diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index c6045cd835e..22369d5470d 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -78,6 +78,7 @@ CREATE TABLE `characters` (
`rlimb_data` mediumtext NOT NULL,
`nanotrasen_relation` varchar(45) NOT NULL,
`speciesprefs` int(1) NOT NULL,
+ `socks` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 1bb4ea02cf3..3777874cb91 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -124,7 +124,7 @@
"act" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Prisoner Transfer Center"; req_access = null; req_access_txt = "1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"acu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/permabrig)
"acv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/permabrig)
-"acw" = (/obj/item/weapon/secbot_assembly,/turf/simulated/floor/plating,/area/security/permabrig)
+"acw" = (/obj/item/clothing/mask/muzzle/gag,/turf/simulated/floor/plating,/area/security/permabrig)
"acx" = (/turf/simulated/wall/r_wall,/area/security/securearmoury)
"acy" = (/obj/structure/grille,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/space,/area/space)
"acz" = (/obj/structure/grille,/turf/space,/area/space)
@@ -2487,6 +2487,7 @@
"aVQ" = (/turf/simulated/floor{dir = 2; icon_state = "asteroid"; tag = "icon-asteroid (NORTH)"},/turf/simulated/floor{tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; dir = 1},/turf/simulated/floor{tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; dir = 1},/area/hydroponics)
"aVR" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Hydroponics Pasture"; req_access_txt = "35"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aVS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
+"aVT" = (/obj/machinery/conveyor{dir = 10; id = "garbage"; verted = -1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aVU" = (/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aVV" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = -31},/obj/machinery/light,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aVW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
@@ -3193,7 +3194,7 @@
"bjv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/port)
"bjw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bjx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port)
-"bjy" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bjy" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bjz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/blood/oil,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/port)
"bjA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/port)
"bjB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/port)
@@ -3619,7 +3620,7 @@
"brF" = (/obj/structure/closet/crate/medical,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"brG" = (/obj/structure/closet/crate/internals,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"brH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
-"brI" = (/obj/machinery/conveyor{dir = 10; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"brI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"brJ" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/quartermaster/office)
"brK" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"brL" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
@@ -3850,11 +3851,11 @@
"bwc" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
"bwd" = (/obj/effect/decal/warning_stripes/north,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bwe" = (/obj/effect/decal/warning_stripes/north,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bwf" = (/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bwg" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bwh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bwi" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bwj" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/port)
+"bwf" = (/obj/machinery/door/airlock/maintenance{name = "Disposal Access"; req_access_txt = "12"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bwg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bwh" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/port)
+"bwi" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
+"bwj" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bwk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/port)
"bwl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/port)
"bwm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/port)
@@ -3944,7 +3945,7 @@
"bxS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
"bxT" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry)
"bxU" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor,/area/hallway/secondary/entry)
-"bxV" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/port)
+"bxV" = (/obj/machinery/light_switch{pixel_x = 30},/obj/machinery/camera{c_tag = "Disposals"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/disposal)
"bxW" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
"bxX" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Disposal Exit"; layer = 3; name = "Disposal Exit Vent"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bxY" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -4040,7 +4041,7 @@
"bzK" = (/obj/machinery/driver_button{id_tag = "trash"; pixel_x = -26; pixel_y = -6},/obj/machinery/door_control{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access_txt = "12"},/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/disposal)
"bzL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/medical/virology)
"bzM" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology)
-"bzN" = (/obj/machinery/light_switch{pixel_x = 30},/obj/machinery/camera{c_tag = "Disposals"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bzN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bzO" = (/turf/space,/area/supply/station)
"bzP" = (/obj/structure/barricade/wooden,/obj/structure/grille,/turf/simulated/floor/plating,/area/assembly/assembly_line)
"bzQ" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/status_display/supply_display{pixel_y = 32},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
@@ -4136,7 +4137,7 @@
"bBC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bBD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bBE" = (/obj/machinery/mass_driver{id_tag = "trash"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"bBF" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/structure/closet,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"bBF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bBG" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/atmos/distribution)
"bBH" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos/distribution)
"bBI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/medical/virology)
@@ -6740,7 +6741,7 @@
"czG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"czH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"czI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"czJ" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/disposal)
+"czJ" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/disposal)
"czK" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"; protected = 0},/turf/simulated/floor/plating/airless,/area/maintenance/disposal)
"czL" = (/obj/structure/table/glass,/obj/item/weapon/restraints/handcuffs/cable/zipties,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"czM" = (/obj/item/device/radio/beacon,/turf/simulated/floor/engine,/area/toxins/test_chamber)
@@ -6970,6 +6971,7 @@
"cEc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/medical/virology)
"cEd" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/medical/virology)
"cEe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Patient Isolation"; req_access_txt = "5"},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology)
+"cEf" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal)
"cEg" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
"cEh" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"cEi" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{amount = 5; layer = 2.9},/obj/machinery/media/receiver/boombox,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
@@ -8142,11 +8144,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPaaaaabaAvaIiboRboSboTbnqbmibmibmibmibnwboUboXboYboZboWboVbjlbjlbjlbpbbmebjlaZKaZKaZKaZKbkMbpcbpdbpaaZKbpfbpebkRbwqbpibmmbnzbpjbkRbmobpkbnBbnCbnCbplbpmbkXbpnbnHbmuaHVbppbpqbprbxfbptbpubnNbpvbjPbpwbnQblgbpxbpybpxblgbnQbpzblkbpAbnVbnVbnWbpBbnYbnVbpCbllbpDbocbocbodboebofbohbohbohbohbohbohbohbpEbohbohbohbohbohbohbpFbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpGbpHbpIbpJboEboEbpKbkobkobkobkobkobkpbkobkobkobkobkobkobkobkobkobkobkobkobpLbkobpMbpNaXOaXOaXOaXOaXOaXOaXObpOaFTaHPaFTaFTaFTaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPaHRaAvaAvbpQbpRbpSbpgbpSbpSbpSbpSbpUbpTbpWaZOaZObpVbpXbjlbkFbpYbpZbntbjlbqabsubqaaZKaZKaZKaZKbqcaZKbqdbrpbkRbqebqfbnzbqgbqhbkRbmobkXbqibnCbnCbnCbqjbkXbqkbnHbmuaHVbqmbpqbprbqnbqobpubnNbqpbjPbqqbqrblgbqsbqtbyibmEbqvczCbqxbqybqzbqAbqBbqCbqDbnVbqEbllbqFbqGbocbodboebofbohbqHbohbohbohbohbqIbqJbqJbqJbqJbqKbohbohbohbohbyzbohbqHbqMbohbqNbqObqPbohbqQbqRbqRbqSbqTbqUbqVbkobkobkobkobkobkobkobqWbyUbkobkobkobkobkobkobkobkobkobkobkobqZbrabrabrbbrcbrdbrebrfbrfbrfbrfbrgbrhaFTaabaaaaaaaabaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtdcdaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPbrjbrkbrlbrmbrnbpSbrsbrrbrwbrtbrAbpUbrBbrubrvbrvbrCbrxbjlbjlbjlbmdbrybmcaZOaZOaZOaZObrzbbKbbKbrpbbKbqdbrpbkRbrFbrEbrHbrGbmmbkRbrJbkXbrKbnCbnCbnCbrLaIgbrNbnHbrOblbbrPbrQbnLbnLbnLbnLbnNbrRbjPbrSbrTbjPbjPbjPbjPbjPbjPbjPblkbllbzabrVbrWbrXbrYbrZbsabllbsbbscbscbsdbsdbsdbsdbsdbsdbsdbsebsebsfbsgbshbshbsgbsfbsebsebsibsibsibsibsibsibsjbsjbskbsjbsjbsjbsjbsjbslbsmbsnbsobkobkobspbspbsqbsqbsqbsqbsqbsrbrabrabqZbrabkobrabrabrabrabssbstbstbstbstbsFbsvbsvbsvbsvbsvbsvbsvbsvbsvaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPaAvaAvaAvbpQbswbpSbrobrqbrqbrqbrIbpUbbKbdabsAbsBbsSbsCbjlbkFbsDbmdbsEbmcbsHbsGbujbsIbsJbsKbsKbsLbsKbsMbsNbkRbzcbsPbsQbsRbuqbrDbsTbkXbsUbnCbnCbsVbsWbsXbrNbnHbsYblbbsZbtabtbbtcbtdbApbtfblbblbbtgbthbtibtjbtkbtjbtlbthaaabtmbllbtnbtobtpbtqbrYbnVbtrbllbtsbttbtubsdbtvbtwbtxbtybtzbtAbtBbtCbtDbtEbtFbtFbtEbtGbtHbtIbsibtJbASbtKbtMbsibtNbtObtPbtQbtRbtSbtSbtTbslbtUbtVbtWbtXbtWbtYbtYbsqbtZbuabubbsqaImbudaImbsqbuebrabssbstaInbugaInbstbuhbuibstbuwbukbulbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPboPaAvaAvaAvbpQbswbpSbrobrqbrqbrqaVTbpUbbKbdabsAbsBbsSbsCbjlbkFbsDbmdbsEbmcbsHbsGbujbsIbsJbsKbsKbsLbsKbsMbsNbkRbzcbsPbsQbsRbuqbrDbsTbkXbsUbnCbnCbsVbsWbsXbrNbnHbsYblbbsZbtabtbbtcbtdbApbtfblbblbbtgbthbtibtjbtkbtjbtlbthaaabtmbllbtnbtobtpbtqbrYbnVbtrbllbtsbttbtubsdbtvbtwbtxbtybtzbtAbtBbtCbtDbtEbtFbtFbtEbtGbtHbtIbsibtJbASbtKbtMbsibtNbtObtPbtQbtRbtSbtSbtTbslbtUbtVbtWbtXbtWbtYbtYbsqbtZbuabubbsqaImbudaImbsqbuebrabssbstaInbugaInbstbuhbuibstbuwbukbulbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboPboPboPboPboPboPboPboPboPboPaaabunaAvbuoblUbupbpSburbpSbutbrqbuybuubpUbuvbwHbuxbwcbsCbjlbjlbjlbjlbjlbjlbuzbuAbuBbuCbuDbkRbkRbkRbkRbkRbkRbkRbuEbkRbkRbkRbuFbkRbuGbuHbuIbnCbnCbnCbuJaIgbuKbnHbuLblbbuMbtablcblcblcblbbuNblbbuObuPbuQbuRbuSbuTbuUbuVbuWbuXbuYbllbAWbnVbvbbvabrYbvcbnVbllbvdbvebvfbsdbvgbvhbvibvjbvkbvlbvmbtFbtFbtFbtFbtFbtFbtFbtFbvobvpbvqbvrbvsbvtbsibvubvvbvwbvxbxqbvzbvvbEbbslbvAbtVbxtbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbsqbvNbvObvPbstbvQbvRbvSbvTbvTbBcbstbvVbvWbvXbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfazEaBmaBmaAvaAvaAvaAvaAvaAvaAvaGTbwabBnbpSbsxaIhbwebwdbwdbwgbwibwhbjybjybxVbwjbrvbrvbrvbrvbrvbrvbwkbwlbwlbwmbwnbkRbwobDsbBVbwrbwsbwtbwubwvbkRbwwbwxbwybsTaIgbuIbnCbnCbwzbkXbkXbwAbwBbwCbwDbwEbwFbwGbzDbwIbwJbwKbwLbwMbwNbuWbwObwPbwObwPbwQbuWbuXbwRbwSbwTbwUbwVbwWbwXbwYbwZbwSbxabttbttbsdbxbbxcbxdbxebCbbsdbvmbtFbtFbtFbtFbtFbtFbtFbvnbxhbxibxjbxkbvqbxlbsibxmbxnbxobvxbEbbvzbxpbTrbslbxrbxsbEybxubxubxvbxwbxxbxybxzbxzbxzbxAbxzbxBbxCbxDbxEbxFbxGbxHbxIbxJbxJbxJbxKbstbxLbvWbxMbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvbxObxPbxQbxRbxSbxSbxTbxUaFzbpSbxXbpSbzKbwfbwfbzNbpSaZOaJkaJkbyabybbyabyabyabybbyaaZOaZObkRbkRbkRbycbkRbydbydbydbydbydbydbwubyeaJlbygbyhbCvbyjbykbylbymbynbyobypbyqbyrbysbytbyubyvbyvbywbyxbyybEabyAbyBbyCbyDbthbyEbuUbyFbuSbyGbthaaabyHbyIbyJbyKbyIbyIbyIbyIbyLbllbyMbttbyNbyObyPbyQbyRbySbyTbsdbFFbyVbyWbyXbyYbyZbFKbzbbtFbFXbsibzdbxkbzebzfbsibzgbzhbvwbvxbEbbvzbvvbEbbslbvAbtVbzibzjbzkbzlbzmaJmbzobzpbzqbzrbzsbztbzubsqbzvbzwbzxbstbzybzzbzAbvTbzBbzCbstbxLbvWbAhbumaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvbzEbzFbzGaFyaFybzHbzIaFybzJbpSbBEaIhbusbwfczJbBFbpSaaaaabaabbzObzObzObzObzObzObzOaaaaaaaKcbzQbzRbzSbzTbydbydbydbydbydbydbzUbzVbzWbzXbzYbzZbAaaKdbkXbkXbAcbBWbkXbkXbAdbAebAfbAgbBubAibAibAjbAibAkbAlbAmbAnbyDbthbAobtjbtjbtjbHlbthaaabyHbyIbAqbArbAsbAtbAubAvbAwbAxbAybttbAzbsdbtvbAAbABbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbANbAObAPbAQbxkbARbISbsibATbAUbAVbKubAXbAYbAZbtTbslbBabBbbKNbBdbBdbBebBfaKjbBhbBibBjbBkbBlbBmbLIbsqbBobzwbBpbstbBqbBrbBsbvTbvTbBtbstbvVbvWbEGbumaaaaaaaaaaaaaabbBvbBwbBxbBwbBxbBwbByaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfazEaBmaBmaAvaAvaAvaAvaAvaAvaAvaGTbwabBnbpSbsxaIhbwebwdbwdbjybwfbrIbwgbwgbwibwhbrvbrvbrvbrvbrvbrvbwkbwlbwlbwmbwnbkRbwobDsbBVbwrbwsbwtbwubwvbkRbwwbwxbwybsTaIgbuIbnCbnCbwzbkXbkXbwAbwBbwCbwDbwEbwFbwGbzDbwIbwJbwKbwLbwMbwNbuWbwObwPbwObwPbwQbuWbuXbwRbwSbwTbwUbwVbwWbwXbwYbwZbwSbxabttbttbsdbxbbxcbxdbxebCbbsdbvmbtFbtFbtFbtFbtFbtFbtFbvnbxhbxibxjbxkbvqbxlbsibxmbxnbxobvxbEbbvzbxpbTrbslbxrbxsbEybxubxubxvbxwbxxbxybxzbxzbxzbxAbxzbxBbxCbxDbxEbxFbxGbxHbxIbxJbxJbxJbxKbstbxLbvWbxMbumaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvbxObxPbxQbxRbxSbxSbxTbxUaFzbpSbxXbpSbzKbwjbzNbxVbpSaZOaJkaJkbyabybbyabyabyabybbyaaZOaZObkRbkRbkRbycbkRbydbydbydbydbydbydbwubyeaJlbygbyhbCvbyjbykbylbymbynbyobypbyqbyrbysbytbyubyvbyvbywbyxbyybEabyAbyBbyCbyDbthbyEbuUbyFbuSbyGbthaaabyHbyIbyJbyKbyIbyIbyIbyIbyLbllbyMbttbyNbyObyPbyQbyRbySbyTbsdbFFbyVbyWbyXbyYbyZbFKbzbbtFbFXbsibzdbxkbzebzfbsibzgbzhbvwbvxbEbbvzbvvbEbbslbvAbtVbzibzjbzkbzlbzmaJmbzobzpbzqbzrbzsbztbzubsqbzvbzwbzxbstbzybzzbzAbvTbzBbzCbstbxLbvWbAhbumaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvbzEbzFbzGaFyaFybzHbzIaFybzJbpSbBEaIhbusbBFcEfczJbpSaaaaabaabbzObzObzObzObzObzObzOaaaaaaaKcbzQbzRbzSbzTbydbydbydbydbydbydbzUbzVbzWbzXbzYbzZbAaaKdbkXbkXbAcbBWbkXbkXbAdbAebAfbAgbBubAibAibAjbAibAkbAlbAmbAnbyDbthbAobtjbtjbtjbHlbthaaabyHbyIbAqbArbAsbAtbAubAvbAwbAxbAybttbAzbsdbtvbAAbABbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbANbAObAPbAQbxkbARbISbsibATbAUbAVbKubAXbAYbAZbtTbslbBabBbbKNbBdbBdbBebBfaKjbBhbBibBjbBkbBlbBmbLIbsqbBobzwbBpbstbBqbBrbBsbvTbvTbBtbstbvVbvWbEGbumaaaaaaaaaaaaaabbBvbBwbBxbBwbBxbBwbByaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBzaAvbBAbBAaMWaAvaAvaIfazEbBDbBCbpSczKaIhaIhaIhbpSbpSbpSaaaaaaaaabzObzObzObzObzObzObzOaaaaaaaKcbBJbydbBKbBLbBLbBLbBLbBLbBMbBNbBLbBObBPbBQbBRbBSbBTbBUbkXbMbbnCbKebBXaIgbBZbCabNYbAgbAgbAmbCcbCdbCebCfbCgbAmbtgbyDbthaNIaPwbCjaRvaPAbthaaabCmbyIbCnbCobCpbCqbCrbCqbCsbCtbCubttbOJbsdaSVaSOaSObCzbCAbCBbCCbCDbCEbCFbCGbCGbCHbCIbCJbCKbsibAQbCLaSXbsibsibsjbCNbCObCPbsjbslbslbslbCQbCRbtVbCSbzjbzkbCTbBdaKjbCVbCWbCWbCXbvIbCYbCZbDabDbbvObDcbstbDdbDebvTbDfbDgbDhbstbxLbDibumbumaaaaaaaaaaaaaabbDjbDkbDlbDmbDnbDobDjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzOaSZaKcaKcbDubDvbDwbDxbDxbDxbDvbydbwubyebydbydaJlbDybDzbDAbDBbDCbDDbDEbnCbnCbDFaIgbBZbCabDHbDIbDJbDKbDLbDMbDNbDObDPbAmbDQbDRbuQbDSbDTbDUbDVbDWbuWbuXbDXbyIbDYbDZbOTbCqbTFbCqbEcbCtbEdbttbEebsdbEfbEgbEhbEibEjbEkbElbEmbEnbEnaTabEpbEnbEnbEqbErbEsbEtbEubEvbEwbExbEAbEzbEEbEBbECbEDbEFbHTbEYbEHbtVbEIbEJbEKbELbEMbvFbENbCWbCWbEObEPbCYbEQbsqbERbERbESbstbETbEUcHibEWbvTbEXbstbxLbHVbumaaaaaaaaaaaaaaaaabbEZbFabDlbDnbDlbFbbBxaabaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDpbDpbDpbDpbDpbDpbDpaaaaaaaaaaaaaaaaaaaaaaaaaaabDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqbDqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzObzObzObzObzObzObzObFcbFdbFcbFebFfbFgbFfbFfbFfbFfbFhbwubyebFibkRbkRbFjbnCbyhbDBbFkaIgbFmbFnbFnbFobFpbFqbFrbFsaTbbFuaTcbFwbFxbFybFzbFAbAmbAnbyDbthbFBbFCbFDbFEbPgbthaaabCmbFGbFHbFGbFGbFGbFGbFGbFIbFGbFJbttbEebsdbPUbFLbFLbFMbFNbCBbFObFPaTebFRbFSbFTbFUaTebFVbFWbPVbFYbFZbGabGbbGbbGcbGdbGebGfbGgbGhbGjbGibGkbGlbGmbGnbGnbGobGpbGqbvFbGrbvIbvIbGsbGtbCYbGubGvbGwbGxbGybGzbGAaTnaTfbGDaTfbstbstbGFbDbbDbaToaToaToaToaTobDbbDjbDnbDlbDnbDnbGJbDjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkxbkxbkxbkxbkxbkxbkxbkxbkxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index fdee2b259c3..8ffe65bf82c 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -1539,7 +1539,7 @@
"DE" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/wizard{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/helmet/space/rig/syndi,/obj/item/clothing/head/helmet/space/santahat{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DF" = (/obj/structure/rack,/obj/item/clothing/head/welding/fluff/alice_mccrea_1{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/welding/fluff/norah_briggs_1,/obj/item/clothing/head/welding/fluff/yuki_matsuda_1{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DG" = (/obj/structure/rack,/obj/item/clothing/head/soft/black{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft/blue,/obj/item/clothing/head/soft/red{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"DH" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/holding,/obj/item/weapon/storage/backpack/duffel/clown,/obj/item/weapon/storage/backpack/duffel/captain,/obj/item/weapon/storage/backpack/duffel/science,/obj/item/weapon/storage/backpack/duffel/syndiammo,/obj/item/weapon/storage/backpack/duffel/syndimed,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"DH" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/holding,/obj/item/weapon/storage/backpack/duffel/clown,/obj/item/weapon/storage/backpack/duffel/captain,/obj/item/weapon/storage/backpack/duffel/science,/obj/item/weapon/storage/backpack/duffel/syndie/ammo,/obj/item/weapon/storage/backpack/duffel/syndie/med,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DI" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/admin)
"DJ" = (/obj/structure/rack,/obj/item/clothing/under/shorts/black{pixel_x = -3; pixel_y = 3},/obj/item/clothing/under/shorts/blue,/obj/item/clothing/under/shorts/red{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DK" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
@@ -2071,3 +2071,4 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
"}
+
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 0080658562b..8779d6e8860 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -91,3 +91,9 @@
#define APPEARANCE_EYE_COLOR 256
#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR
#define APPEARANCE_ALL 511
+
+// Intents
+#define I_HELP "help"
+#define I_DISARM "disarm"
+#define I_GRAB "grab"
+#define I_HARM "harm"
\ No newline at end of file
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index c69742b94c8..a81a99c540b 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -12,6 +12,10 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, underwear_list, underwear_m, underwear_f)
//undershirt
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
+ //socks
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
+
+
var/list/paths
//Surgery Steps - Initialize all /datum/surgery_step into a list
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 871c06a58fe..5f4be64c9db 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -583,4 +583,3 @@ proc/dd_sortedObjectList(list/incoming)
/datum/alarm/dd_SortValue()
return "[sanitize(last_name)]"
-
\ No newline at end of file
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 619716363f9..fe27e399c84 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -10,6 +10,12 @@
if(FEMALE) return pick(undershirt_f)
else return pick(undershirt_list)
+/proc/random_socks(gender)
+ switch(gender)
+ if(MALE) return pick(socks_m)
+ if(FEMALE) return pick(socks_f)
+ else return pick(socks_list)
+
proc/random_hair_style(var/gender, species = "Human")
var/h_style = "Bald"
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 882331d21de..516ae5630f9 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -15,6 +15,10 @@ var/global/list/underwear_f = list() //stores only underwear name
var/global/list/undershirt_list = list() //stores /datum/sprite_accessory/undershirt indexed by name
var/global/list/undershirt_m = list() //stores only undershirt name
var/global/list/undershirt_f = list() //stores only undershirt name
+ //Socks
+var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
+var/global/list/socks_m = list() //stores only socks name
+var/global/list/socks_f = list() //stores only socks name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 2a227db446f..5c05e27b3c6 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -167,10 +167,10 @@
animals lunging, etc.
*/
/mob/proc/RangedAttack(var/atom/A, var/params)
- if(ishuman(src) && (istype(src:gloves, /obj/item/clothing/gloves/color/yellow/power)) && a_intent == "harm")
+ if(ishuman(src) && (istype(src:gloves, /obj/item/clothing/gloves/color/yellow/power)) && a_intent == I_HARM)
PowerGlove(A)
if(!mutations.len) return
- if((LASER in mutations) && a_intent == "harm")
+ if((LASER in mutations) && a_intent == I_HARM)
LaserEyes(A) // moved into a proc below
return
else
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 3de689430a6..ebeeb392aac 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -333,16 +333,16 @@
if("act_intent")
usr.a_intent_change("right")
if("help")
- usr.a_intent = "help"
+ usr.a_intent = I_HELP
usr.hud_used.action_intent.icon_state = "intent_help"
if("harm")
- usr.a_intent = "harm"
+ usr.a_intent = I_HARM
usr.hud_used.action_intent.icon_state = "intent_harm"
if("grab")
- usr.a_intent = "grab"
+ usr.a_intent = I_GRAB
usr.hud_used.action_intent.icon_state = "intent_grab"
if("disarm")
- usr.a_intent = "disarm"
+ usr.a_intent = I_DISARM
usr.hud_used.action_intent.icon_state = "intent_disarm"
if("pull")
@@ -378,7 +378,7 @@
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.sensor_mode()
-
+
if("Toggle Headlamp")
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm
index 954d2eac3fd..17fb1005fa6 100644
--- a/code/_onclick/oldcode.dm
+++ b/code/_onclick/oldcode.dm
@@ -347,7 +347,7 @@
src.hand_al(usr, usr.hand)
else
// ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD -------
- if((LASER in usr:mutations) && usr:a_intent == "harm" && world.time >= usr.next_move)
+ if((LASER in usr:mutations) && usr:a_intent == I_HARM && world.time >= usr.next_move)
// ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED -------
var/turf/T = get_turf(usr)
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 921fb8e818e..974025dbc1b 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -30,7 +30,7 @@
/mob/living/carbon/human/RangedAttack(var/atom/A)
if(!gloves && !mutations.len) return
var/obj/item/clothing/gloves/G = gloves
- if((LASER in mutations) && a_intent == "harm")
+ if((LASER in mutations) && a_intent == I_HARM)
LaserEyes(A) // moved into a proc below
else if(istype(G) && G.Touch(A,0)) // for magic gloves
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index ac914c9d3f6..f6101b6dcd2 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -165,7 +165,7 @@ var/list/uplink_items = list()
desc = "A radiation laser concealed inside of a Health Analyser. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyser, only appears like one. May not function correctly on radiation resistant humanoids!"
reference = "RL"
item = /obj/item/device/rad_laser
- cost = 6
+ cost = 5
job = list(
"Chief Medical Officer",
"Medical Doctor",
@@ -327,6 +327,14 @@ var/list/uplink_items = list()
gamemodes = list("nuclear emergency")
surplus = 35
+/datum/uplink_item/ammo/bioterror
+ name = "Box of Bioterror Syringes"
+ desc = "A box full of preloaded syringes, containing various chemicals that seize up the victim's motor and broca system , making it impossible for them to move or speak while in their system."
+ reference = "BTS"
+ item = /obj/item/weapon/storage/box/syndie_kit/bioterror
+ cost = 6
+ gamemodes = list("nuclear emergency")
+
/datum/uplink_item/dangerous/tabungrenades
name = "Tabun Gas Grenades"
desc = "A box of four (4) grenades filled with Tabun, a deadly neurotoxin. Use extreme caution when handling and be sure to vacate the premise after using; ensure communication is maintained with team to avoid accidental gassings."
@@ -412,11 +420,27 @@ var/list/uplink_items = list()
cost = 2
gamemodes = list("nuclear emergency")
+/datum/uplink_item/ammo/ammobag
+ name = "Ammo Duffelbag - Shotgun Ammo Grab Bag"
+ desc = "A duffelbag filled with Bulldog ammo to kit out an entire team, at a discounted price."
+ reference = "SAGL"
+ item = /obj/item/weapon/storage/backpack/duffel/syndie/ammo/loaded
+ cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns
+ gamemodes = list("nuclear emergency")
+
+/datum/uplink_item/ammo/bullslug
+ name = "Drum Magazine - 12g Slugs"
+ desc = "An additional 8-round slug magazine for use in the Bulldog shotgun. Now 8 times less likely to shoot your pals."
+ reference = "12BSG"
+ item = /obj/item/ammo_box/magazine/m12g
+ cost = 2
+ gamemodes = list("nuclear emergency")
+
/datum/uplink_item/ammo/bullbuck
name = "Drum Magazine - 12g buckshot"
desc = "An additional 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy."
reference = "12BS"
- item = /obj/item/ammo_box/magazine/m12g
+ item = /obj/item/ammo_box/magazine/m12g/buckshot
cost = 2
gamemodes = list("nuclear emergency")
@@ -433,7 +457,7 @@ var/list/uplink_items = list()
desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. I'm a fire starter, twisted fire starter!"
reference = "12DB"
item = /obj/item/ammo_box/magazine/m12g/dragon
- cost = 3
+ cost = 2
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/car
@@ -509,7 +533,7 @@ var/list/uplink_items = list()
desc = "A pizza box with a bomb taped inside of it. The timer needs to be set by opening the box; afterwards, opening the box again will trigger the detonation."
reference = "PB"
item = /obj/item/device/pizza_bomb
- cost = 4
+ cost = 5
surplus = 8
/datum/uplink_item/stealthy_weapons/dehy_carp
@@ -529,7 +553,7 @@ var/list/uplink_items = list()
desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers."
reference = "CJ"
item = /obj/item/clothing/under/chameleon
- cost = 4
+ cost = 2
/datum/uplink_item/stealthy_tools/chameleon_stamp
name = "Chameleon Stamp"
@@ -540,26 +564,34 @@ var/list/uplink_items = list()
cost = 1
surplus = 35
-/datum/uplink_item/stealthy_tools/syndigolashes
+/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Syndicate Shoes"
desc = "These allow you to run on wet floors. They do not work on lubricated surfaces."
reference = "NSSS"
item = /obj/item/clothing/shoes/syndigaloshes
- cost = 4
+ cost = 2
+ excludefrom = list("nuclear emergency")
+
+/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
+ name = "Tactical No-Slip Brown Shoes"
+ desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow."
+ reference = "NNSSS"
+ cost = 4 //but they aren't
+ gamemodes = list("nuclear emergency")
/datum/uplink_item/stealthy_tools/agent_card
name = "Agent ID Card"
desc = "Agent cards prevent artificial intelligences from tracking the wearer, and can copy access from other identification cards. The access is cumulative, so scanning one card does not erase the access gained from another."
reference = "AIDC"
item = /obj/item/weapon/card/id/syndicate
- cost = 3
+ cost = 2
/datum/uplink_item/stealthy_tools/voice_changer
name = "Voice Changer"
desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognisable."
reference = "VC"
item = /obj/item/clothing/mask/gas/voice
- cost = 5
+ cost = 3
/datum/uplink_item/stealthy_tools/chameleon_proj
name = "Chameleon-Projector"
@@ -570,10 +602,10 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_tools/camera_bug
name = "Camera Bug"
- desc = "Enables you to bug cameras to view them remotely. Adding particular items to it alters its functions."
+ desc = "Enables you to view all cameras on the network and track a target. Bugging cameras allows you to disable them remotely."
reference = "CB"
item = /obj/item/device/camera_bug
- cost = 2
+ cost = 1
surplus = 90
/datum/uplink_item/stealthy_tools/dnascrambler
@@ -611,6 +643,20 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/toolbox/syndicate
cost = 1
+/datum/uplink_item/device_tools/surgerybag
+ name = "Syndicate Surgery Dufflebag"
+ desc = "The Syndicate surgery dufflebag is a toolkit containing all surgery tools, a straitjacket, and a muzzle."
+ reference = "SSDB"
+ item = /obj/item/weapon/storage/backpack/duffel/syndie/surgery
+ cost = 4
+
+/datum/uplink_item/device_tools/military_belt
+ name = "Military Belt"
+ desc = "A robust seven-slot red belt made for carrying a broad variety of weapons, ammunition and explosives"
+ reference = "SBM"
+ item = /obj/item/weapon/storage/belt/military
+ cost = 3
+ excludefrom = list("nuclear emergency")
/datum/uplink_item/device_tools/medkit
name = "Syndicate Combat Medic Kit"
@@ -621,19 +667,12 @@ var/list/uplink_items = list()
cost = 9
gamemodes = list("nuclear emergency")
-/datum/uplink_item/badass/syndiecigs
- name = "Syndicate Smokes"
- desc = "Strong flavor, dense smoke, infused with omnizine."
- reference = "SYSM"
- item = /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate
- cost = 4
-
/datum/uplink_item/device_tools/space_suit
name = "Space Suit"
desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
reference = "SS"
item = /obj/item/weapon/storage/box/syndie_kit/space
- cost = 5
+ cost = 4
/datum/uplink_item/device_tools/hardsuit
name = "Blood-red Hardsuit"
@@ -680,7 +719,7 @@ var/list/uplink_items = list()
These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' slow you down in simulated-gravity environments much like the standard issue variety."
reference = "BRMB"
item = /obj/item/clothing/shoes/magboots/syndie
- cost = 5
+ cost = 3
gamemodes = list("nuclear emergency")
/datum/uplink_item/device_tools/plastic_explosives
@@ -807,6 +846,13 @@ var/list/uplink_items = list()
category = "(Pointless) Badassery"
surplus = 0
+/datum/uplink_item/badass/syndiecigs
+ name = "Syndicate Smokes"
+ desc = "Strong flavor, dense smoke, infused with omnizine."
+ reference = "SYSM"
+ item = /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate
+ cost = 2
+
/datum/uplink_item/badass/bundle
name = "Syndicate Bundle"
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive."
diff --git a/code/game/dna/dna_misc.dm b/code/game/dna/dna_misc.dm
index bc2098d77a6..b4c8bda8b9f 100644
--- a/code/game/dna/dna_misc.dm
+++ b/code/game/dna/dna_misc.dm
@@ -467,7 +467,7 @@
O.adjustToxLoss(M.getToxLoss() + 20)
O.adjustOxyLoss(M.getOxyLoss())
O.stat = M.stat
- O.a_intent = "harm"
+ O.a_intent = I_HARM
for (var/obj/item/weapon/implant/I in implants)
I.loc = O
I.implanted = O
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index 06a16390fa7..ecdbd6fa2f2 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -562,13 +562,13 @@
thoughts = "haunted by their own mortality"
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
usr << "\blue Mood: You sense benevolent thoughts from [M.name]."
- if ("disarm")
+ if (I_DISARM)
usr << "\blue Mood: You sense cautious thoughts from [M.name]."
- if ("grab")
+ if (I_GRAB)
usr << "\blue Mood: You sense hostile thoughts from [M.name]."
- if ("harm")
+ if (I_HARM)
usr << "\blue Mood: You sense cruel thoughts from [M.name]."
for(var/mob/living/L in view(7,M))
if (L == M)
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index c482f9749b5..abcaba4cf18 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -101,12 +101,12 @@
var/turf/location = get_turf(src)
// Create the reagents to put into the air
- create_reagents(25)
+ create_reagents(8)
if(overmind && overmind.blob_reagent_datum)
- reagents.add_reagent(overmind.blob_reagent_datum.id, 25)
+ reagents.add_reagent(overmind.blob_reagent_datum.id, 8)
else
- reagents.add_reagent("spores", 25)
+ reagents.add_reagent("spores", 8)
// Attach the smoke spreader and setup/start it.
S.attach(location)
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index 52245bde71d..4a3f9bbdf57 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -276,7 +276,10 @@
last_attack = world.time
OB.expand(T, 0, blob_reagent_datum.color)
for(var/mob/living/L in T)
- blob_reagent_datum.reaction_mob(L, TOUCH, 25)
+ if("blob" in L.faction) //no friendly fire
+ continue
+ var/mob_protection = L.get_permeability_protection()
+ blob_reagent_datum.reaction_mob(L, TOUCH, 25, 1, mob_protection)
blob_reagent_datum.send_message(L)
OB.color = blob_reagent_datum.color
return
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 50819be8c1d..a5a18c6676e 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -204,6 +204,8 @@
cult -= cult_mind
cult_mind.current << "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it."
cult_mind.memory = ""
+ cult_mind.special_role = null
+ cult_mind.current.hud_updateflag |= 1 << SPECIALROLE_HUD
// remove the cult viewpoint object
var/obj/viewpoint = getCultViewpoint(cult_mind.current)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 6e236db2154..0d5a399b892 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -488,6 +488,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.check_icon()
R.blood_DNA = list()
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
+ R.add_hiddenprint(H)
return
else
user << "The book seems full of illegible scribbles. Is this a joke?"
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 1420fc9c5ae..d39bc8e2ec3 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -327,7 +327,7 @@ datum/objective/protect//The opposite of killing a dude.
datum/objective/hijack
- explanation_text = "Hijack the emergency shuttle by escaping alone."
+ explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive."
check_completion()
if(!owner.current || owner.current.stat)
@@ -337,9 +337,9 @@ datum/objective/hijack
if(issilicon(owner.current))
return 0
var/area/shuttle = locate(/area/shuttle/escape/centcom)
- var/list/protected_mobs = list(/mob/living/silicon/ai, /mob/living/silicon/pai)
for(var/mob/living/player in player_list)
- if(player.type in protected_mobs) continue
+ if(istype(player, /mob/living/silicon) || istype(player, /mob/living/simple_animal) || player.mind.special_role && !player.mind.special_role == "Response Team")
+ continue
if (player.mind && (player.mind != owner))
if(player.stat != DEAD) //they're not dead!
if(get_turf(player) in shuttle)
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 421582d26a1..1cc2cd9d469 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -172,9 +172,8 @@ Made by Xhuis
thrall_mind.current.attack_log += "\[[time_stamp()]\] Dethralled"
thrall_mind.special_role = null
update_shadow_icons_removed(thrall_mind)
- thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
- thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
- //thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/thrall_vision) //uncomment when vision code is unfucked.
+ for(var/obj/effect/proc_holder/spell/S in thrall_mind.spell_list)
+ thrall_mind.remove_spell(S)
thrall_mind.current.remove_language("Shadowling Hivemind")
if(kill && ishuman(thrall_mind.current)) //If dethrallization surgery fails, kill the mob as well as dethralling them
var/mob/living/carbon/human/H = thrall_mind.current
@@ -211,7 +210,29 @@ Made by Xhuis
else
shadowling_dead = 1 //but shadowling was kill :(
return 1
-
+
+/datum/game_mode/proc/remove_shadowling(datum/mind/ling_mind)
+ if(!istype(ling_mind) || !(ling_mind in shadows)) return 0
+ update_shadow_icons_removed(ling_mind)
+ shadows.Remove(ling_mind)
+ ling_mind.current.attack_log += "\[[time_stamp()]\] Deshadowlinged"
+ ling_mind.special_role = null
+ for(var/obj/effect/proc_holder/spell/S in ling_mind.spell_list)
+ ling_mind.remove_spell(S)
+ var/mob/living/M = ling_mind.current
+ if(issilicon(M))
+ M.audible_message("[M] lets out a short blip.", \
+ "You have been turned into a robot! You are no longer a shadowling! Though you try, you cannot remember anything about your time as one...")
+ else
+ M.visible_message("[M] screams and contorts!", \
+ "THE LIGHT-- YOUR MIND-- BURNS--")
+ spawn(30)
+ if(!M || qdeleted(M))
+ return
+ M.visible_message("[M] suddenly bloats and explodes!", \
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA----")
+ playsound(M, 'sound/magic/Disintegrate.ogg', 100, 1)
+ M.gib()
/datum/game_mode/shadowling/proc/check_shadow_victory()
var/success = 0 //Did they win?
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 9b15852dfaa..f45ffa43de8 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -246,7 +246,7 @@
else
user << "Maintenance panel is locked."
else
- if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HARM)
if(health >= maxhealth)
user << "[src] does not need a repair."
return
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 33a3d45d849..36a2fdae614 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -186,7 +186,7 @@ Auto Patrol[]"},
user << "Access denied."
else
..()
- if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HARM) // Any intent but harm will heal, so we shouldn't get angry.
return
if (!istype(W, /obj/item/weapon/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
if(W.force)//If force is non-zero and damage type isn't stamina.
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index 90784f970c1..471f401d46f 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -192,7 +192,7 @@ Auto Patrol: []"},
user << " Access denied."
else
..()
- if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry.
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HARM) // Any intent but harm will heal, so we shouldn't get angry.
return
if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
threatlevel = user.assess_threat(src)
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 0e05c316052..12419f66244 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -8,7 +8,15 @@
var/datum/ai_laws/laws = null
var/obj/item/weapon/circuitboard/circuit = null
var/obj/item/device/mmi/brain = null
-
+
+/obj/structure/AIcore/Destroy()
+ qdel(laws)
+ qdel(circuit)
+ qdel(brain)
+ laws = null
+ circuit = null
+ brain = null
+ return ..()
/obj/structure/AIcore/attackby(obj/item/P as obj, mob/user as mob, params)
switch(state)
@@ -176,7 +184,8 @@
state = 20//So it doesn't interact based on the above. Not really necessary.
/obj/structure/AIcore/deactivated/Destroy()
- empty_playable_ai_cores -= src
+ if(src in empty_playable_ai_cores)
+ empty_playable_ai_cores -= src
return ..()
/obj/structure/AIcore/deactivated/attackby(var/obj/item/W, var/mob/user, params)
diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm
index 608279392b9..be221157b01 100644
--- a/code/game/machinery/programmable_unloader.dm
+++ b/code/game/machinery/programmable_unloader.dm
@@ -501,7 +501,7 @@
H << "The boxing machine refuses to acknowledge you unless you face it head on!"
return
var/damage = 0
- if(H.a_intent != "harm")
+ if(H.a_intent != I_HARM)
damage += rand(0,5)
else
damage += rand(0,10)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 4cfdc0a6c29..1b3f89af28a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -729,7 +729,7 @@
/obj/machinery/vending/assist
products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
/obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
- contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2)
+ contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2, /obj/item/device/assembly/health = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
/obj/machinery/vending/boozeomat/New()
@@ -887,6 +887,7 @@
products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
/obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
/obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
+ contraband = list(/obj/item/device/assembly/health = 3)
/obj/machinery/vending/wallmed1
name = "NanoMed"
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 783513c62ac..05ae2c9b125 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -53,7 +53,7 @@
else if(istype(target,/mob/living))
var/mob/living/M = target
if(M.stat>1) return
- if(chassis.occupant.a_intent == "harm")
+ if(chassis.occupant.a_intent == I_HARM)
M.take_overall_damage(dam_force)
M.adjustOxyLoss(round(dam_force/2))
M.updatehealth()
@@ -1058,10 +1058,10 @@
else if(istype(target,/mob/living))
var/mob/living/M = target
if(M.stat>1) return
- if(chassis.occupant.a_intent == "harm")
+ if(chassis.occupant.a_intent == I_HARM)
chassis.occupant_message("\red You obliterate [target] with [src.name], leaving blood and guts everywhere.")
chassis.visible_message("\red [chassis] destroys [target] in an unholy fury.")
- if(chassis.occupant.a_intent == "disarm")
+ if(chassis.occupant.a_intent == I_DISARM)
chassis.occupant_message("\red You tear [target]'s limbs off with [src.name].")
chassis.visible_message("\red [chassis] rips [target]'s arms off.")
else
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 98a7b32f682..f78c1e61b17 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -844,7 +844,7 @@
user << "There's already a powercell installed."
return
- else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
+ else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HARM)
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0,user))
if (hasInternalDamage(MECHA_INT_TANK_BREACH))
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index b201b83993d..5e684b9ddef 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -1167,95 +1167,99 @@
/datum/construction/reversible/mecha/phazon
result = "/obj/mecha/combat/phazon"
steps = list(
- //1
+ //1
+ list("key"=/obj/item/device/assembly/signaler/anomaly,
+ "backkey"=null, //Cannot remove the anomaly core once it's in
+ "desc"="Anomaly core socket is open and awaiting connection."),
+ //2
list("key"=/obj/item/weapon/weldingtool,
"backkey"=/obj/item/weapon/wrench,
"desc"="External armor is wrenched."),
- //2
+ //3
list("key"=/obj/item/weapon/wrench,
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is installed."),
- //3
+ //4
list("key"=/obj/item/mecha_parts/part/phazon_armor,
"backkey"=/obj/item/weapon/weldingtool,
"desc"="Phase armor is welded."),
- //4
+ //5
list("key"=/obj/item/weapon/weldingtool,
"backkey"=/obj/item/weapon/wrench,
"desc"="Phase armor is wrenched."),
- //5
+ //6
list("key"=/obj/item/weapon/wrench,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Phase armor is installed."),
- //6
+ //7
list("key"=/obj/item/stack/sheet/plasteel,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The bluespace crystal is engaged."),
- //7
+ //8
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/wirecutters,
"desc"="The bluespace crystal is connected."),
- //8
+ //9
list("key"=/obj/item/stack/cable_coil,
"backkey"=/obj/item/weapon/crowbar,
"desc"="The bluespace crystal is installed."),
- //9
+ //10
list("key"=/obj/item/bluespace_crystal,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Super capacitor is secured."),
- //10
+ //11
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Super capacitor is installed."),
- //11
+ //12
list("key"=/obj/item/weapon/stock_parts/capacitor/super,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Phasic scanner module is secured."),
- //12
+ //13
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Phasic scanner module is installed."),
- //13
+ //14
list("key"=/obj/item/weapon/stock_parts/scanning_module/phasic,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Scanning module is secured."),
- //14
+ //15
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Scanning module is installed."),
- //15
+ //16
list("key"=/obj/item/weapon/circuitboard/mecha/phazon/targeting,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Peripherals control module is secured."),
- //16
+ //17
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Peripherals control module is installed"),
- //17
+ //18
list("key"=/obj/item/weapon/circuitboard/mecha/phazon/peripherals,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Central control module is secured."),
- //18
+ //19
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Central control module is installed."),
- //19
+ //20
list("key"=/obj/item/weapon/circuitboard/mecha/phazon/main,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is adjusted."),
- //20
+ //21
list("key"=/obj/item/weapon/wirecutters,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is added."),
- //21
+ //22
list("key"=/obj/item/stack/cable_coil,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The hydraulic systems are active."),
- //22
+ //23
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/wrench,
"desc"="The hydraulic systems are connected."),
- //23
+ //24
list("key"=/obj/item/weapon/wrench,
"desc"="The hydraulic systems are disconnected.")
)
@@ -1270,24 +1274,24 @@
//TODO: better messages.
switch(index)
- if(23)
+ if(24)
user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.")
holder.icon_state = "phazon1"
- if(22)
+ if(23)
if(diff==FORWARD)
user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.")
holder.icon_state = "phazon2"
else
user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.")
holder.icon_state = "phazon0"
- if(21)
+ if(22)
if(diff==FORWARD)
user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].")
holder.icon_state = "phazon3"
else
user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.")
holder.icon_state = "phazon1"
- if(20)
+ if(21)
if(diff==FORWARD)
user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].")
holder.icon_state = "phazon4"
@@ -1296,7 +1300,7 @@
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
holder.icon_state = "phazon2"
- if(19)
+ if(20)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].")
qdel(used_atom)
@@ -1304,7 +1308,7 @@
else
user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].")
holder.icon_state = "phazon3"
- if(18)
+ if(19)
if(diff==FORWARD)
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
holder.icon_state = "phazon6"
@@ -1312,7 +1316,7 @@
user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].")
new /obj/item/weapon/circuitboard/mecha/phazon/main(get_turf(holder))
holder.icon_state = "phazon4"
- if(17)
+ if(18)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].")
qdel(used_atom)
@@ -1320,7 +1324,7 @@
else
user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
holder.icon_state = "phazon5"
- if(16)
+ if(17)
if(diff==FORWARD)
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
holder.icon_state = "phazon8"
@@ -1328,7 +1332,7 @@
user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].")
new /obj/item/weapon/circuitboard/mecha/phazon/peripherals(get_turf(holder))
holder.icon_state = "phazon6"
- if(15)
+ if(16)
if(diff==FORWARD)
user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].")
qdel(used_atom)
@@ -1336,7 +1340,7 @@
else
user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
holder.icon_state = "phazon7"
- if(14)
+ if(15)
if(diff==FORWARD)
user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
holder.icon_state = "phazon10"
@@ -1344,7 +1348,7 @@
user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].")
new /obj/item/weapon/circuitboard/mecha/phazon/targeting(get_turf(holder))
holder.icon_state = "phazon8"
- if(13)
+ if(14)
if(diff==FORWARD)
user.visible_message("[user] installs phasic scanner module to the [holder].", "You install phasic scanner module to the [holder].")
qdel(used_atom)
@@ -1352,7 +1356,7 @@
else
user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.")
holder.icon_state = "phazon9"
- if(12)
+ if(13)
if(diff==FORWARD)
user.visible_message("[user] secures the phasic scanner module.", "You secure the phasic scanner module.")
holder.icon_state = "phazon12"
@@ -1360,7 +1364,7 @@
user.visible_message("[user] removes the phasic scanner module from the [holder].", "You remove the phasic scanner module from the [holder].")
new /obj/item/weapon/stock_parts/scanning_module/phasic(get_turf(holder))
holder.icon_state = "phazon10"
- if(11)
+ if(12)
if(diff==FORWARD)
user.visible_message("[user] installs super capacitor to the [holder].", "You install super capacitor to the [holder].")
qdel(used_atom)
@@ -1368,7 +1372,7 @@
else
user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the phasic scanner module.")
holder.icon_state = "phazon11"
- if(10)
+ if(11)
if(diff==FORWARD)
user.visible_message("[user] secures the super capacitor.", "You secure the super capacitor.")
holder.icon_state = "phazon14"
@@ -1376,7 +1380,7 @@
user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the super capacitor from the [holder].")
new /obj/item/weapon/stock_parts/capacitor/super(get_turf(holder))
holder.icon_state = "phazon12"
- if(9)
+ if(10)
if(diff==FORWARD)
user.visible_message("[user] installs the bluespace crystal.", "You install the bluespace crystal.")
qdel(used_atom)
@@ -1384,7 +1388,7 @@
else
user.visible_message("[user] unsecures the super capacitor from the [holder].", "You unsecure the super capacitor from the [holder].")
holder.icon_state = "phazon13"
- if(8)
+ if(9)
if(diff==FORWARD)
user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.")
holder.icon_state = "phazon16"
@@ -1392,21 +1396,21 @@
user.visible_message("[user] removes the bluespace crystal from the [holder].", "You remove the bluespace crystal from the [holder].")
new /obj/item/bluespace_crystal(get_turf(holder))
holder.icon_state = "phazon14"
- if(7)
+ if(8)
if(diff==FORWARD)
user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.")
holder.icon_state = "phazon17"
else
user.visible_message("[user] disconnects the bluespace crystal from the [holder].", "You disconnect the bluespace crystal from the [holder].")
holder.icon_state = "phazon15"
- if(6)
+ if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the phase armor layer to the [holder].", "You install the phase armor layer to the [holder].")
holder.icon_state = "phazon18"
else
user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.")
holder.icon_state = "phazon16"
- if(5)
+ if(6)
if(diff==FORWARD)
user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.")
holder.icon_state = "phazon19"
@@ -1415,14 +1419,14 @@
var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
MS.amount = 5
holder.icon_state = "phazon17"
- if(4)
+ if(5)
if(diff==FORWARD)
user.visible_message("[user] welds the phase armor layer to the [holder].", "You weld the phase armor layer to the [holder].")
holder.icon_state = "phazon20"
else
user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.")
holder.icon_state = "phazon18"
- if(3)
+ if(4)
if(diff==FORWARD)
user.visible_message("[user] installs Phazon Armor Plates to the [holder].", "You install Phazon Armor Plates to the [holder].")
qdel(used_atom)
@@ -1430,7 +1434,7 @@
else
user.visible_message("[user] cuts phase armor layer from the [holder].", "You cut the phase armor layer from the [holder].")
holder.icon_state = "phazon19"
- if(2)
+ if(3)
if(diff==FORWARD)
user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.")
holder.icon_state = "phazon22"
@@ -1438,12 +1442,16 @@
user.visible_message("[user] pries Phazon Armor Plates from the [holder].", "You pry Phazon Armor Plates from the [holder].")
new /obj/item/mecha_parts/part/phazon_armor(get_turf(holder))
holder.icon_state = "phazon20"
- if(1)
+ if(2)
if(diff==FORWARD)
user.visible_message("[user] welds Phazon Armor Plates to the [holder].", "You weld Phazon Armor Plates to the [holder].")
else
user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.")
holder.icon_state = "phazon21"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] carefully inserts the anomaly core into \the [holder] and secures it.", "You slowly place the anomaly core into its socket and close its chamber.")
+ qdel(used_atom)
return 1
/datum/construction/reversible/mecha/phazon/spawn_result()
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 69adcfb3ae9..48a976cac1f 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -1,10 +1,3 @@
-#define VANILLA_BUG 0
-#define UNIVERSAL_BUG 1
-#define NETWORK_BUG 2
-#define SABOTAGE_BUG 3
-#define ADVANCED_BUG 4
-#define ADMIN_BUG 5
-
#define BUGMODE_LIST 0
#define BUGMODE_MONITOR 1
#define BUGMODE_TRACK 2
@@ -23,13 +16,9 @@
throw_range = 20
var/obj/machinery/camera/current = null
- var/obj/item/expansion = null
- var/bugtype = VANILLA_BUG
var/last_net_update = 0
- var/last_bugtype = VANILLA_BUG
var/list/bugged_cameras = list()
- var/skip_bugcheck = 0
var/track_mode = BUGMODE_LIST
var/last_tracked = 0
@@ -46,11 +35,6 @@
processing_objects += src
/obj/item/device/camera_bug/Destroy()
- if(expansion)
- qdel(expansion)
- expansion = null
- return ..()
-/* Easier to just call del() than this nonsense
get_cameras()
for(var/cam_tag in bugged_cameras)
var/obj/machinery/camera/camera = bugged_cameras[cam_tag]
@@ -59,8 +43,7 @@
bugged_cameras = list()
if(tracking)
tracking = null
- ..()
-*/
+ return ..()
/obj/item/device/camera_bug/interact(var/mob/user = usr)
var/datum/browser/popup = new(user, "camerabug","Camera Bug",nref=src)
@@ -78,7 +61,7 @@
return null
var/turf/T = get_turf(user.loc)
- if(T.z != current.z || (!skip_bugcheck && current.bug != src) || !current.can_use())
+ if(T.z != current.z || !current.can_use())
user << "[src] has lost the signal."
current = null
user.reset_view(null)
@@ -88,26 +71,18 @@
return 1
/obj/item/device/camera_bug/proc/get_cameras()
- if(bugtype != last_bugtype || ( (bugtype in list(UNIVERSAL_BUG,NETWORK_BUG,ADMIN_BUG)) && world.time > (last_net_update + 100)))
+ if(world.time > (last_net_update + 100))
bugged_cameras = list()
- last_bugtype = bugtype
for(var/obj/machinery/camera/camera in cameranet.cameras)
if(camera.stat || !camera.can_use())
continue
- switch(bugtype)
- if(VANILLA_BUG,SABOTAGE_BUG,ADVANCED_BUG)
- if(camera.bug == src)
- bugged_cameras[camera.c_tag] = camera
- if(UNIVERSAL_BUG)
- if(camera.bug)
- bugged_cameras[camera.c_tag] = camera
- if(NETWORK_BUG,ADMIN_BUG)
- if(length(list("SS13","MINE")&camera.network))
- bugged_cameras[camera.c_tag] = camera
+ if(length(list("SS13","MINE")&camera.network))
+ bugged_cameras[camera.c_tag] = camera
sortList(bugged_cameras)
return bugged_cameras
+
/obj/item/device/camera_bug/proc/menu(var/list/cameras)
if(!cameras || !cameras.len)
return "No bugged cameras found."
@@ -119,16 +94,10 @@
for(var/entry in cameras)
var/obj/machinery/camera/C = cameras[entry]
var/functions = ""
- switch(bugtype)
- if(SABOTAGE_BUG)
- functions = " - \[Disable\]"
- if(ADVANCED_BUG)
- functions = " - \[Monitor\]"
- if(ADMIN_BUG)
- if(C.bug == src)
- functions = " - \[Monitor\] \[Disable\]"
- else
- functions = " - \[Monitor\]"
+ if(C.bug == src)
+ functions = " - \[Monitor\] \[Disable\]"
+ else
+ functions = " - \[Monitor\]"
html += "
| [entry] | [functions] |
"
if(BUGMODE_MONITOR)
@@ -157,6 +126,9 @@
var/s = (time_diff - 4*m) * 15
if(!s) s = "00"
html += "Last seen near [outstring] ([m]:[s] minute\s ago)
"
+ if( C && (C.bug == src)) //Checks to see if the camera has a bug
+ html += "\[Disable\]"
+
else
html += "Not yet seen."
else
@@ -309,62 +281,6 @@
break
src.updateSelfDialog()
-/obj/item/device/camera_bug/attackby(var/obj/item/W as obj,var/mob/living/user as mob, params)
- if(istype(W,/obj/item/weapon/screwdriver) && expansion)
- expansion.loc = get_turf(loc)
- user << "You unscrew [expansion]."
- user.put_in_inactive_hand(expansion)
- expansion = null
- bugtype = VANILLA_BUG
- skip_bugcheck = 0
- track_mode = BUGMODE_LIST
- tracking = null
- return
-
- if(expansion || !W)
- return ..(W,user)
-
- // I am not sure that this list is or should be final
- // really I do not know what to do here.
- var/static/list/expandables = list(
- /obj/item/weapon/research = ADMIN_BUG, // could have been anything spawn-only
-
- // these are all so hackish I am sorry
-
- /obj/item/device/analyzer = UNIVERSAL_BUG,
- /obj/item/weapon/stock_parts/subspace/analyzer = UNIVERSAL_BUG,
-
- /obj/item/device/assembly/igniter = SABOTAGE_BUG,
- /obj/item/device/assembly/infra = SABOTAGE_BUG, // ir blaster to disable camera
- /obj/item/weapon/stock_parts/subspace/amplifier = SABOTAGE_BUG,
-
- /obj/item/device/radio = NETWORK_BUG,
- /obj/item/device/assembly/signaler = NETWORK_BUG,
- /obj/item/weapon/stock_parts/subspace/transmitter = NETWORK_BUG,
-
- /obj/item/device/detective_scanner = ADVANCED_BUG,
- /obj/item/device/paicard = ADVANCED_BUG,
- /obj/item/weapon/stock_parts/scanning_module = ADVANCED_BUG
- )
-
- for(var/entry in expandables)
- if(istype(W,entry))
- bugtype = expandables[entry]
- user.drop_item()
- W.loc = src
- expansion = W
- user << "You add [W] to [src]."
- get_cameras() // the tracking code will want to know the new camera list
- if(bugtype in list(UNIVERSAL_BUG,NETWORK_BUG,ADMIN_BUG))
- skip_bugcheck = 1
- return
-
-#undef VANILLA_BUG
-#undef UNIVERSAL_BUG
-#undef NETWORK_BUG
-#undef SABOTAGE_BUG
-#undef ADVANCED_BUG
-#undef ADMIN_BUG
#undef BUGMODE_LIST
#undef BUGMODE_MONITOR
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 6950d3b0361..da972725956 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -6,6 +6,8 @@
w_class = 2.0
slot_flags = SLOT_BELT
origin_tech = "programming=2"
+ var/request_cooldown = 60 // one minute
+ var/last_request
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
@@ -241,6 +243,12 @@
pai.master_dna = dna.unique_enzymes
pai << "You have been bound to a new master.
"
if(href_list["request"])
+ var/delta = (world.time / 10) - last_request
+ if(request_cooldown > delta)
+ var/cooldown_time = round(request_cooldown - ((world.time / 10) - last_request), 1)
+ usr << "\red The request system is currently offline. Please wait another [cooldown_time] seconds."
+ return
+ last_request = world.time / 10
src.looking_for_personality = 1
paiController.findPAI(src, usr)
if(href_list["wipe"])
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index cb7dc52d743..b90f987adf5 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -80,21 +80,20 @@ effective or pretty fucking useless.
desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end."
flags = CONDUCT
slot_flags = SLOT_BELT
- discrete = 1 // Makes the item not give an attack log message for viewers.
throwforce = 3
w_class = 1.0
- throw_speed = 5
- throw_range = 10
+ throw_speed = 3
+ throw_range = 7
materials = list(MAT_METAL=400)
origin_tech = "magnets=3;biotech=5;syndicate=3"
var/intensity = 5 // how much damage the radiation does
var/wavelength = 10 // time it takes for the radiation to kick in, in seconds
var/used = 0 // is it cooling down?
-/obj/item/device/rad_laser/attack(mob/living/M as mob, mob/living/user as mob)
+/obj/item/device/rad_laser/attack(mob/living/M, mob/living/user)
if(!used)
- ..()
- user.visible_message(" [user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.")
+ add_logs(M, user, "irradiated", src)
+ user.visible_message("[user] has analyzed [M]'s vitals.")
var/cooldown = round(max(100,(((intensity*8)-(wavelength/2))+(intensity*2))*10))
used = 1
icon_state = "health1"
@@ -105,18 +104,18 @@ effective or pretty fucking useless.
M.apply_effect(round(intensity/1.5), PARALYZE)
M.apply_effect(intensity*10, IRRADIATE)
else
- user << "The radioactive microlaser is still recharging."
+ user << "The radioactive microlaser is still recharging."
-/obj/item/device/rad_laser/proc/handle_cooldown(var/cooldown)
+/obj/item/device/rad_laser/proc/handle_cooldown(cooldown)
spawn(cooldown)
used = 0
icon_state = "health2"
-/obj/item/device/rad_laser/attack_self(mob/user as mob)
+/obj/item/device/rad_laser/attack_self(mob/user)
..()
interact(user)
-/obj/item/device/rad_laser/interact(mob/user as mob)
+/obj/item/device/rad_laser/interact(mob/user)
user.set_machine(src)
var/cooldown = round(max(10,((intensity*8)-(wavelength/2))+(intensity*2)))
@@ -131,7 +130,7 @@ effective or pretty fucking useless.
popup.open()
/obj/item/device/rad_laser/Topic(href, href_list)
- if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained())
+ if(..())
return 1
usr.set_machine(src)
@@ -146,7 +145,6 @@ effective or pretty fucking useless.
amount += wavelength
wavelength = max(1,(min(120,amount)))
- //updateUsrDialog()
- interact(usr)
+ attack_self(usr)
add_fingerprint(usr)
return
\ No newline at end of file
diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm
index 3420dd3acbd..488f958e17f 100644
--- a/code/game/objects/items/policetape.dm
+++ b/code/game/objects/items/policetape.dm
@@ -164,7 +164,7 @@ var/list/tape_roll_applications = list()
breaktape(W, user)
/obj/item/tape/attack_hand(mob/user as mob)
- if (user.a_intent == "help" && src.allowed(user))
+ if (user.a_intent == I_HELP && src.allowed(user))
user.show_viewers("\blue [user] lifts [src], allowing passage.")
src.density = 0
spawn(200)
@@ -176,7 +176,7 @@ var/list/tape_roll_applications = list()
breaktape(/obj/item/weapon/wirecutters,user)
/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob)
- if(user.a_intent == "help" && ((!can_puncture(W) && src.allowed(user))))
+ if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user))))
user << "You can't break the [src] with that!"
return
user.show_viewers("\blue [user] breaks the [src]!")
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 22226dcdcea..51fe775d82c 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -320,7 +320,7 @@
user << "The instructions on [defib] don't mention how to revive that..."
return
else
- if(user.a_intent == "harm" && !defib.safety)
+ if(user.a_intent == I_HARM && !defib.safety)
busy = 1
H.visible_message("[user] has touched [H.name] with [src]!", \
"[user] has touched [H.name] with [src]!")
@@ -435,7 +435,7 @@
user << "This unit is only designed to work on humanoid lifeforms."
return
else
- if(user.a_intent == "harm" && !safety)
+ if(user.a_intent == I_HARM && !safety)
busy = 1
H.visible_message("[user] has touched [H.name] with [src]!", \
"[user] has touched [H.name] with [src]!")
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 1fc648e3e2c..fc6636b6561 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -63,7 +63,7 @@ var/last_chew = 0
var/mob/living/carbon/human/H = A
if (!H.handcuffed)
return
- if (H.a_intent != "harm")
+ if (H.a_intent != I_HARM)
return
if (H.zone_sel.selecting != "mouth")
return
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index c964dd1e0b4..820a3311cff 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -4,6 +4,7 @@
name = "implant"
icon = 'icons/obj/device.dmi'
icon_state = "implant"
+ origin_tech = "materials=2;biotech=3;programming=2"
var/implanted = null
var/mob/living/imp_in = null
var/obj/item/organ/external/part = null
@@ -52,6 +53,7 @@
/obj/item/weapon/implant/tracking
name = "tracking"
desc = "Track with this."
+ origin_tech = "materials=2;magnets=2;programming=2;biotech=2"
var/id = 1.0
@@ -92,6 +94,7 @@ Implant Specifics:
"}
/obj/item/weapon/implant/dexplosive
name = "explosive"
desc = "And boom goes the weasel."
+ origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
icon_state = "implant_evil"
get_data()
@@ -127,6 +130,7 @@ Implant Specifics:
"}
/obj/item/weapon/implant/explosive
name = "explosive implant"
desc = "A military grade micro bio-explosive. Highly dangerous."
+ origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
var/elevel = "Localized Limb"
var/phrase = "supercalifragilisticexpialidocious"
icon_state = "implant_evil"
@@ -252,6 +256,7 @@ Implant Specifics:
"}
/obj/item/weapon/implant/chem
name = "chem"
desc = "Injects things."
+ origin_tech = "materials=3;biotech=4"
allow_reagents = 1
get_data()
@@ -316,6 +321,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/loyalty
name = "loyalty"
desc = "Makes you loyal or such."
+ origin_tech = "materials=2;biotech=4;programming=4"
get_data()
var/dat = {"
@@ -406,6 +412,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/adrenalin
name = "adrenalin"
desc = "Removes all stuns and knockdowns."
+ origin_tech = "materials=2;biotech=4;combat=3;syndicate=4"
var/uses = 3
get_data()
@@ -436,7 +443,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
source.reagents.add_reagent("synaptizine", 10)
source.reagents.add_reagent("omnizine", 10)
- source.reagents.add_reagent("methamphetamine", 10)
+ source.reagents.add_reagent("stimulative_agent", 10)
return
@@ -523,6 +530,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
name = "compressed matter implant"
desc = "Based on compressed matter technology, can store a single item."
icon_state = "implant_evil"
+ origin_tech = "materials=2;magnets=4;bluespace=4;syndicate=4"
var/activation_emote = "sigh"
var/obj/item/scanned = null
@@ -574,7 +582,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/emp
name = "emp implant"
desc = "Triggers an EMP."
-
+ origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4"
var/activation_emote = "chuckle"
var/uses = 2
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index f4f9f3d2400..f32764ae410 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -8,7 +8,14 @@
throw_speed = 1
throw_range = 5
w_class = 1.0
+ origin_tech = "materials=1;biotech=2"
+ materials = list(MAT_GLASS=500)
var/obj/item/weapon/implant/imp = null
+
+ New()
+ ..()
+ update()
+
proc
update()
@@ -16,8 +23,10 @@
update()
if (src.imp)
src.icon_state = text("implantcase-[]", src.imp._color)
+ src.origin_tech = src.imp.origin_tech
else
src.icon_state = "implantcase-0"
+ src.origin_tech = initial(src.origin_tech)
return
@@ -148,4 +157,15 @@
New()
src.imp = new /obj/item/weapon/implant/freedom( src )
..()
+ return
+
+/obj/item/weapon/implantcase/adrenaline
+ name = "Glass Case- 'Adrenaline'"
+ desc = "A glass case containing an adrenaline implant."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "implantcase-b"
+
+ New()
+ src.imp = new /obj/item/weapon/implant/adrenalin( src )
+ ..()
return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 423ab379253..f0cad339826 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -6,16 +6,23 @@
throw_speed = 1
throw_range = 5
w_class = 2.0
+ origin_tech = "materials=1;biotech=3;programming=2"
var/obj/item/weapon/implant/imp = null
+/obj/item/weapon/implanter/New()
+ ..()
+ update()
+
/obj/item/weapon/implanter/proc/update()
/obj/item/weapon/implanter/update()
if (src.imp)
src.icon_state = "implanter1"
+ src.origin_tech = src.imp.origin_tech
else
src.icon_state = "implanter0"
+ src.origin_tech = initial(src.origin_tech)
return
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index 9b225ac70fc..68497e500b7 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -5,12 +5,12 @@
desc = "Use this to escape from those evil Red Shirts."
_color = "r"
var/activation_emote = "chuckle"
- var/uses = 1.0
+ origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4"
+ var/uses = 4
New()
src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
- src.uses = rand(1, 5)
..()
return
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 05b50b49b03..6e7fac76a6c 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -1,6 +1,7 @@
/obj/item/weapon/implant/uplink
name = "uplink"
desc = "Summon things."
+ origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5"
var/activation_emote = "chuckle"
/obj/item/weapon/implant/uplink/New()
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index db1f078e034..f1980d417c2 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -40,7 +40,7 @@
if(!istype(M))
return ..()
- if(user.a_intent != "help")
+ if(user.a_intent != I_HELP)
if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
if((CLUMSY in user.mutations) && prob(50))
M = user
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 4a57227afa0..2e59a30fb9c 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -231,19 +231,63 @@
max_combined_w_class = 27
slowdown = 1
-/obj/item/weapon/storage/backpack/duffel/syndimed
+/obj/item/weapon/storage/backpack/duffel/syndie
+ name = "suspicious looking dufflebag"
+ desc = "A large dufflebag for holding extra tactical supplies."
+ icon_state = "duffel-syndi"
+ item_state = "duffel-syndimed"
+ origin_tech = "syndicate=1"
+ silent = 1
+ slowdown = 0
+
+/obj/item/weapon/storage/backpack/duffel/syndie/med
name = "suspicious duffelbag"
desc = "A black and red duffelbag with a red and white cross sewn onto it."
icon_state = "duffel-syndimed"
item_state = "duffel-syndimed"
- slowdown = 0
-/obj/item/weapon/storage/backpack/duffel/syndiammo
+/obj/item/weapon/storage/backpack/duffel/syndie/ammo
name = "suspicious duffelbag"
desc = "A black and red duffelbag with a patch depicting shotgun shells sewn onto it."
icon_state = "duffel-syndiammo"
item_state = "duffel-syndiammo"
- slowdown = 0
+
+/obj/item/weapon/storage/backpack/duffel/syndie/ammo/loaded
+ desc = "A large dufflebag, packed to the brim with Bulldog shotgun ammo."
+
+/obj/item/weapon/storage/backpack/duffel/syndie/ammo/loaded/New()
+ ..()
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g(src)
+ new /obj/item/ammo_box/magazine/m12g/buckshot(src)
+ new /obj/item/ammo_box/magazine/m12g/stun(src)
+ new /obj/item/ammo_box/magazine/m12g/dragon(src)
+
+/obj/item/weapon/storage/backpack/duffel/syndie/surgery
+ name = "surgery dufflebag"
+ desc = "A suspicious looking dufflebag for holding surgery tools."
+ icon_state = "duffel-syndimed"
+ item_state = "duffle-syndimed"
+ storage_slots = 12
+
+/obj/item/weapon/storage/backpack/duffel/syndie/surgery/New()
+ ..()
+ new /obj/item/weapon/scalpel(src)
+ new /obj/item/weapon/hemostat(src)
+ new /obj/item/weapon/retractor(src)
+ new /obj/item/weapon/circular_saw(src)
+ new /obj/item/weapon/surgicaldrill(src)
+ new /obj/item/weapon/cautery(src)
+ new /obj/item/weapon/bonegel(src)
+ new /obj/item/weapon/bonesetter(src)
+ new /obj/item/weapon/FixOVein(src)
+ new /obj/item/clothing/suit/straight_jacket(src)
+ new /obj/item/clothing/mask/muzzle(src)
+// new /obj/item/device/mmi/syndie(src)
/obj/item/weapon/storage/backpack/duffel/captain
name = "captain's duffelbag"
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 8fc0a74cf9c..5d92705d1ed 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -98,6 +98,7 @@
"/obj/item/clothing/mask/surgical",
"/obj/item/clothing/gloves/color/latex",
"/obj/item/weapon/reagent_containers/hypospray/autoinjector",
+ "/obj/item/device/rad_laser",
"/obj/item/device/sensor_device"
)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index a8551e96fd6..65bf38cd961 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -9,6 +9,7 @@
name = "storage"
icon = 'icons/obj/storage.dmi'
w_class = 3.0
+ var/silent = 0 // No message on putting items in
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set)
@@ -292,6 +293,8 @@
if(!usr.unEquip(W))
return 0
usr.update_icons() //update our overlays
+ if(silent)
+ prevent_warning = 1
W.loc = src
W.on_enter_storage(src)
if(usr)
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index de1e1522a6b..51adfcd5a4c 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -77,6 +77,7 @@
icon_state = "syndicate"
item_state = "toolbox_syndi"
origin_tech = "combat=1;syndicate=1"
+ silent = 1
force = 15.0
throwforce = 18.0
@@ -88,4 +89,4 @@
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
- new /obj/item/clothing/gloves/color/red/insulated(src)
\ No newline at end of file
+ new /obj/item/clothing/gloves/combat(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 09fa9b17db8..d676b3ba967 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -207,4 +207,18 @@
new /obj/item/weapon/grenade/chem_grenade/tabungas(src)
new /obj/item/weapon/grenade/chem_grenade/tabungas(src)
new /obj/item/weapon/grenade/chem_grenade/tabungas(src)
- new /obj/item/weapon/grenade/chem_grenade/tabungas(src)
\ No newline at end of file
+ new /obj/item/weapon/grenade/chem_grenade/tabungas(src)
+
+/obj/item/weapon/storage/box/syndie_kit/bioterror
+ name = "bioterror syringe box"
+
+ New()
+ ..()
+ new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
+ new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
+ new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
+ new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
+ new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
+ new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
+ new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 7273b9e107c..1416602d4fd 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -117,7 +117,7 @@
var/mob/living/L = M
- if(user.a_intent != "harm")
+ if(user.a_intent != I_HARM)
if(status)
user.do_attack_animation(L)
baton_stun(L, user)
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index d0619606d57..66683b26abe 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -126,7 +126,7 @@
return
if(!isliving(target))
return
- if (user.a_intent == "harm")
+ if (user.a_intent == I_HARM)
if(!..()) return
if(!isrobot(target)) return
else
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 5755d94f7c8..af98d810510 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -83,7 +83,7 @@
return
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M) || user.a_intent == "help")
+ if(!istype(M) || user.a_intent == I_HELP)
return ..()
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
return ..()
@@ -475,7 +475,7 @@
if (!S)
return
- if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help" || S.open == 2)
+ if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2)
return ..()
if(S.brute_dam)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 78e90703b9e..c410617775c 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -37,6 +37,7 @@
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/fingerless(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
+ new /obj/item/weapon/mining_voucher(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/clothing/mask/gas(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index f62f03b175a..5f21f2d0c84 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -43,8 +43,7 @@
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/weapon/storage/box/teargas(src)
new /obj/item/weapon/storage/box/flashbangs(src)
- new /obj/item/weapon/storage/backpack/duffel/syndimed(src)
- new /obj/item/weapon/storage/backpack/duffel/syndiammo(src)
+ new /obj/item/weapon/storage/backpack/duffel/syndie/med(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 0e34ed14e68..5b5109a8b9c 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -195,7 +195,7 @@
circuit=null
new /obj/machinery/constructable_frame/machine_frame(T)
qdel(src)
- if(user.a_intent == "harm")
+ if(user.a_intent == I_HARM)
src.health -= W.force
src.healthcheck()
..()
@@ -219,7 +219,7 @@
src.add_fingerprint(user)
update_icon()
else
- if(user.a_intent == "harm")
+ if(user.a_intent == I_HARM)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("\red [user.name] kicks \the [src]!", \
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 10898e80a47..f1eca747755 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -12,7 +12,7 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/choice = input(user, "Underwear or Undershirt?", "Changing") as null|anything in list("Underwear","Undershirt")
+ var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks")
if(!Adjacent(user))
return
@@ -27,5 +27,11 @@
if(new_undershirt)
H.undershirt = new_undershirt
+ if("Socks")
+ var/new_socks = input(user, "Select your socks", "Changing") as null|anything in socks_list
+ if(new_socks)
+ H.socks= new_socks
+
+
add_fingerprint(H)
H.update_body()
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index 956bc6d7d07..4af9b504ed3 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -133,7 +133,7 @@
..()
if(!buckled_mob) return
- if(propelled || (pulling && (pulling.a_intent == "harm")))
+ if(propelled || (pulling && (pulling.a_intent == I_HARM)))
var/mob/living/occupant = buckled_mob
unbuckle()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index ae88b3b38f8..7c973eed7ec 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -299,8 +299,8 @@
user.do_attack_animation(src)
visible_message("[user] slices [src] apart!")
destroy()
-
-/obj/structure/table/mech_melee_attack(obj/mecha/M)
+
+/obj/structure/table/mech_melee_attack(obj/mecha/M)
visible_message("[M] smashes [src] apart!")
destroy()
@@ -402,7 +402,7 @@
if (istype(G.affecting, /mob/living))
var/mob/living/M = G.affecting
if (G.state < 2)
- if(user.a_intent == "harm")
+ if(user.a_intent == I_HARM)
if (prob(15)) M.Weaken(5)
M.apply_damage(8,def_zone = "head")
visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!")
@@ -914,8 +914,8 @@
visible_message("[user] smashes [src] apart!")
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
destroy()
-
-/obj/structure/rack/mech_melee_attack(obj/mecha/M)
+
+/obj/structure/rack/mech_melee_attack(obj/mecha/M)
visible_message("[M] smashes [src] apart!")
destroy()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index f04ce3ab802..02aed69966e 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -119,7 +119,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("[user] smashes through [src]!")
destroy()
- else if (usr.a_intent == "harm")
+ else if (usr.a_intent == I_HARM)
user.changeNext_move(CLICK_CD_MELEE)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
usr.visible_message("\red [usr.name] bangs against the [src.name]!", \
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 1574e440a23..dc67751f667 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -149,6 +149,11 @@ var/list/mechtoys = list(
var/points_per_slip = 2
var/points_per_crate = 5
var/points_per_plasma = 5
+ var/points_per_intel = 250 //points gained per intel returned
+ var/points_per_design = 25 //points gained per max reliability research design returned (only for initilally unreliable designs)
+
+ var/list/techLevels = list()
+ var/list/researchDesigns = list()
//control
var/ordernum
var/list/shoppinglist = list()
@@ -201,6 +206,7 @@ var/list/mechtoys = list(
if(!area_shuttle) return
var/plasma_count = 0
+ var/intel_count = 0
for(var/atom/movable/MA in area_shuttle)
if(MA.anchored) continue
@@ -222,10 +228,37 @@ var/list/mechtoys = list(
find_slip = 0
// Sell plasma
- else if(istype(A, /obj/item/stack/sheet/mineral/plasma))
+ if(istype(A, /obj/item/stack/sheet/mineral/plasma))
var/obj/item/stack/sheet/mineral/plasma/P = A
plasma_count += P.amount
+ // Sell syndicate intel
+ if(istype(A, /obj/item/documents/syndicate))
+ ++intel_count
+
+ // Sell tech levels
+ if(istype(A, /obj/item/weapon/disk/tech_disk))
+ var/obj/item/weapon/disk/tech_disk/disk = A
+ if(!disk.stored) continue
+ var/datum/tech/tech = disk.stored
+
+ var/cost = tech.getCost(techLevels[tech.id])
+ if(cost)
+ techLevels[tech.id] = tech.level
+ points += cost
+
+ // Sell max reliablity designs
+ if(istype(A, /obj/item/weapon/disk/design_disk))
+ var/obj/item/weapon/disk/design_disk/disk = A
+ if(!disk.blueprint) continue
+ var/datum/design/design = disk.blueprint
+ if(design.id in researchDesigns) continue
+
+ if(initial(design.reliability) < 100 && design.reliability >= 100)
+ // Maxed out reliability designs only.
+ points += points_per_design
+ researchDesigns += design.id
+
// If you send something in a crate, centcom's keeping it! - fixes secure crates being sent to centom to open them
qdel(A)
qdel(MA)
@@ -233,6 +266,9 @@ var/list/mechtoys = list(
if(plasma_count)
points += plasma_count * points_per_plasma
+ if(intel_count)
+ points += intel_count * points_per_intel
+
//Buyin
/datum/controller/supply/proc/buy()
if(!shoppinglist.len) return
@@ -326,12 +362,12 @@ var/list/mechtoys = list(
// data to send to ui
var/data[0]
data["last_viewed_group"] = last_viewed_group
-
+
var/category_list[0]
for(var/category in all_supply_groups)
category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category)))
data["categories"] = category_list
-
+
var/cat = text2num(last_viewed_group)
var/packs_list[0]
for(var/set_name in supply_controller.supply_packs)
@@ -339,7 +375,7 @@ var/list/mechtoys = list(
if(!pack.contraband && !pack.hidden && pack.group == cat)
// 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name))))
-
+
data["supply_packs"] = packs_list
if(content_pack)
var/pack_name = sanitize(content_pack.name)
@@ -358,19 +394,19 @@ var/list/mechtoys = list(
owned = 1
requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "owned" = owned, "command1" = list("rreq" = SO.ordernum))))
data["requests"] = requests_list
-
+
var/orders_list[0]
for(var/set_name in supply_controller.shoppinglist)
var/datum/supply_order/SO = set_name
if(SO)
orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby)))
data["orders"] = orders_list
-
+
data["points"] = supply_controller.points
data["send"] = list("send" = 1)
-
+
var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
- data["moving"] = shuttle.has_arrive_time()
+ data["moving"] = shuttle.has_arrive_time()
data["at_station"] = shuttle.at_station()
data["timeleft"] = shuttle.eta_minutes()
if(shuttle.docking_controller)
@@ -391,7 +427,7 @@ var/list/mechtoys = list(
visible_message("[src]'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
nanomanager.update_uis(src)
return
-
+
var/index = copytext(href_list["doorder"], 1, lentext(href_list["doorder"])) //text2num(copytext(href_list["doorder"], 1))
var/multi = text2num(copytext(href_list["doorder"], -1))
if(!isnum(multi))
@@ -402,15 +438,15 @@ var/list/mechtoys = list(
var/crates = 1
if(multi)
var/num_input = input(usr, "Amount:", "How many crates?", "") as num
- crates = Clamp(round(text2num(num_input)), 1, 20)
+ crates = Clamp(round(text2num(num_input)), 1, 20)
if(..())
return
var/timeout = world.time + 600
var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN))
- if(world.time > timeout || !reason || ..())
+ if(world.time > timeout || !reason || ..())
return
-
+
var/idname = "*None Provided*"
var/idrank = "*None Provided*"
if(ishuman(usr))
@@ -461,7 +497,7 @@ var/list/mechtoys = list(
else if (href_list["last_viewed_group"])
content_pack = null
last_viewed_group = text2num(href_list["last_viewed_group"])
-
+
else if (href_list["contents"])
var/topic = href_list["contents"]
if(topic == 1)
@@ -475,8 +511,8 @@ var/list/mechtoys = list(
return
/obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob)
- return attack_hand(user)
-
+ return attack_hand(user)
+
/obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob)
if(!allowed(user) && !isobserver(user))
user << "Access denied."
@@ -491,17 +527,17 @@ var/list/mechtoys = list(
user << "Special supplies unlocked."
hacked = 1
return
-
+
/obj/machinery/computer/supplycomp/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
// data to send to ui
var/data[0]
data["last_viewed_group"] = last_viewed_group
-
+
var/category_list[0]
for(var/category in all_supply_groups)
category_list.Add(list(list("name" = get_supply_group_name(category), "category" = category)))
- data["categories"] = category_list
-
+ data["categories"] = category_list
+
var/cat = text2num(last_viewed_group)
var/packs_list[0]
for(var/set_name in supply_controller.supply_packs)
@@ -510,14 +546,14 @@ var/list/mechtoys = list(
if(pack.group == cat)
// 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name))))
-
+
data["supply_packs"] = packs_list
if(content_pack)
var/pack_name = sanitize(content_pack.name)
data["contents_name"] = pack_name
data["contents"] = content_pack.manifest
data["contents_access"] = get_access_desc(content_pack.access)
-
+
var/requests_list[0]
for(var/set_name in supply_controller.requestlist)
var/datum/supply_order/SO = set_name
@@ -526,19 +562,19 @@ var/list/mechtoys = list(
SO.comment = "No comment."
requests_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment, "command1" = list("confirmorder" = SO.ordernum), "command2" = list("rreq" = SO.ordernum))))
data["requests"] = requests_list
-
+
var/orders_list[0]
for(var/set_name in supply_controller.shoppinglist)
var/datum/supply_order/SO = set_name
if(SO)
orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment)))
data["orders"] = orders_list
-
+
data["points"] = supply_controller.points
data["send"] = list("send" = 1)
-
+
var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
- data["moving"] = shuttle.has_arrive_time()
+ data["moving"] = shuttle.has_arrive_time()
data["at_station"] = shuttle.at_station()
data["timeleft"] = shuttle.eta_minutes()
data["can_launch"] = shuttle.can_launch()
@@ -552,32 +588,32 @@ var/list/mechtoys = list(
ui = new(user, src, ui_key, "supply_console.tmpl", name, COMP_SCREEN_WIDTH, COMP_SCREEN_HEIGHT)
ui.set_initial_data(data)
ui.open()
-
+
/obj/machinery/computer/supplycomp/proc/is_authorized(user)
if(allowed(user))
return 1
-
+
if(isobserver(user) && check_rights(R_ADMIN, 0))
return 1
-
+
return 0
/obj/machinery/computer/supplycomp/Topic(href, href_list)
if(..())
return 1
-
+
if(!is_authorized(usr))
return 1
-
+
if(!supply_controller)
log_to_dd("## ERROR: The supply_controller controller datum is missing somehow.")
return 1
-
+
var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if(!shuttle)
log_to_dd("## ERROR: The supply or shuttle datum is missing somehow.")
return 1
-
+
if(href_list["send"])
if(shuttle.at_station())
if (shuttle.forbidden_atoms_check())
@@ -610,18 +646,18 @@ var/list/mechtoys = list(
var/crates = 1
if(multi)
var/num_input = input(usr, "Amount:", "How many crates?", "") as num
- crates = Clamp(round(text2num(num_input)), 1, 20)
+ crates = Clamp(round(text2num(num_input)), 1, 20)
if(..())
- return
-
+ return
+
var/timeout = world.time + 600
var/reason = sanitize(copytext(input(usr,"Reason:","Why do you require this item?","") as null|text,1,MAX_MESSAGE_LEN))
- if(world.time > timeout || !reason || ..())
+ if(world.time > timeout || !reason || ..())
return
-
+
var/idname = "*None Provided*"
var/idrank = "*None Provided*"
-
+
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
idname = H.get_authentification_name()
@@ -657,7 +693,7 @@ var/list/mechtoys = list(
O.orderedby = idname
O.comment = reason
supply_controller.requestlist += O
-
+
else if(href_list["confirmorder"])
//Find the correct supply_order datum
var/ordernum = text2num(href_list["confirmorder"])
@@ -675,7 +711,7 @@ var/list/mechtoys = list(
else
usr << "There are insufficient supply points for this request."
break
-
+
else if (href_list["rreq"])
var/ordernum = text2num(href_list["rreq"])
for(var/i=1, i<=supply_controller.requestlist.len, i++)
@@ -686,8 +722,8 @@ var/list/mechtoys = list(
else if (href_list["last_viewed_group"])
content_pack = null
- last_viewed_group = text2num(href_list["last_viewed_group"])
-
+ last_viewed_group = text2num(href_list["last_viewed_group"])
+
else if (href_list["contents"])
var/topic = href_list["contents"]
if(topic == 1)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index fd3b7039386..c0b1aba0a61 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -153,6 +153,7 @@ var/list/admin_verbs_debug = list(
/client/proc/check_bomb_impacts,
/client/proc/test_movable_UI,
/client/proc/test_snap_UI,
+ /client/proc/cinematic,
/proc/machine_upgrade
)
var/list/admin_verbs_possess = list(
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 4dbd5be8f5d..32cd8fb90ba 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1833,6 +1833,8 @@
stampvalue = "cent"
sendername = command_name()
if("Syndicate")
+ stamptype = "icon"
+ stampvalue = "syndicate"
sendername = "UNKNOWN"
if("Administrator")
stamptype = input(src.owner, "Pick a stamp type.", "Stamp Type") as null|anything in list("icon","text","none")
@@ -1904,8 +1906,9 @@
else
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
if((F.z in config.station_levels))
- if(!F.receivefax(P))
- src.owner << "\red Message transmission to [F.department] failed."
+ spawn(0)
+ if(!F.receivefax(P))
+ src.owner << "\red Message transmission to [F.department] failed."
var/datum/fax/admin/A = new /datum/fax/admin()
A.name = P.name
@@ -1923,7 +1926,7 @@
src.owner << "\blue Message transmitted successfully."
if(notify == "Yes")
var/mob/living/carbon/human/H = sender
- if(istype(H) && H.stat == 1 && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
+ if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset)))
sender << "Your headset pings, notifying you that a reply to your fax has arrived."
if(sender)
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]")
diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm
index e78dfcf1bd5..570d73e19a8 100644
--- a/code/modules/admin/verbs/cinematic.dm
+++ b/code/modules/admin/verbs/cinematic.dm
@@ -1,8 +1,7 @@
/client/proc/cinematic(var/cinematic as anything in list("explosion",null))
- set name = "cinematic"
- set category = "Event"
- set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
- set hidden = 1
+ set name = "Play cinematic"
+ set category = "Debug"
+ set desc = "Shows a cinematic, will work like a normal nuke" // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
if(alert("Are you sure you want to run [cinematic]?","Confirmation","Yes","No")=="No") return
if(!ticker) return
switch(cinematic)
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
new file mode 100644
index 00000000000..f1a3f402336
--- /dev/null
+++ b/code/modules/assembly/health.dm
@@ -0,0 +1,104 @@
+/obj/item/device/assembly/health
+ name = "health sensor"
+ desc = "Used for scanning and monitoring health."
+ icon_state = "health"
+ materials = list(MAT_METAL=800, MAT_GLASS=200)
+ origin_tech = "magnets=1;biotech=1"
+ secured = 0
+
+ var/scanning = 0
+ var/health_scan
+ var/alarm_health = 0
+
+
+
+/obj/item/device/assembly/health/activate()
+ if(!..()) return 0//Cooldown check
+ toggle_scan()
+ return 0
+
+/obj/item/device/assembly/health/toggle_secure()
+ secured = !secured
+ if(secured && scanning)
+ processing_objects.Add(src)
+ else
+ scanning = 0
+ processing_objects.Remove(src)
+ update_icon()
+ return secured
+
+/obj/item/device/assembly/health/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/device/multitool))
+ if(alarm_health == 0)
+ alarm_health = -90
+ user.show_message("You toggle [src] to \"detect death\" mode.")
+ else
+ alarm_health = 0
+ user.show_message("You toggle [src] to \"detect critical state\" mode.")
+ return
+ else
+ return ..()
+
+/obj/item/device/assembly/health/process()
+ if(!scanning || !secured)
+ return
+
+ var/atom/A = src
+ if(connected && connected.holder)
+ A = connected.holder
+
+ for(A, A && !ismob(A), A=A.loc);
+ // like get_turf(), but for mobs.
+ var/mob/living/M = A
+
+ if(M)
+ health_scan = M.health
+ if(health_scan <= alarm_health)
+ pulse()
+ audible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ toggle_scan()
+ return
+ return
+
+/obj/item/device/assembly/health/proc/toggle_scan()
+ if(!secured) return 0
+ scanning = !scanning
+ if(scanning)
+ processing_objects.Add(src)
+ else
+ processing_objects.Remove(src)
+ return
+
+/obj/item/device/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
+ if(!secured)
+ user.show_message("The [name] is unsecured!")
+ return 0
+ var/dat = text("Health Sensor [scanning?"On":"Off"]")
+ if(scanning && health_scan)
+ dat += "
Health: [health_scan]"
+ user << browse(dat, "window=hscan")
+ onclose(user, "hscan")
+ return
+
+
+/obj/item/device/assembly/health/Topic(href, href_list)
+ ..()
+ if(!ismob(usr))
+ return
+
+ var/mob/user = usr
+
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ usr << browse(null, "window=hscan")
+ onclose(usr, "hscan")
+ return
+
+ if(href_list["scanning"])
+ toggle_scan()
+
+ if(href_list["close"])
+ usr << browse(null, "window=hscan")
+ return
+
+ attack_self(user)
+ return
\ No newline at end of file
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 1376f088aea..cc97f6193f7 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -183,8 +183,8 @@
if(!prefs.unlock_content)
src << "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Click here to find out more."
return 0
- return 1
-
+ return 1
+
/client/proc/handle_spam_prevention(var/message, var/mute_type)
if(config.automute_on && !holder && src.last_message == message)
src.last_message_count++
@@ -330,8 +330,8 @@
related_accounts_cid = list()
while(query_cid.NextRow())
if(ckey != query_cid.item[1])
- related_accounts_cid.Add("[query_cid.item[1]]")
-
+ related_accounts_cid.Add("[query_cid.item[1]]")
+
//Log all the alts
if(related_accounts_cid.len)
log_access("Alts: [key_name(src)]:[list2text(related_accounts_cid, " - ")]")
@@ -339,8 +339,8 @@
var/watchreason = check_watchlist(sql_ckey)
if(watchreason)
message_admins("Notice: [key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]")
- send2irc_adminless_only("Watchlist", "[key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]")
-
+ send2irc_adminless_only("Watchlist", "[key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]")
+
//Just the standard check to see if it's actually a number
if(sql_id)
if(istext(sql_id))
@@ -389,6 +389,15 @@
'html/search.js', // Used in various non-NanoUI HTML windows for search functionality
'html/panels.css' // Used for styling certain panels, such as in the new player panel
)
-
+
// Send NanoUI resources to this client
spawn nanomanager.send_resources(src)
+
+//For debugging purposes
+/client/proc/list_all_languages()
+ for(var/L in all_languages)
+ var/datum/language/lang = all_languages[L]
+ var/message = "[lang.name] : [lang.type]"
+ if(lang.flags & RESTRICTED)
+ message += " (RESTRICTED)"
+ world << "[message]"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 338d57dd616..37e2f588fc3 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -108,6 +108,7 @@ datum/preferences
var/b_type = "A+" //blood type (not-chooseable)
var/underwear = "Nude" //underwear type
var/undershirt = "Nude" //undershirt type
+ var/socks = "Nude" //socks type
var/backbag = 2 //backpack type
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
@@ -185,17 +186,17 @@ datum/preferences
// jukebox volume
var/volume = 100
-
+
// BYOND membership
var/unlock_content = 0
-
+
/datum/preferences/New(client/C)
b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
if(istype(C))
if(!IsGuestKey(C.key))
unlock_content = C.IsByondMember()
if(unlock_content)
- max_save_slots = MAX_SAVE_SLOTS_MEMBER
+ max_save_slots = MAX_SAVE_SLOTS_MEMBER
var/loaded_preferences_successfully = load_preferences(C)
if(loaded_preferences_successfully)
if(load_character(C))
@@ -331,6 +332,7 @@ datum/preferences
dat += "
"
dat += "Underwear:
[underwear]
"
dat += "Undershirt:
[undershirt]
"
+ dat += "Socks:
[socks]
"
dat += "Backpack Type:
[backbaglist[backbag]]
"
dat += "Nanotrasen Relation:
[nanotrasen_relation]
"
dat += "Preview
  | "
@@ -385,7 +387,7 @@ datum/preferences
dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
"
if(config.allow_Metadata)
dat += "OOC notes: Edit
"
-
+
if(user.client)
if(user.client.holder)
dat += "Adminhelp sound: "
@@ -393,7 +395,7 @@ datum/preferences
if(check_rights(R_ADMIN,0))
dat += "OOC: Change
"
-
+
if(unlock_content)
dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
"
@@ -1010,6 +1012,9 @@ datum/preferences
if("undershirt")
undershirt = random_undershirt(gender)
ShowChoices(user)
+ if("socks")
+ socks = random_socks(gender)
+ ShowChoices(user)
if("eyes")
r_eyes = rand(0,255)
g_eyes = rand(0,255)
@@ -1210,6 +1215,22 @@ datum/preferences
undershirt = new_undershirt
ShowChoices(user)
+ if("socks")
+ var/list/valid_sockstyles = list()
+ for(var/sockstyle in socks_list)
+ var/datum/sprite_accessory/S = socks_list[sockstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_sockstyles[sockstyle] = socks_list[sockstyle]
+ var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
+ ShowChoices(user)
+ if(new_socks)
+ socks = new_socks
+
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null
if(new_eyes)
@@ -1360,7 +1381,7 @@ datum/preferences
if("publicity")
if(unlock_content)
toggles ^= MEMBER_PUBLIC
-
+
if("gender")
if(gender == MALE)
gender = FEMALE
@@ -1548,6 +1569,7 @@ datum/preferences
character.underwear = underwear
character.undershirt = undershirt
+ character.socks = socks
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm
index 96e51448c6d..8470ece80a9 100644
--- a/code/modules/client/preferences_mysql.dm
+++ b/code/modules/client/preferences_mysql.dm
@@ -149,6 +149,9 @@
nanotrasen_relation = query.item[52]
speciesprefs = text2num(query.item[53])
+ //socks
+ socks = query.item[54]
+
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
@@ -196,6 +199,9 @@
disabilities = sanitize_integer(disabilities, 0, 65535, initial(disabilities))
be_special = sanitize_integer(be_special, 0, 65535, initial(be_special))
+ socks = sanitize_text(socks, initial(socks))
+
+
// if(isnull(disabilities)) disabilities = 0
if(!player_alt_titles) player_alt_titles = new()
if(!organ_data) src.organ_data = list()
@@ -267,7 +273,8 @@
organ_data='[organlist]',
rlimb_data='[rlimblist]',
nanotrasen_relation='[nanotrasen_relation]',
- speciesprefs='[speciesprefs]'
+ speciesprefs='[speciesprefs]',
+ socks='[socks]'
WHERE ckey='[C.ckey]'
AND slot='[default_slot]'"}
)
@@ -295,7 +302,7 @@
job_karma_high, job_karma_med, job_karma_low,
flavor_text, med_record, sec_record, gen_record,
player_alt_titles, be_special,
- disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs)
+ disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks)
VALUES
('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]',
'[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]',
@@ -312,7 +319,7 @@
'[job_karma_high]', '[job_karma_med]', '[job_karma_low]',
'[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]',
'[playertitlelist]', '[be_special]',
- '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]')
+ '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]','[socks]')
"}
)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 8e1c0e12964..f1dd7b307f3 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -141,6 +141,7 @@
S["eyes_blue"] >> b_eyes
S["underwear"] >> underwear
S["undershirt"] >> undershirt
+ S["socks"] >> socks
S["backbag"] >> backbag
S["b_type"] >> b_type
S["accent"] >> accent
@@ -203,6 +204,7 @@
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear))
undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt))
+ socks = sanitize_integer(socks,1 socks_t.len, initial(socks))
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
b_type = sanitize_text(b_type, initial(b_type))
accent = sanitize_text(accent, initial(accent))
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 993ec11e7c1..c24d307a01b 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -371,6 +371,10 @@ BLIND // can't see anything
permeability_coefficient = 0.90
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/uniform.dmi'
+ )
var/has_sensor = 1//For the crew computer 2 = unable to change mode
var/sensor_mode = 0
/*
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index 49181471fe8..b3c5d19b6d7 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -353,7 +353,7 @@
user << "You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight."
name = "blood-red hardsuit helmet (combat)"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
- flags = BLOCKHAIR
+ flags = BLOCKHAIR | THICKMATERIAL
flags_inv = HIDEEARS
cold_protection = null
set_light(0)
@@ -393,7 +393,7 @@
name = "blood-red hardsuit helmet (combat)"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
slowdown = 0
- flags = BLOCKHAIR
+ flags = THICKMATERIAL
flags_inv = null
cold_protection = null
@@ -450,7 +450,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
slowdown = 1
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/device/rad_laser)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
//Security
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 4b754f9483c..097955805c2 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/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)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10)
species_fit = list("Vox")
sprite_sheets = list(
@@ -23,7 +23,7 @@
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/radio, /obj/item/weapon/tank/emergency_oxygen)
+ /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)
//Botonist
@@ -278,7 +278,7 @@
item_state = "fr_jacket"
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/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)
verb/toggle()
set name = "Toggle Jacket Buttons"
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 14aa7594855..bad3378da22 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -5,7 +5,7 @@
item_state = "labcoat"
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/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper)
+ 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/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/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index ba2e2f7f723..2f6fb17f314 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -80,7 +80,7 @@
/obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user)
if(ishuman(M) && isliving(user))
- if(user.a_intent == "help")
+ if(user.a_intent == I_HELP)
var/body_part = parse_zone(user.zone_sel.selecting)
if(body_part)
var/their = "their"
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index 0417a8ce0c5..06e13d50ed0 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -52,7 +52,7 @@
if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj))
user << "You need an empty hand to draw the [holstered]!"
else
- if(user.a_intent == "hurt")
+ if(user.a_intent == I_HARM)
usr.visible_message("\red [user] draws the [holstered], ready to shoot!", \
"You draw the [holstered], ready to shoot!")
else
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 45b4b4b618e..eca864123c5 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -1,9 +1,5 @@
/obj/item/clothing/under/color
desc = "A standard issue colored jumpsuit. Variety is the spice of life!"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/color/random/New()
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index ece479485c3..9d7b74e9e82 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -7,10 +7,6 @@
item_state = "ba_suit"
_color = "ba_suit"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"."
@@ -19,11 +15,6 @@
item_state = "caparmor"
_color = "captain"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
-
/obj/item/clothing/under/rank/cargo
name = "quartermaster's jumpsuit"
@@ -32,10 +23,6 @@
item_state = "lb_suit"
_color = "qm"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/cargotech
@@ -45,10 +32,6 @@
item_state = "lb_suit"
_color = "cargo"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/chaplain
@@ -58,11 +41,6 @@
item_state = "bl_suit"
_color = "chapblack"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
-
/obj/item/clothing/under/rank/chef
desc = "It's an apron which is given only to the most hardcore chefs in space."
@@ -70,11 +48,6 @@
icon_state = "chef"
_color = "chef"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
-
/obj/item/clothing/under/rank/clown
name = "clown suit"
@@ -92,10 +65,6 @@
item_state = "b_suit"
_color = "hop"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/head_of_personnel_whimsy
desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does."
@@ -113,11 +82,6 @@
_color = "hydroponics"
permeability_coefficient = 0.50
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
-
/obj/item/clothing/under/rank/internalaffairs
desc = "The plain, professional attire of an Internal Affairs Agent. The collar is immaculately starched."
@@ -126,10 +90,6 @@
item_state = "internalaffairs"
_color = "internalaffairs"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/ntrep
desc = "A well-ironed dress shirt and matching set of black pants."
@@ -138,11 +98,6 @@
item_state = "internalaffairs"
_color = "internalaffairs"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
-
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
@@ -151,10 +106,6 @@
_color = "janitor"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/lawyer
@@ -166,37 +117,21 @@
icon_state = "lawyer_black"
item_state = "lawyer_black"
_color = "lawyer_black"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/lawyer/female
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
_color = "black_suit_fem"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/lawyer/red
icon_state = "lawyer_red"
item_state = "lawyer_red"
_color = "lawyer_red"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/lawyer/blue
icon_state = "lawyer_blue"
item_state = "lawyer_blue"
_color = "lawyer_blue"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/lawyer/bluesuit
name = "Blue Suit"
@@ -204,20 +139,12 @@
icon_state = "bluesuit"
item_state = "bluesuit"
_color = "bluesuit"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/lawyer/purpsuit
name = "Purple Suit"
icon_state = "lawyer_purp"
item_state = "lawyer_purp"
_color = "lawyer_purp"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/lawyer/oldman
name = "Old Man's Suit"
@@ -225,10 +152,6 @@
icon_state = "oldman"
item_state = "oldman"
_color = "oldman"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/librarian
@@ -238,11 +161,6 @@
item_state = "red_suit"
_color = "red_suit"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
-
/obj/item/clothing/under/mime
name = "mime's outfit"
@@ -260,14 +178,10 @@
item_state = "miner"
_color = "miner"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/barber
desc = "It's a barber's uniform."
name = "barber's uniform"
icon_state = "barber"
item_state = "barber"
- _color = "barber"
\ No newline at end of file
+ _color = "barber"
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 75e8f01d7e9..c190e31c95b 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -7,10 +7,6 @@
_color = "chief"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
@@ -19,10 +15,6 @@
item_state = "atmos_suit"
_color = "atmos"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
@@ -32,10 +24,6 @@
_color = "engine"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
@@ -44,14 +32,10 @@
item_state = "robotics"
_color = "robotics"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/mechanic
desc = "It's a pair of overalls worn by mechanics."
name = "mechanic's overalls"
icon_state = "mechanic"
item_state = "mechanic"
- _color = "mechanic"
\ No newline at end of file
+ _color = "mechanic"
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index 93baad2f1a4..b5895bc9d26 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -9,10 +9,6 @@
_color = "director"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/scientist
desc = "It's made of a special fiber that provides minor protection against biohazards. It has markings that denote the wearer as a scientist."
@@ -23,10 +19,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/chemist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
@@ -37,10 +29,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/*
* Medical
@@ -54,10 +42,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
@@ -68,10 +52,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
@@ -82,10 +62,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
@@ -96,10 +72,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/nurse
desc = "A dress commonly worn by the nursing staff in the medical department."
@@ -110,10 +82,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/orderly
desc = "A white suit to be worn by orderly people who love orderly things."
@@ -124,10 +92,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/medical
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
@@ -138,10 +102,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/medical/blue
name = "medical scrubs"
@@ -149,10 +109,6 @@
icon_state = "scrubsblue"
_color = "scrubsblue"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/medical/green
name = "medical scrubs"
@@ -160,10 +116,6 @@
icon_state = "scrubsgreen"
_color = "scrubsgreen"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/medical/purple
name = "medical scrubs"
@@ -171,10 +123,6 @@
icon_state = "scrubspurple"
_color = "scrubspurple"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/medical/mortician
name = "coroner's scrubs"
@@ -182,10 +130,6 @@
icon_state = "scrubsblack"
_color = "scrubsblack"
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
//paramedic
/obj/item/clothing/under/rank/medical/paramedic
@@ -197,10 +141,6 @@
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10)
flags = ONESIZEFITSALL
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/obj/item/clothing/under/rank/psych
desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist."
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index b5d267dc017..0c73309342d 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -5,14 +5,6 @@
* Head of Security
*/
-/*
- * Making everything but the jackets fit Vox
- */
-/obj/item/clothing/under/rank
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/uniform.dmi'
- )
/*
* Security
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 39d551da13a..ffd38f192a8 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -209,7 +209,7 @@
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
- _color = "black_suit"
+ _color = "really_black_suit"
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
@@ -224,7 +224,6 @@
icon_state = "red_suit"
item_state = "r_suit"
_color = "red_suit"
- species_fit = list("Vox")
flags = ONESIZEFITSALL
/obj/item/clothing/under/suit_jacket/navy
@@ -563,17 +562,17 @@
_color = "vengine"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
-/obj/item/clothing/under/vox_toxins
+/obj/item/clothing/under/vox_sec
name = "Vox Security Jumpsuit"
- desc = "A Security Uniform ripped to better fit a vox."
+ desc = "A Security officer's jumpsuit ripped to better fit a vox."
icon_state = "vred"
item_state = "vred"
_color = "vred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-/obj/item/clothing/under/vox_toxins
+/obj/item/clothing/under/vox_chem
name = "Vox Chemist Jumpsuit"
- desc = "A Security Uniform ripped to better fit a vox."
+ desc = "A Chemist's jumpsuit ripped to better fit a vox."
icon_state = "vchem"
item_state = "vchem"
_color = "vchem"
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index f27a5c320a7..55a89f36789 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -491,7 +491,7 @@
/obj/machinery/fishtank/attack_animal(mob/living/simple_animal/M as mob)
if(istype(M, /mob/living/simple_animal/pet/cat))
- if(M.a_intent == "help") //Cats can try to fish in open tanks on help intent
+ if(M.a_intent == I_HELP) //Cats can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
M.visible_message("[M.name] stares at into \the [src] while sitting perfectly still.", "The lid is closed, so you stare into \the [src] intently.")
else
@@ -513,7 +513,7 @@
else
attack_generic(M, M.harm_intent_damage)
else if(istype(M, /mob/living/simple_animal/hostile/bear))
- if(M.a_intent == "help") //Bears can try to fish in open tanks on help intent
+ if(M.a_intent == I_HELP) //Bears can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
M.visible_message("[M.name] scrapes it's claws along \the [src]'s lid.", "The lid is closed, so you scrape your claws against \the [src]'s lid.")
else
@@ -533,7 +533,7 @@
else
if(M.melee_damage_upper > 0) //If the simple_animal has a melee_damage_upper defined, use that for the damage
attack_generic(M, M.melee_damage_upper)
- else if(M.a_intent == "harm") //Let any simple_animal try to break tanks when on harm intent
+ else if(M.a_intent == I_HARM) //Let any simple_animal try to break tanks when on harm intent
if(M.harm_intent_damage <= 0) return //If it doesn't do damage, don't bother with the attack
attack_generic(M, M.harm_intent_damage)
check_health()
@@ -553,7 +553,7 @@
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("[user] smashes through [src]!")
destroy()
- else if (usr.a_intent == "harm")
+ else if (usr.a_intent == I_HARM)
user.changeNext_move(CLICK_CD_MELEE)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
usr.visible_message("[usr.name] bangs against the [src.name]!", \
@@ -589,7 +589,7 @@
//Welders repair damaged tanks on help intent, damage on all others
if(istype(O, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = O
- if(user.a_intent == "help")
+ if(user.a_intent == I_HELP)
if(W.isOn())
if(cur_health < max_health)
usr << "You repair some of the cracks on \the [src]."
diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm
index 580f626bf47..0aabf6fb3ef 100644
--- a/code/modules/food/recipes_microwave.dm
+++ b/code/modules/food/recipes_microwave.dm
@@ -632,7 +632,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/mint
/datum/recipe/microwave/boiled_shrimp
- reagents = list("water" = 1)
+ reagents = list("water" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/shrimp
)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index f494d7336db..9f0f22f8bcc 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -294,7 +294,7 @@
if(user == M)
return ..()
- if(user.a_intent == "harm")
+ if(user.a_intent == I_HARM)
// This is being copypasted here because reagent_containers (WHY DOES FOOD DESCEND FROM THAT) overrides it completely.
// TODO: refactor all food paths to be less horrible and difficult to work with in this respect. ~Z
@@ -359,7 +359,7 @@
if(istype(user.loc,/turf/space))
return
- if(user.a_intent == "harm")
+ if(user.a_intent == I_HARM)
user.visible_message("\The [user] squashes \the [src]!")
seed.thrown_at(src,user)
sleep(-1)
diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm
index ae9df7bb702..808f4d1dc3a 100644
--- a/code/modules/lighting/light_source.dm
+++ b/code/modules/lighting/light_source.dm
@@ -11,9 +11,9 @@
var/lum_g
var/lum_b
- var/tmp/old_lum_r
- var/tmp/old_lum_g
- var/tmp/old_lum_b
+ var/tmp/applied_lum_r
+ var/tmp/applied_lum_g
+ var/tmp/applied_lum_b
var/list/effect_str
var/list/effect_turf
@@ -107,11 +107,6 @@
if(light_range && light_power && !applied)
. = 1
- if(. || source_atom.light_color != light_color)//Save the old lumcounts if we need to update, if the colour changed DO IT BEFORE we parse the colour and LOSE the old lumcounts!
- old_lum_r = lum_r
- old_lum_g = lum_g
- old_lum_b = lum_b
-
if(source_atom.light_color != light_color)
light_color = source_atom.light_color
parse_light_color()
@@ -149,6 +144,12 @@
/datum/light_source/proc/apply_lum()
applied = 1
+
+ // Cache the applied lum counts.
+ applied_lum_r = lum_r
+ applied_lum_g = lum_g
+ applied_lum_b = lum_b
+
if(istype(source_turf))
FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING)
if(T.lighting_overlay)
@@ -188,7 +189,7 @@
if(T.lighting_overlay)
var/str = effect_str[i]
- T.lighting_overlay.update_lumcount(-str * old_lum_r, -str * old_lum_g, -str * old_lum_b)
+ T.lighting_overlay.update_lumcount(-str * applied_lum_r, -str * applied_lum_g, -str * applied_lum_b)
i++
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 1bfe96094db..67eb53c2e0d 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -31,7 +31,7 @@
component_parts += new /obj/item/device/assembly/igniter(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
-
+
/obj/machinery/mineral/ore_redemption/upgraded/New()
..()
component_parts = list()
@@ -604,7 +604,7 @@
stop_automated_movement_when_pulled = 1
mouse_opacity = 1
faction = list("neutral")
- a_intent = "harm"
+ a_intent = I_HARM
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -668,7 +668,7 @@
SetCollectBehavior()
/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
- if(M.a_intent == "help")
+ if(M.a_intent == I_HELP)
switch(search_objects)
if(0)
SetCollectBehavior()
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 835e13f7104..937ee9d86d8 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -19,6 +19,7 @@
var/list/syllables // Used when scrambling text for a non-speaker.
var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string.
var/follow = 0 // Applies to HIVEMIND languages - should a follow link be included for dead mobs?
+ var/list/scramble_cache = list()
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4)
if(!syllables || !syllables.len)
@@ -38,9 +39,6 @@
return "[trim(full_name)]"
-/datum/language
- var/list/scramble_cache = list()
-
/datum/language/proc/scramble(var/input)
if(!syllables || !syllables.len)
@@ -247,7 +245,7 @@
flags = RESTRICTED | WHITELISTED
syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0")
-/datum/language/machine/get_random_name()
+/datum/language/trinary/get_random_name()
var/new_name
if(prob(70))
new_name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm
index 6c670bc7fe5..8d0c36bc05d 100644
--- a/code/modules/mob/living/carbon/alien/alien_defenses.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm
@@ -16,7 +16,7 @@ In all, this is a lot like the monkey code. /N
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
sleeping = max(0,sleeping-5)
resting = 0
AdjustParalysis(-3)
@@ -24,7 +24,7 @@ In all, this is a lot like the monkey code. /N
AdjustWeakened(-3)
visible_message("[M.name] nuzzles [src] trying to wake it up!")
- if ("grab")
+ if (I_GRAB)
src.grabbedby(M)
return 1
@@ -53,11 +53,11 @@ In all, this is a lot like the monkey code. /N
return 0 //this is horrible but 100% necessary
switch(M.a_intent)
- if("help")
+ if(I_HELP)
help_shake_act(M)
- if("grab")
+ if(I_GRAB)
src.grabbedby(M)
- if ("harm", "disarm")
+ if (I_HARM, I_DISARM)
return 1
return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index b88004e4a2d..19b3c07c8c6 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -198,13 +198,13 @@
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
help_shake_act(M)
- if ("grab")
+ if (I_GRAB)
grabbedby(M)
- if ("harm")
+ if (I_HARM)
M.do_attack_animation(src)
var/damage = rand(1, 9)
if (prob(90))
@@ -229,7 +229,7 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("[M] has attempted to punch [src]!")
- if ("disarm")
+ if (I_DISARM)
if (!lying)
if (prob(5))//Very small chance to push an alien down.
Paralyse(2)
@@ -265,7 +265,7 @@ In all, this is a lot like the monkey code. /N
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
sleeping = max(0,sleeping-5)
resting = 0
AdjustParalysis(-3)
@@ -291,7 +291,7 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/humanoid/attack_larva(mob/living/carbon/alien/larva/L as mob)
switch(L.a_intent)
- if("help")
+ if(I_HELP)
visible_message("[L] rubs its head against [src].")
@@ -355,4 +355,7 @@ In all, this is a lot like the monkey code. /N
else if(custom_pixel_x_offset)
return custom_pixel_x_offset
else
- return initial(pixel_x)
\ No newline at end of file
+ return initial(pixel_x)
+
+/mob/living/carbon/alien/humanoid/get_permeability_protection()
+ return 0.8
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 8f098b64cdf..f9a2b945410 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -159,22 +159,11 @@
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
help_shake_act(M)
- if ("grab")
- if (M == src || anchored)
- return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
-
- M.put_in_active_hand(G)
-
- G.synch()
-
- LAssailant = M
-
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- visible_message("[M] has grabbed [src] passively!")
+ if (I_GRAB)
+ grabbedby(M)
else
M.do_attack_animation(src)
@@ -216,7 +205,7 @@
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
sleeping = max(0,sleeping-5)
resting = 0
AdjustParalysis(-3)
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 92a2ebcd053..8cee6355712 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "posibrain"
w_class = 3
- origin_tech = "engineering=4;materials=4;bluespace=2;programming=4"
+ origin_tech = "biotech=3;programming=2"
var/searching = 0
var/askDelay = 10 * 60 * 1
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a63f487aec7..149273f6351 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -181,7 +181,7 @@
return
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
- if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && !tmob.buckled && canmove) // mutual brohugs all around!
+ if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained()) && tmob.canmove && !tmob.buckled && canmove) // mutual brohugs all around!
var/turf/oldloc = loc
loc = tmob.loc
tmob.loc = oldloc
@@ -244,6 +244,8 @@
stat(null, eta_status)
if (client.statpanel == "Status")
+ if(locate(/obj/item/device/assembly/health) in src)
+ stat(null, "Health: [health]")
if (internal)
if (!internal.air_contents)
qdel(internal)
@@ -414,7 +416,7 @@
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob)
switch(L.a_intent)
- if("help")
+ if(I_HELP)
visible_message("[L] rubs its head against [src].")
@@ -431,7 +433,7 @@
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
-/mob/living/carbon/human/proc/is_loyalty_implanted()
+/mob/living/carbon/human/proc/is_loyalty_implanted()
for(var/L in contents)
if(istype(L, /obj/item/weapon/implant/loyalty))
for(var/obj/item/organ/external/O in organs)
@@ -694,7 +696,7 @@
// if looting pockets with gloves, do it quietly
if(href_list["pockets"])
- if(isanimal(usr))
+ if(isanimal(usr))
return //animals cannot strip people
if(frozen)
@@ -726,19 +728,19 @@
// Update strip window
if(usr.machine == src && in_range(src, usr))
show_inv(usr)
-
+
else if(!pickpocket)
// Display a warning if the user mocks up
src << "You feel your [pocket_side] pocket being fumbled with!"
// if looting id with gloves, do it quietly - this allows pickpocket gloves to take/place id stealthily - Bone White
if(href_list["item"])
- if(isanimal(usr))
+ if(isanimal(usr))
return //animals cannot strip people
-
+
if(frozen)
usr << "\red Do not attempt to strip frozen people."
- return
+ return
var/itemTarget = href_list["item"]
if(itemTarget == "id")
if(pickpocket)
@@ -1158,7 +1160,7 @@
if(!fail_msg)
fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
user << "[fail_msg]"
-
+
/mob/living/carbon/human/proc/check_has_mouth()
// Todo, check stomach organ when implemented.
var/obj/item/organ/external/head/H = get_organ("head")
@@ -1170,7 +1172,7 @@
if(stat==DEAD)return
if(!check_has_mouth())
- return
+ return
if(!lastpuke)
lastpuke = 1
@@ -1517,16 +1519,16 @@
W.add_fingerprint(src)
-// Allows IPC's to change their monitor display
+// Allows IPC's to change their monitor display
/mob/living/carbon/human/proc/change_monitor()
- set category = "IC"
+ set category = "IC"
set name = "Change Monitor Display"
set desc = "Change the display on your monitor."
-
+
if(stat || paralysis || stunned || weakened)
src << "You cannot change your monitor display in your current state."
- return
-
+ return
+
var/list/hair = list()
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
@@ -1540,7 +1542,7 @@
h_style = new_style
update_hair()
-
+
//Putting a couple of procs here that I don't know where else to dump.
//Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse).
/mob/living/carbon/human/proc/leap()
@@ -1757,4 +1759,24 @@
return 1
if(!silent)
src << "You don't have the dexterity to use that!"
- return 0
\ No newline at end of file
+ return 0
+
+/mob/living/carbon/human/get_permeability_protection()
+ var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0)
+ for(var/obj/item/I in get_equipped_items())
+ if(I.body_parts_covered & HANDS)
+ prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"])
+ if(I.body_parts_covered & UPPER_TORSO)
+ prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"])
+ if(I.body_parts_covered & LOWER_TORSO)
+ prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"])
+ if(I.body_parts_covered & LEGS)
+ prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"])
+ if(I.body_parts_covered & FEET)
+ prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"])
+ if(I.body_parts_covered & ARMS)
+ prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"])
+ if(I.body_parts_covered & HEAD)
+ prot["head"] = max(1 - I.permeability_coefficient, prot["head"])
+ var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7
+ return protection
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm
index c09901e8dcb..e40030c9e0f 100644
--- a/code/modules/mob/living/carbon/human/human_attackalien.dm
+++ b/code/modules/mob/living/carbon/human/human_attackalien.dm
@@ -4,12 +4,12 @@
return 0
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
visible_message(text("\blue [M] caresses [src] with its scythe like arm."))
- if ("grab")
+ if (I_GRAB)
grabbedby(M)
- if("harm")
+ if(I_HARM)
M.do_attack_animation(src)
if (w_uniform)
w_uniform.add_fingerprint(M)
@@ -30,7 +30,7 @@
apply_effect(4, WEAKEN, armor_block)
updatehealth()
- if("disarm")
+ if(I_DISARM)
M.do_attack_animation(src)
var/randn = rand(1, 100)
if (randn <= 80)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index fe466cb1c74..c863249b79a 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -58,7 +58,7 @@
species.handle_attack_hand(src,M)
switch(M.a_intent)
- if("help")
+ if(I_HELP)
if(health >= config.health_threshold_crit)
help_shake_act(M)
add_logs(src, M, "shaked")
@@ -88,14 +88,14 @@
add_logs(src, M, "CPRed")
return 1
- if("grab")
+ if(I_GRAB)
if(attacker_style && attacker_style.grab_act(H, src))
return 1
else
src.grabbedby(M)
return 1
- if("harm")
+ if(I_HARM)
if(attacker_style && attacker_style.harm_act(H, src))
return 1
else
@@ -163,7 +163,7 @@
forcesay(hit_appends)
- if("disarm")
+ if(I_DISARM)
if(attacker_style && attacker_style.disarm_act(H, src))
return 1
else
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 036dcc78803..3036d0252a8 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -35,10 +35,10 @@ emp_act
if(check_shields(P.damage, "the [P.name]", P))
P.on_hit(src, 100, def_zone)
return 2
-
+
var/obj/item/organ/external/organ = get_organ(check_zone(def_zone))
if(isnull(organ))
- return
+ return
//Shrapnel
if (P.damage_type == BRUTE)
@@ -221,7 +221,7 @@ emp_act
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
- if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == "harm")
+ if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM)
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc))
newmeat.name = src.real_name + newmeat.name
newmeat.subjectname = src.real_name
@@ -465,7 +465,7 @@ emp_act
if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
- if(M.occupant.a_intent == "harm")
+ if(M.occupant.a_intent == I_HARM)
if(M.damtype == "brute")
step_away(src,M,15)
var/obj/item/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
@@ -493,7 +493,7 @@ emp_act
attack_log += text("\[[time_stamp()]\] Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])")
M.occupant.attack_log += text("\[[time_stamp()]\] Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
-
+
else
..()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index bc10d54b1c8..7d7d400c9c3 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -30,7 +30,8 @@
var/b_type = "A+" //Player's bloodtype
var/underwear = "Nude" //Which underwear the player wants
- var/undershirt = "Nude" //Which undershirt the player wants.
+ var/undershirt = "Nude" //Which undershirt the player wants
+ var/socks = "Nude" //Which socks the player wants
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
//Equipment slots
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 82f09f0f489..875a3a85260 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -64,6 +64,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
life_tick++
var/datum/gas_mixture/environment = loc.return_air()
+ in_stasis = 0
if(istype(loc, /obj/structure/closet/body_bag/cryobag))
var/obj/structure/closet/body_bag/cryobag/loc_as_cryobag = loc
if(!loc_as_cryobag.opened)
diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm
index 8289d8bc267..f5445b80543 100644
--- a/code/modules/mob/living/carbon/human/species/apollo.dm
+++ b/code/modules/mob/living/carbon/human/species/apollo.dm
@@ -51,7 +51,7 @@
C << "It feels like part of you has died."
/datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M)
- if(M.a_intent == "harm")
+ if(M.a_intent == I_HARM)
if(H.handcuffed)
if(!(locate(H.internal_organs_by_name["antennae"]) in H.internal_organs)) return
var/turf/p_loc = M.loc
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 2e7a5e2be23..f7493c272d8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -327,6 +327,13 @@ var/global/list/damage_icon_parts = list()
if(U2)
stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
+
+ if(socks)
+ var/datum/sprite_accessory/socks/U3 = socks_list[socks]
+ if(U3)
+ stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
+
+
if(update_icons)
update_icons()
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index 93a478f5829..078305a654d 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -270,7 +270,7 @@
switch(L.a_intent)
- if("help")
+ if(I_HELP)
visible_message("[L] rubs its head against [src].")
@@ -366,22 +366,11 @@
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
help_shake_act(M)
- if ("grab")
- if (M == src || anchored)
- return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
-
- M.put_in_active_hand(G)
-
- G.synch()
-
- LAssailant = M
-
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- visible_message("[M] has grabbed [src] passively!")
+ if (I_GRAB)
+ grabbedby(M)
else
M.do_attack_animation(src)
@@ -427,10 +416,10 @@
return
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
visible_message("[M] caresses [src] with its scythe like arm.")
- if ("harm")
+ if (I_HARM)
M.do_attack_animation(src)
if (prob(95))
attacked += 10
@@ -450,21 +439,10 @@
visible_message("[M] has attempted to lunge at [name]!", \
"[M] has attempted to lunge at [name]!")
- if ("grab")
- if (M == src || anchored)
- return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
+ if (I_GRAB)
+ grabbedby(M)
- M.put_in_active_hand(G)
-
- G.synch()
-
- LAssailant = M
-
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- visible_message(" [M] has grabbed [name] passively!")
-
- if ("disarm")
+ if (I_DISARM)
M.do_attack_animation(src)
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
var/damage = 5
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f6113e61694..ddc46419e7f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -937,3 +937,7 @@
/mob/living/proc/spawn_dust()
new /obj/effect/decal/cleanable/ash(loc)
+
+//used in datum/reagents/reaction() proc
+/mob/living/proc/get_permeability_protection()
+ return 0
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index d1017431eb8..5737aad1c6c 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -146,7 +146,7 @@
src.pinned += O
/mob/living/mech_melee_attack(obj/mecha/M)
- if(M.occupant.a_intent == "harm")
+ if(M.occupant.a_intent == I_HARM)
if(M.damtype == "brute")
step_away(src,M,15)
switch(M.damtype)
@@ -168,9 +168,9 @@
attack_log += text("\[[time_stamp()]\] Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])")
M.occupant.attack_log += text("\[[time_stamp()]\] Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
-
+
else
-
+
step_away(src,M)
add_logs(M.occupant, src, "pushed", object=M, admin=0)
M.occupant_message("You push [src] out of the way.")
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 19fb4b6f513..6992e7d91e6 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -91,7 +91,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/add_ai_verbs()
src.verbs |= ai_verbs_default
src.verbs |= silicon_subsystems
-
+
/mob/living/silicon/ai/proc/remove_ai_verbs()
src.verbs -= ai_verbs_default
src.verbs -= silicon_subsystems
@@ -551,7 +551,7 @@ var/list/ai_verbs_default = list(
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
visible_message("[M] caresses [src]'s plating with its scythe like arm.")
else //harm
@@ -960,7 +960,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/is_in_chassis()
return istype(loc, /turf)
-
+
/mob/living/silicon/ai/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card)
if(!..())
return
diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm
index a95a754eae8..cc2cb3e8435 100644
--- a/code/modules/mob/living/silicon/login.dm
+++ b/code/modules/mob/living/silicon/login.dm
@@ -3,4 +3,6 @@
if(mind && ticker && ticker.mode)
ticker.mode.remove_cultist(mind, 1)
ticker.mode.remove_revolutionary(mind, 1)
+ ticker.mode.remove_thrall(mind,0)
+ ticker.mode.remove_shadowling(mind)
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/mommi/mommi.dm b/code/modules/mob/living/silicon/mommi/mommi.dm
index fa3f2c45d82..9fe7884ff29 100644
--- a/code/modules/mob/living/silicon/mommi/mommi.dm
+++ b/code/modules/mob/living/silicon/mommi/mommi.dm
@@ -338,7 +338,7 @@ They can only use one tool at a time, they can't choose modules, and they have 1
if(ishuman(user))
- if(user.a_intent == "help")
+ if(user.a_intent == I_HELP)
user.visible_message("\blue [user.name] pats [src.name] on the head.")
return
@@ -346,7 +346,7 @@ They can only use one tool at a time, they can't choose modules, and they have 1
if(!istype(user, /mob/living/silicon))
switch(user.a_intent)
- if("disarm")
+ if(I_DISARM)
user.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])")
src.attack_log += text("\[[time_stamp()]\] Has been disarmed by [user.name] ([user.ckey])")
log_admin("ATTACK: [user.name] ([user.ckey]) disarmed [src.name] ([src.ckey])")
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 4dc1758066f..79ead634085 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -231,7 +231,7 @@
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\blue [M] caresses [src]'s casing with its scythe like arm."), 1)
@@ -281,7 +281,7 @@
medicalActive2 = null
medical_cannotfind = 0
nanomanager.update_uis(src)
- usr << "You reset your record-viewing software."
+ usr << "You reset your record-viewing software."
/mob/living/silicon/pai/cancel_camera()
set category = "pAI Commands"
@@ -554,12 +554,12 @@
/mob/living/silicon/pai/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
- if(H.a_intent == "help")
+ if(H.a_intent == I_HELP)
get_scooped(H)
//return
else
return ..()
-
+
/mob/living/silicon/pai/on_forcemove(atom/newloc)
if(card)
card.loc = newloc
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 433a8361719..bcf862b3d92 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -25,6 +25,8 @@
//Used for self-mailing.
var/mail_destination = 0
+ var/reboot_cooldown = 60 // one minute
+ var/last_reboot
holder_type = /obj/item/weapon/holder/drone
// var/sprite[0]
@@ -123,8 +125,15 @@
if(!allowed(usr))
user << "\red Access denied."
return
-
+
+ var/delta = (world.time / 10) - last_reboot
+ if(reboot_cooldown > delta)
+ var/cooldown_time = round(reboot_cooldown - ((world.time / 10) - last_reboot), 1)
+ usr << "\red The reboot system is currently offline. Please wait another [cooldown_time] seconds."
+ return
+
user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to reboot it.", "\red You swipe your ID card through \the [src], attempting to reboot it.")
+ last_reboot = world.time / 10
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
if(D.key && D.client)
@@ -256,13 +265,11 @@
/mob/living/silicon/robot/drone/proc/question(var/client/C,var/mob/M)
spawn(0)
if(!C || !M || jobban_isbanned(M,"nonhumandept") || jobban_isbanned(M,"Drone")) return
- var/response = alert(C, "Someone is attempting to reboot a maintenance drone. Would you like to play as one?", "Maintenance drone reboot", "Yes", "No", "Never for this round.")
+ var/response = alert(C, "Someone is attempting to reboot a maintenance drone. Would you like to play as one?", "Maintenance drone reboot", "Yes", "No")
if(!C || ckey)
return
if(response == "Yes")
transfer_personality(C)
- else if (response == "Never for this round")
- C.prefs.be_special ^= BE_PAI
/mob/living/silicon/robot/drone/proc/transfer_personality(var/client/player)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
index 93a5b2c46f2..50b846c0192 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
@@ -45,7 +45,7 @@
//Actual picking-up event.
/mob/living/silicon/robot/drone/attack_hand(mob/living/carbon/human/M as mob)
- if(M.a_intent == "help")
+ if(M.a_intent == I_HELP)
get_scooped(M)
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm
index df9f6e050e5..84b31b16766 100644
--- a/code/modules/mob/living/silicon/robot/login.dm
+++ b/code/modules/mob/living/silicon/robot/login.dm
@@ -2,6 +2,8 @@
..()
regenerate_icons()
show_laws(0)
+ if(mind) ticker.mode.remove_cultist(mind)
if(mind) ticker.mode.remove_revolutionary(mind)
if(mind) ticker.mode.remove_thrall(mind,0)
+ if(mind) ticker.mode.remove_shadowling(mind)
return
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index df492ba3c1f..29691e3d53f 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -73,11 +73,11 @@ var/list/robot_verbs_default = list(
var/braintype = "Cyborg"
var/base_icon = ""
var/crisis = 0
-
+
var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
-
+
var/jetpackoverlay = 0
var/magpulse = 0
@@ -163,8 +163,8 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/SetName(pickedName as text)
custom_name = pickedName
- updatename()
-
+ updatename()
+
/mob/living/silicon/robot/proc/sync()
if(lawupdate && connected_ai)
lawsync()
@@ -578,8 +578,8 @@ var/list/robot_verbs_default = list(
return
- if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent == "help")
- if(W == module_active)
+ if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent == I_HELP)
+ if(W == module_active)
return
if (!getBruteLoss())
user << "Nothing to fix!"
@@ -597,7 +597,7 @@ var/list/robot_verbs_default = list(
return
- else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == "help" && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
+ else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == I_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
if (!getFireLoss())
user << "Nothing to fix!"
return
@@ -825,23 +825,15 @@ var/list/robot_verbs_default = list(
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1)
- if ("grab")
- if (M == src || anchored)
- return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
+ if (I_GRAB)
+ grabbedby(M)
- M.put_in_active_hand(G)
-
- G.synch()
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- visible_message("[M] has grabbed [src] passively!")
-
- if ("harm")
+ if (I_HARM)
M.do_attack_animation(src)
var/damage = rand(10, 20)
if (prob(90))
@@ -857,7 +849,7 @@ var/list/robot_verbs_default = list(
visible_message("[M] took a swipe at [src]!", \
"[M] took a swipe at [src]!")
- if ("disarm")
+ if (I_DISARM)
if(!(lying))
M.do_attack_animation(src)
if (prob(85))
@@ -923,7 +915,7 @@ var/list/robot_verbs_default = list(
update_icons()
if(!opened && (!istype(user, /mob/living/silicon)))
- if (user.a_intent == "help")
+ if (user.a_intent == I_HELP)
user.visible_message("[user] pets [src]!", \
"You pet [src]!")
@@ -986,7 +978,7 @@ var/list/robot_verbs_default = list(
icon_state = "[base_icon]-roll"
else
icon_state = base_icon
-
+
if(jetpackoverlay)
overlays += "minerjetpack-[icon_state]"
update_fire()
@@ -1124,7 +1116,7 @@ var/list/robot_verbs_default = list(
if(lamp_button)
lamp_button.icon_state = "lamp[lamp_intensity]"
- update_icons()
+ update_icons()
/mob/living/silicon/robot/Move(a, b, flag)
@@ -1188,7 +1180,7 @@ var/list/robot_verbs_default = list(
// Instead of being listed as "deactivated". The downside is that I'm going
// to have to check if every camera is null or not before doing anything, to prevent runtime errors.
// I could change the network to null but I don't know what would happen, and it seems too hacky for me.
-
+
/mob/living/silicon/robot/proc/ResetSecurityCodes()
set category = "Robot Commands"
set name = "Reset Identity Codes"
@@ -1368,7 +1360,7 @@ var/list/robot_verbs_default = list(
connected_ai << "
NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
"
if(3) //New Name
connected_ai << "
NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
"
-
+
/mob/living/silicon/robot/proc/disconnect_from_ai()
if(connected_ai)
sync() // One last sync attempt
@@ -1381,4 +1373,4 @@ var/list/robot_verbs_default = list(
connected_ai = AI
connected_ai.connected_robots |= src
notify_ai(1)
- sync()
+ sync()
diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm
index 68216b57736..3e0c3605eda 100644
--- a/code/modules/mob/living/simple_animal/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer.dm
@@ -42,7 +42,7 @@
icon_living = "brainslug"
icon_dead = "brainslug_dead"
speed = 5
- a_intent = "harm"
+ a_intent = I_HARM
stop_automated_movement = 1
status_flags = CANPUSH
attacktext = "nips"
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index be304fc4cd8..cc5c5d930e9 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -10,7 +10,7 @@
response_harm = "punches"
icon_dead = "shade_dead"
speed = 0
- a_intent = "harm"
+ a_intent = I_HARM
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/weapons/punch1.ogg'
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 85599a57af8..ac707426430 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -595,8 +595,8 @@
/mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M)
. = ..()
switch(M.a_intent)
- if("help") wuv(1,M)
- if("harm") wuv(-1,M)
+ if(I_HELP) wuv(1,M)
+ if(I_HARM) wuv(-1,M)
/mob/living/simple_animal/pet/corgi/proc/wuv(change, mob/M)
if(change)
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index 4f9ce5fef68..45cc9a73f66 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -50,7 +50,7 @@
/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M as mob)
//Let people pick the little buggers up.
- if(M.a_intent == "help")
+ if(M.a_intent == I_HELP)
if(M.species && M.species.name == "Diona")
M << "You feel your being twine with that of [src] as it merges with your biomass."
src << "You feel your being twine with that of [M] as you merge with its biomass."
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 238ef2c5852..c380fba0ea2 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -137,7 +137,7 @@
milk_content = min(50, milk_content+rand(5, 10))
/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob)
- if(!stat && M.a_intent == "disarm" && icon_state != icon_dead)
+ if(!stat && M.a_intent == I_DISARM && icon_state != icon_dead)
M.visible_message("[M] tips over [src].","You tip over [src].")
Weaken(30)
icon_state = icon_dead
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index a09f843b118..80e715dc7d3 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -212,8 +212,9 @@
if(camera)
camera.status = 0
- held_item.loc = src.loc
- held_item = null
+ if(held_item)
+ held_item.forceMove(src.loc)
+ held_item = null
robogibs(src.loc, viruses)
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 3ec2633e2e9..4659c1b4dd1 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -19,7 +19,7 @@
melee_damage_upper = 25
attacktext = "slashes"
speak_emote = list("hisses")
- a_intent = "harm"
+ a_intent = I_HARM
attack_sound = 'sound/weapons/bladeslice.ogg'
min_oxy = 0
max_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 78b669e2047..dd42262bdcd 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -36,6 +36,8 @@
faction = list("mimic")
move_to_delay = 9
+ var/is_electronic = 0
+
/mob/living/simple_animal/hostile/mimic/FindTarget()
. = ..()
if(.)
@@ -47,7 +49,14 @@
ghostize()
qdel(src)
-
+/mob/living/simple_animal/hostile/mimic/emp_act(severity)
+ if(is_electronic)
+ switch(severity)
+ if(1)
+ Die()
+ if(2)
+ adjustBruteLoss(50)
+ ..(severity)
//
// Crate Mimic
@@ -188,12 +197,16 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
knockdown_people = 1
melee_damage_lower *= 2
melee_damage_upper *= 2
+ if(istype(O, /obj/machinery))
+ is_electronic = 1
else if(istype(O, /obj/item))
var/obj/item/I = O
health = 15 * I.w_class
melee_damage_lower = 2 + I.force
melee_damage_upper = 2 + I.force
move_to_delay = 2 * I.w_class + 1
+ if(istype(O, /obj/item/device))
+ is_electronic = 1
maxHealth = health
if(creator)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 3522cce7bc0..d83770ffc8b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -17,7 +17,7 @@
response_disarm = "shoves"
response_harm = "strikes"
status_flags = 0
- a_intent = "harm"
+ a_intent = I_HARM
var/throw_message = "bounces off of"
var/icon_aggro = null // for swapping to when we get aggressive
see_in_dark = 8
@@ -73,7 +73,7 @@
melee_damage_lower = 12
melee_damage_upper = 12
attacktext = "bites into"
- a_intent = "harm"
+ a_intent = I_HARM
speak_emote = list("chitters")
attack_sound = 'sound/weapons/bladeslice.ogg'
ranged_cooldown_cap = 4
@@ -140,7 +140,7 @@
melee_damage_upper = 0
attacktext = "barrels into"
attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = "help"
+ a_intent = I_HELP
speak_emote = list("screeches")
throw_message = "sinks in slowly, before being pushed out of "
status_flags = CANPUSH
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 0d1d16ac19a..c3fa9d01800 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -138,7 +138,7 @@
/mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/M as mob)
..()
- if(M.a_intent == "harm")
+ if(M.a_intent == I_HARM)
Bruise()
/mob/living/simple_animal/hostile/mushroom/hitby(atom/movable/AM)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index 2635c97f9a1..f4f0db898bb 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -13,7 +13,7 @@
speak = list("HONK", "Honk!", "Welcome to clown planet!")
emote_see = list("honks")
speak_chance = 1
- a_intent = "harm"
+ a_intent = I_HARM
maxHealth = 75
health = 75
speed = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index e4b9fe7ac0f..eb3d989cb3e 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -15,7 +15,7 @@
response_harm = "hits the"
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
- a_intent = "harm"
+ a_intent = I_HARM
stop_automated_movement_when_pulled = 0
health = 300
maxHealth = 300
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index 729ef2ad658..69ad3e579d7 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -18,7 +18,7 @@
melee_damage_upper = 15
attacktext = "punches"
attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = "harm"
+ a_intent = I_HARM
var/corpse = /obj/effect/landmark/mobcorpse/russian
var/weapon1 = /obj/item/weapon/kitchenknife
min_oxy = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index 4736c407839..65cd340bf3f 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -30,7 +30,7 @@
max_co2 = 0
max_tox = 0
- a_intent = "harm" //so they don't get pushed around
+ a_intent = I_HARM //so they don't get pushed around
environment_smash = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 1cf812d1dec..c2e84b06370 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -8,7 +8,7 @@
icon_living = "angelseen"
icon_dead = "angelseen"
gender = NEUTER
- a_intent = "harm"
+ a_intent = I_HARM
response_help = "touches"
response_disarm = "pushes"
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 6eb56766229..bd6d0723a0e 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -18,7 +18,7 @@
melee_damage_upper = 10
attacktext = "punches"
attack_sound = 'sound/weapons/punch1.ogg'
- a_intent = "harm"
+ a_intent = I_HARM
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
var/weapon1
var/weapon2
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index dbd87107f1e..b1d584777ad 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -87,9 +87,9 @@
return
/mob/living/simple_animal/Life()
- if(paralysis || stunned || weakened || buckled || resting)
+ if(paralysis || stunned || weakened || buckled || resting)
canmove = 0
- else
+ else
canmove = 1
//Health
@@ -107,7 +107,7 @@
if(health > maxHealth)
health = maxHealth
-
+
if(resting && icon_resting && stat != DEAD)
icon_state = icon_resting
else if(icon_resting && stat != DEAD)
@@ -292,12 +292,12 @@
switch(M.a_intent)
- if("help")
+ if(I_HELP)
if (health > 0)
visible_message(" [M] [response_help] [src].")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if("grab")
+ if(I_GRAB)
if (M == src || anchored)
return
if (!(status_flags & CANPUSH))
@@ -314,7 +314,7 @@
visible_message("[M] has grabbed [src] passively!")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if("harm", "disarm")
+ if(I_HARM, I_DISARM)
M.do_attack_animation(src)
visible_message("[M] [response_harm] [src]!")
playsound(loc, "punch", 25, 1, -1)
@@ -326,26 +326,13 @@
switch(M.a_intent)
- if ("help")
+ if (I_HELP)
visible_message("[M] caresses [src] with its scythe like arm.")
- if ("grab")
- if(M == src || anchored)
- return
- if(!(status_flags & CANPUSH))
- return
+ if (I_GRAB)
+ grabbedby(M)
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
-
- M.put_in_active_hand(G)
-
- G.synch()
- LAssailant = M
-
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- visible_message("[M] has grabbed [src] passively!")
-
- if("harm", "disarm")
+ if(I_HARM, I_DISARM)
M.do_attack_animation(src)
var/damage = rand(15, 30)
visible_message("[M] has slashed at [src]!", \
@@ -358,7 +345,7 @@
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L as mob)
switch(L.a_intent)
- if("help")
+ if(I_HELP)
visible_message("[L] rubs its head against [src].")
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
index 96a2b832860..a54b0e0e1e2 100644
--- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
@@ -14,7 +14,7 @@
icon_state = "daemon"
icon_living = "daemon"
speed = 1
- a_intent = "harm"
+ a_intent = I_HARM
stop_automated_movement = 1
status_flags = CANPUSH
attack_sound = 'sound/misc/demon_attack1.ogg'
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 9e406738a1b..cee943541d3 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -114,7 +114,7 @@
var/losebreath = 0.0//Carbon
var/intent = null//Living
var/shakecamera = 0
- var/a_intent = "help"//Living
+ var/a_intent = I_HELP//Living
var/m_int = null//Living
var/m_intent = "run"//Living
var/lastKnownIP = null
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 0b8c6949029..2f50994b4b9 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -316,7 +316,7 @@
var/mob/living/carbon/human/affected = affecting
var/mob/living/carbon/human/attacker = assailant
switch(assailant.a_intent)
- if("help")
+ if(I_HELP)
/*if(force_down)
assailant << "You no longer pin [affecting] to the ground."
force_down = 0
@@ -324,10 +324,10 @@
//This specific example would allow you to stop pinning people to the floor without moving away from them.
return
- if("grab")
+ if(I_GRAB)
return
- if("harm") //This checks that the user is on harm intent.
+ if(I_HARM) //This checks that the user is on harm intent.
if(last_hit_zone == "head") //This checks the hitzone the user has selected. In this specific case, they have the head selected.
if(affecting.lying)
return
@@ -367,7 +367,7 @@
M << "\red You go blind!"*///This is a demonstration of adding a new damaging type based on intent as well as hitzone.
//This specific example would allow you to squish people's eyes with a GRAB_NECK.
- if("disarm") //This checks that the user is on disarm intent.
+ if(I_DISARM) //This checks that the user is on disarm intent.
/* if(state < GRAB_AGGRESSIVE)
assailant << "You require a better grab to do this."
return
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index b3101543291..52fc729c121 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -96,7 +96,7 @@ proc/isembryo(A)
if(istype(A, /mob/living/silicon/ai))
return 1
return 0
-
+
/mob/proc/isSynthetic()
return 0
@@ -174,17 +174,17 @@ proc/isAntag(A)
if(C.mind && C.mind.special_role)
return 1
return 0
-
+
proc/isNonCrewAntag(A)
if(!isAntag(A))
return 0
-
+
var/mob/living/carbon/C = A
var/special_role = C.mind.special_role
var/list/crew_roles = list("traitor", "Changeling", "Vampire", "Cultist", "Head Revolutionary", "Revolutionary", "malfunctioning AI", "Shadowling", "loyalist", "mutineer", "Response Team")
if((special_role in crew_roles))
return 0
-
+
return 1
proc/isnewplayer(A)
@@ -394,20 +394,20 @@ proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 fo
return 0
//converts intent-strings into numbers and back
-var/list/intents = list("help","disarm","grab","harm")
+var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
/proc/intent_numeric(argument)
if(istext(argument))
switch(argument)
- if("help") return 0
- if("disarm") return 1
- if("grab") return 2
+ if(I_HELP) return 0
+ if(I_DISARM) return 1
+ if(I_GRAB) return 2
else return 3
else
switch(argument)
- if(0) return "help"
- if(1) return "disarm"
- if(2) return "grab"
- else return "harm"
+ if(0) return I_HELP
+ if(1) return I_DISARM
+ if(2) return I_GRAB
+ else return I_HARM
//change a mob's act-intent. Input the intent as a string such as "help" or use "right"/"left
/mob/verb/a_intent_change(input as text)
@@ -416,7 +416,7 @@ var/list/intents = list("help","disarm","grab","harm")
if(ishuman(src) || isalienadult(src) || isbrain(src))
switch(input)
- if("help","disarm","grab","harm")
+ if(I_HELP,I_DISARM,I_GRAB,I_HARM)
a_intent = input
if("right")
a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4)
@@ -427,14 +427,14 @@ var/list/intents = list("help","disarm","grab","harm")
else if(isrobot(src) || islarva(src))
switch(input)
- if("help")
- a_intent = "help"
- if("harm")
- a_intent = "harm"
+ if(I_HELP)
+ a_intent = I_HELP
+ if(I_HARM)
+ a_intent = I_HARM
if("right","left")
a_intent = intent_numeric(intent_numeric(a_intent) - 3)
if(hud_used && hud_used.action_intent)
- if(a_intent == "harm")
+ if(a_intent == I_HARM)
hud_used.action_intent.icon_state = "harm"
else
hud_used.action_intent.icon_state = "help"
@@ -527,7 +527,7 @@ var/list/intents = list("help","disarm","grab","harm")
O << "[message]"
if(ghost_sound)
O << sound(ghost_sound)
-
+
/mob/proc/switch_to_camera(var/obj/machinery/camera/C)
if (!C.can_use() || stat || (get_dist(C, src) > 1 || machine != src || blinded || !canmove))
return 0
@@ -541,4 +541,3 @@ var/list/intents = list("help","disarm","grab","harm")
eyeobj.setLoc(get_turf(C))
client.eye = eyeobj
return 1
-
\ No newline at end of file
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index b60ebe12c5d..77f48b976d5 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -7,6 +7,7 @@ datum/preferences
gender = pick(MALE, FEMALE)
underwear = random_underwear(gender)
undershirt = random_undershirt(gender)
+ socks = random_socks(gender)
if(species == "Human")
s_tone = random_skin_tone()
h_style = random_hair_style(gender, species)
@@ -264,6 +265,12 @@ datum/preferences
if(U2)
undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY)
+ var/icon/socks_s = null
+ if(socks)
+ var/datum/sprite_accessory/socks/U3 = socks_list[socks]
+ if(U3)
+ socks_s = new/icon(U3.icon, "[U3.icon_state]_s", ICON_OVERLAY)
+
var/icon/clothes_s = null
var/uniform_dmi='icons/mob/uniform.dmi'
if(disabilities&DISABILITY_FLAG_FAT)
@@ -792,6 +799,8 @@ datum/preferences
preview_icon.Blend(underwear_s, ICON_OVERLAY)
if(undershirt_s)
preview_icon.Blend(undershirt_s, ICON_OVERLAY)
+ if(socks_s)
+ preview_icon.Blend(socks_s, ICON_OVERLAY)
if(clothes_s)
preview_icon.Blend(clothes_s, ICON_OVERLAY)
preview_icon_front = new(preview_icon, dir = SOUTH)
@@ -800,4 +809,5 @@ datum/preferences
del(eyes_s)
del(underwear_s)
del(undershirt_s)
+ del(socks_s)
del(clothes_s)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 45fe53c3d82..5a27db7e008 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -1260,4 +1260,193 @@
name = "Fire Tank-Top"
icon_state = "tank_fire"
gender = NEUTER
-//end tanktops
\ No newline at end of file
+//end tanktops
+
+///////////////////////
+// Socks Definitions //
+///////////////////////
+/datum/sprite_accessory/socks
+ icon = 'icons/mob/underwear.dmi'
+
+/datum/sprite_accessory/socks/nude
+ name = "Nude"
+ icon_state = null
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington","Vox")
+
+
+/datum/sprite_accessory/socks/white_norm
+ name = "Normal White"
+ icon_state = "white_norm"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_norm
+ name = "Normal Black"
+ icon_state = "black_norm"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/white_short
+ name = "Short White"
+ icon_state = "white_short"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_short
+ name = "Short Black"
+ icon_state = "black_short"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/white_knee
+ name = "Knee-high White"
+ icon_state = "white_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_knee
+ name = "Knee-high Black"
+ icon_state = "black_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/thin_knee
+ name = "Knee-high Thin"
+ icon_state = "thin_knee"
+ gender = FEMALE
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/striped_knee
+ name = "Knee-high Striped"
+ icon_state = "striped_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/rainbow_knee
+ name = "Knee-high Rainbow"
+ icon_state = "rainbow_knee"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/white_thigh
+ name = "Thigh-high White"
+ icon_state = "white_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+/datum/sprite_accessory/socks/black_thigh
+ name = "Thigh-high Black"
+ icon_state = "black_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/thin_thigh
+ name = "Thigh-high Thin"
+ icon_state = "thin_thigh"
+ gender = FEMALE
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/striped_thigh
+ name = "Thigh-high Striped"
+ icon_state = "striped_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/rainbow_thigh
+ name = "Thigh-high Rainbow"
+ icon_state = "rainbow_thigh"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/pantyhose
+ name = "Pantyhose"
+ icon_state = "pantyhose"
+ gender = FEMALE
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+
+/datum/sprite_accessory/socks/black_fishnet
+ name = "Black Fishnet"
+ icon_state = "black_fishnet"
+ gender = NEUTER
+ species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpakanin","Slime People","Skellington")
+
+/datum/sprite_accessory/socks/vox_white
+ name = "Vox White"
+ icon_state = "vox_white"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_black
+ name = "Vox Black"
+ icon_state = "vox_black"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_thin
+ name = "Vox Black Thin"
+ icon_state = "vox_blackthin"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_rainbow
+ name = "Vox Rainbow"
+ icon_state = "vox_rainbow"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_stripped
+ name = "Vox Striped"
+ icon_state = "vox_white"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_white_thigh
+ name = "Vox Thigh-high White"
+ icon_state = "vox_whiteTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_black_thigh
+ name = "Vox Thigh-high Black"
+ icon_state = "vox_blackTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_thin_thigh
+ name = "Vox Thigh-high Thin"
+ icon_state = "vox_blackthinTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_rainbow_thigh
+ name = "Vox Thigh-high Rainbow"
+ icon_state = "vox_rainbowTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_striped_thigh
+ name = "Vox Thigh-high Striped"
+ icon_state = "vox_stripedTH"
+ gender = NEUTER
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox_fishnet
+ name = "Vox Fishnets"
+ icon_state = "vox_fishnet"
+ gender = NEUTER
+ species_allowed = list("Vox")
\ No newline at end of file
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 5616b617125..73870334d37 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -40,7 +40,7 @@
O.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF)
O.loc = loc
O.viruses = viruses
- O.a_intent = "harm"
+ O.a_intent = I_HARM
if (client)
@@ -259,7 +259,7 @@
if("Drone")
new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc)
- new_xeno.a_intent = "harm"
+ new_xeno.a_intent = I_HARM
new_xeno.key = key
new_xeno << "You are now an alien."
@@ -318,7 +318,7 @@
qdel(t)
var/mob/living/simple_animal/pet/corgi/new_corgi = new /mob/living/simple_animal/pet/corgi (loc)
- new_corgi.a_intent = "harm"
+ new_corgi.a_intent = I_HARM
new_corgi.key = key
new_corgi << "You are now a Corgi. Yap Yap!"
@@ -353,7 +353,7 @@
var/mob/new_mob = new mobpath(src.loc)
new_mob.key = key
- new_mob.a_intent = "harm"
+ new_mob.a_intent = I_HARM
new_mob << "You suddenly feel more... animalistic."
@@ -374,7 +374,7 @@
var/mob/new_mob = new mobpath(src.loc)
new_mob.key = key
- new_mob.a_intent = "harm"
+ new_mob.a_intent = I_HARM
new_mob << "You feel more... animalistic"
new_mob.update_pipe_vision()
@@ -470,12 +470,8 @@
return 1
//Antag Creatures!
-/* if(ispath(MP, /mob/living/simple_animal/hostile/carp) && !jobban_isbanned(src, "Syndicate"))
- return 1 */
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, "alien") && !jobban_isbanned(src, "Syndicate"))
return 1
- if(ispath(MP, /mob/living/carbon/alien) && !jobban_isbanned(src, "alien") && !jobban_isbanned(src, "Syndicate"))
- return 1
if(ispath(MP, /mob/living/simple_animal/hostile/statue) && !jobban_isbanned(src, "Syndicate"))
return 1
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 7dff264aa53..a9a410df238 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -25,7 +25,7 @@ var/list/organ_cache = list()
/obj/item/organ/attack_self(mob/user as mob)
// Convert it to an edible form, yum yum.
- if(!robotic && user.a_intent == "harm")
+ if(!robotic && user.a_intent == I_HARM)
bitten(user)
return
@@ -71,8 +71,8 @@ var/list/organ_cache = list()
//dead already, no need for more processing
if(status & ORGAN_DEAD)
- return
-
+ return
+
// Don't process if we're in a freezer, an MMI or a stasis bag. //TODO: ambient temperature?
if(istype(loc,/obj/item/device/mmi) || istype(loc,/obj/item/bodybag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer))
return
@@ -81,7 +81,7 @@ var/list/organ_cache = list()
if ((status & ORGAN_ROBOT) || (owner && owner.species && (owner.species.flags & IS_PLANT)))
germ_level = 0
return
-
+
if(!owner)
if(reagents)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
@@ -97,16 +97,16 @@ var/list/organ_cache = list()
if(damage >= max_damage)
die()
-
+
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
//** Handle antibiotics and curing infections
handle_antibiotics()
handle_germ_effects()
-
+
//check if we've hit max_damage
if(damage >= max_damage)
die()
-
+
/obj/item/organ/examine(mob/user)
..(user)
if(status & ORGAN_DEAD)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index dd0fbd2fc7e..88478fec1e9 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -54,7 +54,7 @@
var/areastring = null
var/obj/item/weapon/stock_parts/cell/cell
var/start_charge = 90 // initial cell charge %
- var/cell_type = 2500
+ var/cell_type = 2500
var/opened = 0 //0=closed, 1=opened, 2=cover removed
var/shorted = 0
var/lighting = 3
@@ -99,9 +99,9 @@
var/global/list/status_overlays_lighting
var/global/list/status_overlays_environ
var/indestructible = 0 // If set, prevents aliens from destroying it
-
+
var/report_power_alarm = 1
-
+
/obj/machinery/power/apc/noalarm
report_power_alarm = 0
@@ -143,7 +143,7 @@
src.update_icon()
spawn(5)
src.update()
-
+
/obj/machinery/power/apc/Destroy()
apcs -= src
if(malfai && operating)
@@ -378,7 +378,7 @@
results += 2
return results
-// Used in process so it doesn't update the icon too much
+// Used in process so it doesn't update the icon too much
/obj/machinery/power/apc/proc/queue_icon_update()
if(!updating_icon)
@@ -644,7 +644,7 @@
//Synthetic human mob goes here.
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- if(!isnull(H.internal_organs_by_name["cell"]) && H.a_intent == "grab")
+ if(!isnull(H.internal_organs_by_name["cell"]) && H.a_intent == I_GRAB)
if(emagged || stat & BROKEN)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
@@ -661,9 +661,9 @@
src.cell.charge = 0
user << "You slot your fingers into the APC interface and siphon off some of the stored charge for your own use."
- if(src.cell.charge < 0)
+ if(src.cell.charge < 0)
src.cell.charge = 0
- if(H.nutrition > 500)
+ if(H.nutrition > 500)
H.nutrition = 500
src.charging = 1
else
@@ -879,7 +879,7 @@
return 1
else
return !locked
-
+
/obj/machinery/power/apc/proc/is_locked(mob/user as mob)
if(isobserver(user) && check_rights(R_ADMIN, 0, user))
return 0
@@ -1095,8 +1095,8 @@
//Returns 1 if the APC should attempt to charge
/obj/machinery/power/apc/proc/attempt_charging()
- return (chargemode && charging == 1 && operating)
-
+ return (chargemode && charging == 1 && operating)
+
/obj/machinery/power/apc/draw_power(var/amount)
if(terminal && terminal.powernet)
return terminal.powernet.draw_power(amount)
@@ -1258,7 +1258,7 @@
update()
else if (last_ch != charging)
queue_icon_update()
-
+
/obj/machinery/power/apc/proc/autoset(var/val, var/on)
if(on==0)
if(val==2) // if on, return off
@@ -1275,7 +1275,7 @@
return 1
return val
-
+
// damage and destruction acts
/obj/machinery/power/apc/emp_act(severity)
@@ -1317,7 +1317,7 @@
set_broken()
if (cell && prob(5))
cell.blob_act()
-
+
/obj/machinery/power/apc/disconnect_terminal()
if(terminal)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index f35d0f6353b..27974f6a922 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -506,7 +506,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(!S)
return
- if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help" || S.open == 2)
+ if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2)
return ..()
if(S.burn_dam)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 709bd0cbaff..a209a127da9 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -706,7 +706,7 @@
if(!proximity) return
if(istype(target, /obj/machinery/light))
return
- if(user.a_intent != "harm")
+ if(user.a_intent != I_HARM)
return
shatter()
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index be084ebca0e..7fa2224cbcd 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -188,9 +188,9 @@
icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]"
/obj/item/ammo_box/magazine/m12g
- name = "shotgun magazine (12g buckshot)"
+ name = "shotgun magazine (12g slugs)"
icon_state = "m12gb"
- ammo_type = "/obj/item/ammo_casing/shotgun/buckshot"
+ ammo_type = "/obj/item/ammo_casing/shotgun"
origin_tech = "combat=3;syndicate=1"
caliber = "shotgun"
max_ammo = 8
@@ -199,6 +199,10 @@
..()
icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/8)*8]"
+/obj/item/ammo_box/magazine/m12g/buckshot
+ name = "shotgun magazine (12g buckshot slugs)"
+ icon_state = "m12gb"
+ ammo_type = "/obj/item/ammo_casing/shotgun/buckshot"
/obj/item/ammo_box/magazine/m12g/stun
name = "shotgun magazine (12g taser slugs)"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 8e3fd960123..61fb6ba0020 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -295,7 +295,7 @@
if (src.process_chambered())
//Point blank shooting if on harm intent or target we were targeting.
- if(user.a_intent == "harm")
+ if(user.a_intent == I_HARM)
user.visible_message("\red \The [user] fires \the [src] point blank at [M]!")
if(istype(in_chamber)) in_chamber.damage *= 1.3
Fire(M,user,0,0,1)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 9772d42dd99..63a3f2a3a79 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -232,7 +232,7 @@ proc/wabbajack(mob/living/M)
M.attack_log += text("\[[time_stamp()]\] [M.real_name] ([M.ckey]) became [new_mob.real_name].")
new_mob.attack_log = M.attack_log
- new_mob.a_intent = "harm"
+ new_mob.a_intent = I_HARM
if(M.mind)
M.mind.transfer_to(new_mob)
else
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index f8661d168e8..29a67ffe492 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -5,621 +5,618 @@ var/const/INGEST = 2
///////////////////////////////////////////////////////////////////////////////////
-datum
- reagents
- var/list/datum/reagent/reagent_list = new/list()
- var/total_volume = 0
- var/maximum_volume = 100
- var/atom/my_atom = null
+/datum/reagents
+ var/list/datum/reagent/reagent_list = new/list()
+ var/total_volume = 0
+ var/maximum_volume = 100
+ var/atom/my_atom = null
- New(maximum=100)
- maximum_volume = maximum
+/datum/reagents/New(maximum=100)
+ maximum_volume = maximum
- //I dislike having these here but map-objects are initialised before world/New() is called. >_>
- if(!chemical_reagents_list)
- //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
- var/paths = subtypesof(/datum/reagent)
- chemical_reagents_list = list()
- for(var/path in paths)
- var/datum/reagent/D = new path()
- chemical_reagents_list[D.id] = D
- if(!chemical_reactions_list)
- //Chemical Reactions - Initialises all /datum/chemical_reaction into a list
- // It is filtered into multiple lists within a list.
- // For example:
- // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma
+ //I dislike having these here but map-objects are initialised before world/New() is called. >_>
+ if(!chemical_reagents_list)
+ //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
+ var/paths = subtypesof(/datum/reagent)
+ chemical_reagents_list = list()
+ for(var/path in paths)
+ var/datum/reagent/D = new path()
+ chemical_reagents_list[D.id] = D
+ if(!chemical_reactions_list)
+ //Chemical Reactions - Initialises all /datum/chemical_reaction into a list
+ // It is filtered into multiple lists within a list.
+ // For example:
+ // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma
- var/paths = subtypesof(/datum/chemical_reaction)
- chemical_reactions_list = list()
+ var/paths = subtypesof(/datum/chemical_reaction)
+ chemical_reactions_list = list()
- for(var/path in paths)
+ for(var/path in paths)
- var/datum/chemical_reaction/D = new path()
- var/list/reaction_ids = list()
+ var/datum/chemical_reaction/D = new path()
+ var/list/reaction_ids = list()
- if(D && D.required_reagents && D.required_reagents.len)
- for(var/reaction in D.required_reagents)
- reaction_ids += reaction
+ if(D && D.required_reagents && D.required_reagents.len)
+ for(var/reaction in D.required_reagents)
+ reaction_ids += reaction
- // Create filters based on each reagent id in the required reagents list
- for(var/id in reaction_ids)
- if(!chemical_reactions_list[id])
- chemical_reactions_list[id] = list()
- chemical_reactions_list[id] += D
- break // Don't bother adding ourselves to other reagent ids, it is redundant.
+ // Create filters based on each reagent id in the required reagents list
+ for(var/id in reaction_ids)
+ if(!chemical_reactions_list[id])
+ chemical_reactions_list[id] = list()
+ chemical_reactions_list[id] += D
+ break // Don't bother adding ourselves to other reagent ids, it is redundant.
- proc
+/datum/reagents/proc/remove_any(var/amount=1)
+ var/total_transfered = 0
+ var/current_list_element = 1
- remove_any(var/amount=1)
- var/total_transfered = 0
- var/current_list_element = 1
+ current_list_element = rand(1,reagent_list.len)
- current_list_element = rand(1,reagent_list.len)
+ while(total_transfered != amount)
+ if(total_transfered >= amount) break
+ if(total_volume <= 0 || !reagent_list.len) break
- while(total_transfered != amount)
- if(total_transfered >= amount) break
- if(total_volume <= 0 || !reagent_list.len) break
+ if(current_list_element > reagent_list.len) current_list_element = 1
+ var/datum/reagent/current_reagent = reagent_list[current_list_element]
- if(current_list_element > reagent_list.len) current_list_element = 1
- var/datum/reagent/current_reagent = reagent_list[current_list_element]
+ src.remove_reagent(current_reagent.id, min(1, amount - total_transfered))
- src.remove_reagent(current_reagent.id, min(1, amount - total_transfered))
+ current_list_element++
+ total_transfered++
+ src.update_total()
- current_list_element++
- total_transfered++
- src.update_total()
+ handle_reactions()
+ return total_transfered
- handle_reactions()
- return total_transfered
+/datum/reagents/proc/get_master_reagent_name()
+ var/the_name = null
+ var/the_volume = 0
+ for(var/datum/reagent/A in reagent_list)
+ if(A.volume > the_volume)
+ the_volume = A.volume
+ the_name = A.name
- get_master_reagent_name()
- var/the_name = null
- var/the_volume = 0
- for(var/datum/reagent/A in reagent_list)
- if(A.volume > the_volume)
- the_volume = A.volume
- the_name = A.name
+ return the_name
- return the_name
+/datum/reagents/proc/get_master_reagent_id()
+ var/the_id = null
+ var/the_volume = 0
+ for(var/datum/reagent/A in reagent_list)
+ if(A.volume > the_volume)
+ the_volume = A.volume
+ the_id = A.id
- get_master_reagent_id()
- var/the_id = null
- var/the_volume = 0
- for(var/datum/reagent/A in reagent_list)
- if(A.volume > the_volume)
- the_volume = A.volume
- the_id = A.id
+ return the_id
- return the_id
+/datum/reagents/proc/trans_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
+ if (!target )
+ return
+ if (!target.reagents || src.total_volume<=0)
+ return
+ var/datum/reagents/R = target.reagents
+ amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
+ var/part = amount / src.total_volume
+ var/trans_data = null
+ for (var/datum/reagent/current_reagent in src.reagent_list)
+ if (!current_reagent)
+ continue
+ if (current_reagent.id == "blood" && ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.inject_blood(my_atom, amount)
+ continue
+ var/current_reagent_transfer = current_reagent.volume * part
+ if(preserve_data)
+ trans_data = copy_data(current_reagent)
- trans_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
- if (!target )
- return
- if (!target.reagents || src.total_volume<=0)
- return
- var/datum/reagents/R = target.reagents
- amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
- var/part = amount / src.total_volume
- var/trans_data = null
- for (var/datum/reagent/current_reagent in src.reagent_list)
- if (!current_reagent)
- continue
- if (current_reagent.id == "blood" && ishuman(target))
- var/mob/living/carbon/human/H = target
- H.inject_blood(my_atom, amount)
- continue
- var/current_reagent_transfer = current_reagent.volume * part
- if(preserve_data)
- trans_data = copy_data(current_reagent)
+ R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp)
+ src.remove_reagent(current_reagent.id, current_reagent_transfer)
- R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp)
- src.remove_reagent(current_reagent.id, current_reagent_transfer)
+ src.update_total()
+ R.update_total()
+ R.handle_reactions()
+ src.handle_reactions()
+ return amount
- src.update_total()
- R.update_total()
- R.handle_reactions()
- src.handle_reactions()
- return amount
+/datum/reagents/proc/trans_to_ingest(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//For items ingested. A delay is added between ingestion and addition of the reagents
+ if (!target )
+ return
+ if (!target.reagents || src.total_volume<=0)
+ return
- trans_to_ingest(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//For items ingested. A delay is added between ingestion and addition of the reagents
- if (!target )
- return
- if (!target.reagents || src.total_volume<=0)
- return
+ var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder
+ B.volume = 1000
- var/obj/item/weapon/reagent_containers/glass/beaker/noreact/B = new /obj/item/weapon/reagent_containers/glass/beaker/noreact //temporary holder
- B.volume = 1000
+ var/datum/reagents/BR = B.reagents
+ var/datum/reagents/R = target.reagents
- var/datum/reagents/BR = B.reagents
- var/datum/reagents/R = target.reagents
+ amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
- amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
+ src.trans_to(B, amount)
- src.trans_to(B, amount)
+ spawn(-1)
+ src = null // Survive through deletion of the reagent holder
+ sleep(100)
+ if(!target)
+ return
+ BR.trans_to(target, BR.total_volume)
+ qdel(B)
- spawn(-1)
- src = null // Survive through deletion of the reagent holder
- sleep(100)
- if(!target)
- return
- BR.trans_to(target, BR.total_volume)
- qdel(B)
+ return amount
- return amount
+/datum/reagents/proc/copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0)
+ if(!target)
+ return
+ if(!target.reagents || src.total_volume<=0)
+ return
+ var/datum/reagents/R = target.reagents
+ amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
+ var/part = amount / src.total_volume
+ var/trans_data = null
+ for (var/datum/reagent/current_reagent in src.reagent_list)
+ var/current_reagent_transfer = current_reagent.volume * part
+ if(preserve_data)
+ trans_data = copy_data(current_reagent)
+ R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
- copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0)
- if(!target)
- return
- if(!target.reagents || src.total_volume<=0)
- return
- var/datum/reagents/R = target.reagents
- amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
- var/part = amount / src.total_volume
- var/trans_data = null
- for (var/datum/reagent/current_reagent in src.reagent_list)
- var/current_reagent_transfer = current_reagent.volume * part
- if(preserve_data)
- trans_data = copy_data(current_reagent)
- R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
+ src.update_total()
+ R.update_total()
+ R.handle_reactions()
+ src.handle_reactions()
+ return amount
- src.update_total()
- R.update_total()
- R.handle_reactions()
- src.handle_reactions()
- return amount
+/datum/reagents/proc/trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
+ if (!target)
+ return
+ if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent))
+ return
- trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
- if (!target)
- return
- if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent))
- return
+ var/datum/reagents/R = target.reagents
+ if(src.get_reagent_amount(reagent) R.maximum_volume) return 0
+ if (!target) return
+ var/total_transfered = 0
+ var/current_list_element = 1
+ var/datum/reagents/R = target.reagents
+ var/trans_data = null
+ //if(R.total_volume + amount > R.maximum_volume) return 0
- current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix.
+ current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix.
- while(total_transfered != amount)
- if(total_transfered >= amount) break //Better safe than sorry.
- if(total_volume <= 0 || !reagent_list.len) break
- if(R.total_volume >= R.maximum_volume) break
+ while(total_transfered != amount)
+ if(total_transfered >= amount) break //Better safe than sorry.
+ if(total_volume <= 0 || !reagent_list.len) break
+ if(R.total_volume >= R.maximum_volume) break
- if(current_list_element > reagent_list.len) current_list_element = 1
- var/datum/reagent/current_reagent = reagent_list[current_list_element]
- if(preserve_data)
- trans_data = current_reagent.data
- R.add_reagent(current_reagent.id, (1 * multiplier), trans_data)
- src.remove_reagent(current_reagent.id, 1)
+ if(current_list_element > reagent_list.len) current_list_element = 1
+ var/datum/reagent/current_reagent = reagent_list[current_list_element]
+ if(preserve_data)
+ trans_data = current_reagent.data
+ R.add_reagent(current_reagent.id, (1 * multiplier), trans_data)
+ src.remove_reagent(current_reagent.id, 1)
- current_list_element++
- total_transfered++
- src.update_total()
- R.update_total()
- R.handle_reactions()
- handle_reactions()
+ current_list_element++
+ total_transfered++
+ src.update_total()
+ R.update_total()
+ R.handle_reactions()
+ handle_reactions()
- return total_transfered
+ return total_transfered
*/
- conditional_update_move(var/atom/A, var/Running = 0)
- for(var/datum/reagent/R in reagent_list)
- R.on_move (A, Running)
- update_total()
+/datum/reagents/proc/conditional_update_move(var/atom/A, var/Running = 0)
+ for(var/datum/reagent/R in reagent_list)
+ R.on_move (A, Running)
+ update_total()
- conditional_update(var/atom/A, )
- for(var/datum/reagent/R in reagent_list)
- R.on_update (A)
- update_total()
+/datum/reagents/proc/conditional_update(var/atom/A, )
+ for(var/datum/reagent/R in reagent_list)
+ R.on_update (A)
+ update_total()
+
+/datum/reagents/proc/handle_reactions()
+ if(my_atom.flags & NOREACT) return //Yup, no reactions here. No siree.
+
+ var/reaction_occured = 0
+ do
+ reaction_occured = 0
+ for(var/datum/reagent/R in reagent_list) // Usually a small list
+ for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id
+
+ if(!reaction)
+ continue
+
+ var/datum/chemical_reaction/C = reaction
+
+ var/total_required_reagents = C.required_reagents.len
+ var/total_matching_reagents = 0
+ var/total_required_catalysts = C.required_catalysts.len
+ var/total_matching_catalysts= 0
+ var/matching_container = 0
+ var/matching_other = 0
+ var/list/multipliers = new/list()
+ var/min_temp = C.min_temp //Minimum temperature required for the reaction to occur (heat to/above this)
+ var/max_temp = C.max_temp //Maximum temperature allowed for the reaction to occur (cool to/below this)
+ for(var/B in C.required_reagents)
+ if(!has_reagent(B, C.required_reagents[B])) break
+ total_matching_reagents++
+ multipliers += round(get_reagent_amount(B) / C.required_reagents[B])
+ for(var/B in C.required_catalysts)
+ if(!has_reagent(B, C.required_catalysts[B])) break
+ total_matching_catalysts++
+
+ if(!C.required_container)
+ matching_container = 1
+
+ else
+ if(my_atom.type == C.required_container)
+ matching_container = 1
+
+ if(!C.required_other)
+ matching_other = 1
+
+ else
+ /*if(istype(my_atom, /obj/item/slime_core))
+ var/obj/item/slime_core/M = my_atom
+
+ if(M.POWERFLAG == C.required_other && M.Uses > 0) // added a limit to slime cores -- Muskets requested this
+ matching_other = 1*/
+ if(istype(my_atom, /obj/item/slime_extract))
+ var/obj/item/slime_extract/M = my_atom
+
+ if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
+ matching_other = 1
+
+ if(min_temp == 0)
+ min_temp = chem_temp
+
+ if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp <= max_temp && chem_temp >= min_temp)
+ var/multiplier = min(multipliers)
+ var/preserved_data = null
+ for(var/B in C.required_reagents)
+ if(!preserved_data)
+ preserved_data = get_data(B)
+ remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
+
+ var/created_volume = C.result_amount*multiplier
+ if(C.result)
+ feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]")
+ multiplier = max(multiplier, 1) //this shouldnt happen ...
+ add_reagent(C.result, C.result_amount*multiplier)
+ set_data(C.result, preserved_data)
+
+ //add secondary products
+ for(var/S in C.secondary_results)
+ add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier)
+
+ var/list/seen = viewers(4, get_turf(my_atom))
+ for(var/mob/M in seen)
+ 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--
+ if(ME2.Uses <= 0) // give the notification that the slime core is dead
+ for(var/mob/M in seen)
+ M << "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction."
+ ME2.name = "used slime extract"
+ ME2.desc = "This extract has been used up."
+
+ playsound(get_turf(my_atom), C.mix_sound, 80, 1)
+
+ C.on_reaction(src, created_volume)
+ reaction_occured = 1
+ break
+
+ while(reaction_occured)
+ update_total()
+ return 0
+
+/datum/reagents/proc/isolate_reagent(var/reagent)
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if (R.id != reagent)
+ del_reagent(R.id)
+ update_total()
+
+/datum/reagents/proc/del_reagent(var/reagent)
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if (R.id == reagent)
+ if(istype(my_atom, /mob/living))
+ var/mob/living/M = my_atom
+ R.reagent_deleted(M)
+ reagent_list -= A
+ qdel(A)
+ update_total()
+ my_atom.on_reagent_change()
+ check_ignoreslow(my_atom)
+ check_gofast(my_atom)
+ check_goreallyfast(my_atom)
+ return 0
+
+
+ return 1
+
+/datum/reagents/proc/update_total()
+ total_volume = 0
+ for(var/datum/reagent/R in reagent_list)
+ if(R.volume < 0.1)
+ del_reagent(R.id)
+ else
+ total_volume += R.volume
+
+ return 0
+
+/datum/reagents/proc/clear_reagents()
+ for(var/datum/reagent/R in reagent_list)
+ del_reagent(R.id)
+ return 0
+
+/datum/reagents/proc/reaction_check(var/mob/M, var/datum/reagent/R)
+ var/can_process = 0
+ if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
+ return can_process
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ //Check if this mob's species is set and can process this type of reagent
+ if(H.species && H.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ can_process = 1
+ if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ can_process = 1
+ //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ can_process = 1
+ //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
+ else
+ if(R.process_flags != SYNTHETIC)
+ can_process = 1
+ return can_process
+
+/datum/reagents/proc/reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
+
+ switch(method)
+ if(TOUCH)
+ for(var/datum/reagent/R in reagent_list)
+ if(ismob(A))
+ spawn(0)
+ if(!R) return
+ var/check = reaction_check(A, R)
+ if(!check)
+ continue
+ else
+ R.reaction_mob(A, TOUCH, R.volume+volume_modifier)
+ if(isturf(A))
+ spawn(0)
+ if(!R) return
+ else R.reaction_turf(A, R.volume+volume_modifier)
+ if(isobj(A))
+ spawn(0)
+ if(!R) return
+ else R.reaction_obj(A, R.volume+volume_modifier)
+ if(INGEST)
+ for(var/datum/reagent/R in reagent_list)
+ if(ismob(A) && R)
+ spawn(0)
+ if(!R) return
+ var/check = reaction_check(A, R)
+ if(!check)
+ continue
+ else
+ R.reaction_mob(A, INGEST, R.volume+volume_modifier)
+ if(isturf(A) && R)
+ spawn(0)
+ if(!R) return
+ else R.reaction_turf(A, R.volume+volume_modifier)
+ if(isobj(A) && R)
+ spawn(0)
+ if(!R) return
+ else R.reaction_obj(A, R.volume+volume_modifier)
+ return
+
+/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300)
+ if(!isnum(amount)) return 1
+ update_total()
+ if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
+ if(amount <= 0) return 0
+ chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems
+
+ for(var/A in reagent_list)
+
+ var/datum/reagent/R = A
+ if (R.id == reagent)
+ 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
+*/
handle_reactions()
- if(my_atom.flags & NOREACT) return //Yup, no reactions here. No siree.
+ return 0
- var/reaction_occured = 0
- do
- reaction_occured = 0
- for(var/datum/reagent/R in reagent_list) // Usually a small list
- for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id
+ var/datum/reagent/D = chemical_reagents_list[reagent]
+ if(D)
- if(!reaction)
- continue
-
- var/datum/chemical_reaction/C = reaction
-
- var/total_required_reagents = C.required_reagents.len
- var/total_matching_reagents = 0
- var/total_required_catalysts = C.required_catalysts.len
- var/total_matching_catalysts= 0
- var/matching_container = 0
- var/matching_other = 0
- var/list/multipliers = new/list()
- var/min_temp = C.min_temp //Minimum temperature required for the reaction to occur (heat to/above this)
- var/max_temp = C.max_temp //Maximum temperature allowed for the reaction to occur (cool to/below this)
- for(var/B in C.required_reagents)
- if(!has_reagent(B, C.required_reagents[B])) break
- total_matching_reagents++
- multipliers += round(get_reagent_amount(B) / C.required_reagents[B])
- for(var/B in C.required_catalysts)
- if(!has_reagent(B, C.required_catalysts[B])) break
- total_matching_catalysts++
-
- if(!C.required_container)
- matching_container = 1
-
- else
- if(my_atom.type == C.required_container)
- matching_container = 1
-
- if(!C.required_other)
- matching_other = 1
-
- else
- /*if(istype(my_atom, /obj/item/slime_core))
- var/obj/item/slime_core/M = my_atom
-
- if(M.POWERFLAG == C.required_other && M.Uses > 0) // added a limit to slime cores -- Muskets requested this
- matching_other = 1*/
- if(istype(my_atom, /obj/item/slime_extract))
- var/obj/item/slime_extract/M = my_atom
-
- if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
- matching_other = 1
-
- if(min_temp == 0)
- min_temp = chem_temp
-
- if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp <= max_temp && chem_temp >= min_temp)
- var/multiplier = min(multipliers)
- var/preserved_data = null
- for(var/B in C.required_reagents)
- if(!preserved_data)
- preserved_data = get_data(B)
- remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
-
- var/created_volume = C.result_amount*multiplier
- if(C.result)
- feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]")
- multiplier = max(multiplier, 1) //this shouldnt happen ...
- add_reagent(C.result, C.result_amount*multiplier)
- set_data(C.result, preserved_data)
-
- //add secondary products
- for(var/S in C.secondary_results)
- add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier)
-
- var/list/seen = viewers(4, get_turf(my_atom))
- for(var/mob/M in seen)
- 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--
- if(ME2.Uses <= 0) // give the notification that the slime core is dead
- for(var/mob/M in seen)
- M << "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction."
- ME2.name = "used slime extract"
- ME2.desc = "This extract has been used up."
-
- playsound(get_turf(my_atom), C.mix_sound, 80, 1)
-
- C.on_reaction(src, created_volume)
- reaction_occured = 1
- break
-
- while(reaction_occured)
- update_total()
- return 0
-
- isolate_reagent(var/reagent)
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if (R.id != reagent)
- del_reagent(R.id)
- update_total()
-
- del_reagent(var/reagent)
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if (R.id == reagent)
- if(istype(my_atom, /mob/living))
- var/mob/living/M = my_atom
- R.reagent_deleted(M)
- reagent_list -= A
- qdel(A)
- update_total()
- my_atom.on_reagent_change()
- check_ignoreslow(my_atom)
- check_gofast(my_atom)
- check_goreallyfast(my_atom)
- return 0
-
-
- return 1
-
- update_total()
- total_volume = 0
- for(var/datum/reagent/R in reagent_list)
- if(R.volume < 0.1)
- del_reagent(R.id)
- else
- total_volume += R.volume
-
- return 0
-
- clear_reagents()
- for(var/datum/reagent/R in reagent_list)
- del_reagent(R.id)
- return 0
-
- reaction_check(var/mob/M, var/datum/reagent/R)
- var/can_process = 0
- if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
- return can_process
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- //Check if this mob's species is set and can process this type of reagent
- if(H.species && H.species.reagent_tag)
- if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
- can_process = 1
- if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
- can_process = 1
- //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
- if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
- can_process = 1
- //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
- else
- if(R.process_flags != SYNTHETIC)
- can_process = 1
- return can_process
-
- reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
-
- switch(method)
- if(TOUCH)
- for(var/datum/reagent/R in reagent_list)
- if(ismob(A))
- spawn(0)
- if(!R) return
- var/check = reaction_check(A, R)
- if(!check)
- continue
- else
- R.reaction_mob(A, TOUCH, R.volume+volume_modifier)
- if(isturf(A))
- spawn(0)
- if(!R) return
- else R.reaction_turf(A, R.volume+volume_modifier)
- if(isobj(A))
- spawn(0)
- if(!R) return
- else R.reaction_obj(A, R.volume+volume_modifier)
- if(INGEST)
- for(var/datum/reagent/R in reagent_list)
- if(ismob(A) && R)
- spawn(0)
- if(!R) return
- var/check = reaction_check(A, R)
- if(!check)
- continue
- else
- R.reaction_mob(A, INGEST, R.volume+volume_modifier)
- if(isturf(A) && R)
- spawn(0)
- if(!R) return
- else R.reaction_turf(A, R.volume+volume_modifier)
- if(isobj(A) && R)
- spawn(0)
- if(!R) return
- else R.reaction_obj(A, R.volume+volume_modifier)
- return
-
- add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300)
- if(!isnum(amount)) return 1
- update_total()
- if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
- if(amount <= 0) return 0
- chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems
-
- for(var/A in reagent_list)
-
- var/datum/reagent/R = A
- if (R.id == reagent)
- 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
-*/
-
- handle_reactions()
- return 0
-
- var/datum/reagent/D = chemical_reagents_list[reagent]
- if(D)
-
- var/datum/reagent/R = new D.type()
- reagent_list += R
- R.holder = src
- R.volume = amount
+ var/datum/reagent/R = new D.type()
+ 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
- update_total()
- my_atom.on_reagent_change()
- handle_reactions()
- return 0
- else
- warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])")
+ if(data) R.data = data
+ //debug
+ //world << "Adding data"
+ //for(var/D in R.data)
+ // world << "Container data: [D] = [R.data[D]]"
+ //debug
+ update_total()
+ my_atom.on_reagent_change()
+ handle_reactions()
+ return 0
+ else
+ warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])")
+ handle_reactions()
+
+ return 1
+
+/datum/reagents/proc/remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to
+
+ if(!isnum(amount)) return 1
+
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if (R.id == reagent)
+ R.volume -= amount
+ update_total()
+ if(!safety)//So it does not handle reactions when it need not to
handle_reactions()
+ my_atom.on_reagent_change()
+ return 0
- return 1
+ return 1
- remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to
+/datum/reagents/proc/has_reagent(var/reagent, var/amount = -1)
- if(!isnum(amount)) return 1
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if (R.id == reagent)
+ if(!amount) return R
+ else
+ if(R.volume >= amount) return R
+ else return 0
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if (R.id == reagent)
- R.volume -= amount
- update_total()
- if(!safety)//So it does not handle reactions when it need not to
- handle_reactions()
- my_atom.on_reagent_change()
- return 0
+ return 0
- return 1
+/datum/reagents/proc/get_reagent_amount(var/reagent)
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if (R.id == reagent)
+ return R.volume
- has_reagent(var/reagent, var/amount = -1)
+ return 0
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if (R.id == reagent)
- if(!amount) return R
- else
- if(R.volume >= amount) return R
- else return 0
+/datum/reagents/proc/get_reagents()
+ var/res = ""
+ for(var/datum/reagent/A in reagent_list)
+ if (res != "") res += ","
+ res += A.name
- return 0
+ return res
- get_reagent_amount(var/reagent)
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if (R.id == reagent)
- return R.volume
+/datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0, var/safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
+ if(!isnum(amount)) return 1
- return 0
+ var/has_removed_reagent = 0
- get_reagents()
- var/res = ""
- for(var/datum/reagent/A in reagent_list)
- if (res != "") res += ","
- res += A.name
+ for(var/datum/reagent/R in reagent_list)
+ var/matches = 0
+ // Switch between how we check the reagent type
+ if(strict)
+ if(R.type == reagent_type)
+ matches = 1
+ else
+ if(istype(R, reagent_type))
+ matches = 1
+ // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type.
+ if(matches)
+ // Have our other proc handle removement
+ has_removed_reagent = remove_reagent(R.id, amount, safety)
- return res
+ return has_removed_reagent
- remove_all_type(var/reagent_type, var/amount, var/strict = 0, var/safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
- if(!isnum(amount)) return 1
+// Admin logging.
+/datum/reagents/proc/get_reagent_ids(var/and_amount=0)
+ var/list/stuff = list()
+ for(var/datum/reagent/A in reagent_list)
+ if(and_amount)
+ stuff += "[get_reagent_amount(A.id)]U of [A.id]"
+ else
+ stuff += A.id
+ return english_list(stuff)
- var/has_removed_reagent = 0
+//two helper functions to preserve data across reactions (needed for xenoarch)
+/datum/reagents/proc/get_data(var/reagent_id)
+ for(var/datum/reagent/D in reagent_list)
+ if(D.id == reagent_id)
+ //world << "proffering a data-carrying reagent ([reagent_id])"
+ return D.data
- for(var/datum/reagent/R in reagent_list)
- var/matches = 0
- // Switch between how we check the reagent type
- if(strict)
- if(R.type == reagent_type)
- matches = 1
- else
- if(istype(R, reagent_type))
- matches = 1
- // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type.
- if(matches)
- // Have our other proc handle removement
- has_removed_reagent = remove_reagent(R.id, amount, safety)
+/datum/reagents/proc/set_data(var/reagent_id, var/new_data)
+ for(var/datum/reagent/D in reagent_list)
+ if(D.id == reagent_id)
+ //world << "reagent data set ([reagent_id])"
+ D.data = new_data
- return has_removed_reagent
+/datum/reagents/proc/copy_data(var/datum/reagent/current_reagent)
+ if (!current_reagent || !current_reagent.data) return null
+ if (!istype(current_reagent.data, /list)) return current_reagent.data
- // Admin logging.
- get_reagent_ids(var/and_amount=0)
- var/list/stuff = list()
- for(var/datum/reagent/A in reagent_list)
- if(and_amount)
- stuff += "[get_reagent_amount(A.id)]U of [A.id]"
- else
- stuff += A.id
- return english_list(stuff)
+ var/list/trans_data = current_reagent.data.Copy()
- //two helper functions to preserve data across reactions (needed for xenoarch)
- get_data(var/reagent_id)
- for(var/datum/reagent/D in reagent_list)
- if(D.id == reagent_id)
- //world << "proffering a data-carrying reagent ([reagent_id])"
- return D.data
+ // We do this so that introducing a virus to a blood sample
+ // doesn't automagically infect all other blood samples from
+ // the same donor.
+ //
+ // 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()
- set_data(var/reagent_id, var/new_data)
- for(var/datum/reagent/D in reagent_list)
- if(D.id == reagent_id)
- //world << "reagent data set ([reagent_id])"
- D.data = new_data
-
- copy_data(var/datum/reagent/current_reagent)
- if (!current_reagent || !current_reagent.data) return null
- if (!istype(current_reagent.data, /list)) return current_reagent.data
-
- var/list/trans_data = current_reagent.data.Copy()
-
- // We do this so that introducing a virus to a blood sample
- // doesn't automagically infect all other blood samples from
- // the same donor.
- //
- // 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()
-
- return trans_data
+ return trans_data
///////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
deleted file mode 100644
index 238724c0b09..00000000000
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ /dev/null
@@ -1,3283 +0,0 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
-#define FOOD_METABOLISM 0.4
-#define REM REAGENTS_EFFECT_MULTIPLIER
-
-//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
-//so that it can continue working when the reagent is deleted while the proc is still active.
-
-datum
- reagent
- var/name = "Reagent"
- var/id = "reagent"
- var/description = ""
- var/datum/reagents/holder = null
- var/reagent_state = SOLID
- var/list/data = null
- var/volume = 0
- var/nutriment_factor = 0
- var/metabolization_rate = REAGENTS_METABOLISM
- //var/list/viruses = list()
- var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
- var/shock_reduction = 0
- var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin
- //Processing flags, defines the type of mobs the reagent will affect
- //By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths
- var/process_flags = ORGANIC
- proc
- reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
- if(!istype(M, /mob/living)) return 0
- var/datum/reagent/self = src
- src = null
-
- if(self.holder) //for catching rare runtimes
- if(method == TOUCH && self.penetrates_skin)
- var/block = 0
- for(var/obj/item/clothing/C in M.get_equipped_items())
- if(istype(C, /obj/item/clothing/suit/bio_suit))
- block += 1
- if(istype(C, /obj/item/clothing/head/bio_hood))
- block += 1
- if(block < 2)
- if(M.reagents)
- M.reagents.add_reagent(self.id,self.volume)
-
-/*
- if(method == INGEST && istype(M, /mob/living/carbon))
- if(prob(1 * self.addictiveness))
- if(prob(5 * volume))
- var/datum/disease/addiction/A = new /datum/disease/addiction
- A.addicted_to = self
- A.name = "[self.name] Addiction"
- A.addiction ="[self.name]"
- A.cure = self.id
- M.viruses += A
- A.affected_mob = M
- A.holder = M
-*/
- return 1
-
- reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object
- src = null //if it can hold reagents. nope!
- //if(O.reagents)
- // O.reagents.add_reagent(id,volume/3)
- return
-
- reaction_turf(var/turf/T, var/volume)
- src = null
- return
-
- on_mob_life(var/mob/living/M as mob, var/alien)
- if(!istype(M, /mob/living)) // YOU'RE A FUCKING RETARD NEO WHY CAN'T YOU JUST FIX THE PROBLEM ON THE REAGENT - Iamgoofball
- return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO
- // Certain elements in too large amounts cause side-effects
- holder.remove_reagent(src.id, metabolization_rate) //By default it slowly disappears.
- current_cycle++
- return
-
- // Called when two reagents of the same are mixing.
- on_merge(var/data)
- return
-
- on_move(var/mob/M)
- return
-
- on_update(var/atom/A)
- return
-
- slimejelly
- name = "Slime Jelly"
- id = "slimejelly"
- description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL."
- reagent_state = LIQUID
- color = "#801E28" // rgb: 128, 30, 40
- on_mob_life(var/mob/living/M as mob)
- if(prob(10))
- M << "\red Your insides are burning!"
- M.adjustToxLoss(rand(20,60)*REM)
- else if(prob(40))
- M.heal_organ_damage(5*REM,0)
- ..()
- return
-
-
- blood
- data = new/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
-
- 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]
-
- 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"]
-
- on_merge(var/data)
- if(data["blood_colour"])
- color = data["blood_colour"]
- return ..()
-
- on_update(var/atom/A)
- if(data["blood_colour"])
- color = data["blood_colour"]
- return ..()
-
-
-
- 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
- if(!(volume >= 3)) return
- //var/datum/disease/D = self.data["virus"]
- if(!self.data["donor"] || istype(self.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[self.data["blood_DNA"]] = self.data["blood_type"]
-
- if(self.data["virus2"])
- blood_prop.virus2 = virus_copylist(self.data["virus2"])
-
- else if(istype(self.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
-
-/* Must check the transfering of reagents and their data first. They all can point to one disease datum.
-
- Destroy()
- if(src.data["virus"])
- var/datum/disease/D = src.data["virus"]
- D.cure(0)
- return ..()
-*/
-
-/*
- vaccine
- //data must contain virus type
- name = "Vaccine"
- id = "vaccine"
- reagent_state = LIQUID
- color = "#C81040" // rgb: 200, 16, 64
-
- 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
-*/
-
- // Ported from Bay as part of the Botany Update
- // Allows you to make planks from any plant that has this reagent in it.
- // Also vines with this reagent are considered dense.
- woodpulp
- name = "Wood Pulp"
- id = "woodpulp"
- description = "A mass of wood fibers."
- reagent_state = LIQUID
- color = "#B97A57"
-
- fishwater
- name = "Fish Water"
- id = "fishwater"
- description = "Smelly water from a fish tank. Gross!"
- reagent_state = LIQUID
- color = "#757547"
-
- reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
- if(!istype(M, /mob/living))
- return
- if(method == INGEST)
- M << "Oh god, why did you drink that?"
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(prob(30)) // Nasty, you drank this stuff? 30% chance of the fakevomit (non-stunning version)
- if(prob(50)) // 50/50 chance of green vomit vs normal vomit
- M.fakevomit(1)
- else
- M.fakevomit(0)
- ..()
- return
-
- water
- name = "Water"
- id = "water"
- description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
- reagent_state = LIQUID
- color = "#0064C8" // rgb: 0, 100, 200
- var/cooling_temperature = 2
- process_flags = ORGANIC | SYNTHETIC
-
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if(!istype(M, /mob/living))
- return
-
- // Put out fire
- if(method == TOUCH)
- M.adjust_fire_stacks(-(volume / 10))
- if(M.fire_stacks <= 0)
- M.ExtinguishMob()
- return
-
- reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
- src = null
- if(volume >= 3)
- if(T.wet >= 1) return
- T.wet = 1
- if(T.wet_overlay)
- T.overlays -= T.wet_overlay
- T.wet_overlay = null
- T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
- T.overlays += T.wet_overlay
-
- spawn(800)
- if (!istype(T)) return
- if(T.wet >= 2) return
- T.wet = 0
- if(T.wet_overlay)
- T.overlays -= T.wet_overlay
- T.wet_overlay = null
-
- for(var/mob/living/carbon/slime/M in T)
- M.apply_water()
-
- var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot && !istype(T, /turf/space))
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
- lowertemp.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
- return
-
- reaction_obj(var/obj/O, var/volume)
- src = null
- var/turf/T = get_turf(O)
- var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot && !istype(T, /turf/space))
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
- lowertemp.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
- var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
- if(!cube.wrapped)
- cube.Expand()
- // Dehydrated carp
- if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
- var/obj/item/toy/carpplushie/dehy_carp/dehy = O
- dehy.Swell() // Makes a carp
- return
-
- hellwater
- name = "Hell Water"
- id = "hell_water"
- description = "YOUR FLESH! IT BURNS!"
- process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
-
- on_mob_life(var/mob/living/M as mob)
- M.fire_stacks = min(5,M.fire_stacks + 3)
- M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
- M.adjustToxLoss(1)
- M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard?
- M.adjustBrainLoss(5)
- holder.remove_reagent(src.id, 1)
-
- lube
- name = "Space Lube"
- id = "lube"
- description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity."
- reagent_state = LIQUID
- color = "#1BB1AB"
-
- reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
- src = null
- if(volume >= 1)
- if(T.wet >= 2) return
- T.wet = 2
- spawn(800)
- if (!istype(T)) return
- T.wet = 0
- if(T.wet_overlay)
- T.overlays -= T.wet_overlay
- T.wet_overlay = null
- return
-
- toxin
- name = "Toxin"
- id = "toxin"
- description = "A Toxic chemical."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(2)
- ..()
- return
-
- spider_venom
- name = "Spider venom"
- id = "spidertoxin"
- description = "A toxic venom injected by spacefaring arachnids."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(1.5)
- ..()
- return
-
- plasticide
- name = "Plasticide"
- id = "plasticide"
- description = "Liquid plastic, do not eat."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(1.5)
- ..()
- return
-
- minttoxin
- name = "Mint Toxin"
- id = "minttoxin"
- description = "Useful for dealing with undesirable customers."
- reagent_state = LIQUID
- color = "#CF3600" // rgb: 207, 54, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if (FAT in M.mutations)
- M.gib()
- ..()
- return
-
- slimetoxin
- name = "Mutation Toxin"
- id = "mutationtoxin"
- description = "A corruptive toxin produced by slimes."
- reagent_state = LIQUID
- color = "#13BC5E" // rgb: 19, 188, 94
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(ishuman(M))
- var/mob/living/carbon/human/human = M
- if(human.species.name != "Shadow")
- M << "\red Your flesh rapidly mutates!"
- M << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids."
- M << "\red Your body reacts violently to light. \green However, it naturally heals in darkness."
- M << "Aside from your new traits, you are mentally unchanged and retain your prior obligations."
- human.set_species("Shadow")
- ..()
- return
-
-
-
- aslimetoxin
- name = "Advanced Mutation Toxin"
- id = "amutationtoxin"
- description = "An advanced corruptive toxin produced by slimes."
- reagent_state = LIQUID
- color = "#13BC5E" // rgb: 19, 188, 94
-
- 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 = "harm"
- new_mob.universal_speak = 1
- if(M.mind)
- M.mind.transfer_to(new_mob)
- else
- new_mob.key = M.key
- qdel(M)
- ..()
- return
-
- space_drugs
- name = "Space drugs"
- id = "space_drugs"
- description = "An illegal chemical compound used as drug."
- reagent_state = LIQUID
- color = "#9087A2"
- metabolization_rate = 0.2
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.druggy = max(M.druggy, 15)
- if(isturf(M.loc) && !istype(M.loc, /turf/space))
- if(M.canmove && !M.restrained())
- if(prob(10)) step(M, pick(cardinal))
- if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
- ..()
- return
-
- holywater
- name = "Water"
- id = "holywater"
- description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
- reagent_state = LIQUID
- color = "#0064C8" // rgb: 0, 100, 200
- process_flags = ORGANIC | SYNTHETIC
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.jitteriness = max(M.jitteriness-5,0)
- if(data >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec
- if (!M.stuttering) M.stuttering = 1
- M.stuttering += 4
- M.Dizzy(5)
- if(iscultist(M) && prob(5))
- M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
- if(data >= 75 && prob(33)) // 30 units, 150 seconds
- if (!M.confused) M.confused = 1
- M.confused += 3
- if(iscultist(M))
- ticker.mode.remove_cultist(M.mind)
- holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
- M.jitteriness = 0
- M.stuttering = 0
- M.confused = 0
- if(ishuman(M)) .
- if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers)) && prob(80))
- switch(data)
- if(1 to 4)
- M << "Something sizzles in your veins!"
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
- if(5 to 12)
- M << "You feel an intense burning inside of you!"
- M.adjustFireLoss(1)
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
- if(13 to INFINITY)
- M << "You suddenly ignite in a holy fire!"
- for(var/mob/O in viewers(M, null))
- O.show_message(text("[] suddenly bursts into flames!", M), 1)
- M.fire_stacks = min(5,M.fire_stacks + 3)
- M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
- M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard?
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
- ..()
- return
-
-
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- // Vampires have their powers weakened by holy water applied to the skin.
- if(ishuman(M))
- if((M.mind in ticker.mode.vampires) && !(VAMP_FULL in M.mind.vampire.powers))
- var/mob/living/carbon/human/H=M
- if(method == TOUCH)
- if(H.wear_mask)
- H << "\red Your mask protects you from the holy water!"
- return
- else if(H.head)
- H << "\red Your helmet protects you from the holy water!"
- return
- else
- M << "Something holy interferes with your powers!"
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
- return
-
-
- reaction_turf(var/turf/simulated/T, var/volume)
- ..()
- if(!istype(T)) return
- if(volume>=10)
- for(var/obj/effect/rune/R in T)
- qdel(R)
- T.Bless()
-
- serotrotium
- name = "Serotrotium"
- id = "serotrotium"
- description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
- reagent_state = LIQUID
- color = "#202040" // rgb: 20, 20, 40
-
- on_mob_life(var/mob/living/M as mob)
- if(ishuman(M))
- if(prob(7)) M.emote(pick("twitch","drool","moan","gasp"))
- holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM)
- return
-
-/* silicate
- name = "Silicate"
- id = "silicate"
- description = "A compound that can be used to reinforce glass."
- reagent_state = LIQUID
- color = "#C7FFFF" // rgb: 199, 255, 255
-
- reaction_obj(var/obj/O, var/volume)
- src = null
- if(istype(O,/obj/structure/window))
- if(O:silicate <= 200)
-
- O:silicate += volume
- O:health += volume * 3
-
- if(!O:silicateIcon)
- var/icon/I = icon(O.icon,O.icon_state,O.dir)
-
- var/r = (volume / 100) + 1
- var/g = (volume / 70) + 1
- var/b = (volume / 50) + 1
- I.SetIntensity(r,g,b)
- O.icon = I
- O:silicateIcon = I
- else
- var/icon/I = O:silicateIcon
-
- var/r = (volume / 100) + 1
- var/g = (volume / 70) + 1
- var/b = (volume / 50) + 1
- I.SetIntensity(r,g,b)
- O.icon = I
- O:silicateIcon = I
-
- return*/
-
- oxygen
- name = "Oxygen"
- id = "oxygen"
- description = "A colorless, odorless gas."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
-
- on_mob_life(var/mob/living/M as mob, var/alien)
- if(M.stat == 2) return
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
- M.adjustToxLoss(REAGENTS_METABOLISM)
- holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
- return
- ..()
-
- copper
- name = "Copper"
- id = "copper"
- description = "A highly ductile metal."
- color = "#6E3B08" // rgb: 110, 59, 8
-
-
- nitrogen
- name = "Nitrogen"
- id = "nitrogen"
- description = "A colorless, odorless, tasteless gas."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
-
-
- on_mob_life(var/mob/living/M as mob, var/alien)
- if(M.stat == 2) return
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
- M.adjustOxyLoss(-2*REM)
- holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
- return
- ..()
-
- hydrogen
- name = "Hydrogen"
- id = "hydrogen"
- description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
-
-
- potassium
- name = "Potassium"
- id = "potassium"
- description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water."
- reagent_state = SOLID
- color = "#A0A0A0" // rgb: 160, 160, 160
-
-
- mercury
- name = "Mercury"
- id = "mercury"
- description = "A chemical element."
- reagent_state = LIQUID
- color = "#484848" // rgb: 72, 72, 72
- metabolization_rate = 0.2
- penetrates_skin = 1
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(prob(70))
- M.adjustBrainLoss(1)
- ..()
- return
-
- sulfur
- name = "Sulfur"
- id = "sulfur"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#BF8C00" // rgb: 191, 140, 0
-
- carbon
- name = "Carbon"
- id = "carbon"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#1C1300" // rgb: 30, 20, 0
-
-
- reaction_turf(var/turf/T, var/volume)
- src = null
- // Only add one dirt per turf. Was causing people to crash.
- if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T))
- new /obj/effect/decal/cleanable/dirt(T)
-
- chlorine
- name = "Chlorine"
- id = "chlorine"
- description = "A chemical element."
- reagent_state = GAS
- color = "#808080" // rgb: 128, 128, 128
- penetrates_skin = 1
- process_flags = ORGANIC | SYNTHETIC
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustFireLoss(1)
- ..()
- return
-
- fluorine
- name = "Fluorine"
- id = "fluorine"
- description = "A highly-reactive chemical element."
- reagent_state = GAS
- color = "#6A6054"
- penetrates_skin = 1
- process_flags = ORGANIC | SYNTHETIC
-
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustFireLoss(1)
- M.adjustToxLoss(1*REM)
- ..()
- return
-
- sodium
- name = "Sodium"
- id = "sodium"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#808080" // rgb: 128, 128, 128
-
-
- phosphorus
- name = "Phosphorus"
- id = "phosphorus"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#832828" // rgb: 131, 40, 40
-
-
- lithium
- name = "Lithium"
- id = "lithium"
- description = "A chemical element."
- reagent_state = SOLID
- color = "#808080" // rgb: 128, 128, 128
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(M.canmove && !M.restrained() && istype(M.loc, /turf/space))
- step(M, pick(cardinal))
- if(prob(5)) M.emote(pick("twitch","drool","moan"))
- ..()
- return
-
- sugar
- name = "Sugar"
- id = "sugar"
- description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
- reagent_state = SOLID
- color = "#FFFFFF" // rgb: 255, 255, 255
- overdose_threshold = 200 // Hyperglycaemic shock
-
- on_mob_life(var/mob/living/M as mob)
- if(prob(4))
- M.reagents.add_reagent("epinephrine", 1.2)
- if(prob(50))
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- if(current_cycle >= 90)
- M.jitteriness += 10
- ..()
- return
-
- overdose_process(var/mob/living/M as mob)
- if(volume > 200)
- M << "You pass out from hyperglycemic shock!"
- M.Paralyse(1)
- if(prob(8))
- M.adjustToxLoss(rand(1,2))
- ..()
- return
-
- sacid
- name = "Sulphuric acid"
- id = "sacid"
- description = "A strong mineral acid with the molecular formula H2SO4."
- reagent_state = LIQUID
- color = "#00D72B"
- process_flags = ORGANIC | SYNTHETIC
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustFireLoss(1)
- ..()
- return
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if(!istype(M, /mob/living))
- return
- if(method == TOUCH)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- if(volume > 25)
-
- if(H.wear_mask)
- H << "\red Your mask protects you from the acid!"
- return
-
- if(H.head)
- H << "\red Your helmet protects you from the acid!"
- return
-
- if(!M.unacidable)
- if(prob(75))
- var/obj/item/organ/external/affecting = H.get_organ("head")
- if(affecting)
- affecting.take_damage(20, 0)
- H.UpdateDamageIcon()
- H.emote("scream")
- else
- M.take_organ_damage(15,0)
- else
- M.take_organ_damage(15,0)
-
- if(method == INGEST)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- if(volume < 10)
- M << "The greenish acidic substance stings you, but isn't concentrated enough to harm you!"
-
- if(volume >=10 && volume <=25)
- if(!H.unacidable)
- M.take_organ_damage(min(max(volume-10,2)*2,20),0)
- M.emote("scream")
-
-
- if(volume > 25)
- if(!M.unacidable)
- if(prob(75))
- var/obj/item/organ/external/affecting = H.get_organ("head")
- if(affecting)
- affecting.take_damage(20, 0)
- H.UpdateDamageIcon()
- H.emote("scream")
- else
- M.take_organ_damage(15,0)
-
- reaction_obj(var/obj/O, var/volume)
- if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40))
- if(!O.unacidable)
- var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
- I.desc = "Looks like this was \an [O] some time ago."
- for(var/mob/M in viewers(5, O))
- M << "\red \the [O] melts."
- qdel(O)
-
- glycerol
- name = "Glycerol"
- id = "glycerol"
- description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
- reagent_state = LIQUID
- color = "#808080" // rgb: 128, 128, 128
-
-
- nitroglycerin
- name = "Nitroglycerin"
- id = "nitroglycerin"
- description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
- reagent_state = LIQUID
- color = "#808080" // rgb: 128, 128, 128
-
- radium
- name = "Radium"
- id = "radium"
- description = "Radium is an alkaline earth metal. It is extremely radioactive."
- reagent_state = SOLID
- color = "#C7C7C7" // rgb: 199,199,199
- metabolization_rate = 0.4
- penetrates_skin = 1
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.apply_effect(4*REM,IRRADIATE,0)
- // 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,0) // curing it that way may kill you instead
- M.adjustToxLoss(100)
- C.antibodies |= V.antigen
- ..()
- return
-
- reaction_turf(var/turf/T, var/volume)
- src = null
- if(volume >= 3)
- if(!istype(T, /turf/space))
- new /obj/effect/decal/cleanable/greenglow(T)
- return
-
- thermite
- name = "Thermite"
- id = "thermite"
- description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
- reagent_state = SOLID
- color = "#673910" // rgb: 103, 57, 16
- process_flags = ORGANIC | SYNTHETIC
-
- reaction_turf(var/turf/T, var/volume)
- src = null
- if(volume >= 5)
- if(istype(T, /turf/simulated/wall))
- T:thermite = 1
- T.overlays.Cut()
- T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
- return
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustFireLoss(1)
- ..()
- return
-
- mutagen
- name = "Unstable mutagen"
- id = "mutagen"
- description = "Might cause unpredictable mutations. Keep away from children."
- reagent_state = LIQUID
- color = "#04DF27"
- metabolization_rate = 0.3
-
- reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
- if(!..()) return
- if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- src = null
- if((method==TOUCH && prob(33)) || method==INGEST)
- if(prob(98))
- randmutb(M)
- else
- randmutg(M)
- domutcheck(M, null)
- M.UpdateAppearance()
- return
- on_mob_life(var/mob/living/M as mob)
- if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- if(!M) M = holder.my_atom
- M.apply_effect(2*REM,IRRADIATE,0)
- if(prob(4))
- randmutb(M)
- ..()
- return
-
- hydrocodone
- name = "Hydrocodone"
- id = "hydrocodone"
- description = "An extremely effective painkiller; may have long term abuse consequences."
- reagent_state = LIQUID
- color = "#C805DC"
- metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units
- shock_reduction = 200
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- ..()
- return
-
- 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
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.nutrition += nutriment_factor*REM
- ..()
- return
-
- sterilizine
- name = "Sterilizine"
- id = "sterilizine"
- description = "Sterilizes wounds in preparation for surgery."
- reagent_state = LIQUID
- color = "#C8A5DC" // rgb: 200, 165, 220
-
- //makes you squeaky clean
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if (method == TOUCH)
- M.germ_level -= min(volume*20, M.germ_level)
-
- reaction_obj(var/obj/O, var/volume)
- O.germ_level -= min(volume*20, O.germ_level)
-
- reaction_turf(var/turf/T, var/volume)
- T.germ_level -= min(volume*20, T.germ_level)
-
- iron
- name = "Iron"
- id = "iron"
- description = "Pure iron is a metal."
- reagent_state = SOLID
- color = "#C8A5DC" // rgb: 200, 165, 220
-/*
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if((M.virus) && (prob(8) && (M.virus.name=="Magnitis")))
- if(M.virus.spread == "Airborne")
- M.virus.spread = "Remissive"
- M.virus.stage--
- if(M.virus.stage <= 0)
- M.resistances += M.virus.type
- M.virus = null
- holder.remove_reagent(src.id, 0.2)
- return
-*/
-
- gold
- name = "Gold"
- id = "gold"
- description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known."
- reagent_state = SOLID
- color = "#F7C430" // rgb: 247, 196, 48
-
- silver
- name = "Silver"
- id = "silver"
- description = "A lustrous metallic element regarded as one of the precious metals."
- reagent_state = SOLID
- color = "#D0D0D0" // rgb: 208, 208, 208
-
- uranium
- name ="Uranium"
- id = "uranium"
- description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive."
- reagent_state = SOLID
- color = "#B8B8C0" // rgb: 184, 184, 192
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.apply_effect(2,IRRADIATE,0)
- ..()
- return
-
-
- reaction_turf(var/turf/T, var/volume)
- src = null
- if(volume >= 3)
- if(!istype(T, /turf/space))
- new /obj/effect/decal/cleanable/greenglow(T)
-
- aluminum
- name = "Aluminum"
- id = "aluminum"
- description = "A silvery white and ductile member of the boron group of chemical elements."
- reagent_state = SOLID
- color = "#A8A8A8" // rgb: 168, 168, 168
-
- silicon
- name = "Silicon"
- id = "silicon"
- description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon."
- reagent_state = SOLID
- color = "#A8A8A8" // rgb: 168, 168, 168
-
- fuel
- name = "Welding fuel"
- id = "fuel"
- description = "A highly flammable blend of basic hydrocarbons, mostly Acetylene. Useful for both welding and organic chemistry, and can be fortified into a heavier oil."
- reagent_state = LIQUID
- color = "#060606"
-
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite!
- if(!istype(M, /mob/living))
- return
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 10)
- return
- ..()
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(1)
- ..()
- return
-
- unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
- name = "Unholy Water"
- id = "unholywater"
- description = "Something that shouldn't exist on this plane of existance."
- process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it.
-
- on_mob_life(mob/living/M)
- M.adjustBrainLoss(3)
- if(iscultist(M))
- M.status_flags |= GOTTAGOFAST
- M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustParalysis(-2)
- M.AdjustStunned(-2)
- M.AdjustWeakened(-2)
- else
- M.adjustToxLoss(2)
- M.adjustFireLoss(2)
- M.adjustOxyLoss(2)
- M.adjustBruteLoss(2)
- holder.remove_reagent(src.id, 1)
-
- incendiary_fuel //copy-pasta of welding fuel; allow incendiary grenades to function better without the headache of people spraying fuel everywhere with regular welding fuel.
- name = "Incendiary fuel"
- id = "incendiaryfuel"
- description = "A highly flammable compound used in incendiary grenades."
- reagent_state = LIQUID
- color = "#660000" // rgb: 102, 0, 0
-
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite!
- if(!istype(M, /mob/living))
- return
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 10)
- return
-
- reaction_obj(var/obj/O, var/volume)
- var/turf/the_turf = get_turf(O)
- if(!the_turf)
- return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO
- new /obj/effect/decal/cleanable/liquid_fuel(the_turf, volume)
- reaction_turf(var/turf/T, var/volume)
- new /obj/effect/decal/cleanable/liquid_fuel(T, volume)
- return
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(1)
- ..()
- return
-
- space_cleaner
- name = "Space cleaner"
- id = "cleaner"
- description = "A compound used to clean things. Now with 50% more sodium hypochlorite!"
- reagent_state = LIQUID
- color = "#61C2C2"
-
- reaction_obj(var/obj/O, var/volume)
- if(istype(O,/obj/effect/decal/cleanable))
- qdel(O)
- else
- if(O)
- O.clean_blood()
- reaction_turf(var/turf/T, var/volume)
- if(volume >= 1)
- T.overlays.Cut()
- T.clean_blood()
- for(var/obj/effect/decal/cleanable/C in src)
- qdel(C)
-
- for(var/mob/living/carbon/slime/M in T)
- M.adjustToxLoss(rand(5,10))
- reaction_turf(var/turf/simulated/S, var/volume)
- if(volume >= 1)
- S.dirt = 0
- reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.lip_style)
- H.lip_style = null
- H.update_body()
- if(C.r_hand)
- C.r_hand.clean_blood()
- if(C.l_hand)
- C.l_hand.clean_blood()
- if(C.wear_mask)
- if(C.wear_mask.clean_blood())
- C.update_inv_wear_mask(0)
- if(ishuman(M))
- var/mob/living/carbon/human/H = C
- if(H.head)
- if(H.head.clean_blood())
- H.update_inv_head(0,0)
- if(H.wear_suit)
- if(H.wear_suit.clean_blood())
- H.update_inv_wear_suit(0,0)
- else if(H.w_uniform)
- if(H.w_uniform.clean_blood())
- H.update_inv_w_uniform(0,0)
- if(H.shoes)
- if(H.shoes.clean_blood())
- H.update_inv_shoes(0,0)
- M.clean_blood()
- ..()
- return
-
- plasma
- name = "Plasma"
- id = "plasma"
- description = "The liquid phase of an unusual extraterrestrial compound."
- reagent_state = LIQUID
- color = "#7A2B94"
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(1*REM)
- if(holder.has_reagent("epinephrine"))
- holder.remove_reagent("epinephrine", 2)
- ..()
- return
-
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel!
- if(!istype(M, /mob/living))
- return
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 5)
- ..()
- return
- lexorin
- name = "Lexorin"
- id = "lexorin"
- description = "Lexorin temporarily stops respiration. Causes tissue damage."
- reagent_state = LIQUID
- color = "#52685D"
- metabolization_rate = 0.2
-
- on_mob_life(var/mob/living/M as mob)
- if(M.stat == 2.0)
- return
- if(!M) M = holder.my_atom
- M.adjustToxLoss(1)
- ..()
- return
-
- adminordrazine //An OP chemical for admins
- name = "Adminordrazine"
- id = "adminordrazine"
- description = "It's magic. We don't have to explain it."
- reagent_state = LIQUID
- color = "#C8A5DC" // rgb: 200, 165, 220
- process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
-
- on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom ///This can even heal dead people.
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.id,5)
- M.setCloneLoss(0)
- M.setOxyLoss(0)
- M.radiation = 0
- M.heal_organ_damage(5,5)
- M.adjustToxLoss(-5)
- M.hallucination = 0
- M.setBrainLoss(0)
- M.disabilities = 0
- M.sdisabilities = 0
- M.eye_blurry = 0
- M.eye_blind = 0
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
- if(istype(E))
- E.damage = max(E.damage-5 , 0)
- M.SetWeakened(0)
- M.SetStunned(0)
- M.SetParalysis(0)
- M.silent = 0
- M.dizziness = 0
- M.drowsyness = 0
- M.stuttering = 0
- M.slurring = 0
- M.confused = 0
- M.sleeping = 0
- 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
- ..()
- return
-
- nanites
- name = "Nanites"
- id = "nanites"
- description = "Nanomachines that aid in rapid cellular regeneration."
-
-
- synaptizine
- name = "Synaptizine"
- id = "synaptizine"
- description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis."
- reagent_state = LIQUID
- color = "#FA46FA"
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- if(prob(50))
- M.adjustBrainLoss(-1.0)
- ..()
- return
-
- audioline
- name = "Audioline"
- id = "audioline"
- description = "Heals ear damage."
- reagent_state = LIQUID
- color = "#6600FF" // rgb: 100, 165, 255
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.ear_damage = 0
- M.ear_deaf = 0
- ..()
- return
-
- mitocholide
- name = "Mitocholide"
- id = "mitocholide"
- description = "A specialized drug that stimulates the mitochondria of cells to encourage healing of internal organs."
- reagent_state = LIQUID
- color = "#C8A5DC" // rgb: 200, 165, 220
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- //Mitocholide is hard enough to get, it's probably fair to make this all internal organs
- for(var/name in H.internal_organs_by_name)
- var/obj/item/organ/I = H.internal_organs_by_name[name]
- if(I.damage > 0)
- I.damage -= 0.20
- ..()
- return
-
- cryoxadone
- name = "Cryoxadone"
- id = "cryoxadone"
- description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly."
- reagent_state = LIQUID
- color = "#0000C8" // rgb: 200, 165, 220
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(M.bodytemperature < 265)
- M.adjustCloneLoss(-4)
- M.adjustOxyLoss(-10)
- M.heal_organ_damage(12,12)
- M.adjustToxLoss(-3)
- M.status_flags &= ~DISFIGURED
- ..()
- return
-
- rezadone
- name = "Rezadone"
- id = "rezadone"
- description = "A powder derived from fish toxin, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects."
- reagent_state = SOLID
- color = "#669900" // rgb: 102, 153, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- data++
- switch(data)
- if(1 to 15)
- M.adjustCloneLoss(-1)
- M.heal_organ_damage(1,1)
- if(15 to 35)
- M.adjustCloneLoss(-2)
- M.heal_organ_damage(2,1)
- M.status_flags &= ~DISFIGURED
- if(35 to INFINITY)
- M.adjustToxLoss(1)
- M.Dizzy(5)
- M.Jitter(5)
-
- ..()
- return
-
- spaceacillin
- name = "Spaceacillin"
- id = "spaceacillin"
- description = "An all-purpose antibiotic agent extracted from space fungus."
- reagent_state = LIQUID
- color = "#0AB478"
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- return
-
- carpotoxin
- name = "Carpotoxin"
- id = "carpotoxin"
- description = "A deadly neurotoxin produced by the dreaded spess carp."
- reagent_state = LIQUID
- color = "#003333" // rgb: 0, 51, 51
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(2*REM)
- ..()
- return
-
- staminatoxin
- name = "Tirizene"
- id = "tirizene"
- description = "A toxin that affects the stamina of a person when injected into the bloodstream."
- reagent_state = LIQUID
- color = "#6E2828"
- data = 13
-
- on_mob_life(var/mob/living/M)
- M.adjustStaminaLoss(REM * data)
- data = max(data - 1, 3)
- ..()
-
- lsd
- name = "Lysergic acid diethylamide"
- id = "lsd"
- description = "A highly potent hallucinogenic substance. Far out, maaaan."
- reagent_state = LIQUID
- color = "#0000D8"
-
- on_mob_life(var/mob/living/M)
- if(!M) M = holder.my_atom
- M.hallucination += 10
- ..()
- return
-
-
- spores
- name = "Spore Toxin"
- id = "spores"
- description = "A toxic spore cloud which blocks vision when ingested."
- color = "#9ACD32"
-
- on_mob_life(var/mob/living/M as mob)
- M.adjustToxLoss(0.5)
- M.damageoverlaytemp = 60
- M.eye_blurry = max(M.eye_blurry, 3)
- ..()
- return
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////
-/*
- nanomachines
- name = "Nanomachines"
- id = "nanomachines"
- description = "Microscopic construction robots."
- reagent_state = LIQUID
- color = "#535E66" // rgb: 83, 94, 102
-
- reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
- src = null
- if( (prob(10) && method==TOUCH) || method==INGEST)
- M.contract_disease(new /datum/disease/robotic_transformation(0),1)
-
- xenomicrobes
- name = "Xenomicrobes"
- id = "xenomicrobes"
- description = "Microbes with an entirely alien cellular structure."
- reagent_state = LIQUID
- color = "#535E66" // rgb: 83, 94, 102
-
- reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
- src = null
- if( (prob(10) && method==TOUCH) || method==INGEST)
- M.contract_disease(new /datum/disease/xeno_transformation(0),1)
-*/
-
- spore
- name = "Blob Spores"
- id = "spore"
- description = "Spores of some blob creature thingy."
- reagent_state = LIQUID
- color = "#CE760A" // rgb: 206, 118, 10
- var/client/blob_client = null
- var/blob_point_rate = 3
-
- on_mob_life(var/mob/living/M)
- if(!M) M = holder.my_atom
- if (holder.has_reagent("atrazine",45))
- holder.del_reagent("spore")
- if (prob(1))
- M << "\red Your mouth tastes funny."
- if (prob(1) && prob(25))
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(directory[ckey(C.key)])
- blob_client = directory[ckey(C.key)]
- C.gib()
- if(blob_client)
- var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate)
- if(core.overmind && core.overmind.mind)
- core.overmind.mind.name = C.name
-
- return
-
-//foam
-
- fluorosurfactant
- name = "Fluorosurfactant"
- id = "fluorosurfactant"
- description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
- reagent_state = LIQUID
- color = "#9E6B38" // rgb: 158, 107, 56
-
-// metal foaming agent
-// this is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually
-
- ammonia
- name = "Ammonia"
- id = "ammonia"
- description = "A caustic substance commonly used in fertilizer or household cleaners."
- reagent_state = GAS
- color = "#404030" // rgb: 64, 64, 48
-
-
- diethylamine
- name = "Diethylamine"
- id = "diethylamine"
- description = "A secondary amine, useful as a plant nutrient and as building block for other compounds."
- reagent_state = LIQUID
- color = "#322D00"
-
- beer2 //disguised as normal beer for use by emagged brobots
- name = "Beer"
- id = "beer2"
- description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data)
- data = 1
- switch(data)
- if(1 to 50)
- M.sleeping += 1
- if(51 to INFINITY)
- M.sleeping += 1
- M.adjustToxLoss((data - 50)*REM)
- data++
- holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
- ..()
- return
-
-/////////////////////////Food Reagents////////////////////////////
-// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food
-// condiments, additives, and such go.
- nutriment // Pure nutriment, universally digestable and thus slightly less effective
- name = "Nutriment"
- id = "nutriment"
- description = "A questionable mixture of various pure nutrients commonly found in processed foods."
- reagent_state = SOLID
- nutriment_factor = 12 * REAGENTS_METABOLISM
- color = "#664330" // rgb: 102, 67, 48
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!(M.mind in ticker.mode.vampires))
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.species && H.species.dietflags) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
- H.nutrition += nutriment_factor // For hunger and fatness
- if(prob(50)) M.heal_organ_damage(1,0)
- if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
- if(prob(50)) M.heal_organ_damage(1,0)
- ..()
- return
-
- protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores
- name = "Protein"
- id = "protein"
- description = "Various essential proteins and fats commonly found in animal flesh and blood."
- reagent_state = SOLID
- nutriment_factor = 15 * REAGENTS_METABOLISM
- color = "#664330" // rgb: 102, 67, 48
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!(M.mind in ticker.mode.vampires))
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_HERB)) //Make sure the species has it's dietflag set, and that it is not a herbivore
- H.nutrition += nutriment_factor // For hunger and fatness
- if(prob(50)) M.heal_organ_damage(1,0)
- if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
- if(prob(50)) M.heal_organ_damage(1,0)
- ..()
- return
-
- plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
- name = "Plant-matter"
- id = "plantmatter"
- description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
- reagent_state = SOLID
- nutriment_factor = 15 * REAGENTS_METABOLISM
- color = "#664330" // rgb: 102, 67, 48
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!(M.mind in ticker.mode.vampires))
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_CARN)) //Make sure the species has it's dietflag set, and that it is not a carnivore
- H.nutrition += nutriment_factor // For hunger and fatness
- if(prob(50)) M.heal_organ_damage(1,0)
- if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
- if(prob(50)) M.heal_organ_damage(1,0)
- ..()
- return
-
- soysauce
- name = "Soysauce"
- id = "soysauce"
- description = "A salty sauce made from the soy plant."
- reagent_state = LIQUID
- nutriment_factor = 2 * REAGENTS_METABOLISM
- color = "#792300" // rgb: 121, 35, 0
-
- ketchup
- name = "Ketchup"
- id = "ketchup"
- description = "Ketchup, catsup, whatever. It's tomato paste."
- reagent_state = LIQUID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#731008" // rgb: 115, 16, 8
-
-
- capsaicin
- name = "Capsaicin Oil"
- id = "capsaicin"
- description = "This is what makes chilis hot."
- reagent_state = LIQUID
- color = "#B31008" // rgb: 179, 16, 8
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- switch(data)
- if(1 to 15)
- M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("frostoil"))
- holder.remove_reagent("frostoil", 5)
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature += rand(5,20)
- if(15 to 25)
- M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature += rand(10,20)
- if(25 to INFINITY)
- M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature += rand(15,20)
- holder.remove_reagent(src.id, FOOD_METABOLISM)
- data++
- ..()
- return
-
- condensedcapsaicin
- name = "Condensed Capsaicin"
- id = "condensedcapsaicin"
- description = "This shit goes in pepperspray."
- reagent_state = LIQUID
- color = "#B31008" // rgb: 179, 16, 8
-
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if(!istype(M, /mob/living))
- return
- if(method == TOUCH)
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/victim = M
- var/mouth_covered = 0
- var/eyes_covered = 0
- var/obj/item/safe_thing = null
- if( victim.wear_mask )
- if ( victim.wear_mask.flags & MASKCOVERSEYES )
- eyes_covered = 1
- safe_thing = victim.wear_mask
- if ( victim.wear_mask.flags & MASKCOVERSMOUTH )
- mouth_covered = 1
- safe_thing = victim.wear_mask
- if( victim.head )
- if ( victim.head.flags & MASKCOVERSEYES )
- eyes_covered = 1
- safe_thing = victim.head
- if ( victim.head.flags & MASKCOVERSMOUTH )
- mouth_covered = 1
- safe_thing = victim.head
- if(victim.glasses)
- eyes_covered = 1
- if ( !safe_thing )
- safe_thing = victim.glasses
- if ( eyes_covered && mouth_covered )
- victim << "\red Your [safe_thing] protects you from the pepperspray!"
- return
- else if ( mouth_covered ) // Reduced effects if partially protected
- victim << "\red Your [safe_thing] protect you from most of the pepperspray!"
- if(prob(5))
- victim.emote("scream")
- victim.eye_blurry = max(M.eye_blurry, 3)
- victim.eye_blind = max(M.eye_blind, 1)
- victim.confused = max(M.confused, 3)
- victim.damageoverlaytemp = 60
- victim.Weaken(3)
- victim.drop_item()
- return
- else if ( eyes_covered ) // Eye cover is better than mouth cover
- victim << "\red Your [safe_thing] protects your eyes from the pepperspray!"
- victim.eye_blurry = max(M.eye_blurry, 3)
- victim.damageoverlaytemp = 30
- return
- else // Oh dear :D
- if(prob(5))
- victim.emote("scream")
- victim << "\red You're sprayed directly in the eyes with pepperspray!"
- victim.eye_blurry = max(M.eye_blurry, 5)
- victim.eye_blind = max(M.eye_blind, 2)
- victim.confused = max(M.confused, 6)
- victim.damageoverlaytemp = 75
- victim.Weaken(5)
- victim.drop_item()
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(prob(5))
- M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]")
- ..()
- return
-
- frostoil
- name = "Frost Oil"
- id = "frostoil"
- description = "A special oil that noticably chills the body. Extraced from Icepeppers."
- reagent_state = LIQUID
- color = "#B31008" // rgb: 139, 166, 233
- process_flags = ORGANIC | SYNTHETIC
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- switch(data)
- if(1 to 15)
- M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("capsaicin"))
- holder.remove_reagent("capsaicin", 5)
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(5,20)
- if(15 to 25)
- M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(10,20)
- if(25 to INFINITY)
- M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(1))
- M.emote("shiver")
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(15,20)
- data++
- holder.remove_reagent(src.id, FOOD_METABOLISM)
- ..()
- return
-
- reaction_turf(var/turf/simulated/T, var/volume)
- for(var/mob/living/carbon/slime/M in T)
- M.adjustToxLoss(rand(15,30))
-
- sodiumchloride
- name = "Salt"
- id = "sodiumchloride"
- description = "Sodium chloride, common table salt."
- reagent_state = SOLID
- color = "#B1B0B0"
-
- overdose_process(var/mob/living/M as mob)
- if(volume > 100)
- if(prob(70))
- M.adjustBrainLoss(1)
- if(prob(8))
- M.adjustToxLoss(rand(1,2))
- ..()
- return
-
- blackpepper
- name = "Black Pepper"
- id = "blackpepper"
- description = "A powder ground from peppercorns. *AAAACHOOO*"
- reagent_state = SOLID
- // no color (ie, black)
-
- coco
- name = "Coco Powder"
- id = "coco"
- description = "A fatty, bitter paste made from coco beans."
- reagent_state = SOLID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- ..()
- return
-
- hot_coco
- name = "Hot Chocolate"
- id = "hot_coco"
- description = "Made with love! And coco beans."
- reagent_state = LIQUID
- nutriment_factor = 2 * REAGENTS_METABOLISM
- color = "#403010" // rgb: 64, 48, 16
-
- on_mob_life(var/mob/living/M as mob)
- if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
- M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.nutrition += nutriment_factor
- ..()
- return
-
- psilocybin
- name = "Psilocybin"
- id = "psilocybin"
- description = "A strong psycotropic derived from certain species of mushroom."
- color = "#E700E7" // rgb: 231, 0, 231
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.druggy = max(M.druggy, 30)
- if(!data) data = 1
- switch(data)
- if(1 to 5)
- if (!M.stuttering) M.stuttering = 1
- M.Dizzy(5)
- if(prob(10)) M.emote(pick("twitch","giggle"))
- if(5 to 10)
- if (!M.stuttering) M.stuttering = 1
- M.Jitter(10)
- M.Dizzy(10)
- M.druggy = max(M.druggy, 35)
- if(prob(20)) M.emote(pick("twitch","giggle"))
- if (10 to INFINITY)
- if (!M.stuttering) M.stuttering = 1
- M.Jitter(20)
- M.Dizzy(20)
- M.druggy = max(M.druggy, 40)
- if(prob(30)) M.emote(pick("twitch","giggle"))
- data++
- ..()
- return
-
- sprinkles
- name = "Sprinkles"
- id = "sprinkles"
- description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops."
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#FF00FF" // rgb: 255, 0, 255
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
- if(!M) M = holder.my_atom
- M.heal_organ_damage(1,1)
- M.nutrition += nutriment_factor
- ..()
- return
- ..()
-
- cornoil
- name = "Corn Oil"
- id = "cornoil"
- description = "An oil derived from various types of corn."
- reagent_state = LIQUID
- nutriment_factor = 20 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- ..()
- return
- reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
- src = null
- if(volume >= 3)
- if(T.wet >= 1) return
- T.wet = 1
- if(T.wet_overlay)
- T.overlays -= T.wet_overlay
- T.wet_overlay = null
- T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
- T.overlays += T.wet_overlay
-
- spawn(800)
- if (!istype(T)) return
- if(T.wet >= 2) return
- T.wet = 0
- if(T.wet_overlay)
- T.overlays -= T.wet_overlay
- T.wet_overlay = null
- var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot)
- var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
- lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
- lowertemp.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
-
- enzyme
- name = "Denatured Enzyme"
- id = "enzyme"
- description = "Heated beyond usefulness, this enzyme is now worthless."
- reagent_state = LIQUID
- color = "#282314" // rgb: 54, 94, 48
-
- dry_ramen
- name = "Dry Ramen"
- id = "dry_ramen"
- description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water."
- reagent_state = SOLID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- ..()
- return
-
- hot_ramen
- name = "Hot Ramen"
- id = "hot_ramen"
- description = "The noodles are boiled, the flavors are artificial, just like being back in school."
- reagent_state = LIQUID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
- M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT))
- ..()
- return
-
- hell_ramen
- name = "Hell Ramen"
- id = "hell_ramen"
- description = "The noodles are boiled, the flavors are artificial, just like being back in school."
- reagent_state = LIQUID
- nutriment_factor = 5 * REAGENTS_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- ..()
- return
-
-
- flour
- name = "flour"
- id = "flour"
- description = "This is what you rub all over yourself to pretend to be a ghost."
- reagent_state = SOLID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#FFFFFF" // rgb: 0, 0, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- ..()
- return
-
- reaction_turf(var/turf/T, var/volume)
- src = null
- if(!istype(T, /turf/space))
- new /obj/effect/decal/cleanable/flour(T)
-
- rice
- name = "Rice"
- id = "rice"
- description = "Enjoy the great taste of nothing."
- reagent_state = SOLID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#FFFFFF" // rgb: 0, 0, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- ..()
- return
-
- cherryjelly
- name = "Cherry Jelly"
- id = "cherryjelly"
- description = "Totally the best. Only to be spread on foods with excellent lateral symmetry."
- reagent_state = LIQUID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#801E28" // rgb: 128, 30, 40
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- ..()
- return
-
- toxin/coffeepowder
- name = "Coffee Grounds"
- id = "coffeepowder"
- description = "Finely ground Coffee beans, used to make coffee."
- reagent_state = SOLID
- color = "#5B2E0D" // rgb: 91, 46, 13
-
- toxin/teapowder
- name = "Ground Tea Leaves"
- id = "teapowder"
- description = "Finely shredded Tea leaves, used for making tea."
- reagent_state = SOLID
- color = "#7F8400" // rgb: 127, 132, 0
-
- //Reagents used for plant fertilizers.
- toxin/fertilizer
- name = "fertilizer"
- id = "fertilizer"
- description = "A chemical mix good for growing plants with."
- reagent_state = LIQUID
-// toxpwr = 0.2 //It's not THAT poisonous.
- color = "#664330" // rgb: 102, 67, 48
-
-
- toxin/fertilizer/eznutrient
- name = "EZ Nutrient"
- id = "eznutrient"
-
- toxin/fertilizer/left4zed
- name = "Left-4-Zed"
- id = "left4zed"
-
- toxin/fertilizer/robustharvest
- name = "Robust Harvest"
- id = "robustharvest"
-
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
- drink
- name = "Drink"
- id = "drink"
- description = "Uh, some kind of drink."
- reagent_state = LIQUID
- nutriment_factor = 1 * REAGENTS_METABOLISM
- color = "#E78108" // rgb: 231, 129, 8
- var/adj_dizzy = 0
- var/adj_drowsy = 0
- var/adj_sleepy = 0
- var/adj_temp = 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.nutrition += nutriment_factor
- holder.remove_reagent(src.id, FOOD_METABOLISM)
- if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy)
- if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy)
- if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy)
- if (adj_temp)
- if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
- M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT))
- // Drinks should be used up faster than other reagents.
- holder.remove_reagent(src.id, FOOD_METABOLISM)
- ..()
- return
-
- orangejuice
- name = "Orange juice"
- id = "orangejuice"
- description = "Both delicious AND rich in Vitamin C, what more do you need?"
- color = "#E78108" // rgb: 231, 129, 8
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1*REM)
- return
-
- tomatojuice
- name = "Tomato Juice"
- id = "tomatojuice"
- description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?"
- color = "#731008" // rgb: 115, 16, 8
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1)
- return
-
- limejuice
- name = "Lime Juice"
- id = "limejuice"
- description = "The sweet-sour juice of limes."
- color = "#365E30" // rgb: 54, 94, 48
- on_mob_life(var/mob/living/M as mob)
- ..()
- if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1)
- return
-
-
- carrotjuice
- name = "Carrot juice"
- id = "carrotjuice"
- description = "It is just like a carrot but without crunching."
- color = "#973800" // rgb: 151, 56, 0
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.eye_blurry = max(M.eye_blurry-1 , 0)
- M.eye_blind = max(M.eye_blind-1 , 0)
- if(!data) data = 1
- switch(data)
- if(1 to 20)
- //nothing
- if(21 to INFINITY)
- if (prob(data-10))
- M.disabilities &= ~NEARSIGHTED
- data++
- return
-
- doctor_delight
- name = "The Doctor's Delight"
- id = "doctorsdelight"
- description = "A gulp a day keeps the MediBot away. That's probably for the best."
- reagent_state = LIQUID
- color = "#FF8CFF" // rgb: 255, 140, 255
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1)
- ..()
- return
-
- berryjuice
- name = "Berry Juice"
- id = "berryjuice"
- description = "A delicious blend of several different kinds of berries."
- color = "#863333" // rgb: 134, 51, 51
-
- poisonberryjuice
- name = "Poison Berry Juice"
- id = "poisonberryjuice"
- description = "A tasty juice blended from various kinds of very deadly and toxic berries."
- color = "#863353" // rgb: 134, 51, 83
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.adjustToxLoss(1)
- return
-
- watermelonjuice
- name = "Watermelon Juice"
- id = "watermelonjuice"
- description = "Delicious juice made from watermelon."
- color = "#863333" // rgb: 134, 51, 51
-
- lemonjuice
- name = "Lemon Juice"
- id = "lemonjuice"
- description = "This juice is VERY sour."
- color = "#863333" // rgb: 175, 175, 0
-
- grapejuice
- name = "Grape Juice"
- id = "grapejuice"
- description = "This juice is known to stain shirts."
- color = "#993399" // rgb: 153, 51, 153
-
- banana
- name = "Banana Juice"
- id = "banana"
- description = "The raw essence of a banana."
- color = "#863333" // rgb: 175, 175, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
- if(!M) M = holder.my_atom
- M.heal_organ_damage(1,1)
- M.nutrition += nutriment_factor
- ..()
- return
- ..()
-
- nothing
- name = "Nothing"
- id = "nothing"
- description = "Absolutely nothing."
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
- if(!M) M = holder.my_atom
- M.heal_organ_damage(1,1)
- M.nutrition += nutriment_factor
- ..()
- return
- ..()
-
- potato_juice
- name = "Potato Juice"
- id = "potato"
- description = "Juice of the potato. Bleh."
- nutriment_factor = 2 * FOOD_METABOLISM
- color = "#302000" // rgb: 48, 32, 0
-
- milk
- name = "Milk"
- id = "milk"
- description = "An opaque white liquid produced by the mammary glands of mammals."
- color = "#DFDFDF" // rgb: 223, 223, 223
-
- on_mob_life(var/mob/living/M as mob)
- if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
- if(holder.has_reagent("capsaicin"))
- holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM)
- ..()
- return
-
- soymilk
- name = "Soy Milk"
- id = "soymilk"
- description = "An opaque white liquid made from soybeans."
- color = "#DFDFC7" // rgb: 223, 223, 199
-
- cream
- name = "Cream"
- id = "cream"
- description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
- color = "#DFD7AF" // rgb: 223, 215, 175
-
- chocolate_milk
- name = "Chocolate milk"
- id ="chocolate_milk"
- description = "Chocolate-flavored milk, tastes like being a kid again."
- color = "#85432C"
-
- hot_coco
- name = "Hot Chocolate"
- id = "hot_coco"
- description = "Made with love! And coco beans."
- nutriment_factor = 2 * FOOD_METABOLISM
- color = "#403010" // rgb: 64, 48, 16
- adj_temp = 5
-
- coffee
- name = "Coffee"
- id = "coffee"
- description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant."
- color = "#482000" // rgb: 72, 32, 0
- adj_dizzy = -5
- adj_drowsy = -3
- adj_sleepy = -2
- adj_temp = 25
- overdose_threshold = 45
-
- on_mob_life(var/mob/living/M as mob)
- if(adj_temp > 0 && holder.has_reagent("frostoil"))
- holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM)
- if(prob(50))
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- ..()
- return
-
- overdose_process(var/mob/living/M as mob)
- if(volume > 45)
- M.Jitter(5)
-
- ..()
- return
-
- icecoffee
- name = "Iced Coffee"
- id = "icecoffee"
- description = "Coffee and ice, refreshing and cool."
- color = "#102838" // rgb: 16, 40, 56
- adj_temp = -5
-
- soy_latte
- name = "Soy Latte"
- id = "soy_latte"
- description = "A nice and tasty beverage while you are reading your hippie books."
- color = "#664300" // rgb: 102, 67, 0
- adj_sleepy = 0
- adj_temp = 5
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.sleeping = 0
- if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
- return
-
- cafe_latte
- name = "Cafe Latte"
- id = "cafe_latte"
- description = "A nice, strong and tasty beverage while you are reading."
- color = "#664300" // rgb: 102, 67, 0
- adj_sleepy = 0
- adj_temp = 5
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.sleeping = 0
- if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
- return
-
- tea
- name = "Tea"
- id = "tea"
- description = "Tasty black tea: It has antioxidants. It's good for you!"
- color = "#101000" // rgb: 16, 16, 0
- adj_dizzy = -2
- adj_drowsy = -1
- adj_sleepy = -3
- adj_temp = 20
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- if(M.getToxLoss() && prob(20))
- M.adjustToxLoss(-1)
- return
-
- icetea
- name = "Iced Tea"
- id = "icetea"
- description = "No relation to a certain rap artist/ actor."
- color = "#104038" // rgb: 16, 64, 56
- adj_temp = -5
-
- kahlua
- name = "Kahlua"
- id = "kahlua"
- description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
- color = "#664300" // rgb: 102, 67, 0
- adj_dizzy = -5
- adj_drowsy = -3
- adj_sleepy = -2
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.Jitter(5)
- return
-
- cold
- name = "Cold drink"
- adj_temp = -5
-
- tonic
- name = "Tonic Water"
- id = "tonic"
- description = "It tastes strange but at least the quinine keeps the Space Malaria at bay."
- color = "#664300" // rgb: 102, 67, 0
- adj_dizzy = -5
- adj_drowsy = -3
- adj_sleepy = -2
-
- sodawater
- name = "Soda Water"
- id = "sodawater"
- description = "A can of club soda. Why not make a scotch and soda?"
- color = "#619494" // rgb: 97, 148, 148
- adj_dizzy = -5
- adj_drowsy = -3
-
- ice
- name = "Ice"
- id = "ice"
- description = "Frozen water, your dentist wouldn't like you chewing this."
- reagent_state = SOLID
- color = "#619494" // rgb: 97, 148, 148
-
- space_cola
- name = "Cola"
- id = "cola"
- description = "A refreshing beverage."
- reagent_state = LIQUID
- color = "#100800" // rgb: 16, 8, 0
- adj_drowsy = -3
-
- nuka_cola
- name = "Nuka Cola"
- id = "nuka_cola"
- description = "Cola, cola never changes."
- color = "#100800" // rgb: 16, 8, 0
- adj_sleepy = -2
-
- on_mob_life(var/mob/living/M as mob)
- M.Jitter(20)
- M.druggy = max(M.druggy, 30)
- M.dizziness +=5
- M.drowsyness = 0
- M.status_flags |= GOTTAGOFAST
- ..()
- return
-
- spacemountainwind
- name = "Space Mountain Wind"
- id = "spacemountainwind"
- description = "Blows right through you like a space wind."
- color = "#102000" // rgb: 16, 32, 0
- adj_drowsy = -7
- adj_sleepy = -1
-
- dr_gibb
- name = "Dr. Gibb"
- id = "dr_gibb"
- description = "A delicious blend of 42 different flavours"
- color = "#102000" // rgb: 16, 32, 0
- adj_drowsy = -6
-
- space_up
- name = "Space-Up"
- id = "space_up"
- description = "Tastes like a hull breach in your mouth."
- color = "#202800" // rgb: 32, 40, 0
- adj_temp = -8
-
- lemon_lime
- name = "Lemon Lime"
- description = "A tangy substance made of 0.5% natural citrus!"
- id = "lemon_lime"
- color = "#878F00" // rgb: 135, 40, 0
- adj_temp = -8
-
- lemonade
- name = "Lemonade"
- description = "Oh the nostalgia..."
- id = "lemonade"
- color = "#FFFF00" // rgb: 255, 255, 0
-
- kiraspecial
- name = "Kira Special"
- description = "Long live the guy who everyone had mistaken for a girl. Baka!"
- id = "kiraspecial"
- color = "#CCCC99" // rgb: 204, 204, 153
-
- brownstar
- name = "Brown Star"
- description = "Its not what it sounds like..."
- id = "brownstar"
- color = "#9F3400" // rgb: 159, 052, 000
- adj_temp = - 2
-
- milkshake
- name = "Milkshake"
- description = "Glorious brainfreezing mixture."
- id = "milkshake"
- color = "#AEE5E4" // rgb" 174, 229, 228
- adj_temp = -9
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- switch(data)
- if(1 to 15)
- M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("capsaicin"))
- holder.remove_reagent("capsaicin", 5)
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(5,20)
- if(15 to 25)
- M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(10,20)
- if(25 to INFINITY)
- M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(1)) M.emote("shiver")
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(15,20)
- data++
- holder.remove_reagent(src.id, FOOD_METABOLISM)
- ..()
- return
-
- rewriter
- name = "Rewriter"
- description = "The secert of the sanctuary of the Libarian..."
- id = "rewriter"
- color = "#485000" // rgb:72, 080, 0
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.Jitter(5)
- return
-
- hippies_delight
- name = "Hippie's Delight"
- id = "hippiesdelight"
- description = "You just don't get it maaaan."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.druggy = max(M.druggy, 50)
- if(!data) data = 1
- switch(data)
- if(1 to 5)
- if (!M.stuttering) M.stuttering = 1
- M.Dizzy(10)
- if(prob(10)) M.emote(pick("twitch","giggle"))
- if(5 to 10)
- if (!M.stuttering) M.stuttering = 1
- M.Jitter(20)
- M.Dizzy(20)
- M.druggy = max(M.druggy, 45)
- if(prob(20)) M.emote(pick("twitch","giggle"))
- if (10 to INFINITY)
- if (!M.stuttering) M.stuttering = 1
- M.Jitter(40)
- M.Dizzy(40)
- M.druggy = max(M.druggy, 60)
- if(prob(30)) M.emote(pick("twitch","giggle"))
- holder.remove_reagent(src.id, 0.2)
- data++
- ..()
- return
-
-//ALCOHOL WOO
- ethanol
- name = "Ethanol" //Parent class for all alcoholic reagents.
- id = "ethanol"
- description = "A well-known alcohol with a variety of applications."
- reagent_state = LIQUID
- nutriment_factor = 0 //So alcohol can fill you up! If they want to.
- color = "#404030" // rgb: 64, 64, 48
- var/datum/martial_art/drunk_brawling/F = new
- var/dizzy_adj = 3
- var/slurr_adj = 3
- var/confused_adj = 2
- var/slur_start = 65 //amount absorbed after which mob starts slurring
- var/brawl_start = 75 //amount absorbed after which mob switches to drunken brawling as a fighting style
- var/confused_start = 130 //amount absorbed after which mob starts confusing directions
- var/vomit_start = 180 //amount absorbed after which mob starts vomitting
- var/blur_start = 260 //amount absorbed after which mob starts getting blurred vision
- var/pass_out = 325 //amount absorbed after which mob starts passing out
-
- on_mob_life(var/mob/living/M as mob, var/alien)
- // Sobering multiplier.
- // Sober block makes it more difficult to get drunk
- var/sober_str=!(SOBER in M.mutations)?1:2
- M:nutrition += nutriment_factor
- holder.remove_reagent(src.id, FOOD_METABOLISM)
- if(!src.data) data = 1
- src.data++
-
- var/d = data
-
- // make all the beverages work together
- for(var/datum/reagent/ethanol/A in holder.reagent_list)
- if(isnum(A.data)) d += A.data
-
- d/=sober_str
-
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly.
- d*=5
-
- M.dizziness += dizzy_adj.
- if(d >= slur_start && d < pass_out)
- if (!M:slurring) M:slurring = 1
- M:slurring += slurr_adj/sober_str
- if(d >= brawl_start && ishuman(M))
- var/mob/living/carbon/human/H = M
- F.teach(H,1)
- if(src.volume < 3)
- if(H.martial_art == F)
- F.remove(H)
- if(d >= confused_start && prob(33))
- if (!M:confused) M:confused = 1
- M.confused = max(M:confused+(confused_adj/sober_str),0)
- if(d >= blur_start)
- M.eye_blurry = max(M.eye_blurry, 10/sober_str)
- M:drowsyness = max(M:drowsyness, 0)
- if(d >= vomit_start)
- if(prob(8))
- M.fakevomit()
- if(d >= pass_out)
- M:paralysis = max(M:paralysis, 20/sober_str)
- M:drowsyness = max(M:drowsyness, 30/sober_str)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"]
- if (istype(L))
- L.take_damage(0.1, 1)
- H.adjustToxLoss(0.1)
- holder.remove_reagent(src.id, 0.4)
- ..()
- return
-
- reaction_obj(var/obj/O, var/volume)
- if(istype(O,/obj/item/weapon/paper))
- var/obj/item/weapon/paper/paperaffected = O
- paperaffected.clearpaper()
- usr << "The solution melts away the ink on the paper."
- if(istype(O,/obj/item/weapon/book))
- if(volume >= 5)
- var/obj/item/weapon/book/affectedbook = O
- affectedbook.dat = null
- usr << "The solution melts away the ink on the book."
- else
- usr << "It wasn't enough..."
- return
-
- reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel.
- if(!istype(M, /mob/living))
- return
- if(method == TOUCH)
- M.adjust_fire_stacks(volume / 15)
- return
-
- beer //It's really much more stronger than other drinks.
- name = "Beer"
- id = "beer"
- description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
- nutriment_factor = 2 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
- on_mob_life(var/mob/living/M as mob)
- ..()
- M:jitteriness = max(M:jitteriness-3,0)
- return
-
- cider
- name = "Cider"
- id = "cider"
- description = "An alcoholic beverage derived from apples."
- color = "#174116"
-
- whiskey
- name = "Whiskey"
- id = "whiskey"
- description = "A superb and well-aged single-malt whiskey. Damn."
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
-
- specialwhiskey
- name = "Special Blend Whiskey"
- id = "specialwhiskey"
- description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
- color = "#664300" // rgb: 102, 67, 0
- slur_start = 30 //amount absorbed after which mob starts slurring
- brawl_start = 40
-
- gin
- name = "Gin"
- id = "gin"
- description = "It's gin. In space. I say, good sir."
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 3
-
- absinthe
- name = "Absinthe"
- id = "absinthe"
- description = "Watch out that the Green Fairy doesn't come for you!"
- color = "#33EE00" // rgb: lots, ??, ??
- overdose_threshold = 30
- dizzy_adj = 5
- slur_start = 25
- brawl_start = 40
- confused_start = 100
-
- //copy paste from LSD... shoot me
- on_mob_life(var/mob/M)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- data++
- M:hallucination += 5
- if(volume > overdose_threshold)
- M:adjustToxLoss(1)
- ..()
- return
-
- rum
- name = "Rum"
- id = "rum"
- description = "Popular with the sailors. Not very popular with everyone else."
- color = "#664300" // rgb: 102, 67, 0
- overdose_threshold = 30
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.dizziness +=5
- if(volume > overdose_threshold)
- M:adjustToxLoss(1)
- return
-
- mojito
- name = "Mojito"
- id = "mojito"
- description = "If it's good enough for Spesscuba, it's good enough for you."
- color = "#664300" // rgb: 102, 67, 0
-
- vodka
- name = "Vodka"
- id = "vodka"
- description = "Number one drink AND fueling choice for Russians worldwide."
- color = "#664300" // rgb: 102, 67, 0
-
- sake
- name = "Sake"
- id = "sake"
- description = "Anime's favorite drink."
- color = "#664300" // rgb: 102, 67, 0
-
- tequilla
- name = "Tequila"
- id = "tequilla"
- description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?"
- color = "#A8B0B7" // rgb: 168, 176, 183
-
- vermouth
- name = "Vermouth"
- id = "vermouth"
- description = "You suddenly feel a craving for a martini..."
- color = "#664300" // rgb: 102, 67, 0
-
- wine
- name = "Wine"
- id = "wine"
- description = "An premium alchoholic beverage made from distilled grape juice."
- color = "#7E4043" // rgb: 126, 64, 67
- dizzy_adj = 2
- slur_start = 65 //amount absorbed after which mob starts slurring
- confused_start = 145 //amount absorbed after which mob starts confusing directions
-
- cognac
- name = "Cognac"
- id = "cognac"
- description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
- confused_start = 115 //amount absorbed after which mob starts confusing directions
-
- suicider //otherwise known as "I want to get so smashed my liver gives out and I die from alcohol poisoning".
- name = "Suicider"
- id = "suicider"
- description = "An unbelievably strong and potent variety of Cider."
- color = "#CF3811"
- dizzy_adj = 20
- slurr_adj = 20
- confused_adj = 3
- slur_start = 15
- brawl_start = 25
- confused_start = 40
- blur_start = 60
- pass_out = 80
-
- ale
- name = "Ale"
- id = "ale"
- description = "A dark alchoholic beverage made by malted barley and yeast."
- color = "#664300" // rgb: 102, 67, 0
-
- thirteenloko
- name = "Thirteen Loko"
- id = "thirteenloko"
- description = "A potent mixture of caffeine and alcohol."
- reagent_state = LIQUID
- color = "#102000" // rgb: 16, 32, 0
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M:nutrition += nutriment_factor
- holder.remove_reagent(src.id, FOOD_METABOLISM)
- M:drowsyness = max(0,M:drowsyness-7)
- //if(!M:sleeping_willingly)
- // M:sleeping = max(0,M.sleeping-2)
- if (M.bodytemperature > 310)
- M.bodytemperature = max(310, M.bodytemperature-5)
- M.Jitter(1)
- return
-
-
-/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
-
- bilk
- name = "Bilk"
- id = "bilk"
- description = "This appears to be beer mixed with milk. Disgusting."
- reagent_state = LIQUID
- color = "#895C4C" // rgb: 137, 92, 76
-
- atomicbomb
- name = "Atomic Bomb"
- id = "atomicbomb"
- description = "Nuclear proliferation never tasted so good."
- reagent_state = LIQUID
- color = "#666300" // rgb: 102, 99, 0
-
- threemileisland
- name = "THree Mile Island Iced Tea"
- id = "threemileisland"
- description = "Made for a woman, strong enough for a man."
- reagent_state = LIQUID
- color = "#666340" // rgb: 102, 99, 64
-
- goldschlager
- name = "Goldschlager"
- id = "goldschlager"
- description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- patron
- name = "Patron"
- id = "patron"
- description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
- reagent_state = LIQUID
- color = "#585840" // rgb: 88, 88, 64
-
- gintonic
- name = "Gin and Tonic"
- id = "gintonic"
- description = "An all time classic, mild cocktail."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- cuba_libre
- name = "Cuba Libre"
- id = "cubalibre"
- description = "Rum, mixed with cola. Viva la revolution."
- reagent_state = LIQUID
- color = "#3E1B00" // rgb: 62, 27, 0
-
- whiskey_cola
- name = "Whiskey Cola"
- id = "whiskeycola"
- description = "Whiskey, mixed with cola. Surprisingly refreshing."
- reagent_state = LIQUID
- color = "#3E1B00" // rgb: 62, 27, 0
-
- martini
- name = "Classic Martini"
- id = "martini"
- description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- vodkamartini
- name = "Vodka Martini"
- id = "vodkamartini"
- description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- white_russian
- name = "White Russian"
- id = "whiterussian"
- description = "That's just, like, your opinion, man..."
- reagent_state = LIQUID
- color = "#A68340" // rgb: 166, 131, 64
-
- screwdrivercocktail
- name = "Screwdriver"
- id = "screwdrivercocktail"
- description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
-
- booger
- name = "Booger"
- id = "booger"
- description = "Ewww..."
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
-
- bloody_mary
- name = "Bloody Mary"
- id = "bloodymary"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- gargle_blaster
- name = "Pan-Galactic Gargle Blaster"
- id = "gargleblaster"
- description = "Whoah, this stuff looks volatile!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- brave_bull
- name = "Brave Bull"
- id = "bravebull"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- tequilla_sunrise
- name = "Tequila Sunrise"
- id = "tequillasunrise"
- description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- toxins_special
- name = "Toxins Special"
- id = "toxinsspecial"
- description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- beepsky_smash
- name = "Beepsky Smash"
- id = "beepskysmash"
- description = "Deny drinking this and prepare for THE LAW."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- changelingsting
- name = "Changeling Sting"
- id = "changelingsting"
- description = "You take a tiny sip and feel a burning sensation..."
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
-
- irish_cream
- name = "Irish Cream"
- id = "irishcream"
- description = "Whiskey-imbued cream, what else would you expect from the Irish."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- manly_dorf
- name = "The Manly Dorf"
- id = "manlydorf"
- description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- longislandicedtea
- name = "Long Island Iced Tea"
- id = "longislandicedtea"
- description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- moonshine
- name = "Moonshine"
- id = "moonshine"
- description = "You've really hit rock bottom now... your liver packed its bags and left last night."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- b52
- name = "B-52"
- id = "b52"
- description = "Coffee, Irish Cream, and congac. You will get bombed."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- irishcoffee
- name = "Irish Coffee"
- id = "irishcoffee"
- description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- margarita
- name = "Margarita"
- id = "margarita"
- description = "On the rocks with salt on the rim. Arriba~!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- black_russian
- name = "Black Russian"
- id = "blackrussian"
- description = "For the lactose-intolerant. Still as classy as a White Russian."
- reagent_state = LIQUID
- color = "#360000" // rgb: 54, 0, 0
-
- manhattan
- name = "Manhattan"
- id = "manhattan"
- description = "The Detective's undercover drink of choice. He never could stomach gin..."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- manhattan_proj
- name = "Manhattan Project"
- id = "manhattan_proj"
- description = "A scienitst's drink of choice, for pondering ways to blow up the station."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- whiskeysoda
- name = "Whiskey Soda"
- id = "whiskeysoda"
- description = "Ultimate refreshment."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- antifreeze
- name = "Anti-freeze"
- id = "antifreeze"
- description = "Ultimate refreshment."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- barefoot
- name = "Barefoot"
- id = "barefoot"
- description = "Barefoot and pregnant"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- snowwhite
- name = "Snow White"
- id = "snowwhite"
- description = "A cold refreshment"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- demonsblood
- name = "Demons Blood"
- id = "demonsblood"
- description = "AHHHH!!!!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 10
- slurr_adj = 10
-
- vodkatonic
- name = "Vodka and Tonic"
- id = "vodkatonic"
- description = "For when a gin and tonic isn't russian enough."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
- slurr_adj = 3
-
- ginfizz
- name = "Gin Fizz"
- id = "ginfizz"
- description = "Refreshingly lemony, deliciously dry."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
- dizzy_adj = 4
- slurr_adj = 3
-
- bahama_mama
- name = "Bahama mama"
- id = "bahama_mama"
- description = "Tropic cocktail."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- singulo
- name = "Singulo"
- id = "singulo"
- description = "A blue-space beverage!"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
- dizzy_adj = 15
- slurr_adj = 15
-
- sbiten
- name = "Sbiten"
- id = "sbiten"
- description = "A spicy Vodka! Might be a little hot for the little guys!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- if (M.bodytemperature < 360)
- M.bodytemperature = min(360, M.bodytemperature+50) //310 is the normal bodytemp. 310.055
- return
-
- devilskiss
- name = "Devils Kiss"
- id = "devilskiss"
- description = "Creepy time!"
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
-
- red_mead
- name = "Red Mead"
- id = "red_mead"
- description = "The true Viking drink! Even though it has a strange red color."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- mead
- name = "Mead"
- id = "mead"
- description = "A Vikings drink, though a cheap one."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- iced_beer
- name = "Iced Beer"
- id = "iced_beer"
- description = "A beer which is so cold the air around it freezes."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- if (M.bodytemperature < 270)
- M.bodytemperature = min(270, M.bodytemperature-40) //310 is the normal bodytemp. 310.055
- return
-
- grog
- name = "Grog"
- id = "grog"
- description = "Watered down rum, Nanotrasen approves!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- aloe
- name = "Aloe"
- id = "aloe"
- description = "So very, very, very good."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- andalusia
- name = "Andalusia"
- id = "andalusia"
- description = "A nice, strange named drink."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- alliescocktail
- name = "Allies Cocktail"
- id = "alliescocktail"
- description = "A drink made from your allies."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- acid_spit
- name = "Acid Spit"
- id = "acidspit"
- description = "A drink by Nanotrasen. Made from live aliens."
- reagent_state = LIQUID
- color = "#365000" // rgb: 54, 80, 0
-
- amasec
- name = "Amasec"
- id = "amasec"
- description = "Official drink of the Imperium."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
-
- neurotoxin
- name = "Neurotoxin"
- id = "neurotoxin"
- description = "A strong neurotoxin that puts the subject into a death-like state."
- reagent_state = LIQUID
- color = "#2E2E61" // rgb: 46, 46, 97
-
- on_mob_life(var/mob/living/M as mob)
- M.weakened = max(M.weakened, 3)
- if(!data)
- data = 1
- data++
- M.dizziness +=6
- if(data >= 15 && data <45)
- if (!M.slurring)
- M.slurring = 1
- M.slurring += 3
- else if(data >= 45 && prob(50) && data <55)
- M.confused = max(M.confused+3,0)
- else if(data >=55)
- M.druggy = max(M.druggy, 55)
- else if(data >=200)
- M.adjustToxLoss(2)
- ..()
- return
-
- bananahonk
- name = "Banana Mama"
- id = "bananahonk"
- description = "A drink from Clown Heaven."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
- if(!M) M = holder.my_atom
- M.heal_organ_damage(1,1)
- M.nutrition += nutriment_factor
- ..()
- return
- ..()
-
- silencer
- name = "Silencer"
- id = "silencer"
- description = "A drink from Mime Heaven."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
- if(!M) M = holder.my_atom
- M.heal_organ_damage(1,1)
- M.nutrition += nutriment_factor
- ..()
- return
- ..()
-
- changelingsting
- name = "Changeling Sting"
- id = "changelingsting"
- description = "A stingy drink."
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.dizziness +=5
- return
-
- erikasurprise
- name = "Erika Surprise"
- id = "erikasurprise"
- description = "The surprise is, it's green!"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
-
- irishcarbomb
- name = "Irish Car Bomb"
- id = "irishcarbomb"
- description = "Mmm, tastes like chocolate cake..."
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
-
- on_mob_life(var/mob/living/M as mob)
- ..()
- M.dizziness +=5
- return
-
- syndicatebomb
- name = "Syndicate Bomb"
- id = "syndicatebomb"
- description = "A Syndicate bomb"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
-
- erikasurprise
- name = "Erika Surprise"
- id = "erikasurprise"
- description = "The surprise is, it's green!"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
-
- driestmartini
- name = "Driest Martini"
- id = "driestmartini"
- description = "Only for the experienced. You think you see sand floating in the glass."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#2E6671" // rgb: 46, 102, 113
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=10
- if(data >= 55 && data <115)
- if (!M.stuttering) M.stuttering = 1
- M.stuttering += 10
- else if(data >= 115 && prob(33))
- M.confused = max(M.confused+15,15)
- ..()
-
- return
-
-// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
-#undef REM
-
-
-/datum/reagent/Destroy()
- holder = null
- return ..()
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
deleted file mode 100644
index 8fcd9e8117b..00000000000
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ /dev/null
@@ -1,1576 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-datum
- chemical_reaction
- var/name = null
- var/id = null
- var/result = null
- var/list/required_reagents = list()
- var/list/required_catalysts = list()
-
- // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things
- var/atom/required_container = null // the container required for the reaction to happen
- var/required_other = 0 // an integer required for the reaction to happen
-
- var/result_amount = 0
- var/secondary = 0 // set to nonzero if secondary reaction
- var/list/secondary_results = list() //additional reagents produced by the reaction
- var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement
- var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this).
- var/mix_message = "The solution begins to bubble."
- var/mix_sound = 'sound/effects/bubbles.ogg'
- var/no_message = 0
-
-
- proc
- on_reaction(var/datum/reagents/holder, var/created_volume)
- return
-
- //I recommend you set the result amount to the total volume of all components.
-
- explosion_potassium
- name = "Explosion"
- id = "explosion_potassium"
- result = null
- required_reagents = list("water" = 1, "potassium" = 1)
- result_amount = 2
- mix_message = "The mixture explodes!"
-
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0)
- e.start()
- holder.clear_reagents()
- return
-
- emp_pulse
- name = "EMP Pulse"
- id = "emp_pulse"
- result = null
- required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
- result_amount = 2
-
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
- // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
- empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
- holder.clear_reagents()
- return
-/*
- silicate
- name = "Silicate"
- id = "silicate"
- result = "silicate"
- required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1)
- result_amount = 3
-*/
-
- ice
- name = "Ice"
- id = "ice"
- result = "ice"
- required_reagents = list("water" = 1)
- result_amount = 1
- max_temp = 273
- mix_message = "Ice forms as the water freezes."
- mix_sound = null
-
- sterilizine
- name = "Sterilizine"
- id = "sterilizine"
- result = "sterilizine"
- required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1)
- result_amount = 3
-
- mutagen
- name = "Unstable mutagen"
- id = "mutagen"
- result = "mutagen"
- required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1)
- result_amount = 3
- mix_message = "The substance turns neon green and bubbles unnervingly."
-
- hydrocodone
- name = "Hydrocodone"
- id = "hydrocodone"
- result = "hydrocodone"
- required_reagents = list("morphine" = 1, "sacid" = 1, "water" = 1, "oil" = 1)
- result_amount = 2
-
- thermite
- name = "Thermite"
- id = "thermite"
- result = "thermite"
- required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
- result_amount = 3
-
- space_drugs
- name = "Space Drugs"
- id = "space_drugs"
- result = "space_drugs"
- required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1)
- result_amount = 3
- mix_message = "Slightly dizzying fumes drift from the solution."
-
- lube
- name = "Space Lube"
- id = "lube"
- result = "lube"
- required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1)
- result_amount = 3
- mix_message = "The substance turns a striking cyan and becomes oily."
-
- mitocholide
- name = "mitocholide"
- id = "mitocholide"
- result = "mitocholide"
- required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1)
- result_amount = 3
-
- holy_water
- name = "Holy Water"
- id = "holywater"
- result = "holywater"
- required_reagents = list("water" = 1, "mercury" = 1, "wine" = 1)
- result_amount = 3
- mix_message = "The water somehow seems purified. Or maybe defiled."
-
- cryoxadone
- name = "Cryoxadone"
- id = "cryoxadone"
- result = "cryoxadone"
- required_reagents = list("cryostylane" = 1, "plasma" = 1, "acetone" = 1, "mutagen" = 1)
- result_amount = 4
- mix_message = "The solution bubbles softly."
-
- spaceacillin
- name = "Spaceacillin"
- id = "spaceacillin"
- result = "spaceacillin"
- required_reagents = list("fungus" = 1, "ethanol" = 1)
- result_amount = 2
- mix_message = "The solvent extracts an antibiotic compound from the fungus."
-
- Audioline
- name = "Audioline"
- id = "audioline"
- result = "audioline"
- required_reagents = list("spaceacillin" = 1, "salglu_solution" = 1, "epinephrine" = 1)
- result_amount = 3
-
- glycerol
- name = "Glycerol"
- id = "glycerol"
- result = "glycerol"
- required_reagents = list("cornoil" = 3, "sacid" = 1)
- result_amount = 1
-
- nitroglycerin
- name = "Nitroglycerin"
- id = "nitroglycerin"
- result = "nitroglycerin"
- required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1)
- result_amount = 2
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0)
- e.start()
-
- holder.clear_reagents()
- return
-
- sodiumchloride
- name = "Sodium Chloride"
- id = "sodiumchloride"
- result = "sodiumchloride"
- required_reagents = list("sodium" = 1, "chlorine" = 1, "water" = 1)
- result_amount = 3
- mix_message = "The solution crystallizes with a brief flare of light."
-
- rezadone
- name = "Rezadone"
- id = "rezadone"
- result = "rezadone"
- required_reagents = list("carpotoxin" = 1, "spaceacillin" = 1, "copper" = 1)
- result_amount = 3
-
- lsd
- name = "Lysergic acid diethylamide"
- id = "lsd"
- result = "lsd"
- required_reagents = list("diethylamine" = 1, "fungus" = 1)
- result_amount = 3
- mix_message = "The mixture turns a rather unassuming color and settles."
-
- plastication
- name = "Plastic"
- id = "solidplastic"
- result = null
- required_reagents = list("facid" = 10, "plasticide" = 20)
- result_amount = 1
- on_reaction(var/datum/reagents/holder)
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic
- M.amount = 10
- M.loc = get_turf(holder.my_atom)
- return
-
- 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()
-*/
- condensedcapsaicin
- name = "Condensed Capsaicin"
- id = "condensedcapsaicin"
- result = "condensedcapsaicin"
- required_reagents = list("capsaicin" = 2)
- required_catalysts = list("plasma" = 5)
- result_amount = 1
-///////////////////////////////////////////////////////////////////////////////////
-
-// foam and foam precursor
-
- surfactant
- name = "Foam surfactant"
- id = "foam surfactant"
- result = "fluorosurfactant"
- required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
- result_amount = 5
- mix_message = "A head of foam results from the mixture's constant fizzing."
-
-
- foam
- name = "Foam"
- id = "foam"
- result = null
- required_reagents = list("fluorosurfactant" = 1, "water" = 1)
- result_amount = 2
-
- on_reaction(var/datum/reagents/holder, var/created_volume)
-
-
- var/location = get_turf(holder.my_atom)
- for(var/mob/M in viewers(5, location))
- M << "\red The solution violently bubbles!"
-
- location = get_turf(holder.my_atom)
-
- for(var/mob/M in viewers(5, location))
- M << "\red The solution spews out foam!"
-
- //world << "Holder volume is [holder.total_volume]"
- //for(var/datum/reagent/R in holder.reagent_list)
- // world << "[R.name] = [R.volume]"
-
- var/datum/effect/effect/system/foam_spread/s = new()
- s.set_up(created_volume, location, holder, 0)
- s.start()
- holder.clear_reagents()
- return
-
- metalfoam
- name = "Metal Foam"
- id = "metalfoam"
- result = null
- required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1)
- result_amount = 5
-
- on_reaction(var/datum/reagents/holder, var/created_volume)
-
-
- var/location = get_turf(holder.my_atom)
-
- for(var/mob/M in viewers(5, location))
- M << "\red The solution spews out a metalic foam!"
-
- var/datum/effect/effect/system/foam_spread/s = new()
- s.set_up(created_volume, location, holder, 1)
- s.start()
- return
-
- ironfoam
- name = "Iron Foam"
- id = "ironlfoam"
- result = null
- required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1)
- result_amount = 5
-
- on_reaction(var/datum/reagents/holder, var/created_volume)
-
-
- var/location = get_turf(holder.my_atom)
-
- for(var/mob/M in viewers(5, location))
- M << "\red The solution spews out a metalic foam!"
-
- var/datum/effect/effect/system/foam_spread/s = new()
- s.set_up(created_volume, location, holder, 2)
- s.start()
- return
-
- // Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game!
- ammonia
- name = "Ammonia"
- id = "ammonia"
- result = "ammonia"
- required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
- result_amount = 3
- mix_message = "The mixture bubbles, emitting an acrid reek."
-
- diethylamine
- name = "Diethylamine"
- id = "diethylamine"
- result = "diethylamine"
- required_reagents = list ("ammonia" = 1, "ethanol" = 1)
- result_amount = 2
- min_temp = 374
- mix_message = "A horrible smell pours forth from the mixture."
-
- space_cleaner
- name = "Space cleaner"
- id = "cleaner"
- result = "cleaner"
- required_reagents = list("ammonia" = 1, "water" = 1, "ethanol" = 1)
- result_amount = 3
- mix_message = "Ick, this stuff really stinks. Sure does make the container sparkle though!"
-
- sulfuric_acid
- name = "Sulfuric Acid"
- id = "sacid"
- result = "sacid"
- required_reagents = list("sulfur" = 1, "oxygen" = 1, "hydrogen" = 1)
- result_amount = 2
- mix_message = "The mixture gives off a sharp acidic tang."
-
-///////Changeling Blood Test/////////////
-/*
- changeling_test
- name = "Changeling blood test"
- id = "changelingblood"
- result = "blood"
- required_reagents = list("blood" = 5)
- required_catalysts = list("fuel")
- result_amount = 1 //Needs this in order to check the donor, as the data var in the reacted blood gets transferred.
- on_reaction(var/datum/reagents/holder, var/created_volume)
- if(!holder.reagent_list) //reagent_list is not null
- return
- var/datum/reagent/blood/B = locate() in holder.reagent_list
- if(!B) //B is not null
- return
- var/mob/living/carbon/human/H = B.data["donor"]
- if(!H) //H is not null.
- return
- if(H.mind && H.mind.changeling) //Checks if H, the blood donor is a ling.
- for(var/mob/M in viewers(get_turf(holder.my_atom), null))
- M.show_message( "The blood writhes and wriggles and sizzles away from the container!", 1, "You hear bubbling and sizzling.", 2)
- else
- for(var/mob/M in viewers(get_turf(holder.my_atom), null))
- M.show_message( "The blood seems to break apart in the fuel.", 1)
- holder.del_reagent("blood")
- return
-*/
-
-/////////////////////////////////////////////NEW SLIME CORE REACTIONS/////////////////////////////////////////////
-
-//Grey
- slimespawn
- name = "Slime Spawn"
- id = "m_spawn"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/grey
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("\red Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1)
- var/mob/living/carbon/slime/S = new /mob/living/carbon/slime
- S.loc = get_turf(holder.my_atom)
-
-
- slimeinaprov
- name = "Slime Epinephrine"
- id = "m_epinephrine"
- result = "epinephrine"
- required_reagents = list("water" = 5)
- result_amount = 3
- required_other = 1
- required_container = /obj/item/slime_extract/grey
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-
- slimemonkey
- name = "Slime Monkey"
- id = "m_monkey"
- result = null
- required_reagents = list("blood" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/grey
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- for(var/i = 1, i <= 3, i++)
- var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube
- M.loc = get_turf(holder.my_atom)
-
-//Green
- slimemutate
- name = "Mutation Toxin"
- id = "mutationtoxin"
- result = "mutationtoxin"
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_other = 1
- required_container = /obj/item/slime_extract/green
-
-//Metal
- slimemetal
- name = "Slime Metal"
- id = "m_metal"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/metal
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
- M.amount = 15
- M.loc = get_turf(holder.my_atom)
- var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
- P.amount = 5
- P.loc = get_turf(holder.my_atom)
-
-//Gold
- slimecrit
- name = "Slime Crit"
- id = "m_tele"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/gold
- required_other = 1
- on_reaction(var/datum/reagents/holder)
-
- var/blocked = blocked_mobs //global variable of blocked mobs
-
- var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash)
-
- for(var/i = 1, i <= 5, i++)
- var/chosen = pick(critters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction |= "slimesummon"
- C.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
-// for(var/mob/O in viewers(get_turf(holder.my_atom), null))
-// O.show_message(text("\red The slime core fizzles disappointingly,"), 1)
-
-
- slimecritlesser
- name = "Slime Crit Lesser"
- id = "m_tele3"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/gold
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently!"), 1)
- spawn(50)
-
- if(holder && holder.my_atom)
-
- var/blocked = blocked_mobs
-
- var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash)
-
- var/chosen = pick(critters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction |= "neutral"
- C.loc = get_turf(holder.my_atom)
-
-//Silver
- slimebork
- name = "Slime Bork"
- id = "m_tele2"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/silver
- required_other = 1
- on_reaction(var/datum/reagents/holder)
-
- var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
- // BORK BORK BORK
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash)
-
- for(var/i = 1, i <= 4 + rand(1,2), i++)
- var/chosen = pick(borks)
- var/obj/B = new chosen
- if(B)
- B.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
- slimedrinks
- name = "Slime Drinks"
- id = "m_tele3"
- result = null
- required_reagents = list("water" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/silver
- required_other = 1
- on_reaction(var/datum/reagents/holder)
-
- var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
- // BORK BORK BORK
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash)
-
- for(var/i = 1, i <= 4 + rand(1,2), i++)
- var/chosen = pick(borks)
- var/obj/B = new chosen
- if(B)
- B.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
-
-
-//Blue
- slimefrost
- name = "Slime Frost Oil"
- id = "m_frostoil"
- result = "frostoil"
- required_reagents = list("plasma" = 5)
- result_amount = 10
- required_container = /obj/item/slime_extract/blue
- required_other = 1
-//Dark Blue
- slimefreeze
- name = "Slime Freeze"
- id = "m_freeze"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/darkblue
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("\red The slime extract begins to vibrate violently !"), 1)
- sleep(50)
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
- for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
- M.bodytemperature -= 140
- M << "\blue You feel a chill!"
-
-//Orange
- slimecasp
- name = "Slime Capsaicin Oil"
- id = "m_capsaicinoil"
- result = "capsaicin"
- required_reagents = list("blood" = 5)
- result_amount = 10
- required_container = /obj/item/slime_extract/orange
- required_other = 1
-
- slimefire
- name = "Slime fire"
- id = "m_fire"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/orange
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("\red The slime extract begins to vibrate violently !"), 1)
- sleep(50)
- var/turf/simulated/T = get_turf(holder.my_atom)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50)
-
-//Yellow
- slimeoverload
- name = "Slime EMP"
- id = "m_emp"
- result = null
- required_reagents = list("blood" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/yellow
- required_other = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- empulse(get_turf(holder.my_atom), 3, 7)
-
-
- slimecell
- name = "Slime Powercell"
- id = "m_cell"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/yellow
- required_other = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/obj/item/weapon/stock_parts/cell/slime/P = new /obj/item/weapon/stock_parts/cell/slime
- P.loc = get_turf(holder.my_atom)
-
- slimeglow
- name = "Slime Glow"
- id = "m_glow"
- result = null
- required_reagents = list("water" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/yellow
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("\red The contents of the slime core harden and begin to emit a warm, bright light."), 1)
- var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
- F.loc = get_turf(holder.my_atom)
-
-//Purple
-
- slimepsteroid
- name = "Slime Steroid"
- id = "m_steroid"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/purple
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid
- P.loc = get_turf(holder.my_atom)
-
-
-
- slimejam
- name = "Slime Jam"
- id = "m_jam"
- result = "slimejelly"
- required_reagents = list("sugar" = 5)
- result_amount = 10
- required_container = /obj/item/slime_extract/purple
- required_other = 1
-
-
-//Dark Purple
- slimeplasma
- name = "Slime Plasma"
- id = "m_plasma"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/darkpurple
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma
- P.amount = 10
- P.loc = get_turf(holder.my_atom)
-
-//Red
- slimeglycerol
- name = "Slime Glycerol"
- id = "m_glycerol"
- result = "glycerol"
- required_reagents = list("plasma" = 5)
- result_amount = 8
- required_container = /obj/item/slime_extract/red
- required_other = 1
-
-
- slimebloodlust
- name = "Bloodlust"
- id = "m_bloodlust"
- result = null
- required_reagents = list("blood" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/red
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null))
- slime.rabid = 1
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("\red The [slime] is driven into a frenzy!."), 1)
-
-//Pink
- slimeppotion
- name = "Slime Potion"
- id = "m_potion"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/pink
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion
- P.loc = get_turf(holder.my_atom)
-
-
-//Black
- slimemutate2
- name = "Advanced Mutation Toxin"
- id = "mutationtoxin2"
- result = "amutationtoxin"
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_other = 1
- required_container = /obj/item/slime_extract/black
-
-//Oil
- slimeexplosion
- name = "Slime Explosion"
- id = "m_explosion"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/oil
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("\red The slime extract begins to vibrate violently !"), 1)
- sleep(50)
- explosion(get_turf(holder.my_atom), 1 ,3, 6)
-//Light Pink
- slimepotion2
- name = "Slime Potion 2"
- id = "m_potion2"
- result = null
- result_amount = 1
- required_container = /obj/item/slime_extract/lightpink
- required_reagents = list("plasma" = 5)
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2
- P.loc = get_turf(holder.my_atom)
-//Adamantine
- slimegolem
- name = "Slime Golem"
- id = "m_golem"
- result = null
- required_reagents = list("plasma" = 5)
- result_amount = 1
- required_container = /obj/item/slime_extract/adamantine
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/effect/goleRUNe/Z = new /obj/effect/goleRUNe
- Z.loc = get_turf(holder.my_atom)
- Z.announce_to_ghosts()
-//Bluespace
- slimecrystal
- name = "Slime Crystal"
- id = "m_crystal"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/bluespace
- required_other = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- if(holder.my_atom)
- var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom))
- BC.visible_message("The [BC.name] appears out of thin air!")
-//Cerulean
- slimepsteroid2
- name = "Slime Steroid 2"
- id = "m_steroid2"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/cerulean
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2
- P.loc = get_turf(holder.my_atom)
-//Sepia
- slimecamera
- name = "Slime Camera"
- id = "m_camera"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/sepia
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/device/camera/P = new /obj/item/device/camera
- P.loc = get_turf(holder.my_atom)
-
-
- slimefilm
- name = "Slime Film"
- id = "m_film"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/sepia
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
- P.loc = get_turf(holder.my_atom)
-//Pyrite
- slimepaint
- name = "Slime Paint"
- id = "s_paint"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/pyrite
- required_other = 1
- on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/list/paints = subtypesof(/obj/item/weapon/reagent_containers/glass/paint)
- var/chosen = pick(paints)
- var/obj/P = new chosen
- if(P)
- P.loc = get_turf(holder.my_atom)
-
-
-//////////////////////////////////////////FOOD MIXTURES////////////////////////////////////
-
- tofu
- name = "Tofu"
- id = "tofu"
- result = null
- required_reagents = list("soymilk" = 10)
- required_catalysts = list("enzyme" = 5)
- result_amount = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- for(var/i = 1, i <= created_volume, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/tofu(location)
- return
-
- chocolate_bar
- name = "Chocolate Bar"
- id = "chocolate_bar"
- result = null
- required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2)
- result_amount = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- for(var/i = 1, i <= created_volume, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
- return
-
- chocolate_bar2
- name = "Chocolate Bar"
- id = "chocolate_bar"
- result = null
- required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2)
- result_amount = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- for(var/i = 1, i <= created_volume, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
- return
-
- hot_coco
- name = "Hot Coco"
- id = "hot_coco"
- result = "hot_coco"
- required_reagents = list("water" = 5, "coco" = 1)
- result_amount = 5
-
- chocolate_milk
- name = "Chocolate Milk"
- id = "chocolate_milk"
- result = "chocolate_milk"
- required_reagents = list("chocolate" = 1, "milk" = 1)
- result_amount = 2
- mix_message = "The mixture turns a nice brown color."
-
- coffee
- name = "Coffee"
- id = "coffee"
- result = "coffee"
- required_reagents = list("coffeepowder" = 1, "water" = 5)
- result_amount = 5
-
- tea
- name = "Tea"
- id = "tea"
- result = "tea"
- required_reagents = list("teapowder" = 1, "water" = 5)
- result_amount = 5
-
- soysauce
- name = "Soy Sauce"
- id = "soysauce"
- result = "soysauce"
- required_reagents = list("soymilk" = 2, "flour" = 1, "sodiumchloride" = 1, "water" = 3)
- result_amount = 7
-
- cheesewheel
- name = "Cheesewheel"
- id = "cheesewheel"
- result = null
- required_reagents = list("milk" = 40)
- required_catalysts = list("enzyme" = 5)
- result_amount = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location)
- return
-
- syntiflesh
- name = "Syntiflesh"
- id = "syntiflesh"
- result = null
- required_reagents = list("blood" = 5, "cryoxadone" = 1)
- result_amount = 1
- on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location)
- return
-
- hot_ramen
- name = "Hot Ramen"
- id = "hot_ramen"
- result = "hot_ramen"
- required_reagents = list("water" = 1, "dry_ramen" = 3)
- result_amount = 3
-
- hell_ramen
- name = "Hell Ramen"
- id = "hell_ramen"
- result = "hell_ramen"
- required_reagents = list("capsaicin" = 1, "hot_ramen" = 6)
- result_amount = 6
-
- doughball
- name = "Ball of dough"
- id = "dough_ball"
- result = "dough_ball"
- required_reagents = list("flour" = 15, "water" = 5)
- required_catalysts = list("enzyme" = 5)
-
-
-////////////////////////////////////////// COCKTAILS //////////////////////////////////////
-
-
- goldschlager
- name = "Goldschlager"
- id = "goldschlager"
- result = "goldschlager"
- required_reagents = list("vodka" = 10, "gold" = 1)
- result_amount = 10
-
- patron
- name = "Patron"
- id = "patron"
- result = "patron"
- required_reagents = list("tequilla" = 10, "silver" = 1)
- result_amount = 10
-
- bilk
- name = "Bilk"
- id = "bilk"
- result = "bilk"
- required_reagents = list("milk" = 1, "beer" = 1)
- result_amount = 2
-
- icetea
- name = "Iced Tea"
- id = "icetea"
- result = "icetea"
- required_reagents = list("ice" = 1, "tea" = 3)
- result_amount = 4
-
- icecoffee
- name = "Iced Coffee"
- id = "icecoffee"
- result = "icecoffee"
- required_reagents = list("ice" = 1, "coffee" = 3)
- result_amount = 4
-
- nuka_cola
- name = "Nuka Cola"
- id = "nuka_cola"
- result = "nuka_cola"
- required_reagents = list("uranium" = 1, "cola" = 6)
- result_amount = 6
-
- moonshine
- name = "Moonshine"
- id = "moonshine"
- result = "moonshine"
- required_reagents = list("nutriment" = 10)
- required_catalysts = list("enzyme" = 5)
- result_amount = 10
-
- wine
- name = "Wine"
- id = "wine"
- result = "wine"
- required_reagents = list("berryjuice" = 10)
- required_catalysts = list("enzyme" = 5)
- result_amount = 10
-
- spacebeer
- name = "Space Beer"
- id = "spacebeer"
- result = "beer"
- required_reagents = list("cornoil" = 10)
- required_catalysts = list("enzyme" = 5)
- result_amount = 10
-
- vodka
- name = "Vodka"
- id = "vodka"
- result = "vodka"
- required_reagents = list("potato" = 10)
- required_catalysts = list("enzyme" = 5)
- result_amount = 10
- sake
- name = "Sake"
- id = "sake"
- result = "sake"
- required_reagents = list("rice" = 10,"water" = 5)
- required_catalysts = list("enzyme" = 5)
- result_amount = 15
-
- kahlua
- name = "Kahlua"
- id = "kahlua"
- result = "kahlua"
- required_reagents = list("coffee" = 5, "sugar" = 5, "rum" = 5)
- required_catalysts = list("enzyme" = 5)
- result_amount = 5
-
- kahluaVodka
- name = "KahluaVodka"
- id = "kahlauVodka"
- result = "kahlua"
- required_reagents = list("coffee" = 5, "sugar" = 5, "vodka" = 5)
- required_catalysts = list("enzyme" = 5)
- result_amount = 5
- gin_tonic
- name = "Gin and Tonic"
- id = "gintonic"
- result = "gintonic"
- required_reagents = list("gin" = 2, "tonic" = 1)
- result_amount = 3
- mix_message = "The tonic water and gin mix together perfectly."
-
- cuba_libre
- name = "Cuba Libre"
- id = "cubalibre"
- result = "cubalibre"
- required_reagents = list("rum" = 2, "cola" = 1)
- result_amount = 3
-
- mojito
- name = "Mojito"
- id = "mojito"
- result = "mojito"
- required_reagents = list("rum" = 1, "sugar" = 1, "limejuice" = 1, "sodawater" = 1)
- result_amount = 4
-
- martini
- name = "Classic Martini"
- id = "martini"
- result = "martini"
- required_reagents = list("gin" = 2, "vermouth" = 1)
- result_amount = 3
-
- vodkamartini
- name = "Vodka Martini"
- id = "vodkamartini"
- result = "vodkamartini"
- required_reagents = list("vodka" = 2, "vermouth" = 1)
- result_amount = 3
-
- white_russian
- name = "White Russian"
- id = "whiterussian"
- result = "whiterussian"
- required_reagents = list("blackrussian" = 3, "cream" = 2)
- result_amount = 5
-
- whiskey_cola
- name = "Whiskey Cola"
- id = "whiskeycola"
- result = "whiskeycola"
- required_reagents = list("whiskey" = 2, "cola" = 1)
- result_amount = 3
-
- screwdriver
- name = "Screwdriver"
- id = "screwdrivercocktail"
- result = "screwdrivercocktail"
- required_reagents = list("vodka" = 2, "orangejuice" = 1)
- result_amount = 3
-
- bloody_mary
- name = "Bloody Mary"
- id = "bloodymary"
- result = "bloodymary"
- required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1)
- result_amount = 4
-
- gargle_blaster
- name = "Pan-Galactic Gargle Blaster"
- id = "gargleblaster"
- result = "gargleblaster"
- required_reagents = list("vodka" = 1, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1)
- result_amount = 5
-
- brave_bull
- name = "Brave Bull"
- id = "bravebull"
- result = "bravebull"
- required_reagents = list("tequilla" = 2, "kahlua" = 1)
- result_amount = 3
-
- tequilla_sunrise
- name = "Tequilla Sunrise"
- id = "tequillasunrise"
- result = "tequillasunrise"
- required_reagents = list("tequilla" = 2, "orangejuice" = 1)
- result_amount = 3
-
- toxins_special
- name = "Toxins Special"
- id = "toxinsspecial"
- result = "toxinsspecial"
- required_reagents = list("rum" = 2, "vermouth" = 1, "plasma" = 2)
- result_amount = 5
-
- beepsky_smash
- name = "Beepksy Smash"
- id = "beepksysmash"
- result = "beepskysmash"
- required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1)
- result_amount = 4
-
- doctor_delight
- name = "The Doctor's Delight"
- id = "doctordelight"
- result = "doctorsdelight"
- required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1)
- result_amount = 5
-
- irish_cream
- name = "Irish Cream"
- id = "irishcream"
- result = "irishcream"
- required_reagents = list("whiskey" = 2, "cream" = 1)
- result_amount = 3
-
- manly_dorf
- name = "The Manly Dorf"
- id = "manlydorf"
- result = "manlydorf"
- required_reagents = list ("beer" = 1, "ale" = 2)
- result_amount = 3
-
- suicider
- name = "Suicider"
- id = "suicider"
- result = "suicider"
- required_reagents = list ("vodka" = 1, "cider" = 1, "fuel" = 1, "epinephrine" = 1)
- result_amount = 4
- mix_message = "The drinks and chemicals mix together, emitting a potent smell."
-
- irish_coffee
- name = "Irish Coffee"
- id = "irishcoffee"
- result = "irishcoffee"
- required_reagents = list("irishcream" = 1, "coffee" = 1)
- result_amount = 2
-
- b52
- name = "B-52"
- id = "b52"
- result = "b52"
- required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1)
- result_amount = 3
-
- atomicbomb
- name = "Atomic Bomb"
- id = "atomicbomb"
- result = "atomicbomb"
- required_reagents = list("b52" = 10, "uranium" = 1)
- result_amount = 10
-
- margarita
- name = "Margarita"
- id = "margarita"
- result = "margarita"
- required_reagents = list("tequilla" = 2, "limejuice" = 1)
- result_amount = 3
-
- longislandicedtea
- name = "Long Island Iced Tea"
- id = "longislandicedtea"
- result = "longislandicedtea"
- required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1)
- result_amount = 4
-
- threemileisland
- name = "Three Mile Island Iced Tea"
- id = "threemileisland"
- result = "threemileisland"
- required_reagents = list("longislandicedtea" = 10, "uranium" = 1)
- result_amount = 10
-
- whiskeysoda
- name = "Whiskey Soda"
- id = "whiskeysoda"
- result = "whiskeysoda"
- required_reagents = list("whiskey" = 2, "sodawater" = 1)
- result_amount = 3
-
- black_russian
- name = "Black Russian"
- id = "blackrussian"
- result = "blackrussian"
- required_reagents = list("vodka" = 3, "kahlua" = 2)
- result_amount = 5
-
- manhattan
- name = "Manhattan"
- id = "manhattan"
- result = "manhattan"
- required_reagents = list("whiskey" = 2, "vermouth" = 1)
- result_amount = 3
-
- manhattan_proj
- name = "Manhattan Project"
- id = "manhattan_proj"
- result = "manhattan_proj"
- required_reagents = list("manhattan" = 10, "uranium" = 1)
- result_amount = 10
-
- vodka_tonic
- name = "Vodka and Tonic"
- id = "vodkatonic"
- result = "vodkatonic"
- required_reagents = list("vodka" = 2, "tonic" = 1)
- result_amount = 3
-
- gin_fizz
- name = "Gin Fizz"
- id = "ginfizz"
- result = "ginfizz"
- required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1)
- result_amount = 4
-
- bahama_mama
- name = "Bahama mama"
- id = "bahama_mama"
- result = "bahama_mama"
- required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1)
- result_amount = 6
-
- singulo
- name = "Singulo"
- id = "singulo"
- result = "singulo"
- required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5)
- result_amount = 10
-
- alliescocktail
- name = "Allies Cocktail"
- id = "alliescocktail"
- result = "alliescocktail"
- required_reagents = list("martini" = 1, "vodka" = 1)
- result_amount = 2
-
- demonsblood
- name = "Demons Blood"
- id = "demonsblood"
- result = "demonsblood"
- required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1)
- result_amount = 4
-
- booger
- name = "Booger"
- id = "booger"
- result = "booger"
- required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1)
- result_amount = 4
-
- antifreeze
- name = "Anti-freeze"
- id = "antifreeze"
- result = "antifreeze"
- required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1)
- result_amount = 4
-
- barefoot
- name = "Barefoot"
- id = "barefoot"
- result = "barefoot"
- required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1)
- result_amount = 3
-
-
-////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri/////
-
- sbiten
- name = "Sbiten"
- id = "sbiten"
- result = "sbiten"
- required_reagents = list("vodka" = 10, "capsaicin" = 1)
- result_amount = 10
-
- red_mead
- name = "Red Mead"
- id = "red_mead"
- result = "red_mead"
- required_reagents = list("blood" = 1, "mead" = 1)
- result_amount = 2
-
- mead
- name = "Mead"
- id = "mead"
- result = "mead"
- required_reagents = list("sugar" = 1, "water" = 1)
- required_catalysts = list("enzyme" = 5)
- result_amount = 2
-
- iced_beer
- name = "Iced Beer"
- id = "iced_beer"
- result = "iced_beer"
- required_reagents = list("beer" = 10, "frostoil" = 1)
- result_amount = 10
-
- iced_beer2
- name = "Iced Beer"
- id = "iced_beer"
- result = "iced_beer"
- required_reagents = list("beer" = 5, "ice" = 1)
- result_amount = 6
-
- grog
- name = "Grog"
- id = "grog"
- result = "grog"
- required_reagents = list("rum" = 1, "water" = 1)
- result_amount = 2
-
- soy_latte
- name = "Soy Latte"
- id = "soy_latte"
- result = "soy_latte"
- required_reagents = list("coffee" = 1, "soymilk" = 1)
- result_amount = 2
-
- cafe_latte
- name = "Cafe Latte"
- id = "cafe_latte"
- result = "cafe_latte"
- required_reagents = list("coffee" = 1, "milk" = 1)
- result_amount = 2
-
- acidspit
- name = "Acid Spit"
- id = "acidspit"
- result = "acidspit"
- required_reagents = list("sacid" = 1, "wine" = 5)
- result_amount = 6
-
- amasec
- name = "Amasec"
- id = "amasec"
- result = "amasec"
- required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5)
- result_amount = 10
-
- changelingsting
- name = "Changeling Sting"
- id = "changelingsting"
- result = "changelingsting"
- required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1)
- result_amount = 5
-
- aloe
- name = "Aloe"
- id = "aloe"
- result = "aloe"
- required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1)
- result_amount = 2
-
- andalusia
- name = "Andalusia"
- id = "andalusia"
- result = "andalusia"
- required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1)
- result_amount = 3
-
- neurotoxin
- name = "Neurotoxin"
- id = "neurotoxin"
- result = "neurotoxin"
- required_reagents = list("gargleblaster" = 1, "ether" = 1)
- result_amount = 2
-
- snowwhite
- name = "Snow White"
- id = "snowwhite"
- result = "snowwhite"
- required_reagents = list("beer" = 1, "lemon_lime" = 1)
- result_amount = 2
-
- irishcarbomb
- name = "Irish Car Bomb"
- id = "irishcarbomb"
- result = "irishcarbomb"
- required_reagents = list("ale" = 1, "irishcream" = 1)
- result_amount = 2
-
- syndicatebomb
- name = "Syndicate Bomb"
- id = "syndicatebomb"
- result = "syndicatebomb"
- required_reagents = list("beer" = 1, "whiskeycola" = 1)
- result_amount = 2
-
- erikasurprise
- name = "Erika Surprise"
- id = "erikasurprise"
- result = "erikasurprise"
- required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1)
- result_amount = 5
-
- devilskiss
- name = "Devils Kiss"
- id = "devilskiss"
- result = "devilskiss"
- required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1)
- result_amount = 3
-
- hippiesdelight
- name = "Hippies Delight"
- id = "hippiesdelight"
- result = "hippiesdelight"
- required_reagents = list("psilocybin" = 1, "gargleblaster" = 1)
- result_amount = 2
-
- bananahonk
- name = "Banana Honk"
- id = "bananahonk"
- result = "bananahonk"
- required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1)
- result_amount = 3
-
- silencer
- name = "Silencer"
- id = "silencer"
- result = "silencer"
- required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1)
- result_amount = 3
-
- driestmartini
- name = "Driest Martini"
- id = "driestmartini"
- result = "driestmartini"
- required_reagents = list("nothing" = 1, "gin" = 1)
- result_amount = 2
-
- lemonade
- name = "Lemonade"
- id = "lemonade"
- result = "lemonade"
- required_reagents = list("lemonjuice" = 1, "sugar" = 1, "water" = 1)
- result_amount = 3
-
- kiraspecial
- name = "Kira Special"
- id = "kiraspecial"
- result = "kiraspecial"
- required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1)
- result_amount = 2
-
- brownstar
- name = "Brown Star"
- id = "brownstar"
- result = "brownstar"
- required_reagents = list("orangejuice" = 2, "cola" = 1)
- result_amount = 2
-
- milkshake
- name = "Milkshake"
- id = "milkshake"
- result = "milkshake"
- required_reagents = list("cream" = 1, "ice" = 2, "milk" = 2)
- result_amount = 5
-
- rewriter
- name = "Rewriter"
- id = "rewriter"
- result = "rewriter"
- required_reagents = list("spacemountainwind" = 1, "coffee" = 1)
- result_amount = 2
diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm
index 3107faaae69..48c467fed02 100644
--- a/code/modules/reagents/grenade_launcher.dm
+++ b/code/modules/reagents/grenade_launcher.dm
@@ -17,57 +17,57 @@
materials = list(MAT_METAL=2000)
- examine()
- set src in view()
- ..()
- if (!(usr in view(2)) && usr!=src.loc) return
- usr << "\icon [name]:"
- usr << "\blue [grenades.len] / [max_grenades] [ammo_name]s."
+/obj/item/weapon/gun/grenadelauncher/examine()
+ set src in view()
+ ..()
+ if (!(usr in view(2)) && usr!=src.loc) return
+ usr << "\icon [name]:"
+ usr << "\blue [grenades.len] / [max_grenades] [ammo_name]s."
- attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params)
- if((istype(I, ammo_type)))
- if(grenades.len < max_grenades)
- user.drop_item()
- I.loc = src
- grenades += I
- user << "\blue You put the [ammo_name] in the [name]."
- user << "\blue [grenades.len] / [max_grenades] [ammo_name]s."
- else
- usr << "\red The grenade launcher cannot hold more [ammo_name]s."
-
- afterattack(obj/target, mob/user , flag)
-
- if (istype(target, /obj/item/weapon/storage/backpack ))
- return
-
- else if (locate (/obj/structure/table, src.loc))
- return
-
- else if(target == user)
- return
-
- if(grenades.len)
- spawn(0) fire_grenade(target,user)
+ if((istype(I, ammo_type)))
+ if(grenades.len < max_grenades)
+ user.drop_item()
+ I.loc = src
+ grenades += I
+ user << "\blue You put the [ammo_name] in the [name]."
+ user << "\blue [grenades.len] / [max_grenades] [ammo_name]s."
else
- usr << "\red The [name] is empty."
+ usr << "\red The grenade launcher cannot hold more [ammo_name]s."
+
+/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
+
+ if (istype(target, /obj/item/weapon/storage/backpack ))
+ return
+
+ else if (locate (/obj/structure/table, src.loc))
+ return
+
+ else if(target == user)
+ return
+
+ if(grenades.len)
+ spawn(0) fire_grenade(target,user)
+ else
+ usr << "\red The [name] is empty."
+
+/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] fired a [ammo_name]!", user), 1)
+ user << "\red You fire the [name]!"
+ var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta!
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2, user)
+ message_admins("[key_name_admin(user)] fired a [ammo_name] ([F.name]) from a launcher ([name]).")
+ log_game("[key_name_admin(user)] used a [ammo_name] ([name]).")
+ F.active = 1
+ F.icon_state = initial(icon_state) + "_active"
+ playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
- proc
- fire_grenade(atom/target, mob/user)
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] fired a [ammo_name]!", user), 1)
- user << "\red You fire the [name]!"
- var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta!
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2, user)
- message_admins("[key_name_admin(user)] fired a [ammo_name] ([F.name]) from a launcher ([name]).")
- log_game("[key_name_admin(user)] used a [ammo_name] ([name]).")
- F.active = 1
- F.icon_state = initial(icon_state) + "_active"
- playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
/obj/item/weapon/gun/grenadelauncher/piecannon
name = "pie cannon"
diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm
index f3b65c9d1b5..80c36713bbe 100644
--- a/code/modules/reagents/newchem/Blob-Reagents.dm
+++ b/code/modules/reagents/newchem/Blob-Reagents.dm
@@ -1,188 +1,149 @@
// These can only be applied by blobs. They are what blobs are made out of.
// The 4 damage
/datum/reagent/blob
+ description = ""
var/message = "The blob strikes you" //message sent to any mob hit by the blob
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
-/datum/reagent/blob/boiling_oil
+/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, volume, show_message, touch_protection)
+ return round(volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
+
+/datum/reagent/blob/ripping_tendrils //does brute and a little stamina damage
+ name = "Ripping Tendrils"
+ id = "ripping_tendrils"
+ color = "#7F0000"
+ message_living = ", and you feel your skin ripping and tearing off"
+
+/datum/reagent/blob/ripping_tendrils/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ volume = ..()
+ M.apply_damage(0.6*volume, BRUTE)
+ M.adjustStaminaLoss(0.4*volume)
+ if(iscarbon(M))
+ M.emote("scream")
+
+/datum/reagent/blob/boiling_oil //sets you on fire, does burn damage
name = "Boiling Oil"
id = "boiling_oil"
- description = ""
color = "#B68D00"
message = "The blob splashes you with burning oil"
+ message_living = ", and you feel your skin char and melt"
/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(15*ratio, BURN)
- M.adjust_fire_stacks(2*ratio)
+ M.adjust_fire_stacks(round(volume/12))
+ volume = ..()
+ M.apply_damage(0.6*volume, BURN)
M.IgniteMob()
if(isliving(M))
M.emote("scream")
-/datum/reagent/blob/toxic_goop
- name = "Toxic Goop"
- id = "toxic_goop"
- description = ""
- color = "#008000"
+/datum/reagent/blob/envenomed_filaments //toxin, hallucination, and some bonus spore toxin
+ name = "Envenomed Filaments"
+ id = "envenomed_filaments"
+ color = "#9ACD32"
message_living = ", and you feel sick and nauseated"
-/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/blob/envenomed_filaments/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(20*ratio, TOX)
+ volume = ..()
+ M.apply_damage(0.6*volume, TOX)
+ M.hallucination += 0.6*volume
+ M.reagents.add_reagent("spores", 0.4*volume)
-/datum/reagent/blob/skin_ripper
- name = "Skin Ripper"
- id = "skin_ripper"
- description = ""
- color = "#FF4C4C"
- message_living = ", and you feel your skin ripping and tearing off"
-
-/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
- if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(20*ratio, BRUTE)
- if(iscarbon(M))
- M.emote("scream")
-
-// Combo Reagents
-
-/datum/reagent/blob/skin_melter
- name = "Skin Melter"
- id = "skin_melter"
- description = ""
- color = "#7F0000"
- message_living = ", and you feel your skin char and melt"
-
-/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
- if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(10*ratio, BRUTE)
- M.apply_damage(10*ratio, BURN)
- M.adjust_fire_stacks(2*ratio)
- M.IgniteMob()
- if(iscarbon(M))
- M.emote("scream")
-
-/datum/reagent/blob/lung_destroying_toxin
- name = "Lung Destroying Toxin"
- id = "lung_destroying_toxin"
- description = ""
+/datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute
+ name = "Lexorin Jelly"
+ id = "lexorin_jelly"
color = "#00FFC5"
message_living = ", and your lungs feel heavy and weak"
-/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/blob/lexorin_jelly/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(20* ratio, OXY)
- M.losebreath += 15*ratio
- M.apply_damage(20*ratio, TOX)
+ volume = ..()
+ M.apply_damage(0.4*volume, BRUTE)
+ M.apply_damage(1*volume, OXY)
+ M.losebreath += round(0.3*volume)
-// Special Reagents
-/datum/reagent/blob/radioactive_liquid
- name = "Radioactive Liquid"
- id = "radioactive_liquid"
- description = ""
- color = "#00EE00"
- message_living = ", and your skin feels papery and everything hurts"
+/datum/reagent/blob/kinetic //does semi-random brute damage
+ name = "Kinetic Gelatin"
+ id = "kinetic"
+ color = "#FFA500"
+ message = "The blob pummels you"
-/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/blob/kinetic/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(10*ratio, BRUTE)
- if(istype(M, /mob/living/carbon/human))
- M.apply_effect(40*ratio,IRRADIATE,0)
- if(prob(33*ratio))
- randmuti(M)
- if(prob(98))
- randmutb(M)
- domutcheck(M, null)
- M.UpdateAppearance()
+ volume = ..()
+ var/damage = rand(5, 35)/25
+ M.apply_damage(damage*volume, BRUTE)
+
+/datum/reagent/blob/cryogenic_liquid //does low burn damage and stamina damage and cools targets down
+ name = "Cryogenic Liquid"
+ id = "cryogenic_liquid"
+ color = "#8BA6E9"
+ message = "The blob splashes you with an icy liquid"
+ message_living = ", and you feel cold and tired"
+
+/datum/reagent/blob/cryogenic_liquid/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
+ volume = ..()
+ M.apply_damage(0.4*volume, BURN)
+ M.adjustStaminaLoss(0.4*volume)
+ M.reagents.add_reagent("frostoil", 0.4*volume)
/datum/reagent/blob/dark_matter
name = "Dark Matter"
id = "dark_matter"
- description = ""
color = "#61407E"
message = "You feel a thrum as the blob strikes you, and everything flies at you"
/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(15*ratio, BRUTE)
- reagent_vortex(M, 0)
+ reagent_vortex(M, 0, volume)
+ volume = ..()
+ M.apply_damage(0.6*volume, BRUTE)
/datum/reagent/blob/b_sorium
name = "Sorium"
id = "b_sorium"
- description = ""
color = "#808000"
message = "The blob slams into you, and sends you flying"
/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- var/ratio = volume/25
- M.apply_damage(15*ratio, BRUTE)
- reagent_vortex(M, 1)
+ reagent_vortex(M, 1, volume)
+ volume = ..()
+ M.apply_damage(0.6*volume, BRUTE)
-
-/datum/reagent/blob/explosive // I'm gonna burn in hell for this one
- name = "Explosive Gelatin"
- id = "explosive"
- description = ""
- color = "#FFA500"
- message = "The blob strikes you, and its tendrils explode"
-
-/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
- if(method == TOUCH)
- var/ratio = volume/25
- if(prob(75*ratio))
- explosion(M.loc, 0, 0, 1, 0, 0)
-
-/datum/reagent/blob/omnizine
- name = "Omnizine"
- id = "b_omnizine"
- description = ""
- color = "#C8A5DC"
- message = "The blob squirts something at you"
- message_living = ", and you feel great"
-
-/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
- if(method == TOUCH)
- var/ratio = volume/25
- M.reagents.add_reagent("omnizine", 11*ratio)
-
-/datum/reagent/blob/spacedrugs
- name = "Space drugs"
- id = "b_space_drugs"
- description = ""
- color = "#60A584"
- message = "The blob squirts something at you"
- message_living = ", and you feel funny"
-
-/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
- if(method == TOUCH)
- var/ratio = volume/25
- M.hallucination += 20*ratio
- M.reagents.add_reagent("space_drugs", 15*ratio)
- M.apply_damage(10*ratio, TOX)
-
-
-/datum/reagent/blob/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type)
+/datum/reagent/blob/proc/reagent_vortex(mob/living/M, setting_type, volume)
var/turf/pull = get_turf(M)
- for(var/atom/movable/X in range(4,pull))
- if(istype(X, /atom/movable))
- if((X) && !X.anchored)
- if(setting_type)
- step_away(X,pull)
- step_away(X,pull)
- step_away(X,pull)
- step_away(X,pull)
+ var/range_power = Clamp(round(volume/5, 1), 1, 5)
+ for(var/atom/movable/X in range(range_power,pull))
+ if(istype(X, /obj/effect))
+ continue
+ if(!X.anchored)
+ var/distance = get_dist(X, pull)
+ var/moving_power = max(range_power - distance, 1)
+ spawn(0)
+ if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
+ if(setting_type)
+ var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull)))
+ var/throw_range = 5 - distance
+ X.throw_at(throw_target, throw_range, 1)
+ else
+ X.throw_at(pull, distance, 1)
else
- X.throw_at(pull)
+ if(setting_type)
+ for(var/i = 0, i < moving_power, i++)
+ sleep(2)
+ if(!step_away(X, pull))
+ break
+ else
+ for(var/i = 0, i < moving_power, i++)
+ sleep(2)
+ if(!step_towards(X, pull))
+ break
/datum/reagent/blob/proc/send_message(var/mob/living/M as mob)
var/totalmessage = message
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index ea2675034e7..a54072e9bbb 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -825,6 +825,35 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob)
..()
return
+/datum/reagent/medicine/stimulative_agent
+ name = "Stimulative Agent"
+ id = "stimulative_agent"
+ description = "An illegal compound that dramatically enhances the body's performance and healing capabilities."
+ color = "#C8A5DC"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 60
+
+/datum/reagent/medicine/stimulative_agent/on_mob_life(mob/living/M)
+ M.status_flags |= GOTTAGOFAST
+ if(M.health < 50 && M.health > 0)
+ M.adjustOxyLoss(-1*REM)
+ M.adjustToxLoss(-1*REM)
+ M.adjustBruteLoss(-1*REM)
+ M.adjustFireLoss(-1*REM)
+ M.AdjustParalysis(-3)
+ M.AdjustStunned(-3)
+ M.AdjustWeakened(-3)
+ M.adjustStaminaLoss(-5*REM)
+ ..()
+
+/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M)
+ if(prob(33))
+ M.adjustStaminaLoss(2.5*REM)
+ M.adjustToxLoss(1*REM)
+ M.losebreath++
+ ..()
+ return
+
datum/reagent/insulin
name = "Insulin"
id = "insulin"
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
index 5c87c0f0044..b2d6edc0995 100644
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ b/code/modules/reagents/newchem/newchem_procs.dm
@@ -96,7 +96,7 @@ datum/reagents/proc/check_ignoreslow(var/mob/M)
datum/reagents/proc/check_gofast(var/mob/M)
if(istype(M, /mob))
- if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola"))
+ if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulative_agent"))
return 1
else
M.status_flags &= ~GOTTAGOFAST
diff --git a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm
new file mode 100644
index 00000000000..6b5656c8dc5
--- /dev/null
+++ b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////////
+/datum/chemical_reaction
+ var/name = null
+ var/id = null
+ var/result = null
+ var/list/required_reagents = list()
+ var/list/required_catalysts = list()
+
+ // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things
+ var/atom/required_container = null // the container required for the reaction to happen
+ var/required_other = 0 // an integer required for the reaction to happen
+
+ var/result_amount = 0
+ var/secondary = 0 // set to nonzero if secondary reaction
+ var/list/secondary_results = list() //additional reagents produced by the reaction
+ var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement
+ var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this).
+ var/mix_message = "The solution begins to bubble."
+ var/mix_sound = 'sound/effects/bubbles.ogg'
+ var/no_message = 0
+
+/datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume)
+ return
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm
new file mode 100644
index 00000000000..d56cdcf5644
--- /dev/null
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm
@@ -0,0 +1,590 @@
+/datum/chemical_reaction/
+
+ hot_coco
+ name = "Hot Coco"
+ id = "hot_coco"
+ result = "hot_coco"
+ required_reagents = list("water" = 5, "coco" = 1)
+ result_amount = 5
+
+ chocolate_milk
+ name = "Chocolate Milk"
+ id = "chocolate_milk"
+ result = "chocolate_milk"
+ required_reagents = list("chocolate" = 1, "milk" = 1)
+ result_amount = 2
+ mix_message = "The mixture turns a nice brown color."
+
+ coffee
+ name = "Coffee"
+ id = "coffee"
+ result = "coffee"
+ required_reagents = list("coffeepowder" = 1, "water" = 5)
+ result_amount = 5
+
+ tea
+ name = "Tea"
+ id = "tea"
+ result = "tea"
+ required_reagents = list("teapowder" = 1, "water" = 5)
+ result_amount = 5
+
+
+
+
+ goldschlager
+ name = "Goldschlager"
+ id = "goldschlager"
+ result = "goldschlager"
+ required_reagents = list("vodka" = 10, "gold" = 1)
+ result_amount = 10
+
+ patron
+ name = "Patron"
+ id = "patron"
+ result = "patron"
+ required_reagents = list("tequilla" = 10, "silver" = 1)
+ result_amount = 10
+
+ bilk
+ name = "Bilk"
+ id = "bilk"
+ result = "bilk"
+ required_reagents = list("milk" = 1, "beer" = 1)
+ result_amount = 2
+
+ icetea
+ name = "Iced Tea"
+ id = "icetea"
+ result = "icetea"
+ required_reagents = list("ice" = 1, "tea" = 3)
+ result_amount = 4
+
+ icecoffee
+ name = "Iced Coffee"
+ id = "icecoffee"
+ result = "icecoffee"
+ required_reagents = list("ice" = 1, "coffee" = 3)
+ result_amount = 4
+
+ nuka_cola
+ name = "Nuka Cola"
+ id = "nuka_cola"
+ result = "nuka_cola"
+ required_reagents = list("uranium" = 1, "cola" = 6)
+ result_amount = 6
+
+ moonshine
+ name = "Moonshine"
+ id = "moonshine"
+ result = "moonshine"
+ required_reagents = list("nutriment" = 10)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 10
+
+ wine
+ name = "Wine"
+ id = "wine"
+ result = "wine"
+ required_reagents = list("berryjuice" = 10)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 10
+
+ spacebeer
+ name = "Space Beer"
+ id = "spacebeer"
+ result = "beer"
+ required_reagents = list("cornoil" = 10)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 10
+
+ vodka
+ name = "Vodka"
+ id = "vodka"
+ result = "vodka"
+ required_reagents = list("potato" = 10)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 10
+ sake
+ name = "Sake"
+ id = "sake"
+ result = "sake"
+ required_reagents = list("rice" = 10,"water" = 5)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 15
+
+ kahlua
+ name = "Kahlua"
+ id = "kahlua"
+ result = "kahlua"
+ required_reagents = list("coffee" = 5, "sugar" = 5, "rum" = 5)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 5
+
+ kahluaVodka
+ name = "KahluaVodka"
+ id = "kahlauVodka"
+ result = "kahlua"
+ required_reagents = list("coffee" = 5, "sugar" = 5, "vodka" = 5)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 5
+ gin_tonic
+ name = "Gin and Tonic"
+ id = "gintonic"
+ result = "gintonic"
+ required_reagents = list("gin" = 2, "tonic" = 1)
+ result_amount = 3
+ mix_message = "The tonic water and gin mix together perfectly."
+
+ cuba_libre
+ name = "Cuba Libre"
+ id = "cubalibre"
+ result = "cubalibre"
+ required_reagents = list("rum" = 2, "cola" = 1)
+ result_amount = 3
+
+ mojito
+ name = "Mojito"
+ id = "mojito"
+ result = "mojito"
+ required_reagents = list("rum" = 1, "sugar" = 1, "limejuice" = 1, "sodawater" = 1)
+ result_amount = 4
+
+ martini
+ name = "Classic Martini"
+ id = "martini"
+ result = "martini"
+ required_reagents = list("gin" = 2, "vermouth" = 1)
+ result_amount = 3
+
+ vodkamartini
+ name = "Vodka Martini"
+ id = "vodkamartini"
+ result = "vodkamartini"
+ required_reagents = list("vodka" = 2, "vermouth" = 1)
+ result_amount = 3
+
+ white_russian
+ name = "White Russian"
+ id = "whiterussian"
+ result = "whiterussian"
+ required_reagents = list("blackrussian" = 3, "cream" = 2)
+ result_amount = 5
+
+ whiskey_cola
+ name = "Whiskey Cola"
+ id = "whiskeycola"
+ result = "whiskeycola"
+ required_reagents = list("whiskey" = 2, "cola" = 1)
+ result_amount = 3
+
+ screwdriver
+ name = "Screwdriver"
+ id = "screwdrivercocktail"
+ result = "screwdrivercocktail"
+ required_reagents = list("vodka" = 2, "orangejuice" = 1)
+ result_amount = 3
+
+ bloody_mary
+ name = "Bloody Mary"
+ id = "bloodymary"
+ result = "bloodymary"
+ required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1)
+ result_amount = 4
+
+ gargle_blaster
+ name = "Pan-Galactic Gargle Blaster"
+ id = "gargleblaster"
+ result = "gargleblaster"
+ required_reagents = list("vodka" = 1, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1)
+ result_amount = 5
+
+ brave_bull
+ name = "Brave Bull"
+ id = "bravebull"
+ result = "bravebull"
+ required_reagents = list("tequilla" = 2, "kahlua" = 1)
+ result_amount = 3
+
+ tequilla_sunrise
+ name = "Tequilla Sunrise"
+ id = "tequillasunrise"
+ result = "tequillasunrise"
+ required_reagents = list("tequilla" = 2, "orangejuice" = 1)
+ result_amount = 3
+
+ toxins_special
+ name = "Toxins Special"
+ id = "toxinsspecial"
+ result = "toxinsspecial"
+ required_reagents = list("rum" = 2, "vermouth" = 1, "plasma" = 2)
+ result_amount = 5
+
+ beepsky_smash
+ name = "Beepksy Smash"
+ id = "beepksysmash"
+ result = "beepskysmash"
+ required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1)
+ result_amount = 4
+
+ doctor_delight
+ name = "The Doctor's Delight"
+ id = "doctordelight"
+ result = "doctorsdelight"
+ required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1)
+ result_amount = 5
+
+ irish_cream
+ name = "Irish Cream"
+ id = "irishcream"
+ result = "irishcream"
+ required_reagents = list("whiskey" = 2, "cream" = 1)
+ result_amount = 3
+
+ manly_dorf
+ name = "The Manly Dorf"
+ id = "manlydorf"
+ result = "manlydorf"
+ required_reagents = list ("beer" = 1, "ale" = 2)
+ result_amount = 3
+
+ suicider
+ name = "Suicider"
+ id = "suicider"
+ result = "suicider"
+ required_reagents = list ("vodka" = 1, "cider" = 1, "fuel" = 1, "epinephrine" = 1)
+ result_amount = 4
+ mix_message = "The drinks and chemicals mix together, emitting a potent smell."
+
+ irish_coffee
+ name = "Irish Coffee"
+ id = "irishcoffee"
+ result = "irishcoffee"
+ required_reagents = list("irishcream" = 1, "coffee" = 1)
+ result_amount = 2
+
+ b52
+ name = "B-52"
+ id = "b52"
+ result = "b52"
+ required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1)
+ result_amount = 3
+
+ atomicbomb
+ name = "Atomic Bomb"
+ id = "atomicbomb"
+ result = "atomicbomb"
+ required_reagents = list("b52" = 10, "uranium" = 1)
+ result_amount = 10
+
+ margarita
+ name = "Margarita"
+ id = "margarita"
+ result = "margarita"
+ required_reagents = list("tequilla" = 2, "limejuice" = 1)
+ result_amount = 3
+
+ longislandicedtea
+ name = "Long Island Iced Tea"
+ id = "longislandicedtea"
+ result = "longislandicedtea"
+ required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1)
+ result_amount = 4
+
+ threemileisland
+ name = "Three Mile Island Iced Tea"
+ id = "threemileisland"
+ result = "threemileisland"
+ required_reagents = list("longislandicedtea" = 10, "uranium" = 1)
+ result_amount = 10
+
+ whiskeysoda
+ name = "Whiskey Soda"
+ id = "whiskeysoda"
+ result = "whiskeysoda"
+ required_reagents = list("whiskey" = 2, "sodawater" = 1)
+ result_amount = 3
+
+ black_russian
+ name = "Black Russian"
+ id = "blackrussian"
+ result = "blackrussian"
+ required_reagents = list("vodka" = 3, "kahlua" = 2)
+ result_amount = 5
+
+ manhattan
+ name = "Manhattan"
+ id = "manhattan"
+ result = "manhattan"
+ required_reagents = list("whiskey" = 2, "vermouth" = 1)
+ result_amount = 3
+
+ manhattan_proj
+ name = "Manhattan Project"
+ id = "manhattan_proj"
+ result = "manhattan_proj"
+ required_reagents = list("manhattan" = 10, "uranium" = 1)
+ result_amount = 10
+
+ vodka_tonic
+ name = "Vodka and Tonic"
+ id = "vodkatonic"
+ result = "vodkatonic"
+ required_reagents = list("vodka" = 2, "tonic" = 1)
+ result_amount = 3
+
+ gin_fizz
+ name = "Gin Fizz"
+ id = "ginfizz"
+ result = "ginfizz"
+ required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1)
+ result_amount = 4
+
+ bahama_mama
+ name = "Bahama mama"
+ id = "bahama_mama"
+ result = "bahama_mama"
+ required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1)
+ result_amount = 6
+
+ singulo
+ name = "Singulo"
+ id = "singulo"
+ result = "singulo"
+ required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5)
+ result_amount = 10
+
+ alliescocktail
+ name = "Allies Cocktail"
+ id = "alliescocktail"
+ result = "alliescocktail"
+ required_reagents = list("martini" = 1, "vodka" = 1)
+ result_amount = 2
+
+ demonsblood
+ name = "Demons Blood"
+ id = "demonsblood"
+ result = "demonsblood"
+ required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1)
+ result_amount = 4
+
+ booger
+ name = "Booger"
+ id = "booger"
+ result = "booger"
+ required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1)
+ result_amount = 4
+
+ antifreeze
+ name = "Anti-freeze"
+ id = "antifreeze"
+ result = "antifreeze"
+ required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1)
+ result_amount = 4
+
+ barefoot
+ name = "Barefoot"
+ id = "barefoot"
+ result = "barefoot"
+ required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1)
+ result_amount = 3
+
+
+////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri/////
+
+ sbiten
+ name = "Sbiten"
+ id = "sbiten"
+ result = "sbiten"
+ required_reagents = list("vodka" = 10, "capsaicin" = 1)
+ result_amount = 10
+
+ red_mead
+ name = "Red Mead"
+ id = "red_mead"
+ result = "red_mead"
+ required_reagents = list("blood" = 1, "mead" = 1)
+ result_amount = 2
+
+ mead
+ name = "Mead"
+ id = "mead"
+ result = "mead"
+ required_reagents = list("sugar" = 1, "water" = 1)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 2
+
+ iced_beer
+ name = "Iced Beer"
+ id = "iced_beer"
+ result = "iced_beer"
+ required_reagents = list("beer" = 10, "frostoil" = 1)
+ result_amount = 10
+
+ iced_beer2
+ name = "Iced Beer"
+ id = "iced_beer"
+ result = "iced_beer"
+ required_reagents = list("beer" = 5, "ice" = 1)
+ result_amount = 6
+
+ grog
+ name = "Grog"
+ id = "grog"
+ result = "grog"
+ required_reagents = list("rum" = 1, "water" = 1)
+ result_amount = 2
+
+ soy_latte
+ name = "Soy Latte"
+ id = "soy_latte"
+ result = "soy_latte"
+ required_reagents = list("coffee" = 1, "soymilk" = 1)
+ result_amount = 2
+
+ cafe_latte
+ name = "Cafe Latte"
+ id = "cafe_latte"
+ result = "cafe_latte"
+ required_reagents = list("coffee" = 1, "milk" = 1)
+ result_amount = 2
+
+ acidspit
+ name = "Acid Spit"
+ id = "acidspit"
+ result = "acidspit"
+ required_reagents = list("sacid" = 1, "wine" = 5)
+ result_amount = 6
+
+ amasec
+ name = "Amasec"
+ id = "amasec"
+ result = "amasec"
+ required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5)
+ result_amount = 10
+
+ changelingsting
+ name = "Changeling Sting"
+ id = "changelingsting"
+ result = "changelingsting"
+ required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1)
+ result_amount = 5
+
+ aloe
+ name = "Aloe"
+ id = "aloe"
+ result = "aloe"
+ required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1)
+ result_amount = 2
+
+ andalusia
+ name = "Andalusia"
+ id = "andalusia"
+ result = "andalusia"
+ required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1)
+ result_amount = 3
+
+ neurotoxin
+ name = "Neurotoxin"
+ id = "neurotoxin"
+ result = "neurotoxin"
+ required_reagents = list("gargleblaster" = 1, "ether" = 1)
+ result_amount = 2
+
+ snowwhite
+ name = "Snow White"
+ id = "snowwhite"
+ result = "snowwhite"
+ required_reagents = list("beer" = 1, "lemon_lime" = 1)
+ result_amount = 2
+
+ irishcarbomb
+ name = "Irish Car Bomb"
+ id = "irishcarbomb"
+ result = "irishcarbomb"
+ required_reagents = list("ale" = 1, "irishcream" = 1)
+ result_amount = 2
+
+ syndicatebomb
+ name = "Syndicate Bomb"
+ id = "syndicatebomb"
+ result = "syndicatebomb"
+ required_reagents = list("beer" = 1, "whiskeycola" = 1)
+ result_amount = 2
+
+ erikasurprise
+ name = "Erika Surprise"
+ id = "erikasurprise"
+ result = "erikasurprise"
+ required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1)
+ result_amount = 5
+
+ devilskiss
+ name = "Devils Kiss"
+ id = "devilskiss"
+ result = "devilskiss"
+ required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1)
+ result_amount = 3
+
+ hippiesdelight
+ name = "Hippies Delight"
+ id = "hippiesdelight"
+ result = "hippiesdelight"
+ required_reagents = list("psilocybin" = 1, "gargleblaster" = 1)
+ result_amount = 2
+
+ bananahonk
+ name = "Banana Honk"
+ id = "bananahonk"
+ result = "bananahonk"
+ required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1)
+ result_amount = 3
+
+ silencer
+ name = "Silencer"
+ id = "silencer"
+ result = "silencer"
+ required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1)
+ result_amount = 3
+
+ driestmartini
+ name = "Driest Martini"
+ id = "driestmartini"
+ result = "driestmartini"
+ required_reagents = list("nothing" = 1, "gin" = 1)
+ result_amount = 2
+
+ lemonade
+ name = "Lemonade"
+ id = "lemonade"
+ result = "lemonade"
+ required_reagents = list("lemonjuice" = 1, "sugar" = 1, "water" = 1)
+ result_amount = 3
+
+ kiraspecial
+ name = "Kira Special"
+ id = "kiraspecial"
+ result = "kiraspecial"
+ required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1)
+ result_amount = 2
+
+ brownstar
+ name = "Brown Star"
+ id = "brownstar"
+ result = "brownstar"
+ required_reagents = list("orangejuice" = 2, "cola" = 1)
+ result_amount = 2
+
+ milkshake
+ name = "Milkshake"
+ id = "milkshake"
+ result = "milkshake"
+ required_reagents = list("cream" = 1, "ice" = 2, "milk" = 2)
+ result_amount = 5
+
+ rewriter
+ name = "Rewriter"
+ id = "rewriter"
+ result = "rewriter"
+ required_reagents = list("spacemountainwind" = 1, "coffee" = 1)
+ result_amount = 2
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm
new file mode 100644
index 00000000000..146dc1da95c
--- /dev/null
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm
@@ -0,0 +1,108 @@
+/datum/chemical_reaction/
+
+ tofu
+ name = "Tofu"
+ id = "tofu"
+ result = null
+ required_reagents = list("soymilk" = 10)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/tofu(location)
+ return
+
+ chocolate_bar
+ name = "Chocolate Bar"
+ id = "chocolate_bar"
+ result = null
+ required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2)
+ result_amount = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
+ return
+
+ chocolate_bar2
+ name = "Chocolate Bar"
+ id = "chocolate_bar"
+ result = null
+ required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2)
+ result_amount = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
+ return
+
+
+ soysauce
+ name = "Soy Sauce"
+ id = "soysauce"
+ result = "soysauce"
+ required_reagents = list("soymilk" = 2, "flour" = 1, "sodiumchloride" = 1, "water" = 3)
+ result_amount = 7
+
+ cheesewheel
+ name = "Cheesewheel"
+ id = "cheesewheel"
+ result = null
+ required_reagents = list("milk" = 40)
+ required_catalysts = list("enzyme" = 5)
+ result_amount = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location)
+ return
+
+ syntiflesh
+ name = "Syntiflesh"
+ id = "syntiflesh"
+ result = null
+ required_reagents = list("blood" = 5, "cryoxadone" = 1)
+ result_amount = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location)
+ return
+
+ hot_ramen
+ name = "Hot Ramen"
+ id = "hot_ramen"
+ result = "hot_ramen"
+ required_reagents = list("water" = 1, "dry_ramen" = 3)
+ result_amount = 3
+
+ hell_ramen
+ name = "Hell Ramen"
+ id = "hell_ramen"
+ result = "hell_ramen"
+ required_reagents = list("capsaicin" = 1, "hot_ramen" = 6)
+ result_amount = 6
+
+ doughball
+ name = "Ball of dough"
+ id = "dough_ball"
+ result = "dough_ball"
+ required_reagents = list("flour" = 15, "water" = 5)
+ required_catalysts = list("enzyme" = 5)
+
+ sodiumchloride
+ name = "Sodium Chloride"
+ id = "sodiumchloride"
+ result = "sodiumchloride"
+ required_reagents = list("sodium" = 1, "chlorine" = 1, "water" = 1)
+ result_amount = 3
+ mix_message = "The solution crystallizes with a brief flare of light."
+
+ ice
+ name = "Ice"
+ id = "ice"
+ result = "ice"
+ required_reagents = list("water" = 1)
+ result_amount = 1
+ max_temp = 273
+ mix_message = "Ice forms as the water freezes."
+ mix_sound = null
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm
new file mode 100644
index 00000000000..4ec4c1bb9e4
--- /dev/null
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm
@@ -0,0 +1,76 @@
+//Anything for harm or hostile intents go here (explosions, EMPs, thermite, mutagen)
+/datum/chemical_reaction
+
+ explosion_potassium
+ name = "Explosion"
+ id = "explosion_potassium"
+ result = null
+ required_reagents = list("water" = 1, "potassium" = 1)
+ result_amount = 2
+ mix_message = "The mixture explodes!"
+
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/datum/effect/effect/system/reagents_explosion/e = new()
+ e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0)
+ e.start()
+ holder.clear_reagents()
+ return
+
+ emp_pulse
+ name = "EMP Pulse"
+ id = "emp_pulse"
+ result = null
+ required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
+ result_amount = 2
+
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
+ // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
+ empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
+ holder.clear_reagents()
+ return
+
+ mutagen
+ name = "Unstable mutagen"
+ id = "mutagen"
+ result = "mutagen"
+ required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1)
+ result_amount = 3
+ mix_message = "The substance turns neon green and bubbles unnervingly."
+
+ thermite
+ name = "Thermite"
+ id = "thermite"
+ result = "thermite"
+ required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
+ result_amount = 3
+
+ glycerol
+ name = "Glycerol"
+ id = "glycerol"
+ result = "glycerol"
+ required_reagents = list("cornoil" = 3, "sacid" = 1)
+ result_amount = 1
+
+ nitroglycerin
+ name = "Nitroglycerin"
+ id = "nitroglycerin"
+ result = "nitroglycerin"
+ required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1)
+ result_amount = 2
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/datum/effect/effect/system/reagents_explosion/e = new()
+ e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0)
+ e.start()
+
+ holder.clear_reagents()
+ return
+
+ condensedcapsaicin
+ name = "Condensed Capsaicin"
+ id = "condensedcapsaicin"
+ result = "condensedcapsaicin"
+ required_reagents = list("capsaicin" = 2)
+ required_catalysts = list("plasma" = 5)
+ result_amount = 1
\ 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
new file mode 100644
index 00000000000..02e1f4a65cd
--- /dev/null
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm
@@ -0,0 +1,98 @@
+/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
+ name = "mitocholide"
+ id = "mitocholide"
+ result = "mitocholide"
+ required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1)
+ result_amount = 3
+
+ cryoxadone
+ name = "Cryoxadone"
+ id = "cryoxadone"
+ result = "cryoxadone"
+ required_reagents = list("cryostylane" = 1, "plasma" = 1, "acetone" = 1, "mutagen" = 1)
+ result_amount = 4
+ mix_message = "The solution bubbles softly."
+
+ spaceacillin
+ name = "Spaceacillin"
+ id = "spaceacillin"
+ result = "spaceacillin"
+ required_reagents = list("fungus" = 1, "ethanol" = 1)
+ result_amount = 2
+ mix_message = "The solvent extracts an antibiotic compound from the fungus."
+
+ audioline
+ name = "Audioline"
+ id = "audioline"
+ result = "audioline"
+ required_reagents = list("spaceacillin" = 1, "salglu_solution" = 1, "epinephrine" = 1)
+ result_amount = 3
+
+ 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
+ name = "Sterilizine"
+ id = "sterilizine"
+ result = "sterilizine"
+ required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1)
+ result_amount = 3
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm
new file mode 100644
index 00000000000..f884ef6cb63
--- /dev/null
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm
@@ -0,0 +1,199 @@
+/datum/chemical_reaction/
+// foam and foam precursor
+
+ surfactant
+ name = "Foam surfactant"
+ id = "foam surfactant"
+ result = "fluorosurfactant"
+ required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
+ result_amount = 5
+ mix_message = "A head of foam results from the mixture's constant fizzing."
+
+
+ foam
+ name = "Foam"
+ id = "foam"
+ result = null
+ required_reagents = list("fluorosurfactant" = 1, "water" = 1)
+ result_amount = 2
+
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+
+
+ var/location = get_turf(holder.my_atom)
+ for(var/mob/M in viewers(5, location))
+ M << "\red The solution violently bubbles!"
+
+ location = get_turf(holder.my_atom)
+
+ for(var/mob/M in viewers(5, location))
+ M << "\red The solution spews out foam!"
+
+ //world << "Holder volume is [holder.total_volume]"
+ //for(var/datum/reagent/R in holder.reagent_list)
+ // world << "[R.name] = [R.volume]"
+
+ var/datum/effect/effect/system/foam_spread/s = new()
+ s.set_up(created_volume, location, holder, 0)
+ s.start()
+ holder.clear_reagents()
+ return
+
+ metalfoam
+ name = "Metal Foam"
+ id = "metalfoam"
+ result = null
+ required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1)
+ result_amount = 5
+
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+
+
+ var/location = get_turf(holder.my_atom)
+
+ for(var/mob/M in viewers(5, location))
+ M << "\red The solution spews out a metalic foam!"
+
+ var/datum/effect/effect/system/foam_spread/s = new()
+ s.set_up(created_volume, location, holder, 1)
+ s.start()
+ return
+
+ ironfoam
+ name = "Iron Foam"
+ id = "ironlfoam"
+ result = null
+ required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1)
+ result_amount = 5
+
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+
+
+ var/location = get_turf(holder.my_atom)
+
+ for(var/mob/M in viewers(5, location))
+ M << "\red The solution spews out a metalic foam!"
+
+ var/datum/effect/effect/system/foam_spread/s = new()
+ s.set_up(created_volume, location, holder, 2)
+ s.start()
+ return
+
+ // Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game!
+ ammonia
+ name = "Ammonia"
+ id = "ammonia"
+ result = "ammonia"
+ required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
+ result_amount = 3
+ mix_message = "The mixture bubbles, emitting an acrid reek."
+
+ diethylamine
+ name = "Diethylamine"
+ id = "diethylamine"
+ result = "diethylamine"
+ required_reagents = list ("ammonia" = 1, "ethanol" = 1)
+ result_amount = 2
+ min_temp = 374
+ mix_message = "A horrible smell pours forth from the mixture."
+
+ space_cleaner
+ name = "Space cleaner"
+ id = "cleaner"
+ result = "cleaner"
+ required_reagents = list("ammonia" = 1, "water" = 1, "ethanol" = 1)
+ result_amount = 3
+ mix_message = "Ick, this stuff really stinks. Sure does make the container sparkle though!"
+
+ sulfuric_acid
+ name = "Sulfuric Acid"
+ id = "sacid"
+ result = "sacid"
+ required_reagents = list("sulfur" = 1, "oxygen" = 1, "hydrogen" = 1)
+ result_amount = 2
+ mix_message = "The mixture gives off a sharp acidic tang."
+
+///////Changeling Blood Test/////////////
+/*
+ changeling_test
+ name = "Changeling blood test"
+ id = "changelingblood"
+ result = "blood"
+ required_reagents = list("blood" = 5)
+ required_catalysts = list("fuel")
+ result_amount = 1 //Needs this in order to check the donor, as the data var in the reacted blood gets transferred.
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ if(!holder.reagent_list) //reagent_list is not null
+ return
+ var/datum/reagent/blood/B = locate() in holder.reagent_list
+ if(!B) //B is not null
+ return
+ var/mob/living/carbon/human/H = B.data["donor"]
+ if(!H) //H is not null.
+ return
+ if(H.mind && H.mind.changeling) //Checks if H, the blood donor is a ling.
+ for(var/mob/M in viewers(get_turf(holder.my_atom), null))
+ M.show_message( "The blood writhes and wriggles and sizzles away from the container!", 1, "You hear bubbling and sizzling.", 2)
+ else
+ for(var/mob/M in viewers(get_turf(holder.my_atom), null))
+ M.show_message( "The blood seems to break apart in the fuel.", 1)
+ holder.del_reagent("blood")
+ return
+*/
+
+ plastication
+ name = "Plastic"
+ id = "solidplastic"
+ result = null
+ required_reagents = list("facid" = 10, "plasticide" = 20)
+ result_amount = 1
+ on_reaction(var/datum/reagents/holder)
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic
+ M.amount = 10
+ M.loc = get_turf(holder.my_atom)
+ return
+
+
+
+//Not really misc chems, but not enough to deserve their own file
+/*
+ silicate
+ name = "Silicate"
+ id = "silicate"
+ result = "silicate"
+ required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1)
+ result_amount = 3
+*/
+
+ space_drugs
+ name = "Space Drugs"
+ id = "space_drugs"
+ result = "space_drugs"
+ required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1)
+ result_amount = 3
+ mix_message = "Slightly dizzying fumes drift from the solution."
+
+ lube
+ name = "Space Lube"
+ id = "lube"
+ result = "lube"
+ required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1)
+ result_amount = 3
+ mix_message = "The substance turns a striking cyan and becomes oily."
+
+ holy_water
+ name = "Holy Water"
+ id = "holywater"
+ result = "holywater"
+ required_reagents = list("water" = 1, "mercury" = 1, "wine" = 1)
+ result_amount = 3
+ mix_message = "The water somehow seems purified. Or maybe defiled."
+
+
+ lsd
+ name = "Lysergic acid diethylamide"
+ id = "lsd"
+ result = "lsd"
+ required_reagents = list("diethylamine" = 1, "fungus" = 1)
+ result_amount = 3
+ mix_message = "The mixture turns a rather unassuming color and settles."
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
new file mode 100644
index 00000000000..a1d8b033672
--- /dev/null
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
@@ -0,0 +1,487 @@
+/////////////////////////////////////////////NEW SLIME CORE REACTIONS/////////////////////////////////////////////
+
+//Grey
+/datum/chemical_reaction/
+
+ slimespawn
+ name = "Slime Spawn"
+ id = "m_spawn"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/grey
+ required_other = 1
+
+ on_reaction(var/datum/reagents/holder)
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("\red Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1)
+ var/mob/living/carbon/slime/S = new /mob/living/carbon/slime
+ S.loc = get_turf(holder.my_atom)
+
+
+ slimeinaprov
+ name = "Slime Epinephrine"
+ id = "m_epinephrine"
+ result = "epinephrine"
+ required_reagents = list("water" = 5)
+ result_amount = 3
+ required_other = 1
+ required_container = /obj/item/slime_extract/grey
+
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+
+ slimemonkey
+ name = "Slime Monkey"
+ id = "m_monkey"
+ result = null
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/grey
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ for(var/i = 1, i <= 3, i++)
+ var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube
+ M.loc = get_turf(holder.my_atom)
+
+//Green
+ slimemutate
+ name = "Mutation Toxin"
+ id = "mutationtoxin"
+ result = "mutationtoxin"
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_other = 1
+ required_container = /obj/item/slime_extract/green
+
+//Metal
+ slimemetal
+ name = "Slime Metal"
+ id = "m_metal"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/metal
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
+ M.amount = 15
+ M.loc = get_turf(holder.my_atom)
+ var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
+ P.amount = 5
+ P.loc = get_turf(holder.my_atom)
+
+//Gold
+ slimecrit
+ name = "Slime Crit"
+ id = "m_tele"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/gold
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+
+ var/blocked = blocked_mobs //global variable of blocked mobs
+
+ var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
+ if(M:eyecheck() <= 0)
+ flick("e_flash", M.flash)
+
+ for(var/i = 1, i <= 5, i++)
+ var/chosen = pick(critters)
+ var/mob/living/simple_animal/hostile/C = new chosen
+ C.faction |= "slimesummon"
+ C.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+// for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+// O.show_message(text("\red The slime core fizzles disappointingly,"), 1)
+
+
+ slimecritlesser
+ name = "Slime Crit Lesser"
+ id = "m_tele3"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/gold
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The slime extract begins to vibrate violently!"), 1)
+ spawn(50)
+
+ if(holder && holder.my_atom)
+
+ var/blocked = blocked_mobs
+
+ var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
+ if(M:eyecheck() <= 0)
+ flick("e_flash", M.flash)
+
+ var/chosen = pick(critters)
+ var/mob/living/simple_animal/hostile/C = new chosen
+ C.faction |= "neutral"
+ C.loc = get_turf(holder.my_atom)
+
+//Silver
+ slimebork
+ name = "Slime Bork"
+ id = "m_tele2"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/silver
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+
+ var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
+ // BORK BORK BORK
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
+ if(M:eyecheck() <= 0)
+ flick("e_flash", M.flash)
+
+ for(var/i = 1, i <= 4 + rand(1,2), i++)
+ var/chosen = pick(borks)
+ var/obj/B = new chosen
+ if(B)
+ B.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
+ slimedrinks
+ name = "Slime Drinks"
+ id = "m_tele3"
+ result = null
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/silver
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+
+ var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
+ // BORK BORK BORK
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
+ if(M:eyecheck() <= 0)
+ flick("e_flash", M.flash)
+
+ for(var/i = 1, i <= 4 + rand(1,2), i++)
+ var/chosen = pick(borks)
+ var/obj/B = new chosen
+ if(B)
+ B.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
+
+
+//Blue
+ slimefrost
+ name = "Slime Frost Oil"
+ id = "m_frostoil"
+ result = "frostoil"
+ required_reagents = list("plasma" = 5)
+ result_amount = 10
+ required_container = /obj/item/slime_extract/blue
+ required_other = 1
+//Dark Blue
+ slimefreeze
+ name = "Slime Freeze"
+ id = "m_freeze"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/darkblue
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("\red The slime extract begins to vibrate violently !"), 1)
+ sleep(50)
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+ for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
+ M.bodytemperature -= 140
+ M << "\blue You feel a chill!"
+
+//Orange
+ slimecasp
+ name = "Slime Capsaicin Oil"
+ id = "m_capsaicinoil"
+ result = "capsaicin"
+ required_reagents = list("blood" = 5)
+ result_amount = 10
+ required_container = /obj/item/slime_extract/orange
+ required_other = 1
+
+ slimefire
+ name = "Slime fire"
+ id = "m_fire"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/orange
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("\red The slime extract begins to vibrate violently !"), 1)
+ sleep(50)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(istype(T))
+ T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50)
+
+//Yellow
+ slimeoverload
+ name = "Slime EMP"
+ id = "m_emp"
+ result = null
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/yellow
+ required_other = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ empulse(get_turf(holder.my_atom), 3, 7)
+
+
+ slimecell
+ name = "Slime Powercell"
+ id = "m_cell"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/yellow
+ required_other = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/obj/item/weapon/stock_parts/cell/slime/P = new /obj/item/weapon/stock_parts/cell/slime
+ P.loc = get_turf(holder.my_atom)
+
+ slimeglow
+ name = "Slime Glow"
+ id = "m_glow"
+ result = null
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/yellow
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("\red The contents of the slime core harden and begin to emit a warm, bright light."), 1)
+ var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
+ F.loc = get_turf(holder.my_atom)
+
+//Purple
+
+ slimepsteroid
+ name = "Slime Steroid"
+ id = "m_steroid"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/purple
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid
+ P.loc = get_turf(holder.my_atom)
+
+
+
+ slimejam
+ name = "Slime Jam"
+ id = "m_jam"
+ result = "slimejelly"
+ required_reagents = list("sugar" = 5)
+ result_amount = 10
+ required_container = /obj/item/slime_extract/purple
+ required_other = 1
+
+
+//Dark Purple
+ slimeplasma
+ name = "Slime Plasma"
+ id = "m_plasma"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/darkpurple
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma
+ P.amount = 10
+ P.loc = get_turf(holder.my_atom)
+
+//Red
+ slimeglycerol
+ name = "Slime Glycerol"
+ id = "m_glycerol"
+ result = "glycerol"
+ required_reagents = list("plasma" = 5)
+ result_amount = 8
+ required_container = /obj/item/slime_extract/red
+ required_other = 1
+
+
+ slimebloodlust
+ name = "Bloodlust"
+ id = "m_bloodlust"
+ result = null
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/red
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null))
+ slime.rabid = 1
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("\red The [slime] is driven into a frenzy!."), 1)
+
+//Pink
+ slimeppotion
+ name = "Slime Potion"
+ id = "m_potion"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/pink
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion
+ P.loc = get_turf(holder.my_atom)
+
+
+//Black
+ slimemutate2
+ name = "Advanced Mutation Toxin"
+ id = "mutationtoxin2"
+ result = "amutationtoxin"
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_other = 1
+ required_container = /obj/item/slime_extract/black
+
+//Oil
+ slimeexplosion
+ name = "Slime Explosion"
+ id = "m_explosion"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/oil
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("\red The slime extract begins to vibrate violently !"), 1)
+ sleep(50)
+ explosion(get_turf(holder.my_atom), 1 ,3, 6)
+//Light Pink
+ slimepotion2
+ name = "Slime Potion 2"
+ id = "m_potion2"
+ result = null
+ result_amount = 1
+ required_container = /obj/item/slime_extract/lightpink
+ required_reagents = list("plasma" = 5)
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ var/obj/item/weapon/slimepotion2/P = new /obj/item/weapon/slimepotion2
+ P.loc = get_turf(holder.my_atom)
+//Adamantine
+ slimegolem
+ name = "Slime Golem"
+ id = "m_golem"
+ result = null
+ required_reagents = list("plasma" = 5)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/adamantine
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/effect/goleRUNe/Z = new /obj/effect/goleRUNe
+ Z.loc = get_turf(holder.my_atom)
+ Z.announce_to_ghosts()
+//Bluespace
+ slimecrystal
+ name = "Slime Crystal"
+ id = "m_crystal"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/bluespace
+ required_other = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ if(holder.my_atom)
+ var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom))
+ BC.visible_message("The [BC.name] appears out of thin air!")
+//Cerulean
+ slimepsteroid2
+ name = "Slime Steroid 2"
+ id = "m_steroid2"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/cerulean
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2
+ P.loc = get_turf(holder.my_atom)
+//Sepia
+ slimecamera
+ name = "Slime Camera"
+ id = "m_camera"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/sepia
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/device/camera/P = new /obj/item/device/camera
+ P.loc = get_turf(holder.my_atom)
+
+
+ slimefilm
+ name = "Slime Film"
+ id = "m_film"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/sepia
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
+ P.loc = get_turf(holder.my_atom)
+//Pyrite
+ slimepaint
+ name = "Slime Paint"
+ id = "s_paint"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/pyrite
+ required_other = 1
+ on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/list/paints = subtypesof(/obj/item/weapon/reagent_containers/glass/paint)
+ var/chosen = pick(paints)
+ var/obj/P = new chosen
+ if(P)
+ P.loc = get_turf(holder.my_atom)
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/__oldchem_defines.dm b/code/modules/reagents/oldchem/reagents/__oldchem_defines.dm
new file mode 100644
index 00000000000..815c1208dd9
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/__oldchem_defines.dm
@@ -0,0 +1,5 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+#define FOOD_METABOLISM 0.4
+#define REM REAGENTS_EFFECT_MULTIPLIER
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm
new file mode 100644
index 00000000000..2b2a94ee149
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm
@@ -0,0 +1,82 @@
+/datum/reagent
+ var/name = "Reagent"
+ var/id = "reagent"
+ var/description = ""
+ var/datum/reagents/holder = null
+ var/reagent_state = SOLID
+ var/list/data = null
+ var/volume = 0
+ var/nutriment_factor = 0
+ var/metabolization_rate = REAGENTS_METABOLISM
+ //var/list/viruses = list()
+ var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
+ var/shock_reduction = 0
+ var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin
+ //Processing flags, defines the type of mobs the reagent will affect
+ //By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths
+ var/process_flags = ORGANIC
+
+
+/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
+ if(!istype(M, /mob/living)) return 0
+ var/datum/reagent/self = src
+ src = null
+
+ if(self.holder) //for catching rare runtimes
+ if(method == TOUCH && self.penetrates_skin)
+ var/block = 0
+ for(var/obj/item/clothing/C in M.get_equipped_items())
+ if(istype(C, /obj/item/clothing/suit/bio_suit))
+ block += 1
+ if(istype(C, /obj/item/clothing/head/bio_hood))
+ block += 1
+ if(block < 2)
+ if(M.reagents)
+ M.reagents.add_reagent(self.id,self.volume)
+
+/*
+ if(method == INGEST && istype(M, /mob/living/carbon))
+ if(prob(1 * self.addictiveness))
+ if(prob(5 * volume))
+ var/datum/disease/addiction/A = new /datum/disease/addiction
+ A.addicted_to = self
+ A.name = "[self.name] Addiction"
+ A.addiction ="[self.name]"
+ A.cure = self.id
+ M.viruses += A
+ A.affected_mob = M
+ A.holder = M
+*/
+ return 1
+
+/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object
+ src = null //if it can hold reagents. nope!
+ //if(O.reagents)
+ // O.reagents.add_reagent(id,volume/3)
+ return
+
+/datum/reagent/proc/reaction_turf(var/turf/T, var/volume)
+ src = null
+ return
+
+/datum/reagent/proc/on_mob_life(var/mob/living/M as mob, var/alien)
+ if(!istype(M, /mob/living)) // YOU'RE A FUCKING RETARD NEO WHY CAN'T YOU JUST FIX THE PROBLEM ON THE REAGENT - Iamgoofball
+ return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO
+ // Certain elements in too large amounts cause side-effects
+ holder.remove_reagent(src.id, metabolization_rate) //By default it slowly disappears.
+ current_cycle++
+ return
+
+// Called when two reagents of the same are mixing.
+/datum/reagent/proc/on_merge(var/data)
+ return
+
+/datum/reagent/proc/on_move(var/mob/M)
+ return
+
+/datum/reagent/proc/on_update(var/atom/A)
+ return
+
+/datum/reagent/Destroy()
+ holder = null
+ return ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
new file mode 100644
index 00000000000..b07cd8355e3
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
@@ -0,0 +1,748 @@
+//ALCOHOL WOO
+/datum/reagent/ethanol
+ name = "Ethanol" //Parent class for all alcoholic reagents.
+ id = "ethanol"
+ description = "A well-known alcohol with a variety of applications."
+ reagent_state = LIQUID
+ nutriment_factor = 0 //So alcohol can fill you up! If they want to.
+ color = "#404030" // rgb: 64, 64, 48
+ var/datum/martial_art/drunk_brawling/F = new
+ var/dizzy_adj = 3
+ var/slurr_adj = 3
+ var/confused_adj = 2
+ var/slur_start = 65 //amount absorbed after which mob starts slurring
+ var/brawl_start = 75 //amount absorbed after which mob switches to drunken brawling as a fighting style
+ var/confused_start = 130 //amount absorbed after which mob starts confusing directions
+ var/vomit_start = 180 //amount absorbed after which mob starts vomitting
+ var/blur_start = 260 //amount absorbed after which mob starts getting blurred vision
+ var/pass_out = 325 //amount absorbed after which mob starts passing out
+
+/datum/reagent/ethanol/on_mob_life(var/mob/living/M as mob, var/alien)
+ // Sobering multiplier.
+ // Sober block makes it more difficult to get drunk
+ var/sober_str=!(SOBER in M.mutations)?1:2
+ M:nutrition += nutriment_factor
+ holder.remove_reagent(src.id, FOOD_METABOLISM)
+ if(!src.data) data = 1
+ src.data++
+
+ var/d = data
+
+ // make all the beverages work together
+ for(var/datum/reagent/ethanol/A in holder.reagent_list)
+ if(isnum(A.data)) d += A.data
+
+ d/=sober_str
+
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly.
+ d*=5
+
+ M.dizziness += dizzy_adj.
+ if(d >= slur_start && d < pass_out)
+ if (!M:slurring) M:slurring = 1
+ M:slurring += slurr_adj/sober_str
+ if(d >= brawl_start && ishuman(M))
+ var/mob/living/carbon/human/H = M
+ F.teach(H,1)
+ if(src.volume < 3)
+ if(H.martial_art == F)
+ F.remove(H)
+ if(d >= confused_start && prob(33))
+ if (!M:confused) M:confused = 1
+ M.confused = max(M:confused+(confused_adj/sober_str),0)
+ if(d >= blur_start)
+ M.eye_blurry = max(M.eye_blurry, 10/sober_str)
+ M:drowsyness = max(M:drowsyness, 0)
+ if(d >= vomit_start)
+ if(prob(8))
+ M.fakevomit()
+ if(d >= pass_out)
+ M:paralysis = max(M:paralysis, 20/sober_str)
+ M:drowsyness = max(M:drowsyness, 30/sober_str)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"]
+ if (istype(L))
+ L.take_damage(0.1, 1)
+ H.adjustToxLoss(0.1)
+ holder.remove_reagent(src.id, 0.4)
+ ..()
+ return
+
+/datum/reagent/ethanol/reaction_obj(var/obj/O, var/volume)
+ if(istype(O,/obj/item/weapon/paper))
+ var/obj/item/weapon/paper/paperaffected = O
+ paperaffected.clearpaper()
+ usr << "The solution melts away the ink on the paper."
+ if(istype(O,/obj/item/weapon/book))
+ if(volume >= 5)
+ var/obj/item/weapon/book/affectedbook = O
+ affectedbook.dat = null
+ usr << "The solution melts away the ink on the book."
+ else
+ usr << "It wasn't enough..."
+ return
+
+/datum/reagent/ethanol/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel.
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 15)
+ return
+
+
+/datum/reagent/ethanol/beer //It's really much more stronger than other drinks.
+ name = "Beer"
+ id = "beer"
+ description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
+ nutriment_factor = 2 * FOOD_METABOLISM
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/beer/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M:jitteriness = max(M:jitteriness-3,0)
+ return
+
+/datum/reagent/ethanol/cider
+ name = "Cider"
+ id = "cider"
+ description = "An alcoholic beverage derived from apples."
+ color = "#174116"
+
+/datum/reagent/ethanol/whiskey
+ name = "Whiskey"
+ id = "whiskey"
+ description = "A superb and well-aged single-malt whiskey. Damn."
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+
+/datum/reagent/ethanol/specialwhiskey
+ name = "Special Blend Whiskey"
+ id = "specialwhiskey"
+ description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
+ color = "#664300" // rgb: 102, 67, 0
+ slur_start = 30 //amount absorbed after which mob starts slurring
+ brawl_start = 40
+
+/datum/reagent/ethanol/gin
+ name = "Gin"
+ id = "gin"
+ description = "It's gin. In space. I say, good sir."
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 3
+
+/datum/reagent/ethanol/absinthe
+ name = "Absinthe"
+ id = "absinthe"
+ description = "Watch out that the Green Fairy doesn't come for you!"
+ color = "#33EE00" // rgb: lots, ??, ??
+ overdose_threshold = 30
+ dizzy_adj = 5
+ slur_start = 25
+ brawl_start = 40
+ confused_start = 100
+
+//copy paste from LSD... shoot me
+/datum/reagent/ethanol/absinthe/on_mob_life(var/mob/M)
+ if(!M) M = holder.my_atom
+ if(!data) data = 1
+ data++
+ M:hallucination += 5
+ if(volume > overdose_threshold)
+ M:adjustToxLoss(1)
+ ..()
+ return
+
+/datum/reagent/ethanol/rum
+ name = "Rum"
+ id = "rum"
+ description = "Popular with the sailors. Not very popular with everyone else."
+ color = "#664300" // rgb: 102, 67, 0
+ overdose_threshold = 30
+
+/datum/reagent/ethanol/rum/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.dizziness +=5
+ if(volume > overdose_threshold)
+ M:adjustToxLoss(1)
+ return
+
+/datum/reagent/ethanol/mojito
+ name = "Mojito"
+ id = "mojito"
+ description = "If it's good enough for Spesscuba, it's good enough for you."
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/vodka
+ name = "Vodka"
+ id = "vodka"
+ description = "Number one drink AND fueling choice for Russians worldwide."
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/sake
+ name = "Sake"
+ id = "sake"
+ description = "Anime's favorite drink."
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/tequilla
+ name = "Tequila"
+ id = "tequilla"
+ description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?"
+ color = "#A8B0B7" // rgb: 168, 176, 183
+
+/datum/reagent/ethanol/vermouth
+ name = "Vermouth"
+ id = "vermouth"
+ description = "You suddenly feel a craving for a martini..."
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/wine
+ name = "Wine"
+ id = "wine"
+ description = "An premium alchoholic beverage made from distilled grape juice."
+ color = "#7E4043" // rgb: 126, 64, 67
+ dizzy_adj = 2
+ slur_start = 65 //amount absorbed after which mob starts slurring
+ confused_start = 145 //amount absorbed after which mob starts confusing directions
+
+/datum/reagent/ethanol/cognac
+ name = "Cognac"
+ id = "cognac"
+ description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ confused_start = 115 //amount absorbed after which mob starts confusing directions
+
+/datum/reagent/ethanol/suicider //otherwise known as "I want to get so smashed my liver gives out and I die from alcohol poisoning".
+ name = "Suicider"
+ id = "suicider"
+ description = "An unbelievably strong and potent variety of Cider."
+ color = "#CF3811"
+ dizzy_adj = 20
+ slurr_adj = 20
+ confused_adj = 3
+ slur_start = 15
+ brawl_start = 25
+ confused_start = 40
+ blur_start = 60
+ pass_out = 80
+
+/datum/reagent/ethanol/ale
+ name = "Ale"
+ id = "ale"
+ description = "A dark alchoholic beverage made by malted barley and yeast."
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/thirteenloko
+ name = "Thirteen Loko"
+ id = "thirteenloko"
+ description = "A potent mixture of caffeine and alcohol."
+ reagent_state = LIQUID
+ color = "#102000" // rgb: 16, 32, 0
+
+/datum/reagent/ethanol/thirteenloko/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M:nutrition += nutriment_factor
+ holder.remove_reagent(src.id, FOOD_METABOLISM)
+ M:drowsyness = max(0,M:drowsyness-7)
+ //if(!M:sleeping_willingly)
+ // M:sleeping = max(0,M.sleeping-2)
+ if (M.bodytemperature > 310)
+ M.bodytemperature = max(310, M.bodytemperature-5)
+ M.Jitter(1)
+ return
+
+
+/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
+
+/datum/reagent/ethanol/bilk
+ name = "Bilk"
+ id = "bilk"
+ description = "This appears to be beer mixed with milk. Disgusting."
+ reagent_state = LIQUID
+ color = "#895C4C" // rgb: 137, 92, 76
+
+/datum/reagent/ethanol/atomicbomb
+ name = "Atomic Bomb"
+ id = "atomicbomb"
+ description = "Nuclear proliferation never tasted so good."
+ reagent_state = LIQUID
+ color = "#666300" // rgb: 102, 99, 0
+
+/datum/reagent/ethanol/threemileisland
+ name = "THree Mile Island Iced Tea"
+ id = "threemileisland"
+ description = "Made for a woman, strong enough for a man."
+ reagent_state = LIQUID
+ color = "#666340" // rgb: 102, 99, 64
+
+/datum/reagent/ethanol/goldschlager
+ name = "Goldschlager"
+ id = "goldschlager"
+ description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/patron
+ name = "Patron"
+ id = "patron"
+ description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
+ reagent_state = LIQUID
+ color = "#585840" // rgb: 88, 88, 64
+
+/datum/reagent/ethanol/gintonic
+ name = "Gin and Tonic"
+ id = "gintonic"
+ description = "An all time classic, mild cocktail."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/cuba_libre
+ name = "Cuba Libre"
+ id = "cubalibre"
+ description = "Rum, mixed with cola. Viva la revolution."
+ reagent_state = LIQUID
+ color = "#3E1B00" // rgb: 62, 27, 0
+
+/datum/reagent/ethanol/whiskey_cola
+ name = "Whiskey Cola"
+ id = "whiskeycola"
+ description = "Whiskey, mixed with cola. Surprisingly refreshing."
+ reagent_state = LIQUID
+ color = "#3E1B00" // rgb: 62, 27, 0
+
+/datum/reagent/ethanol/martini
+ name = "Classic Martini"
+ id = "martini"
+ description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/vodkamartini
+ name = "Vodka Martini"
+ id = "vodkamartini"
+ description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/white_russian
+ name = "White Russian"
+ id = "whiterussian"
+ description = "That's just, like, your opinion, man..."
+ reagent_state = LIQUID
+ color = "#A68340" // rgb: 166, 131, 64
+
+/datum/reagent/ethanol/screwdrivercocktail
+ name = "Screwdriver"
+ id = "screwdrivercocktail"
+ description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+
+/datum/reagent/ethanol/booger
+ name = "Booger"
+ id = "booger"
+ description = "Ewww..."
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+
+/datum/reagent/ethanol/bloody_mary
+ name = "Bloody Mary"
+ id = "bloodymary"
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/gargle_blaster
+ name = "Pan-Galactic Gargle Blaster"
+ id = "gargleblaster"
+ description = "Whoah, this stuff looks volatile!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/brave_bull
+ name = "Brave Bull"
+ id = "bravebull"
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/tequilla_sunrise
+ name = "Tequila Sunrise"
+ id = "tequillasunrise"
+ description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/toxins_special
+ name = "Toxins Special"
+ id = "toxinsspecial"
+ description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/beepsky_smash
+ name = "Beepsky Smash"
+ id = "beepskysmash"
+ description = "Deny drinking this and prepare for THE LAW."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/changelingsting
+ name = "Changeling Sting"
+ id = "changelingsting"
+ description = "You take a tiny sip and feel a burning sensation..."
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+
+/datum/reagent/ethanol/irish_cream
+ name = "Irish Cream"
+ id = "irishcream"
+ description = "Whiskey-imbued cream, what else would you expect from the Irish."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/manly_dorf
+ name = "The Manly Dorf"
+ id = "manlydorf"
+ description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/longislandicedtea
+ name = "Long Island Iced Tea"
+ id = "longislandicedtea"
+ description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/moonshine
+ name = "Moonshine"
+ id = "moonshine"
+ description = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/b52
+ name = "B-52"
+ id = "b52"
+ description = "Coffee, Irish Cream, and congac. You will get bombed."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/irishcoffee
+ name = "Irish Coffee"
+ id = "irishcoffee"
+ description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/margarita
+ name = "Margarita"
+ id = "margarita"
+ description = "On the rocks with salt on the rim. Arriba~!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/black_russian
+ name = "Black Russian"
+ id = "blackrussian"
+ description = "For the lactose-intolerant. Still as classy as a White Russian."
+ reagent_state = LIQUID
+ color = "#360000" // rgb: 54, 0, 0
+
+/datum/reagent/ethanol/manhattan
+ name = "Manhattan"
+ id = "manhattan"
+ description = "The Detective's undercover drink of choice. He never could stomach gin..."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/manhattan_proj
+ name = "Manhattan Project"
+ id = "manhattan_proj"
+ description = "A scienitst's drink of choice, for pondering ways to blow up the station."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/whiskeysoda
+ name = "Whiskey Soda"
+ id = "whiskeysoda"
+ description = "Ultimate refreshment."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/antifreeze
+ name = "Anti-freeze"
+ id = "antifreeze"
+ description = "Ultimate refreshment."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/barefoot
+ name = "Barefoot"
+ id = "barefoot"
+ description = "Barefoot and pregnant"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/snowwhite
+ name = "Snow White"
+ id = "snowwhite"
+ description = "A cold refreshment"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/demonsblood
+ name = "Demons Blood"
+ id = "demonsblood"
+ description = "AHHHH!!!!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 10
+ slurr_adj = 10
+
+/datum/reagent/ethanol/vodkatonic
+ name = "Vodka and Tonic"
+ id = "vodkatonic"
+ description = "For when a gin and tonic isn't russian enough."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ slurr_adj = 3
+
+/datum/reagent/ethanol/ginfizz
+ name = "Gin Fizz"
+ id = "ginfizz"
+ description = "Refreshingly lemony, deliciously dry."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ slurr_adj = 3
+
+/datum/reagent/ethanol/bahama_mama
+ name = "Bahama mama"
+ id = "bahama_mama"
+ description = "Tropic cocktail."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/singulo
+ name = "Singulo"
+ id = "singulo"
+ description = "A blue-space beverage!"
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+ dizzy_adj = 15
+ slurr_adj = 15
+
+/datum/reagent/ethanol/sbiten
+ name = "Sbiten"
+ id = "sbiten"
+ description = "A spicy Vodka! Might be a little hot for the little guys!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/sbiten/on_mob_life(var/mob/living/M as mob)
+ ..()
+ if (M.bodytemperature < 360)
+ M.bodytemperature = min(360, M.bodytemperature+50) //310 is the normal bodytemp. 310.055
+ return
+
+/datum/reagent/ethanol/devilskiss
+ name = "Devils Kiss"
+ id = "devilskiss"
+ description = "Creepy time!"
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+
+/datum/reagent/ethanol/red_mead
+ name = "Red Mead"
+ id = "red_mead"
+ description = "The true Viking drink! Even though it has a strange red color."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/mead
+ name = "Mead"
+ id = "mead"
+ description = "A Vikings drink, though a cheap one."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/iced_beer
+ name = "Iced Beer"
+ id = "iced_beer"
+ description = "A beer which is so cold the air around it freezes."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/iced_beer/on_mob_life(var/mob/living/M as mob)
+ ..()
+ if (M.bodytemperature < 270)
+ M.bodytemperature = min(270, M.bodytemperature-40) //310 is the normal bodytemp. 310.055
+ return
+
+/datum/reagent/ethanol/grog
+ name = "Grog"
+ id = "grog"
+ description = "Watered down rum, Nanotrasen approves!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/aloe
+ name = "Aloe"
+ id = "aloe"
+ description = "So very, very, very good."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/andalusia
+ name = "Andalusia"
+ id = "andalusia"
+ description = "A nice, strange named drink."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/alliescocktail
+ name = "Allies Cocktail"
+ id = "alliescocktail"
+ description = "A drink made from your allies."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/acid_spit
+ name = "Acid Spit"
+ id = "acidspit"
+ description = "A drink by Nanotrasen. Made from live aliens."
+ reagent_state = LIQUID
+ color = "#365000" // rgb: 54, 80, 0
+
+/datum/reagent/ethanol/amasec
+ name = "Amasec"
+ id = "amasec"
+ description = "Official drink of the Imperium."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+
+/datum/reagent/ethanol/neurotoxin
+ name = "Neurotoxin"
+ id = "neurotoxin"
+ description = "A strong neurotoxin that puts the subject into a death-like state."
+ reagent_state = LIQUID
+ color = "#2E2E61" // rgb: 46, 46, 97
+
+/datum/reagent/ethanol/neurotoxin/on_mob_life(var/mob/living/M as mob)
+ M.weakened = max(M.weakened, 3)
+ if(!data)
+ data = 1
+ data++
+ M.dizziness +=6
+ if(data >= 15 && data <45)
+ if (!M.slurring)
+ M.slurring = 1
+ M.slurring += 3
+ else if(data >= 45 && prob(50) && data <55)
+ M.confused = max(M.confused+3,0)
+ else if(data >=55)
+ M.druggy = max(M.druggy, 55)
+ else if(data >=200)
+ M.adjustToxLoss(2)
+ ..()
+ return
+
+/datum/reagent/ethanol/bananahonk
+ name = "Banana Mama"
+ id = "bananahonk"
+ description = "A drink from Clown Heaven."
+ nutriment_factor = 1 * FOOD_METABOLISM
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/bananahonk/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
+ if(!M) M = holder.my_atom
+ M.heal_organ_damage(1,1)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+ ..()
+
+/datum/reagent/ethanol/silencer
+ name = "Silencer"
+ id = "silencer"
+ description = "A drink from Mime Heaven."
+ nutriment_factor = 1 * FOOD_METABOLISM
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/silencer/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
+ if(!M) M = holder.my_atom
+ M.heal_organ_damage(1,1)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+ ..()
+
+/datum/reagent/ethanol/changelingsting
+ name = "Changeling Sting"
+ id = "changelingsting"
+ description = "A stingy drink."
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+
+/datum/reagent/ethanol/changelingsting/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.dizziness +=5
+ return
+
+/datum/reagent/ethanol/irishcarbomb
+ name = "Irish Car Bomb"
+ id = "irishcarbomb"
+ description = "Mmm, tastes like chocolate cake..."
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+
+/datum/reagent/ethanol/irishcarbomb/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.dizziness +=5
+ return
+
+/datum/reagent/ethanol/syndicatebomb
+ name = "Syndicate Bomb"
+ id = "syndicatebomb"
+ description = "A Syndicate bomb"
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+
+/datum/reagent/ethanol/erikasurprise
+ name = "Erika Surprise"
+ id = "erikasurprise"
+ description = "The surprise is, it's green!"
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+
+/datum/reagent/ethanol/driestmartini
+ name = "Driest Martini"
+ id = "driestmartini"
+ description = "Only for the experienced. You think you see sand floating in the glass."
+ nutriment_factor = 1 * FOOD_METABOLISM
+ color = "#2E6671" // rgb: 46, 102, 113
+
+/datum/reagent/ethanol/driestmartini/on_mob_life(var/mob/living/M as mob)
+ if(!data) data = 1
+ data++
+ M.dizziness +=10
+ if(data >= 55 && data <115)
+ if (!M.stuttering) M.stuttering = 1
+ M.stuttering += 10
+ else if(data >= 115 && prob(33))
+ M.confused = max(M.confused+15,15)
+ ..()
+
+ return
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
new file mode 100644
index 00000000000..e66e48fbdfe
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
@@ -0,0 +1,279 @@
+/datum/reagent/drink/orangejuice
+ name = "Orange juice"
+ id = "orangejuice"
+ description = "Both delicious AND rich in Vitamin C, what more do you need?"
+ color = "#E78108" // rgb: 231, 129, 8
+
+/datum/reagent/drink/orangejuicde/on_mob_life(var/mob/living/M as mob)
+ ..()
+ if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1*REM)
+ return
+
+/datum/reagent/drink/tomatojuice
+ name = "Tomato Juice"
+ id = "tomatojuice"
+ description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?"
+ color = "#731008" // rgb: 115, 16, 8
+
+/datum/reagent/drink/tomatojuice/on_mob_life(var/mob/living/M as mob)
+ ..()
+ if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1)
+ return
+
+/datum/reagent/drink/limejuice
+ name = "Lime Juice"
+ id = "limejuice"
+ description = "The sweet-sour juice of limes."
+ color = "#365E30" // rgb: 54, 94, 48
+
+/datum/reagent/drink/limejuice/on_mob_life(var/mob/living/M as mob)
+ ..()
+ if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1)
+ return
+
+
+/datum/reagent/drink/carrotjuice
+ name = "Carrot juice"
+ id = "carrotjuice"
+ description = "It is just like a carrot but without crunching."
+ color = "#973800" // rgb: 151, 56, 0
+
+/datum/reagent/drink/carrotjuicde/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.eye_blurry = max(M.eye_blurry-1 , 0)
+ M.eye_blind = max(M.eye_blind-1 , 0)
+ if(!data) data = 1
+ switch(data)
+ if(1 to 20)
+ //nothing
+ if(21 to INFINITY)
+ if (prob(data-10))
+ M.disabilities &= ~NEARSIGHTED
+ data++
+ return
+
+/datum/reagent/drink/doctor_delight
+ name = "The Doctor's Delight"
+ id = "doctorsdelight"
+ description = "A gulp a day keeps the MediBot away. That's probably for the best."
+ reagent_state = LIQUID
+ color = "#FF8CFF" // rgb: 255, 140, 255
+
+/datum/reagent/drink/doctors_delight/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1)
+ ..()
+ return
+
+/datum/reagent/drink/berryjuice
+ name = "Berry Juice"
+ id = "berryjuice"
+ description = "A delicious blend of several different kinds of berries."
+ color = "#863333" // rgb: 134, 51, 51
+
+/datum/reagent/drink/poisonberryjuice
+ name = "Poison Berry Juice"
+ id = "poisonberryjuice"
+ description = "A tasty juice blended from various kinds of very deadly and toxic berries."
+ color = "#863353" // rgb: 134, 51, 83
+
+/datum/reagent/drink/poisonberryjuice/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.adjustToxLoss(1)
+ return
+
+/datum/reagent/drink/watermelonjuice
+ name = "Watermelon Juice"
+ id = "watermelonjuice"
+ description = "Delicious juice made from watermelon."
+ color = "#863333" // rgb: 134, 51, 51
+
+/datum/reagent/drink/lemonjuice
+ name = "Lemon Juice"
+ id = "lemonjuice"
+ description = "This juice is VERY sour."
+ color = "#863333" // rgb: 175, 175, 0
+
+/datum/reagent/drink/grapejuice
+ name = "Grape Juice"
+ id = "grapejuice"
+ description = "This juice is known to stain shirts."
+ color = "#993399" // rgb: 153, 51, 153
+
+/datum/reagent/drink/banana
+ name = "Banana Juice"
+ id = "banana"
+ description = "The raw essence of a banana."
+ color = "#863333" // rgb: 175, 175, 0
+
+/datum/reagent/drink/banana/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
+ if(!M) M = holder.my_atom
+ M.heal_organ_damage(1,1)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+ ..()
+
+/datum/reagent/drink/nothing
+ name = "Nothing"
+ id = "nothing"
+ description = "Absolutely nothing."
+
+/datum/reagent/drink/nothing/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
+ if(!M) M = holder.my_atom
+ M.heal_organ_damage(1,1)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+ ..()
+
+/datum/reagent/drink/potato_juice
+ name = "Potato Juice"
+ id = "potato"
+ description = "Juice of the potato. Bleh."
+ nutriment_factor = 2 * FOOD_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/drink/milk
+ name = "Milk"
+ id = "milk"
+ description = "An opaque white liquid produced by the mammary glands of mammals."
+ color = "#DFDFDF" // rgb: 223, 223, 223
+
+/datum/reagent/drink/milk/on_mob_life(var/mob/living/M as mob)
+ if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
+ if(holder.has_reagent("capsaicin"))
+ holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM)
+ ..()
+ return
+
+/datum/reagent/drink/milk/soymilk
+ name = "Soy Milk"
+ id = "soymilk"
+ description = "An opaque white liquid made from soybeans."
+ color = "#DFDFC7" // rgb: 223, 223, 199
+
+/datum/reagent/drink/milk/cream
+ name = "Cream"
+ id = "cream"
+ description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
+ color = "#DFD7AF" // rgb: 223, 215, 175
+
+/datum/reagent/drink/milk/chocolate_milk
+ name = "Chocolate milk"
+ id ="chocolate_milk"
+ description = "Chocolate-flavored milk, tastes like being a kid again."
+ color = "#85432C"
+
+/datum/reagent/drink/hot_coco
+ name = "Hot Chocolate"
+ id = "hot_coco"
+ description = "Made with love! And coco beans."
+ nutriment_factor = 2 * FOOD_METABOLISM
+ color = "#403010" // rgb: 64, 48, 16
+ adj_temp = 5
+
+/datum/reagent/drink/coffee
+ name = "Coffee"
+ id = "coffee"
+ description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant."
+ color = "#482000" // rgb: 72, 32, 0
+ adj_dizzy = -5
+ adj_drowsy = -3
+ adj_sleepy = -2
+ adj_temp = 25
+ overdose_threshold = 45
+
+/datum/reagent/drink/coffee/on_mob_life(var/mob/living/M as mob)
+ if(adj_temp > 0 && holder.has_reagent("frostoil"))
+ holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM)
+ if(prob(50))
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ ..()
+ return
+
+/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob)
+ if(volume > 45)
+ M.Jitter(5)
+
+ ..()
+ return
+
+/datum/reagent/drink/coffee/icecoffee
+ name = "Iced Coffee"
+ id = "icecoffee"
+ description = "Coffee and ice, refreshing and cool."
+ color = "#102838" // rgb: 16, 40, 56
+ adj_temp = -5
+
+/datum/reagent/drink/coffee/soy_latte
+ name = "Soy Latte"
+ id = "soy_latte"
+ description = "A nice and tasty beverage while you are reading your hippie books."
+ color = "#664300" // rgb: 102, 67, 0
+ adj_sleepy = 0
+ adj_temp = 5
+
+/datum/reagent/drink/coffee/soy_latte/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.sleeping = 0
+ if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
+ return
+
+/datum/reagent/drink/coffee/cafe_latte
+ name = "Cafe Latte"
+ id = "cafe_latte"
+ description = "A nice, strong and tasty beverage while you are reading."
+ color = "#664300" // rgb: 102, 67, 0
+ adj_sleepy = 0
+ adj_temp = 5
+
+/datum/reagent/drink/coffee/cafe_latte/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.sleeping = 0
+ if(M.getBruteLoss() && prob(20))
+ M.heal_organ_damage(1,0)
+ return
+
+/datum/reagent/drink/tea
+ name = "Tea"
+ id = "tea"
+ description = "Tasty black tea: It has antioxidants. It's good for you!"
+ color = "#101000" // rgb: 16, 16, 0
+ adj_dizzy = -2
+ adj_drowsy = -1
+ adj_sleepy = -3
+ adj_temp = 20
+
+/datum/reagent/drink/tea/on_mob_life(var/mob/living/M as mob)
+ ..()
+ if(M.getToxLoss() && prob(20))
+ M.adjustToxLoss(-1)
+ return
+
+/datum/reagent/drink/tea/icetea
+ name = "Iced Tea"
+ id = "icetea"
+ description = "No relation to a certain rap artist/ actor."
+ color = "#104038" // rgb: 16, 64, 56
+ adj_temp = -5
+
+/datum/reagent/drink/kahlua
+ name = "Kahlua"
+ id = "kahlua"
+ description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
+ color = "#664300" // rgb: 102, 67, 0
+ adj_dizzy = -5
+ adj_drowsy = -3
+ adj_sleepy = -2
+
+/datum/reagent/drink/kahlua/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.Jitter(5)
+ return
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
new file mode 100644
index 00000000000..3bc3b364929
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
@@ -0,0 +1,26 @@
+/datum/reagent/drink
+ name = "Drink"
+ id = "drink"
+ description = "Uh, some kind of drink."
+ reagent_state = LIQUID
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#E78108" // rgb: 231, 129, 8
+ var/adj_dizzy = 0
+ var/adj_drowsy = 0
+ var/adj_sleepy = 0
+ var/adj_temp = 0
+
+/datum/reagent/drink/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.nutrition += nutriment_factor
+ holder.remove_reagent(src.id, FOOD_METABOLISM)
+ if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy)
+ if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy)
+ if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy)
+ if (adj_temp)
+ if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+ M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ // Drinks should be used up faster than other reagents.
+ holder.remove_reagent(src.id, FOOD_METABOLISM)
+ ..()
+ return
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
new file mode 100644
index 00000000000..e9acef2da7d
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
@@ -0,0 +1,141 @@
+/datum/reagent/drink/cold
+ name = "Cold drink"
+ adj_temp = -5
+
+/datum/reagent/drink/cold/tonic
+ name = "Tonic Water"
+ id = "tonic"
+ description = "It tastes strange but at least the quinine keeps the Space Malaria at bay."
+ color = "#664300" // rgb: 102, 67, 0
+ adj_dizzy = -5
+ adj_drowsy = -3
+ adj_sleepy = -2
+
+/datum/reagent/drink/cold/sodawater
+ name = "Soda Water"
+ id = "sodawater"
+ description = "A can of club soda. Why not make a scotch and soda?"
+ color = "#619494" // rgb: 97, 148, 148
+ adj_dizzy = -5
+ adj_drowsy = -3
+
+/datum/reagent/drink/cold/ice
+ name = "Ice"
+ id = "ice"
+ description = "Frozen water, your dentist wouldn't like you chewing this."
+ reagent_state = SOLID
+ color = "#619494" // rgb: 97, 148, 148
+
+/datum/reagent/drink/cold/space_cola
+ name = "Cola"
+ id = "cola"
+ description = "A refreshing beverage."
+ reagent_state = LIQUID
+ color = "#100800" // rgb: 16, 8, 0
+ adj_drowsy = -3
+
+/datum/reagent/drink/cold/nuka_cola
+ name = "Nuka Cola"
+ id = "nuka_cola"
+ description = "Cola, cola never changes."
+ color = "#100800" // rgb: 16, 8, 0
+ adj_sleepy = -2
+
+/datum/reagent/drink/cold/nuka_cola/on_mob_life(var/mob/living/M as mob)
+ M.Jitter(20)
+ M.druggy = max(M.druggy, 30)
+ M.dizziness +=5
+ M.drowsyness = 0
+ M.status_flags |= GOTTAGOFAST
+ ..()
+ return
+
+/datum/reagent/drink/cold/spacemountainwind
+ name = "Space Mountain Wind"
+ id = "spacemountainwind"
+ description = "Blows right through you like a space wind."
+ color = "#102000" // rgb: 16, 32, 0
+ adj_drowsy = -7
+ adj_sleepy = -1
+
+/datum/reagent/drink/cold/dr_gibb
+ name = "Dr. Gibb"
+ id = "dr_gibb"
+ description = "A delicious blend of 42 different flavours"
+ color = "#102000" // rgb: 16, 32, 0
+ adj_drowsy = -6
+
+/datum/reagent/drink/cold/space_up
+ name = "Space-Up"
+ id = "space_up"
+ description = "Tastes like a hull breach in your mouth."
+ color = "#202800" // rgb: 32, 40, 0
+ adj_temp = -8
+
+/datum/reagent/drink/cold/lemon_lime
+ name = "Lemon Lime"
+ description = "A tangy substance made of 0.5% natural citrus!"
+ id = "lemon_lime"
+ color = "#878F00" // rgb: 135, 40, 0
+ adj_temp = -8
+
+/datum/reagent/drink/cold/lemonade
+ name = "Lemonade"
+ description = "Oh the nostalgia..."
+ id = "lemonade"
+ color = "#FFFF00" // rgb: 255, 255, 0
+
+/datum/reagent/drink/cold/kiraspecial
+ name = "Kira Special"
+ description = "Long live the guy who everyone had mistaken for a girl. Baka!"
+ id = "kiraspecial"
+ color = "#CCCC99" // rgb: 204, 204, 153
+
+/datum/reagent/drink/cold/brownstar
+ name = "Brown Star"
+ description = "Its not what it sounds like..."
+ id = "brownstar"
+ color = "#9F3400" // rgb: 159, 052, 000
+ adj_temp = - 2
+
+/datum/reagent/drink/cold/milkshake
+ name = "Milkshake"
+ description = "Glorious brainfreezing mixture."
+ id = "milkshake"
+ color = "#AEE5E4" // rgb" 174, 229, 228
+ adj_temp = -9
+
+/datum/reagent/drink/cold/milkshake/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(!data) data = 1
+ switch(data)
+ if(1 to 15)
+ M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(holder.has_reagent("capsaicin"))
+ holder.remove_reagent("capsaicin", 5)
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(5,20)
+ if(15 to 25)
+ M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(10,20)
+ if(25 to INFINITY)
+ M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(prob(1)) M.emote("shiver")
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(15,20)
+ data++
+ holder.remove_reagent(src.id, FOOD_METABOLISM)
+ ..()
+ return
+
+/datum/reagent/drink/cold/rewriter
+ name = "Rewriter"
+ description = "The secert of the sanctuary of the Libarian..."
+ id = "rewriter"
+ color = "#485000" // rgb:72, 080, 0
+
+/datum/reagent/drink/cold/rewriter/on_mob_life(var/mob/living/M as mob)
+ ..()
+ M.Jitter(5)
+ return
\ 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
new file mode 100644
index 00000000000..dd9e73a96b1
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
@@ -0,0 +1,54 @@
+/datum/reagent/adminordrazine //An OP chemical for admins
+ name = "Adminordrazine"
+ id = "adminordrazine"
+ description = "It's magic. We don't have to explain it."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
+
+/datum/reagent/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob)
+ if(!M) M = holder.my_atom ///This can even heal dead people.
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.id,5)
+ M.setCloneLoss(0)
+ M.setOxyLoss(0)
+ M.radiation = 0
+ M.heal_organ_damage(5,5)
+ M.adjustToxLoss(-5)
+ M.hallucination = 0
+ M.setBrainLoss(0)
+ M.disabilities = 0
+ M.sdisabilities = 0
+ M.eye_blurry = 0
+ M.eye_blind = 0
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
+ if(istype(E))
+ E.damage = max(E.damage-5 , 0)
+ M.SetWeakened(0)
+ M.SetStunned(0)
+ M.SetParalysis(0)
+ M.silent = 0
+ M.dizziness = 0
+ M.drowsyness = 0
+ M.stuttering = 0
+ M.slurring = 0
+ M.confused = 0
+ M.sleeping = 0
+ 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
+ ..()
+ return
+
+
+/datum/reagent/adminordrazine/nanites
+ name = "Nanites"
+ id = "nanites"
+ description = "Nanomachines that aid in rapid cellular regeneration."
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
new file mode 100644
index 00000000000..a00da8f283a
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
@@ -0,0 +1,95 @@
+/datum/reagent/serotrotium
+ name = "Serotrotium"
+ id = "serotrotium"
+ description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
+ reagent_state = LIQUID
+ color = "#202040" // rgb: 20, 20, 40
+
+/datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob)
+ if(ishuman(M))
+ if(prob(7)) M.emote(pick("twitch","drool","moan","gasp"))
+ holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM)
+ return
+
+
+/datum/reagent/lithium
+ name = "Lithium"
+ id = "lithium"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#808080" // rgb: 128, 128, 128
+
+/datum/reagent/lithium/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.canmove && !M.restrained() && istype(M.loc, /turf/space))
+ step(M, pick(cardinal))
+ if(prob(5)) M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+
+
+/datum/reagent/hippies_delight
+ name = "Hippie's Delight"
+ id = "hippiesdelight"
+ description = "You just don't get it maaaan."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/hippies_delight/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.druggy = max(M.druggy, 50)
+ if(!data) data = 1
+ switch(data)
+ if(1 to 5)
+ if (!M.stuttering) M.stuttering = 1
+ M.Dizzy(10)
+ if(prob(10)) M.emote(pick("twitch","giggle"))
+ if(5 to 10)
+ if (!M.stuttering) M.stuttering = 1
+ M.Jitter(20)
+ M.Dizzy(20)
+ M.druggy = max(M.druggy, 45)
+ if(prob(20)) M.emote(pick("twitch","giggle"))
+ if (10 to INFINITY)
+ if (!M.stuttering) M.stuttering = 1
+ M.Jitter(40)
+ M.Dizzy(40)
+ M.druggy = max(M.druggy, 60)
+ if(prob(30)) M.emote(pick("twitch","giggle"))
+ holder.remove_reagent(src.id, 0.2)
+ data++
+ ..()
+ return
+
+
+/datum/reagent/lsd
+ name = "Lysergic acid diethylamide"
+ id = "lsd"
+ description = "A highly potent hallucinogenic substance. Far out, maaaan."
+ reagent_state = LIQUID
+ color = "#0000D8"
+
+/datum/reagent/lsd/on_mob_life(var/mob/living/M)
+ if(!M) M = holder.my_atom
+ M.hallucination += 10
+ ..()
+ return
+
+
+/datum/reagent/space_drugs
+ name = "Space drugs"
+ id = "space_drugs"
+ description = "An illegal chemical compound used as drug."
+ reagent_state = LIQUID
+ color = "#9087A2"
+ metabolization_rate = 0.2
+
+/datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.druggy = max(M.druggy, 15)
+ if(isturf(M.loc) && !istype(M.loc, /turf/space))
+ if(M.canmove && !M.restrained())
+ if(prob(10)) step(M, pick(cardinal))
+ if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
+ ..()
+ return
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
new file mode 100644
index 00000000000..4603aa6c238
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
@@ -0,0 +1,136 @@
+/datum/reagent/fuel
+ name = "Welding fuel"
+ id = "fuel"
+ description = "A highly flammable blend of basic hydrocarbons, mostly Acetylene. Useful for both welding and organic chemistry, and can be fortified into a heavier oil."
+ reagent_state = LIQUID
+ color = "#060606"
+
+/datum/reagent/fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite!
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 10)
+ return
+ ..()
+
+/datum/reagent/fuel/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1)
+ ..()
+ return
+
+/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
+ name = "Unholy Water"
+ id = "unholywater"
+ description = "Something that shouldn't exist on this plane of existance."
+ process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it.
+
+/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M)
+ M.adjustBrainLoss(3)
+ if(iscultist(M))
+ M.status_flags |= GOTTAGOFAST
+ M.drowsyness = max(M.drowsyness-5, 0)
+ M.AdjustParalysis(-2)
+ M.AdjustStunned(-2)
+ M.AdjustWeakened(-2)
+ else
+ M.adjustToxLoss(2)
+ M.adjustFireLoss(2)
+ M.adjustOxyLoss(2)
+ M.adjustBruteLoss(2)
+ holder.remove_reagent(src.id, 1)
+
+
+/datum/reagent/incendiary_fuel //copy-pasta of welding fuel; allow incendiary grenades to function better without the headache of people spraying fuel everywhere with regular welding fuel.
+ name = "Incendiary fuel"
+ id = "incendiaryfuel"
+ description = "A highly flammable compound used in incendiary grenades."
+ reagent_state = LIQUID
+ color = "#660000" // rgb: 102, 0, 0
+
+/datum/reagent/incendiary_fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite!
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 10)
+ return
+
+/datum/reagent/incendiary_fuel/reaction_obj(var/obj/O, var/volume)
+ var/turf/the_turf = get_turf(O)
+ if(!the_turf)
+ return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO
+ new /obj/effect/decal/cleanable/liquid_fuel(the_turf, volume)
+
+/datum/reagent/incendiary_fuel/reaction_turf(var/turf/T, var/volume)
+ new /obj/effect/decal/cleanable/liquid_fuel(T, volume)
+ return
+
+/datum/reagent/incendiary_fuel/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1)
+ ..()
+ return
+
+
+/datum/reagent/plasma
+ name = "Plasma"
+ id = "plasma"
+ description = "The liquid phase of an unusual extraterrestrial compound."
+ reagent_state = LIQUID
+ color = "#7A2B94"
+
+/datum/reagent/plasma/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1*REM)
+ if(holder.has_reagent("epinephrine"))
+ holder.remove_reagent("epinephrine", 2)
+ ..()
+ return
+
+/datum/reagent/plasma/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel!
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ M.adjust_fire_stacks(volume / 5)
+ ..()
+ return
+
+
+/datum/reagent/thermite
+ name = "Thermite"
+ id = "thermite"
+ description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
+ reagent_state = SOLID
+ color = "#673910" // rgb: 103, 57, 16
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/thermite/reaction_turf(var/turf/T, var/volume)
+ src = null
+ if(volume >= 5)
+ if(istype(T, /turf/simulated/wall))
+ T:thermite = 1
+ T.overlays.Cut()
+ T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
+ return
+
+/datum/reagent/thermite/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustFireLoss(1)
+ ..()
+ return
+
+
+/datum/reagent/glycerol
+ name = "Glycerol"
+ id = "glycerol"
+ description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
+ reagent_state = LIQUID
+ color = "#808080" // rgb: 128, 128, 128
+
+
+/datum/reagent/nitroglycerin
+ name = "Nitroglycerin"
+ id = "nitroglycerin"
+ description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
+ reagent_state = LIQUID
+ color = "#808080" // rgb: 128, 128, 128
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm
new file mode 100644
index 00000000000..485a42e7ca7
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm
@@ -0,0 +1,425 @@
+/////////////////////////Food Reagents////////////////////////////
+// Part of the food code. Nutriment is used instead of the old "heal_amt" code. Also is where all the food
+// condiments, additives, and such go.
+/datum/reagent/nutriment // Pure nutriment, universally digestable and thus slightly less effective
+ name = "Nutriment"
+ id = "nutriment"
+ description = "A questionable mixture of various pure nutrients commonly found in processed foods."
+ reagent_state = SOLID
+ nutriment_factor = 12 * REAGENTS_METABOLISM
+ color = "#664330" // rgb: 102, 67, 48
+
+/datum/reagent/nutriment/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(!(M.mind in ticker.mode.vampires))
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && H.species.dietflags) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
+ H.nutrition += nutriment_factor // For hunger and fatness
+ if(prob(50)) M.heal_organ_damage(1,0)
+ if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
+ if(prob(50)) M.heal_organ_damage(1,0)
+ ..()
+ return
+
+
+/datum/reagent/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores
+ name = "Protein"
+ id = "protein"
+ description = "Various essential proteins and fats commonly found in animal flesh and blood."
+ reagent_state = SOLID
+ nutriment_factor = 15 * REAGENTS_METABOLISM
+ color = "#664330" // rgb: 102, 67, 48
+
+/datum/reagent/protein/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(!(M.mind in ticker.mode.vampires))
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_HERB)) //Make sure the species has it's dietflag set, and that it is not a herbivore
+ H.nutrition += nutriment_factor // For hunger and fatness
+ if(prob(50)) M.heal_organ_damage(1,0)
+ if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
+ if(prob(50)) M.heal_organ_damage(1,0)
+ ..()
+ return
+
+
+/datum/reagent/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
+ name = "Plant-matter"
+ id = "plantmatter"
+ description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
+ reagent_state = SOLID
+ nutriment_factor = 15 * REAGENTS_METABOLISM
+ color = "#664330" // rgb: 102, 67, 48
+
+/datum/reagent/plantmatter/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(!(M.mind in ticker.mode.vampires))
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && H.species.dietflags && !(H.species.dietflags & DIET_CARN)) //Make sure the species has it's dietflag set, and that it is not a carnivore
+ H.nutrition += nutriment_factor // For hunger and fatness
+ if(prob(50)) M.heal_organ_damage(1,0)
+ if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
+ if(prob(50)) M.heal_organ_damage(1,0)
+ ..()
+ return
+
+
+/datum/reagent/soysauce
+ name = "Soysauce"
+ id = "soysauce"
+ description = "A salty sauce made from the soy plant."
+ reagent_state = LIQUID
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#792300" // rgb: 121, 35, 0
+
+/datum/reagent/ketchup
+ name = "Ketchup"
+ id = "ketchup"
+ description = "Ketchup, catsup, whatever. It's tomato paste."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#731008" // rgb: 115, 16, 8
+
+
+/datum/reagent/capsaicin
+ name = "Capsaicin Oil"
+ id = "capsaicin"
+ description = "This is what makes chilis hot."
+ reagent_state = LIQUID
+ color = "#B31008" // rgb: 179, 16, 8
+
+/datum/reagent/capsaicin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(!data) data = 1
+ switch(data)
+ if(1 to 15)
+ M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(holder.has_reagent("frostoil"))
+ holder.remove_reagent("frostoil", 5)
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature += rand(5,20)
+ if(15 to 25)
+ M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature += rand(10,20)
+ if(25 to INFINITY)
+ M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature += rand(15,20)
+ holder.remove_reagent(src.id, FOOD_METABOLISM)
+ data++
+ ..()
+ return
+
+
+/datum/reagent/sodiumchloride
+ name = "Salt"
+ id = "sodiumchloride"
+ description = "Sodium chloride, common table salt."
+ reagent_state = SOLID
+ color = "#B1B0B0"
+
+/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob)
+ if(volume > 100)
+ if(prob(70))
+ M.adjustBrainLoss(1)
+ if(prob(8))
+ M.adjustToxLoss(rand(1,2))
+ ..()
+ return
+
+
+/datum/reagent/blackpepper
+ name = "Black Pepper"
+ id = "blackpepper"
+ description = "A powder ground from peppercorns. *AAAACHOOO*"
+ reagent_state = SOLID
+ // no color (ie, black)
+
+/datum/reagent/coco
+ name = "Coco Powder"
+ id = "coco"
+ description = "A fatty, bitter paste made from coco beans."
+ reagent_state = SOLID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/coco/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+
+/datum/reagent/hot_coco
+ name = "Hot Chocolate"
+ id = "hot_coco"
+ description = "Made with love! And coco beans."
+ reagent_state = LIQUID
+ nutriment_factor = 2 * REAGENTS_METABOLISM
+ color = "#403010" // rgb: 64, 48, 16
+
+/datum/reagent/hot_coco/on_mob_life(var/mob/living/M as mob)
+ if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+ M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ M.nutrition += nutriment_factor
+ ..()
+ return
+
+
+/datum/reagent/psilocybin
+ name = "Psilocybin"
+ id = "psilocybin"
+ description = "A strong psycotropic derived from certain species of mushroom."
+ color = "#E700E7" // rgb: 231, 0, 231
+
+/datum/reagent/psilocybin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.druggy = max(M.druggy, 30)
+ if(!data) data = 1
+ switch(data)
+ if(1 to 5)
+ if (!M.stuttering) M.stuttering = 1
+ M.Dizzy(5)
+ if(prob(10)) M.emote(pick("twitch","giggle"))
+ if(5 to 10)
+ if (!M.stuttering) M.stuttering = 1
+ M.Jitter(10)
+ M.Dizzy(10)
+ M.druggy = max(M.druggy, 35)
+ if(prob(20)) M.emote(pick("twitch","giggle"))
+ if (10 to INFINITY)
+ if (!M.stuttering) M.stuttering = 1
+ M.Jitter(20)
+ M.Dizzy(20)
+ M.druggy = max(M.druggy, 40)
+ if(prob(30)) M.emote(pick("twitch","giggle"))
+ data++
+ ..()
+ return
+
+
+/datum/reagent/sprinkles
+ name = "Sprinkles"
+ id = "sprinkles"
+ description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops."
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#FF00FF" // rgb: 255, 0, 255
+
+/datum/reagent/sprinkles/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
+ if(!M) M = holder.my_atom
+ M.heal_organ_damage(1,1)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+ ..()
+
+
+/datum/reagent/cornoil
+ name = "Corn Oil"
+ id = "cornoil"
+ description = "An oil derived from various types of corn."
+ reagent_state = LIQUID
+ nutriment_factor = 20 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/cornoil/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+
+/datum/reagent/cornoil/reaction_turf(var/turf/simulated/T, var/volume)
+ if (!istype(T)) return
+ src = null
+ if(volume >= 3)
+ if(T.wet >= 1) return
+ T.wet = 1
+ if(T.wet_overlay)
+ T.overlays -= T.wet_overlay
+ T.wet_overlay = null
+ T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
+ T.overlays += T.wet_overlay
+
+ spawn(800)
+ if (!istype(T)) return
+ if(T.wet >= 2) return
+ T.wet = 0
+ if(T.wet_overlay)
+ T.overlays -= T.wet_overlay
+ T.wet_overlay = null
+ var/hotspot = (locate(/obj/effect/hotspot) in T)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
+ lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
+ lowertemp.react()
+ T.assume_air(lowertemp)
+ qdel(hotspot)
+
+
+/datum/reagent/enzyme
+ name = "Denatured Enzyme"
+ id = "enzyme"
+ description = "Heated beyond usefulness, this enzyme is now worthless."
+ reagent_state = LIQUID
+ color = "#282314" // rgb: 54, 94, 48
+
+
+/datum/reagent/dry_ramen
+ name = "Dry Ramen"
+ id = "dry_ramen"
+ description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water."
+ reagent_state = SOLID
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/dry_ramen/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+
+
+/datum/reagent/hot_ramen
+ name = "Hot Ramen"
+ id = "hot_ramen"
+ description = "The noodles are boiled, the flavors are artificial, just like being back in school."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/hot_ramen/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+ M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ ..()
+ return
+
+
+/datum/reagent/hell_ramen
+ name = "Hell Ramen"
+ id = "hell_ramen"
+ description = "The noodles are boiled, the flavors are artificial, just like being back in school."
+ reagent_state = LIQUID
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#302000" // rgb: 48, 32, 0
+
+/datum/reagent/hell_ramen/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ ..()
+ return
+
+
+/datum/reagent/flour
+ name = "flour"
+ id = "flour"
+ description = "This is what you rub all over yourself to pretend to be a ghost."
+ reagent_state = SOLID
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#FFFFFF" // rgb: 0, 0, 0
+
+/datum/reagent/flour/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+
+/datum/reagent/flour/reaction_turf(var/turf/T, var/volume)
+ src = null
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/flour(T)
+
+
+/datum/reagent/rice
+ name = "Rice"
+ id = "rice"
+ description = "Enjoy the great taste of nothing."
+ reagent_state = SOLID
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#FFFFFF" // rgb: 0, 0, 0
+
+/datum/reagent/rice/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+
+
+/datum/reagent/cherryjelly
+ name = "Cherry Jelly"
+ id = "cherryjelly"
+ description = "Totally the best. Only to be spread on foods with excellent lateral symmetry."
+ reagent_state = LIQUID
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#801E28" // rgb: 128, 30, 40
+
+/datum/reagent/cherryjelly/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+
+
+/datum/reagent/toxin/coffeepowder
+ name = "Coffee Grounds"
+ id = "coffeepowder"
+ description = "Finely ground Coffee beans, used to make coffee."
+ reagent_state = SOLID
+ color = "#5B2E0D" // rgb: 91, 46, 13
+
+/datum/reagent/toxin/teapowder
+ name = "Ground Tea Leaves"
+ id = "teapowder"
+ description = "Finely shredded Tea leaves, used for making tea."
+ reagent_state = SOLID
+ color = "#7F8400" // rgb: 127, 132, 0
+
+//Reagents used for plant fertilizers.
+/datum/reagent/toxin/fertilizer
+ name = "fertilizer"
+ id = "fertilizer"
+ description = "A chemical mix good for growing plants with."
+ reagent_state = LIQUID
+// toxpwr = 0.2 //It's not THAT poisonous.
+ color = "#664330" // rgb: 102, 67, 48
+
+/datum/reagent/toxin/fertilizer/eznutrient
+ name = "EZ Nutrient"
+ id = "eznutrient"
+
+/datum/reagent/toxin/fertilizer/left4zed
+ name = "Left-4-Zed"
+ id = "left4zed"
+
+/datum/reagent/toxin/fertilizer/robustharvest
+ name = "Robust Harvest"
+ id = "robustharvest"
+
+
+/datum/reagent/sugar
+ name = "Sugar"
+ id = "sugar"
+ description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
+ reagent_state = SOLID
+ color = "#FFFFFF" // rgb: 255, 255, 255
+ overdose_threshold = 200 // Hyperglycaemic shock
+
+/datum/reagent/sugar/on_mob_life(var/mob/living/M as mob)
+ if(prob(4))
+ M.reagents.add_reagent("epinephrine", 1.2)
+ if(prob(50))
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ if(current_cycle >= 90)
+ M.jitteriness += 10
+ ..()
+ return
+
+/datum/reagent/sugar/overdose_process(var/mob/living/M as mob)
+ if(volume > 200)
+ M << "You pass out from hyperglycemic shock!"
+ M.Paralyse(1)
+ if(prob(8))
+ M.adjustToxLoss(rand(1,2))
+ ..()
+ return
diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm
new file mode 100644
index 00000000000..696fa6354a5
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm
@@ -0,0 +1,152 @@
+/datum/reagent/hydrocodone
+ name = "Hydrocodone"
+ id = "hydrocodone"
+ description = "An extremely effective painkiller; may have long term abuse consequences."
+ reagent_state = LIQUID
+ color = "#C805DC"
+ metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units
+ shock_reduction = 200
+
+/datum/reagent/hydrocodone/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ ..()
+ 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"
+ description = "Sterilizes wounds in preparation for surgery."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+ //makes you squeaky clean
+/datum/reagent/sterilizine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if (method == TOUCH)
+ M.germ_level -= min(volume*20, M.germ_level)
+
+/datum/reagent/sterilizine/reaction_obj(var/obj/O, var/volume)
+ O.germ_level -= min(volume*20, O.germ_level)
+
+/datum/reagent/sterilizine/reaction_turf(var/turf/T, var/volume)
+ T.germ_level -= min(volume*20, T.germ_level)
+
+/datum/reagent/synaptizine
+ name = "Synaptizine"
+ id = "synaptizine"
+ description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis."
+ reagent_state = LIQUID
+ color = "#FA46FA"
+
+/datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ if(prob(50))
+ M.adjustBrainLoss(-1.0)
+ ..()
+ return
+
+/datum/reagent/audioline
+ name = "Audioline"
+ id = "audioline"
+ description = "Heals ear damage."
+ reagent_state = LIQUID
+ color = "#6600FF" // rgb: 100, 165, 255
+
+/datum/reagent/audioline/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.ear_damage = 0
+ M.ear_deaf = 0
+ ..()
+ return
+
+/datum/reagent/mitocholide
+ name = "Mitocholide"
+ id = "mitocholide"
+ description = "A specialized drug that stimulates the mitochondria of cells to encourage healing of internal organs."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/reagent/mitocholide/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ //Mitocholide is hard enough to get, it's probably fair to make this all internal organs
+ for(var/name in H.internal_organs_by_name)
+ var/obj/item/organ/I = H.internal_organs_by_name[name]
+ if(I.damage > 0)
+ I.damage -= 0.20
+ ..()
+ return
+
+/datum/reagent/cryoxadone
+ name = "Cryoxadone"
+ id = "cryoxadone"
+ description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly."
+ reagent_state = LIQUID
+ color = "#0000C8" // rgb: 200, 165, 220
+
+/datum/reagent/cryoxadone/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.bodytemperature < 265)
+ M.adjustCloneLoss(-4)
+ M.adjustOxyLoss(-10)
+ M.heal_organ_damage(12,12)
+ M.adjustToxLoss(-3)
+ M.status_flags &= ~DISFIGURED
+ ..()
+ return
+
+/datum/reagent/rezadone
+ name = "Rezadone"
+ id = "rezadone"
+ description = "A powder derived from fish toxin, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects."
+ reagent_state = SOLID
+ color = "#669900" // rgb: 102, 153, 0
+
+/datum/reagent/rezadone/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(!data) data = 1
+ data++
+ switch(data)
+ if(1 to 15)
+ M.adjustCloneLoss(-1)
+ M.heal_organ_damage(1,1)
+ if(15 to 35)
+ M.adjustCloneLoss(-2)
+ M.heal_organ_damage(2,1)
+ M.status_flags &= ~DISFIGURED
+ if(35 to INFINITY)
+ M.adjustToxLoss(1)
+ M.Dizzy(5)
+ M.Jitter(5)
+
+ ..()
+ return
+
+/datum/reagent/spaceacillin
+ name = "Spaceacillin"
+ id = "spaceacillin"
+ description = "An all-purpose antibiotic agent extracted from space fungus."
+ reagent_state = LIQUID
+ color = "#0AB478"
+
+/datum/reagent/spaceacillin/on_mob_life(var/mob/living/M as mob)
+ ..()
+ return
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_misc.dm b/code/modules/reagents/oldchem/reagents/reagents_misc.dm
new file mode 100644
index 00000000000..8c3352243eb
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_misc.dm
@@ -0,0 +1,222 @@
+/*/datum/reagent/silicate
+ name = "Silicate"
+ id = "silicate"
+ description = "A compound that can be used to reinforce glass."
+ reagent_state = LIQUID
+ color = "#C7FFFF" // rgb: 199, 255, 255
+
+/datum/reagent/silicate/reaction_obj(var/obj/O, var/volume)
+ src = null
+ if(istype(O,/obj/structure/window))
+ if(O:silicate <= 200)
+
+ O:silicate += volume
+ O:health += volume * 3
+
+ if(!O:silicateIcon)
+ var/icon/I = icon(O.icon,O.icon_state,O.dir)
+
+ var/r = (volume / 100) + 1
+ var/g = (volume / 70) + 1
+ var/b = (volume / 50) + 1
+ I.SetIntensity(r,g,b)
+ O.icon = I
+ O:silicateIcon = I
+ else
+ var/icon/I = O:silicateIcon
+
+ var/r = (volume / 100) + 1
+ var/g = (volume / 70) + 1
+ var/b = (volume / 50) + 1
+ I.SetIntensity(r,g,b)
+ O.icon = I
+ O:silicateIcon = I
+
+ return*/
+
+
+/datum/reagent/oxygen
+ name = "Oxygen"
+ id = "oxygen"
+ description = "A colorless, odorless gas."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+
+/datum/reagent/oxygen/on_mob_life(var/mob/living/M as mob, var/alien)
+ if(M.stat == 2) return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
+ M.adjustToxLoss(REAGENTS_METABOLISM)
+ holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
+ return
+ ..()
+
+
+/datum/reagent/nitrogen
+ name = "Nitrogen"
+ id = "nitrogen"
+ description = "A colorless, odorless, tasteless gas."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+
+/datum/reagent/nitrogen/on_mob_life(var/mob/living/M as mob, var/alien)
+ if(M.stat == 2) return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
+ M.adjustOxyLoss(-2*REM)
+ holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
+ return
+ ..()
+
+
+/datum/reagent/hydrogen
+ name = "Hydrogen"
+ id = "hydrogen"
+ description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+
+
+/datum/reagent/potassium
+ name = "Potassium"
+ id = "potassium"
+ description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water."
+ reagent_state = SOLID
+ color = "#A0A0A0" // rgb: 160, 160, 160
+
+
+/datum/reagent/sulfur
+ name = "Sulfur"
+ id = "sulfur"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#BF8C00" // rgb: 191, 140, 0
+
+
+/datum/reagent/sodium
+ name = "Sodium"
+ id = "sodium"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#808080" // rgb: 128, 128, 128
+
+
+/datum/reagent/phosphorus
+ name = "Phosphorus"
+ id = "phosphorus"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#832828" // rgb: 131, 40, 40
+
+
+/datum/reagent/carbon
+ name = "Carbon"
+ id = "carbon"
+ description = "A chemical element."
+ reagent_state = SOLID
+ color = "#1C1300" // rgb: 30, 20, 0
+
+/datum/reagent/carbon/reaction_turf(var/turf/T, var/volume)
+ src = null
+ // Only add one dirt per turf. Was causing people to crash.
+ if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T))
+ new /obj/effect/decal/cleanable/dirt(T)
+
+
+/datum/reagent/gold
+ name = "Gold"
+ id = "gold"
+ description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known."
+ reagent_state = SOLID
+ color = "#F7C430" // rgb: 247, 196, 48
+
+
+/datum/reagent/silver
+ name = "Silver"
+ id = "silver"
+ description = "A lustrous metallic element regarded as one of the precious metals."
+ reagent_state = SOLID
+ color = "#D0D0D0" // rgb: 208, 208, 208
+
+
+/datum/reagent/aluminum
+ name = "Aluminum"
+ id = "aluminum"
+ description = "A silvery white and ductile member of the boron group of chemical elements."
+ reagent_state = SOLID
+ color = "#A8A8A8" // rgb: 168, 168, 168
+
+
+/datum/reagent/silicon
+ name = "Silicon"
+ id = "silicon"
+ description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon."
+ reagent_state = SOLID
+ color = "#A8A8A8" // rgb: 168, 168, 168
+
+
+/datum/reagent/copper
+ name = "Copper"
+ id = "copper"
+ description = "A highly ductile metal."
+ color = "#6E3B08" // rgb: 110, 59, 8
+
+
+/datum/reagent/iron
+ name = "Iron"
+ id = "iron"
+ description = "Pure iron is a metal."
+ reagent_state = SOLID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+/*
+/datum/reagent/iron/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if((M.virus) && (prob(8) && (M.virus.name=="Magnitis")))
+ if(M.virus.spread == "Airborne")
+ M.virus.spread = "Remissive"
+ M.virus.stage--
+ if(M.virus.stage <= 0)
+ M.resistances += M.virus.type
+ M.virus = null
+ holder.remove_reagent(src.id, 0.2)
+ return
+*/
+
+
+
+//foam
+/datum/reagent/fluorosurfactant
+ name = "Fluorosurfactant"
+ id = "fluorosurfactant"
+ description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
+ reagent_state = LIQUID
+ color = "#9E6B38" // rgb: 158, 107, 56
+
+// metal foaming agent
+// this is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually
+/datum/reagent/ammonia
+ name = "Ammonia"
+ id = "ammonia"
+ description = "A caustic substance commonly used in fertilizer or household cleaners."
+ reagent_state = GAS
+ color = "#404030" // rgb: 64, 64, 48
+
+/datum/reagent/diethylamine
+ name = "Diethylamine"
+ id = "diethylamine"
+ description = "A secondary amine, useful as a plant nutrient and as building block for other compounds."
+ reagent_state = LIQUID
+ color = "#322D00"
+
+
+// Ported from Bay as part of the Botany Update
+// Allows you to make planks from any plant that has this reagent in it.
+// Also vines with this reagent are considered dense.
+/datum/reagent/woodpulp
+ name = "Wood Pulp"
+ id = "woodpulp"
+ description = "A mass of wood fibers."
+ reagent_state = LIQUID
+ color = "#B97A57"
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
new file mode 100644
index 00000000000..8e56b431ad1
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
@@ -0,0 +1,597 @@
+/datum/reagent/toxin
+ name = "Toxin"
+ id = "toxin"
+ description = "A Toxic chemical."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+/datum/reagent/toxin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(2)
+ ..()
+ return
+
+
+/datum/reagent/spider_venom
+ name = "Spider venom"
+ id = "spidertoxin"
+ description = "A toxic venom injected by spacefaring arachnids."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+/datum/reagent/spider_venom/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1.5)
+ ..()
+ return
+
+
+/datum/reagent/plasticide
+ name = "Plasticide"
+ id = "plasticide"
+ description = "Liquid plastic, do not eat."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+/datum/reagent/plasticide/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1.5)
+ ..()
+ return
+
+
+/datum/reagent/minttoxin
+ name = "Mint Toxin"
+ id = "minttoxin"
+ description = "Useful for dealing with undesirable customers."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+/datum/reagent/minttoxin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if (FAT in M.mutations)
+ M.gib()
+ ..()
+ return
+
+
+/datum/reagent/slimejelly
+ name = "Slime Jelly"
+ id = "slimejelly"
+ description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL."
+ reagent_state = LIQUID
+ color = "#801E28" // rgb: 128, 30, 40
+
+/datum/reagent/slimejelly/on_mob_life(var/mob/living/M as mob)
+ if(prob(10))
+ M << "\red Your insides are burning!"
+ M.adjustToxLoss(rand(20,60)*REM)
+ else if(prob(40))
+ M.heal_organ_damage(5*REM,0)
+ ..()
+ return
+
+/datum/reagent/slimetoxin
+ name = "Mutation Toxin"
+ id = "mutationtoxin"
+ description = "A corruptive toxin produced by slimes."
+ reagent_state = LIQUID
+ color = "#13BC5E" // rgb: 19, 188, 94
+
+/datum/reagent/slimetoxin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(ishuman(M))
+ var/mob/living/carbon/human/human = M
+ if(human.species.name != "Shadow")
+ M << "\red Your flesh rapidly mutates!"
+ M << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids."
+ M << "\red Your body reacts violently to light. \green However, it naturally heals in darkness."
+ M << "Aside from your new traits, you are mentally unchanged and retain your prior obligations."
+ human.set_species("Shadow")
+ ..()
+ return
+
+/datum/reagent/aslimetoxin
+ name = "Advanced Mutation Toxin"
+ id = "amutationtoxin"
+ description = "An advanced corruptive toxin produced by slimes."
+ 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/mercury
+ name = "Mercury"
+ id = "mercury"
+ description = "A chemical element."
+ reagent_state = LIQUID
+ color = "#484848" // rgb: 72, 72, 72
+ metabolization_rate = 0.2
+ penetrates_skin = 1
+
+/datum/reagent/mercury/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(70))
+ M.adjustBrainLoss(1)
+ ..()
+ return
+
+
+/datum/reagent/chlorine
+ name = "Chlorine"
+ id = "chlorine"
+ description = "A chemical element."
+ reagent_state = GAS
+ color = "#808080" // rgb: 128, 128, 128
+ penetrates_skin = 1
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/chlorine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustFireLoss(1)
+ ..()
+ return
+
+/datum/reagent/fluorine
+ name = "Fluorine"
+ id = "fluorine"
+ description = "A highly-reactive chemical element."
+ reagent_state = GAS
+ color = "#6A6054"
+ penetrates_skin = 1
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/fluorine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustFireLoss(1)
+ M.adjustToxLoss(1*REM)
+ ..()
+ return
+
+
+/datum/reagent/radium
+ name = "Radium"
+ id = "radium"
+ description = "Radium is an alkaline earth metal. It is extremely radioactive."
+ reagent_state = SOLID
+ color = "#C7C7C7" // rgb: 199,199,199
+ metabolization_rate = 0.4
+ penetrates_skin = 1
+
+/datum/reagent/radium/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.apply_effect(4*REM,IRRADIATE,0)
+ // 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,0) // 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
+ if(volume >= 3)
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/greenglow(T)
+ return
+
+
+/datum/reagent/mutagen
+ name = "Unstable mutagen"
+ id = "mutagen"
+ description = "Might cause unpredictable mutations. Keep away from children."
+ reagent_state = LIQUID
+ color = "#04DF27"
+ metabolization_rate = 0.3
+
+/datum/reagent/mutagen/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ if(!..()) return
+ if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
+ src = null
+ if((method==TOUCH && prob(33)) || method==INGEST)
+ if(prob(98))
+ randmutb(M)
+ else
+ randmutg(M)
+ domutcheck(M, null)
+ M.UpdateAppearance()
+ return
+
+/datum/reagent/mutagen/on_mob_life(var/mob/living/M as mob)
+ if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
+ if(!M) M = holder.my_atom
+ M.apply_effect(2*REM,IRRADIATE,0)
+ if(prob(4))
+ randmutb(M)
+ ..()
+ return
+
+
+/datum/reagent/uranium
+ name ="Uranium"
+ id = "uranium"
+ description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive."
+ reagent_state = SOLID
+ color = "#B8B8C0" // rgb: 184, 184, 192
+
+/datum/reagent/uranium/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.apply_effect(2,IRRADIATE,0)
+ ..()
+ return
+
+/datum/reagent/uranium/reaction_turf(var/turf/T, var/volume)
+ src = null
+ if(volume >= 3)
+ if(!istype(T, /turf/space))
+ new /obj/effect/decal/cleanable/greenglow(T)
+
+
+/datum/reagent/lexorin
+ name = "Lexorin"
+ id = "lexorin"
+ description = "Lexorin temporarily stops respiration. Causes tissue damage."
+ reagent_state = LIQUID
+ color = "#52685D"
+ metabolization_rate = 0.2
+
+/datum/reagent/lexorin/on_mob_life(var/mob/living/M as mob)
+ if(M.stat == 2.0)
+ return
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1)
+ ..()
+ return
+
+
+/datum/reagent/sacid
+ name = "Sulphuric acid"
+ id = "sacid"
+ description = "A strong mineral acid with the molecular formula H2SO4."
+ reagent_state = LIQUID
+ color = "#00D72B"
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/sacid/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustFireLoss(1)
+ ..()
+ return
+
+/datum/reagent/sacid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(volume > 25)
+
+ if(H.wear_mask)
+ H << "\red Your mask protects you from the acid!"
+ return
+
+ if(H.head)
+ H << "\red Your helmet protects you from the acid!"
+ return
+
+ if(!M.unacidable)
+ if(prob(75))
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.take_damage(20, 0)
+ H.UpdateDamageIcon()
+ H.emote("scream")
+ else
+ M.take_organ_damage(15,0)
+ else
+ M.take_organ_damage(15,0)
+
+ if(method == INGEST)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(volume < 10)
+ M << "The greenish acidic substance stings you, but isn't concentrated enough to harm you!"
+
+ if(volume >=10 && volume <=25)
+ if(!H.unacidable)
+ M.take_organ_damage(min(max(volume-10,2)*2,20),0)
+ M.emote("scream")
+
+
+ if(volume > 25)
+ if(!M.unacidable)
+ if(prob(75))
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.take_damage(20, 0)
+ H.UpdateDamageIcon()
+ H.emote("scream")
+ else
+ M.take_organ_damage(15,0)
+
+/datum/reagent/sacid/reaction_obj(var/obj/O, var/volume)
+ if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40))
+ if(!O.unacidable)
+ var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
+ I.desc = "Looks like this was \an [O] some time ago."
+ for(var/mob/M in viewers(5, O))
+ M << "\red \the [O] melts."
+ qdel(O)
+
+
+/datum/reagent/hellwater
+ name = "Hell Water"
+ id = "hell_water"
+ description = "YOUR FLESH! IT BURNS!"
+ process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
+
+/datum/reagent/hellwater/on_mob_life(var/mob/living/M as mob)
+ M.fire_stacks = min(5,M.fire_stacks + 3)
+ M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
+ M.adjustToxLoss(1)
+ M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard?
+ M.adjustBrainLoss(5)
+ holder.remove_reagent(src.id, 1)
+
+
+/datum/reagent/carpotoxin
+ name = "Carpotoxin"
+ id = "carpotoxin"
+ description = "A deadly neurotoxin produced by the dreaded spess carp."
+ reagent_state = LIQUID
+ color = "#003333" // rgb: 0, 51, 51
+
+/datum/reagent/carpotoxin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(2*REM)
+ ..()
+ return
+
+
+/datum/reagent/staminatoxin
+ name = "Tirizene"
+ id = "tirizene"
+ description = "A toxin that affects the stamina of a person when injected into the bloodstream."
+ reagent_state = LIQUID
+ color = "#6E2828"
+ data = 13
+
+/datum/reagent/staminatoxin/on_mob_life(var/mob/living/M)
+ M.adjustStaminaLoss(REM * data)
+ data = max(data - 1, 3)
+ ..()
+
+
+/datum/reagent/spores
+ name = "Spore Toxin"
+ id = "spores"
+ description = "A toxic spore cloud which blocks vision when ingested."
+ color = "#9ACD32"
+
+/datum/reagent/spores/on_mob_life(var/mob/living/M as mob)
+ M.adjustToxLoss(1)
+ M.damageoverlaytemp = 60
+ M.eye_blurry = max(M.eye_blurry, 3)
+ ..()
+ return
+
+
+/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots
+ name = "Beer"
+ id = "beer2"
+ description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/beer2/on_mob_life(var/mob/living/M as mob)
+ if(!data)
+ data = 1
+ switch(data)
+ if(1 to 50)
+ M.sleeping += 1
+ if(51 to INFINITY)
+ M.sleeping += 1
+ M.adjustToxLoss((data - 50)*REM)
+ data++
+ holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
+ ..()
+ return
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/*
+/datum/reagent/nanomachines
+ name = "Nanomachines"
+ id = "nanomachines"
+ description = "Microscopic construction robots."
+ reagent_state = LIQUID
+ color = "#535E66" // rgb: 83, 94, 102
+
+/datum/reagent/nanomachines/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ src = null
+ if( (prob(10) && method==TOUCH) || method==INGEST)
+ M.contract_disease(new /datum/disease/robotic_transformation(0),1)
+
+/datum/reagent/xenomicrobes
+ name = "Xenomicrobes"
+ id = "xenomicrobes"
+ description = "Microbes with an entirely alien cellular structure."
+ reagent_state = LIQUID
+ color = "#535E66" // rgb: 83, 94, 102
+
+/datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ src = null
+ if( (prob(10) && method==TOUCH) || method==INGEST)
+ M.contract_disease(new /datum/disease/xeno_transformation(0),1)
+*/
+
+/datum/reagent/spore
+ name = "Blob Spores"
+ id = "spore"
+ description = "Spores of some blob creature thingy."
+ reagent_state = LIQUID
+ color = "#CE760A" // rgb: 206, 118, 10
+ var/client/blob_client = null
+ var/blob_point_rate = 3
+
+/datum/reagent/spore/on_mob_life(var/mob/living/M)
+ if(!M) M = holder.my_atom
+ if (holder.has_reagent("atrazine",45))
+ holder.del_reagent("spore")
+ if (prob(1))
+ M << "\red Your mouth tastes funny."
+ if (prob(1) && prob(25))
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(directory[ckey(C.key)])
+ blob_client = directory[ckey(C.key)]
+ C.gib()
+ if(blob_client)
+ var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate)
+ if(core.overmind && core.overmind.mind)
+ core.overmind.mind.name = C.name
+
+ return
+
+/datum/reagent/condensedcapsaicin
+ name = "Condensed Capsaicin"
+ id = "condensedcapsaicin"
+ description = "This shit goes in pepperspray."
+ reagent_state = LIQUID
+ color = "#B31008" // rgb: 179, 16, 8
+
+/datum/reagent/condensedcapsaicin/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/victim = M
+ var/mouth_covered = 0
+ var/eyes_covered = 0
+ var/obj/item/safe_thing = null
+ if( victim.wear_mask )
+ if ( victim.wear_mask.flags & MASKCOVERSEYES )
+ eyes_covered = 1
+ safe_thing = victim.wear_mask
+ if ( victim.wear_mask.flags & MASKCOVERSMOUTH )
+ mouth_covered = 1
+ safe_thing = victim.wear_mask
+ if( victim.head )
+ if ( victim.head.flags & MASKCOVERSEYES )
+ eyes_covered = 1
+ safe_thing = victim.head
+ if ( victim.head.flags & MASKCOVERSMOUTH )
+ mouth_covered = 1
+ safe_thing = victim.head
+ if(victim.glasses)
+ eyes_covered = 1
+ if ( !safe_thing )
+ safe_thing = victim.glasses
+ if ( eyes_covered && mouth_covered )
+ victim << "\red Your [safe_thing] protects you from the pepperspray!"
+ return
+ else if ( mouth_covered ) // Reduced effects if partially protected
+ victim << "\red Your [safe_thing] protect you from most of the pepperspray!"
+ if(prob(5))
+ victim.emote("scream")
+ victim.eye_blurry = max(M.eye_blurry, 3)
+ victim.eye_blind = max(M.eye_blind, 1)
+ victim.confused = max(M.confused, 3)
+ victim.damageoverlaytemp = 60
+ victim.Weaken(3)
+ victim.drop_item()
+ return
+ else if ( eyes_covered ) // Eye cover is better than mouth cover
+ victim << "\red Your [safe_thing] protects your eyes from the pepperspray!"
+ victim.eye_blurry = max(M.eye_blurry, 3)
+ victim.damageoverlaytemp = 30
+ return
+ else // Oh dear :D
+ if(prob(5))
+ victim.emote("scream")
+ victim << "\red You're sprayed directly in the eyes with pepperspray!"
+ victim.eye_blurry = max(M.eye_blurry, 5)
+ victim.eye_blind = max(M.eye_blind, 2)
+ victim.confused = max(M.confused, 6)
+ victim.damageoverlaytemp = 75
+ victim.Weaken(5)
+ victim.drop_item()
+
+/datum/reagent/condensedcapsaicin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(5))
+ M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]")
+ ..()
+ return
+
+/datum/reagent/frostoil
+ name = "Frost Oil"
+ id = "frostoil"
+ description = "A special oil that noticably chills the body. Extraced from Icepeppers."
+ reagent_state = LIQUID
+ color = "#8BA6E9" // rgb: 139, 166, 233
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/frostoil/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(!data) data = 1
+ switch(data)
+ if(1 to 15)
+ M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(holder.has_reagent("capsaicin"))
+ holder.remove_reagent("capsaicin", 5)
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(5,20)
+ if(15 to 25)
+ M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(10,20)
+ if(25 to INFINITY)
+ M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(prob(1))
+ M.emote("shiver")
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(15,20)
+ data++
+ holder.remove_reagent(src.id, FOOD_METABOLISM)
+ ..()
+ return
+
+/datum/reagent/frostoil/reaction_turf(var/turf/simulated/T, var/volume)
+ for(var/mob/living/carbon/slime/M in T)
+ M.adjustToxLoss(rand(15,30))
diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm
new file mode 100644
index 00000000000..e7e57129177
--- /dev/null
+++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm
@@ -0,0 +1,351 @@
+/*
+// Frankly, this is just for chemicals that are sortof 'watery', which really didn't seem to fit under any other file
+// Current chems: Water, Space Lube, Space Cleaner, Blood, Fish Water, Holy water
+//
+//
+*/
+
+
+
+/datum/reagent/water
+ name = "Water"
+ id = "water"
+ description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
+ reagent_state = LIQUID
+ color = "#0064C8" // rgb: 0, 100, 200
+ var/cooling_temperature = 2
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+
+// Put out fire
+ if(method == TOUCH)
+ M.adjust_fire_stacks(-(volume / 10))
+ if(M.fire_stacks <= 0)
+ M.ExtinguishMob()
+ return
+
+/datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
+ if (!istype(T)) return
+ src = null
+ if(volume >= 3)
+ if(T.wet >= 1) return
+ T.wet = 1
+ if(T.wet_overlay)
+ T.overlays -= T.wet_overlay
+ T.wet_overlay = null
+ T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
+ T.overlays += T.wet_overlay
+
+ spawn(800)
+ if (!istype(T)) return
+ if(T.wet >= 2) return
+ T.wet = 0
+ if(T.wet_overlay)
+ T.overlays -= T.wet_overlay
+ T.wet_overlay = null
+
+ for(var/mob/living/carbon/slime/M in T)
+ M.apply_water()
+
+ var/hotspot = (locate(/obj/effect/hotspot) in T)
+ if(hotspot && !istype(T, /turf/space))
+ var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
+ lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
+ lowertemp.react()
+ T.assume_air(lowertemp)
+ qdel(hotspot)
+ return
+
+/datum/reagent/water/reaction_obj(var/obj/O, var/volume)
+ src = null
+ var/turf/T = get_turf(O)
+ var/hotspot = (locate(/obj/effect/hotspot) in T)
+ if(hotspot && !istype(T, /turf/space))
+ var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
+ lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
+ lowertemp.react()
+ T.assume_air(lowertemp)
+ qdel(hotspot)
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
+ var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
+ if(!cube.wrapped)
+ cube.Expand()
+ // Dehydrated carp
+ if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
+ var/obj/item/toy/carpplushie/dehy_carp/dehy = O
+ dehy.Swell() // Makes a carp
+ return
+
+
+/datum/reagent/lube
+ name = "Space Lube"
+ id = "lube"
+ description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity."
+ reagent_state = LIQUID
+ color = "#1BB1AB"
+
+/datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume)
+ if (!istype(T)) return
+ src = null
+ if(volume >= 1)
+ if(T.wet >= 2) return
+ T.wet = 2
+ spawn(800)
+ if (!istype(T)) return
+ T.wet = 0
+ if(T.wet_overlay)
+ T.overlays -= T.wet_overlay
+ T.wet_overlay = null
+ return
+
+
+/datum/reagent/space_cleaner
+ name = "Space cleaner"
+ id = "cleaner"
+ description = "A compound used to clean things. Now with 50% more sodium hypochlorite!"
+ reagent_state = LIQUID
+ color = "#61C2C2"
+
+/datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume)
+ if(O && !istype(O, /atom/movable/lighting_overlay))
+ O.color = initial(O.color)
+ if(istype(O,/obj/effect/decal/cleanable))
+ qdel(O)
+ else
+ if(O)
+ O.clean_blood()
+
+/datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
+ if(volume >= 1)
+ if(T)
+ T.color = initial(T.color)
+ T.overlays.Cut()
+ T.clean_blood()
+ for(var/obj/effect/decal/cleanable/C in src)
+ qdel(C)
+
+ for(var/mob/living/carbon/slime/M in T)
+ M.adjustToxLoss(rand(5,10))
+ if(istype(T,/turf/simulated))
+ var/turf/simulated/S = T
+ S.dirt = 0
+
+/datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(istype(M,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.lip_style)
+ H.lip_style = null
+ H.update_body()
+ if(C.r_hand)
+ C.r_hand.clean_blood()
+ if(C.l_hand)
+ C.l_hand.clean_blood()
+ if(C.wear_mask)
+ if(C.wear_mask.clean_blood())
+ C.update_inv_wear_mask(0)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = C
+ if(H.head)
+ if(H.head.clean_blood())
+ H.update_inv_head(0,0)
+ if(H.wear_suit)
+ if(H.wear_suit.clean_blood())
+ H.update_inv_wear_suit(0,0)
+ else if(H.w_uniform)
+ if(H.w_uniform.clean_blood())
+ H.update_inv_w_uniform(0,0)
+ if(H.shoes)
+ if(H.shoes.clean_blood())
+ H.update_inv_shoes(0,0)
+ M.clean_blood()
+ ..()
+ return
+
+
+/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)
+ 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]
+
+ 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"]
+
+/datum/reagent/blood/on_merge(var/data)
+ if(data["blood_colour"])
+ color = data["blood_colour"]
+ return ..()
+
+/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
+ if(!(volume >= 3)) return
+ //var/datum/disease/D = self.data["virus"]
+ if(!self.data["donor"] || istype(self.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[self.data["blood_DNA"]] = self.data["blood_type"]
+
+ if(self.data["virus2"])
+ blood_prop.virus2 = virus_copylist(self.data["virus2"])
+
+ else if(istype(self.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
+
+
+/datum/reagent/fishwater
+ name = "Fish Water"
+ id = "fishwater"
+ description = "Smelly water from a fish tank. Gross!"
+ reagent_state = LIQUID
+ color = "#757547"
+
+/datum/reagent/fishwater/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+ if(method == INGEST)
+ M << "Oh god, why did you drink that?"
+
+/datum/reagent/fishwater/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(30)) // Nasty, you drank this stuff? 30% chance of the fakevomit (non-stunning version)
+ if(prob(50)) // 50/50 chance of green vomit vs normal vomit
+ M.fakevomit(1)
+ else
+ M.fakevomit(0)
+ ..()
+ return
+
+
+/datum/reagent/holywater
+ name = "Water"
+ id = "holywater"
+ description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
+ reagent_state = LIQUID
+ color = "#0064C8" // rgb: 0, 100, 200
+ process_flags = ORGANIC | SYNTHETIC
+
+/datum/reagent/holywater/on_mob_life(var/mob/living/M as mob)
+ if(!data) data = 1
+ data++
+ M.jitteriness = max(M.jitteriness-5,0)
+ if(data >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec
+ if (!M.stuttering) M.stuttering = 1
+ M.stuttering += 4
+ M.Dizzy(5)
+ if(iscultist(M) && prob(5))
+ M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
+ if(data >= 75 && prob(33)) // 30 units, 150 seconds
+ if (!M.confused) M.confused = 1
+ M.confused += 3
+ if(iscultist(M))
+ ticker.mode.remove_cultist(M.mind)
+ holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
+ M.jitteriness = 0
+ M.stuttering = 0
+ M.confused = 0
+ if(ishuman(M)) .
+ if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers)) && prob(80))
+ switch(data)
+ if(1 to 4)
+ M << "Something sizzles in your veins!"
+ M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ if(5 to 12)
+ M << "You feel an intense burning inside of you!"
+ M.adjustFireLoss(1)
+ M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ if(13 to INFINITY)
+ M << "You suddenly ignite in a holy fire!"
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("[] suddenly bursts into flames!", M), 1)
+ M.fire_stacks = min(5,M.fire_stacks + 3)
+ M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
+ M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard?
+ M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ ..()
+ return
+
+
+/datum/reagent/holywater/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ // Vampires have their powers weakened by holy water applied to the skin.
+ if(ishuman(M))
+ if((M.mind in ticker.mode.vampires) && !(VAMP_FULL in M.mind.vampire.powers))
+ var/mob/living/carbon/human/H=M
+ if(method == TOUCH)
+ if(H.wear_mask)
+ H << "\red Your mask protects you from the holy water!"
+ return
+ else if(H.head)
+ H << "\red Your helmet protects you from the holy water!"
+ return
+ else
+ M << "Something holy interferes with your powers!"
+ M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ return
+
+
+/datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume)
+ ..()
+ if(!istype(T)) return
+ if(volume>=10)
+ for(var/obj/effect/rune/R in T)
+ qdel(R)
+ T.Bless()
+
+/*
+/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/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index 205837633de..b02289784a6 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -37,7 +37,7 @@
if(!target)
return
- if(user.a_intent != "harm" || !isGlass)
+ if(user.a_intent != I_HARM || !isGlass)
return ..()
diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm
index 0338cc9ff89..74d939bb49a 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm
@@ -27,7 +27,7 @@
if(!target)
return
- if(user.a_intent != "harm")
+ if(user.a_intent != I_HARM)
return ..()
force = 5
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 408076341ee..2a0d82d3a03 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -62,7 +62,7 @@
user << "\red This syringe is broken!"
return
-/* if (user.a_intent == "harm" && ismob(target))
+/* if (user.a_intent == I_HARM && ismob(target))
if((CLUMSY in user.mutations) && prob(50))
target = user
syringestab(target, user)
@@ -168,7 +168,7 @@
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "\red [target] is full."
return
-
+
var/mob/living/carbon/human/H = target
if(istype(H))
var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
@@ -528,3 +528,14 @@
reagents.add_reagent("insulin", 15)
mode = SYRINGE_INJECT
update_icon()
+
+/obj/item/weapon/reagent_containers/syringe/bioterror
+ name = "bioterror syringe"
+ desc = "Contains several paralyzing reagents."
+ New()
+ ..()
+ reagents.add_reagent("neurotoxin", 5)
+ reagents.add_reagent("capulettium_plus", 5)
+ reagents.add_reagent("sodium_thiopental", 5)
+ mode = SYRINGE_INJECT
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index cd306a78e49..6c3b0db41e0 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -12,60 +12,60 @@
var/amount_per_transfer_from_this = 10
var/possible_transfer_amounts = list(10,25,50,100)
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ return
+
+/obj/structure/reagent_dispensers/New()
+ var/datum/reagents/R = new/datum/reagents(1000)
+ reagents = R
+ R.my_atom = src
+ if (!possible_transfer_amounts)
+ src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
+ ..()
+
+/obj/structure/reagent_dispensers/examine()
+ set src in view()
+ ..()
+ if (!(usr in view(2)) && usr!=src.loc) return
+ usr << "\blue It contains:"
+ if(reagents && reagents.reagent_list.len)
+ for(var/datum/reagent/R in reagents.reagent_list)
+ usr << "\blue [R.volume] units of [R.name]"
+ else
+ usr << "\blue Nothing."
+
+/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
+ set name = "Set transfer amount"
+ set category = "Object"
+ set src in view(1)
+ if(usr.stat || !usr.canmove || usr.restrained())
return
+ var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
+ if (N)
+ amount_per_transfer_from_this = N
- New()
- var/datum/reagents/R = new/datum/reagents(1000)
- reagents = R
- R.my_atom = src
- if (!possible_transfer_amounts)
- src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
- ..()
-
- examine()
- set src in view()
- ..()
- if (!(usr in view(2)) && usr!=src.loc) return
- usr << "\blue It contains:"
- if(reagents && reagents.reagent_list.len)
- for(var/datum/reagent/R in reagents.reagent_list)
- usr << "\blue [R.volume] units of [R.name]"
- else
- usr << "\blue Nothing."
-
- verb/set_APTFT() //set amount_per_transfer_from_this
- set name = "Set transfer amount"
- set category = "Object"
- set src in view(1)
- if(usr.stat || !usr.canmove || usr.restrained())
+/obj/structure/reagent_dispensers/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
return
- var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
- if (N)
- amount_per_transfer_from_this = N
-
- ex_act(severity)
- switch(severity)
- if(1.0)
+ if(2.0)
+ if (prob(50))
+ new /obj/effect/effect/water(src.loc)
qdel(src)
return
- if(2.0)
- if (prob(50))
- new /obj/effect/effect/water(src.loc)
- qdel(src)
- return
- if(3.0)
- if (prob(5))
- new /obj/effect/effect/water(src.loc)
- qdel(src)
- return
- else
- return
+ if(3.0)
+ if (prob(5))
+ new /obj/effect/effect/water(src.loc)
+ qdel(src)
+ return
+ else
+ return
- blob_act()
- if(prob(50))
- new /obj/effect/effect/water(src.loc)
- qdel(src)
+/obj/structure/reagent_dispensers/blob_act()
+ if(prob(50))
+ new /obj/effect/effect/water(src.loc)
+ qdel(src)
@@ -80,9 +80,11 @@
icon = 'icons/obj/objects.dmi'
icon_state = "watertank"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("water",1000)
+
+/obj/structure/reagent_dispensers/watertank/New()
+ ..()
+ reagents.add_reagent("water",1000)
+
/obj/structure/reagent_dispensers/fueltank
name = "fueltank"
@@ -91,22 +93,23 @@
icon_state = "weldtank"
amount_per_transfer_from_this = 10
var/obj/item/device/assembly_holder/rig = null
- New()
- ..()
- reagents.add_reagent("fuel",1000)
- bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
- if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
- message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.")
- log_game("[key_name(Proj.firer)] triggered a fueltank explosion.")
- explode()
+/obj/structure/reagent_dispensers/fueltank/New()
+ ..()
+ reagents.add_reagent("fuel",1000)
- blob_act()
- explosion(src.loc,0,1,5,7,10, flame_range = 5)
+/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
+ if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
+ message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion.")
+ log_game("[key_name(Proj.firer)] triggered a fueltank explosion.")
+ explode()
- ex_act()
- explode()
+/obj/structure/reagent_dispensers/fueltank/blob_act()
+ explosion(src.loc,0,1,5,7,10, flame_range = 5)
+
+/obj/structure/reagent_dispensers/fueltank/ex_act()
+ explode()
/obj/structure/reagent_dispensers/fueltank/examine()
set src in view()
@@ -180,6 +183,7 @@
if(rig)
rig.process_movement()
+
/obj/structure/reagent_dispensers/peppertank
name = "Pepper Spray Refiller"
desc = "Refill pepper spray canisters."
@@ -188,9 +192,10 @@
anchored = 1
density = 0
amount_per_transfer_from_this = 45
- New()
- ..()
- reagents.add_reagent("condensedcapsaicin",1000)
+
+/obj/structure/reagent_dispensers/peppertank/New()
+ ..()
+ reagents.add_reagent("condensedcapsaicin",1000)
/obj/structure/reagent_dispensers/water_cooler
@@ -201,9 +206,10 @@
icon_state = "water_cooler"
possible_transfer_amounts = null
anchored = 1
- New()
- ..()
- reagents.add_reagent("water",500)
+
+/obj/structure/reagent_dispensers/water_cooler/New()
+ ..()
+ reagents.add_reagent("water",500)
/obj/structure/reagent_dispensers/beerkeg
@@ -212,9 +218,10 @@
icon = 'icons/obj/objects.dmi'
icon_state = "beertankTEMP"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("beer",1000)
+
+/obj/structure/reagent_dispensers/beerkeg/New()
+ ..()
+ reagents.add_reagent("beer",1000)
/obj/structure/reagent_dispensers/beerkeg/blob_act()
explosion(src.loc,0,3,5,7,10)
@@ -229,9 +236,9 @@
anchored = 1
density = 0
- New()
- ..()
- reagents.add_reagent("virusfood", 1000)
+/obj/structure/reagent_dispensers/virusfood/New()
+ ..()
+ reagents.add_reagent("virusfood", 1000)
/obj/structure/reagent_dispensers/spacecleanertank
name = "space cleaner refiller"
@@ -241,6 +248,7 @@
anchored = 1
density = 0
amount_per_transfer_from_this = 250
- New()
- ..()
- reagents.add_reagent("cleaner",5000)
+
+/obj/structure/reagent_dispensers/spacecleanertank/New()
+ ..()
+ reagents.add_reagent("cleaner",5000)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index e458feb1fb5..3ce13d94677 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -22,7 +22,7 @@ The currently supporting non-reagent materials:
Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials.
Design Guidlines
-- The reliability formula for all R&D built items is reliability_base (a fixed number) + total tech levels required to make it +
+- The reliability formula for all R&D built items is reliability (a fixed number) + total tech levels required to make it +
reliability_mod (starts at 0, gets improved through experimentation). Example: PACMAN generator. 79 base reliablity + 6 tech
(3 plasmatech, 3 powerstorage) + 0 (since it's completely new) = 85% reliability. Reliability is the chance it works CORRECTLY.
- When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed.
@@ -38,8 +38,6 @@ other types of metals and chemistry for reagents).
var/desc = "Desc" //Description of the created object.
var/id = "id" //ID of the created object for easy refernece. Alphanumeric, lower-case, no symbols
var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements.
- var/reliability_mod = 0 //Reliability modifier of the device at it's starting point.
- var/reliability_base = 100 //Base reliability of a device before modifiers.
var/reliability = 100 //Reliability of the device.
var/build_type = null //Flag as to what kind machine the design is built in. See defines.
var/list/materials = list() //List of materials. Format: "id" = amount.
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 247bfdf25d8..90cebcf4648 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -162,6 +162,14 @@
build_path = /obj/item/device/assembly/infra
category = list("initial", "Miscellaneous")
+/datum/design/health_sensor
+ name = "Health sensor"
+ id = "health_sensor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/device/assembly/health
+ category = list("initial", "Medical")
+
/datum/design/kitchen_knife
name = "Kitchen knife"
id = "kitchen_knife"
@@ -546,3 +554,19 @@
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun
category = list("hacked", "Security")
+
+/datum/design/desttagger
+ name = "Destination tagger"
+ id = "desttagger"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 250, MAT_GLASS = 125)
+ build_path = /obj/item/device/destTagger
+ category = list("initial", "Electronics")
+
+/datum/design/handlabeler
+ name = "Hand labeler"
+ id = "handlabel"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150, MAT_GLASS = 125)
+ build_path = /obj/item/weapon/hand_labeler
+ category = list("initial", "Electronics")
\ No newline at end of file
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index 13a1923c76f..06e6d3cd257 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -8,7 +8,7 @@
req_tech = list("bluespace" = 4, "materials" = 6)
build_type = PROTOLATHE
materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500)
- reliability_base = 100
+ reliability = 100
build_path = /obj/item/bluespace_crystal/artificial
category = list("Bluespace")
@@ -19,7 +19,7 @@
req_tech = list("bluespace" = 4, "materials" = 6)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250)
- reliability_base = 80
+ reliability = 80
build_path = /obj/item/weapon/storage/backpack/holding
category = list("Bluespace")
@@ -30,7 +30,7 @@
req_tech = list("bluespace" = 4, "materials" = 6)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 1500, MAT_DIAMOND = 3000, MAT_URANIUM = 1000)
- reliability_base = 80
+ reliability = 80
build_path = /obj/item/weapon/storage/belt/bluespace
category = list("Bluespace")
@@ -41,7 +41,7 @@
req_tech = list("bluespace" = 2, "materials" = 6)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500)
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
category = list("Medical")
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index cf945134663..2f46ef2532f 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -8,7 +8,7 @@
req_tech = list("biotech" = 2, "magnets" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability_base = 74
+ reliability = 74
build_path = "/obj/item/device/mass_spectrometer/adv"
category = list("Medical")
@@ -19,7 +19,7 @@
req_tech = list("biotech" = 2, "magnets" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability_base = 74
+ reliability = 74
build_path = /obj/item/device/reagent_scanner/adv
category = list("Medical")
@@ -30,7 +30,7 @@
req_tech = list("materials" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000)
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
category = list("Medical")
@@ -41,7 +41,7 @@
req_tech = list("programming" = 2, "biotech" = 2, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/device/robotanalyzer
category = list("Medical")
@@ -84,7 +84,7 @@
req_tech = list("biotech" = 4, "magnets" = 3, "materials" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/device/sensor_device
category = list("Medical")
@@ -96,7 +96,7 @@
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
construction_time = 75
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/device/mmi
category = list("Misc","Medical")
@@ -107,17 +107,19 @@
req_tech = list("biotech" = 2, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/device/mass_spectrometer
category = list("Medical")
/datum/design/posibrain
name = "Positronic Brain"
- desc = "Allows for the construction of a positronic brain"
- id = "posibrain"
- req_tech = list("engineering" = 4, "materials" = 6, "bluespace" = 2, "programming" = 4)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 2000, MAT_GLASS = 1000, MAT_SILVER = 1000, MAT_GOLD = 500, MAT_PLASMA = 500, MAT_DIAMOND = 100)
+ desc = "The latest in Artificial Intelligences."
+ id = "mmi_posi"
+ req_tech = list("programming" = 5, "biotech" = 4)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG.
+ reliability = 74
+ construction_time = 75
build_path = /obj/item/device/mmi/posibrain
category = list("Misc","Medical")
@@ -129,7 +131,7 @@
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 1200, MAT_GLASS = 500)
construction_time = 75
- reliability_base = 74
+ reliability = 74
build_path = /obj/item/device/mmi/radio_enabled
category = list("Misc","Medical")
@@ -150,7 +152,7 @@
req_tech = list("biotech" = 2, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/device/reagent_scanner
category = list("Medical")
@@ -162,7 +164,7 @@
build_type = MECHFAB
materials = list(MAT_METAL = 750, MAT_GLASS = 750)
construction_time = 100
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/device/flash/synthetic
category = list("Misc")
@@ -204,4 +206,48 @@
build_type = PROTOLATHE
materials = list (MAT_METAL = 12500, MAT_GLASS = 7500, MAT_SILVER = 1500, MAT_GOLD = 1500, MAT_DIAMOND = 750)
build_path = /obj/item/weapon/scalpel/manager
+ category = list("Medical")
+
+/////////////////////////////////////////
+////////////Regular Implants/////////////
+/////////////////////////////////////////
+
+/datum/design/implanter
+ name = "Implanter"
+ desc = "A sterile automatic implant injector."
+ id = "implanter"
+ req_tech = list("materials" = 1, "programming" = 2, "biotech" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600, MAT_GLASS = 200)
+ build_path = /obj/item/weapon/implanter
+ category = list("Medical")
+
+/datum/design/implantcase
+ name = "Implant Case"
+ desc = "A glass case containing an implant."
+ id = "implantcase"
+ req_tech = list("materials" = 1, "biotech" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 500)
+ build_path = /obj/item/weapon/implantcase
+ category = list("Medical")
+
+/datum/design/implant_freedom
+ name = "Freedom Implant Case"
+ desc = "A glass case containing an implant."
+ id = "implant_freedom"
+ req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "syndicate" = 5)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 250)
+ build_path = /obj/item/weapon/implantcase/freedom
+ category = list("Medical")
+
+/datum/design/implant_adrenalin
+ name = "Adrenalin Implant Case"
+ desc = "A glass case containing an implant."
+ id = "implant_adrenalin"
+ req_tech = list("materials" = 2, "biotech" = 5, "combat" = 3, "syndicate" = 6)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 50, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 100, MAT_DIAMOND = 200)
+ build_path = /obj/item/weapon/implantcase/adrenaline
category = list("Medical")
\ No newline at end of file
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index 32a4012926f..1fc7a9075b6 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -8,7 +8,7 @@
req_tech = list("materials" = 6, "powerstorage" = 4, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 3750) //Yes, a whole diamond is needed.
- reliability_base = 79
+ reliability = 79
build_path = /obj/item/weapon/pickaxe/drill/diamonddrill
category = list("Mining")
@@ -39,7 +39,7 @@
req_tech = list("materials" = 2, "plasmatech" = 2, "engineering" = 2, "combat" = 1, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 1500, MAT_GLASS = 500, MAT_GOLD = 500, MAT_PLASMA = 500)
- reliability_base = 79
+ reliability = 79
build_path = /obj/item/weapon/gun/energy/plasmacutter
category = list("Mining")
@@ -50,7 +50,7 @@
req_tech = list("materials" = 4, "plasmatech" = 3, "engineering" = 3, "combat" = 3, "magnets" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_PLASMA = 2000, MAT_GOLD = 500)
- reliability_base = 79
+ reliability = 79
build_path = /obj/item/weapon/gun/energy/plasmacutter/adv
category = list("Mining")
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 9fb7000bf52..0bcbda4eac2 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -29,7 +29,7 @@
desc = "A power cell that holds 30000 units of energy"
id = "hyper_cell"
req_tech = list("powerstorage" = 5, "materials" = 4)
- reliability_base = 70
+ reliability = 70
build_type = PROTOLATHE | MECHFAB | PODFAB
materials = list(MAT_METAL = 400, MAT_GOLD = 150, MAT_SILVER = 150, MAT_GLASS = 70)
construction_time=100
@@ -41,7 +41,7 @@
desc = "A power cell that holds 20000 units of energy"
id = "super_cell"
req_tech = list("powerstorage" = 3, "materials" = 2)
- reliability_base = 75
+ reliability = 75
build_type = PROTOLATHE | MECHFAB | PODFAB
materials = list(MAT_METAL = 700, MAT_GLASS = 70)
construction_time=100
@@ -53,7 +53,7 @@
desc = "A power cell that holds 40000 units of energy."
id = "bluespace_cell"
req_tech = list("powerstorage" = 6, "materials" = 5)
- reliability_base = 70
+ reliability = 70
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 800, MAT_GOLD = 300, MAT_SILVER = 300, MAT_GLASS = 160, MAT_DIAMOND = 160)
construction_time=100
@@ -66,7 +66,7 @@
id = "pacman"
req_tech = list("programming" = 3, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3)
build_type = IMPRINTER
- reliability_base = 79
+ reliability = 79
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/pacman
category = list("Engineering Machinery")
@@ -77,7 +77,7 @@
id = "mrspacman"
req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5)
build_type = IMPRINTER
- reliability_base = 74
+ reliability = 74
materials = list(MAT_GLASS = 2000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/pacman/mrs
category = list("Engineering Machinery")
@@ -88,7 +88,7 @@
id = "superpacman"
req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4)
build_type = IMPRINTER
- reliability_base = 76
+ reliability = 76
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/pacman/super
category = list("Engineering Machinery")
diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm
index fcfc62012ea..c3e8ea38c96 100644
--- a/code/modules/research/designs/stock_parts_designs.dm
+++ b/code/modules/research/designs/stock_parts_designs.dm
@@ -108,7 +108,7 @@
id = "super_capacitor"
req_tech = list("powerstorage" = 5, "materials" = 4)
build_type = PROTOLATHE
- reliability_base = 71
+ reliability = 71
materials = list(MAT_METAL = 50, MAT_GLASS = 50, MAT_GOLD = 20)
build_path = /obj/item/weapon/stock_parts/capacitor/super
category = list("Stock Parts")
@@ -120,7 +120,7 @@
req_tech = list("magnets" = 5, "materials" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20, MAT_SILVER = 10)
- reliability_base = 72
+ reliability = 72
build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
category = list("Stock Parts")
@@ -131,7 +131,7 @@
req_tech = list("materials" = 5, "programming" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 30)
- reliability_base = 73
+ reliability = 73
build_path = /obj/item/weapon/stock_parts/manipulator/pico
category = list("Stock Parts")
@@ -142,7 +142,7 @@
req_tech = list("magnets" = 5, "materials" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 20, MAT_URANIUM = 10)
- reliability_base = 70
+ reliability = 70
build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
category = list("Stock Parts")
@@ -153,7 +153,7 @@
req_tech = list("materials" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 80)
- reliability_base = 75
+ reliability = 75
build_path = /obj/item/weapon/stock_parts/matter_bin/super
category = list("Stock Parts")
@@ -163,7 +163,7 @@
id = "quadratic_capacitor"
req_tech = list("powerstorage" = 6, "materials" = 5)
build_type = PROTOLATHE
- reliability_base = 71
+ reliability = 71
materials = list(MAT_METAL = 100, MAT_GLASS = 100, MAT_DIAMOND = 40)
build_path = /obj/item/weapon/stock_parts/capacitor/quadratic
category = list("Stock Parts")
@@ -175,7 +175,7 @@
req_tech = list("magnets" = 6, "materials" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 40, MAT_DIAMOND = 20)
- reliability_base = 72
+ reliability = 72
build_path = /obj/item/weapon/stock_parts/scanning_module/triphasic
category = list("Stock Parts")
@@ -186,7 +186,7 @@
req_tech = list("materials" = 6, "programming" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 60, MAT_DIAMOND = 30)
- reliability_base = 73
+ reliability = 73
build_path = /obj/item/weapon/stock_parts/manipulator/femto
category = list("Stock Parts")
@@ -197,7 +197,7 @@
req_tech = list("magnets" = 6, "materials" = 6)
build_type = PROTOLATHE
materials = list(MAT_METAL = 20, MAT_GLASS = 40, MAT_URANIUM = 20, MAT_DIAMOND = 20)
- reliability_base = 70
+ reliability = 70
build_path = /obj/item/weapon/stock_parts/micro_laser/quadultra
category = list("Stock Parts")
@@ -208,7 +208,7 @@
req_tech = list("materials" = 6)
build_type = PROTOLATHE
materials = list(MAT_METAL = 160, MAT_DIAMOND = 200)
- reliability_base = 75
+ reliability = 75
build_path = /obj/item/weapon/stock_parts/matter_bin/bluespace
category = list("Stock Parts")
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index e750275ef4e..3482547f113 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -9,7 +9,7 @@
req_tech = list("combat" = 4, "materials" = 5, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 2000)
- reliability_base = 76
+ reliability = 76
build_path = /obj/item/weapon/gun/energy/gun/nuclear
locked = 1
category = list("Weapons")
@@ -35,6 +35,7 @@
build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large
locked = 1
category = list("Weapons")
+ reliability = 76
/datum/design/flora_gun
name = "Floral Somatoray"
@@ -64,7 +65,7 @@
req_tech = list("combat" = 3, "materials" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000)
- reliability_base = 79
+ reliability = 79
build_path = /obj/item/weapon/grenade/chem_grenade/large
category = list("Weapons")
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index b9c5487ca42..ff498b9f511 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -49,7 +49,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/id = 0 //ID of the computer (for server restrictions).
var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console
- req_access = list(access_research) //Data and setting manipulation requires scientist access.
+ req_access = list(access_tox) //Data and setting manipulation requires scientist access.
var/selected_category
var/list/datum/design/matching_designs = list() //for the search function
@@ -162,11 +162,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D
else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D
else
- user << " Machine cannot accept disks in that format."
+ user << "Machine cannot accept disks in that format."
+ return
+ if(!user.drop_item())
return
- user.drop_item()
D.loc = src
- user << " You add the disk to the machine!"
+ user << "You add the disk to the machine!"
else
..()
src.updateUsrDialog()
@@ -270,7 +271,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder.
if(linked_destroy)
if(linked_destroy.busy)
- usr << " The destructive analyzer is busy at the moment."
+ usr << "The destructive analyzer is busy at the moment."
else
var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel")
if(choice == "Cancel" || !linked_destroy) return
@@ -283,7 +284,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_destroy.busy = 0
if(!linked_destroy.hacked)
if(!linked_destroy.loaded_item)
- usr <<" The destructive analyzer appears to be empty."
+ usr <<"The destructive analyzer appears to be empty."
screen = 1.0
return
if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail)
@@ -328,7 +329,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected.
screen = 0.0
if(!sync)
- usr << " You must connect to the network first!"
+ usr << "You must connect to the network first!"
else
griefProtection() //Putting this here because I dont trust the sync process
spawn(30)
@@ -425,7 +426,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_lathe.reagents.remove_reagent(M, being_built.materials[M]/coeff * amount)
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
- var/R = being_built.reliability
var/O = being_built.locked
spawn(32*amount/coeff)
if(g2g) //And if we only fail the material requirements, we still spend time and power
@@ -433,11 +433,9 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/obj/item/new_item = new P(src)
if( new_item.type == /obj/item/weapon/storage/backpack/holding )
new_item.investigate_log("built by [key]","singulo")
- new_item.reliability = R
+ new_item.reliability = 100
new_item.materials[MAT_METAL] /= coeff
new_item.materials[MAT_GLASS] /= coeff
- if(linked_lathe.hacked)
- R = max((new_item.reliability/2), 0)
if(O)
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
new_item.loc = L
@@ -492,11 +490,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]/coeff)
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
- var/R = being_built.reliability
spawn(16)
if(g2g)
var/obj/item/new_item = new P(src)
- new_item.reliability = R
+ new_item.reliability = 100
new_item.loc = linked_imprinter.loc
linked_imprinter.busy = 0
screen = old_screen
@@ -736,11 +733,14 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Load Design to Disk"
else
dat += "Name: [d_disk.blueprint.name]
"
- dat += "Level: [Clamp((d_disk.blueprint.reliability + rand(-15,15)), 0, 100)]
"
- switch(d_disk.blueprint.build_type)
- if(IMPRINTER) dat += "Lathe Type: Circuit Imprinter
"
- if(PROTOLATHE) dat += "Lathe Type: Proto-lathe
"
- if(AUTOLATHE) dat += "Lathe Type: Auto-lathe
"
+ dat += "Level: [d_disk.blueprint.reliability]
"
+ var/b_type = d_disk.blueprint.build_type
+ if(b_type)
+ dat += "Lathe Types:
"
+ if(b_type & IMPRINTER) dat += "Circuit Imprinter
"
+ if(b_type & PROTOLATHE) dat += "Proto-lathe
"
+ if(b_type & AUTOLATHE) dat += "Auto-lathe
"
+ if(b_type & MECHFAB) dat += "Mech Fabricator
"
dat += "Required Materials:
"
for(var/M in d_disk.blueprint.materials)
if(copytext(M, 1, 2) == "$") dat += "* [copytext(M, 2)] x [d_disk.blueprint.materials[M]]
"
@@ -813,7 +813,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Origin Tech:
"
var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
for(var/T in temp_tech)
- dat += "* [CallTechName(T)] [temp_tech[T]]
"
+ dat += "* [CallTechName(T)] [temp_tech[T]]"
+ for(var/datum/tech/F in files.known_tech)
+ if(F.name == CallTechName(T))
+ dat += " (Current: [F.level])"
+ break
+ dat += "
"
dat += "Options: "
dat += "Deconstruct Item"
dat += "Eject Item"
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index bf27e538294..c34124af594 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -101,8 +101,8 @@ research holder datum.
/datum/research/proc/AddDesign2Known(var/datum/design/D)
for(var/datum/design/known in known_designs)
if(D.id == known.id)
- if(D.reliability_mod > known.reliability_mod)
- known.reliability_mod = D.reliability_mod
+ if(D.reliability > known.reliability)
+ known.reliability = D.reliability
return
known_designs += D
return
@@ -117,7 +117,7 @@ research holder datum.
if(DesignHasReqs(PD))
AddDesign2Known(PD)
for(var/datum/tech/T in known_tech)
- T = between(1,T.level,20)
+ T = Clamp(T.level, 1, 20)
for(var/datum/design/D in known_designs)
D.CalcReliability(known_tech)
return
@@ -127,7 +127,8 @@ research holder datum.
/datum/research/proc/UpdateTech(var/ID, var/level)
for(var/datum/tech/KT in known_tech)
if(KT.id == ID)
- if(KT.level <= level) KT.level = max((KT.level + 1), (level - 1))
+ if(KT.level <= level)
+ KT.level = max((KT.level + 1), (level - 1))
return
/datum/research/proc/UpdateDesigns(var/obj/item/I, var/list/temp_tech)
@@ -172,6 +173,7 @@ datum/tech //Datum of individual technologies.
var/id = "id" //An easily referenced ID. Must be alphanumeric, lower-case, and no symbols.
var/level = 1 //A simple number scale of the research level. Level 0 = Secret tech.
var/max_level = 1 // Maximum level this can be at (for job objectives)
+ var/rare = 1 //How much CentCom wants to get that tech. Used in supply shuttle tech cost calculation.
var/list/req_tech = list() //List of ids associated values of techs required to research this tech. "id" = #
@@ -194,6 +196,7 @@ datum/tech/plasmatech
desc = "Research into the mysterious substance colloqually known as 'plasma'."
id = "plasmatech"
max_level = 4
+ rare = 3
datum/tech/powerstorage
name = "Power Manipulation Technology"
@@ -206,6 +209,7 @@ datum/tech/bluespace
desc = "Research into the sub-reality known as 'blue-space'"
id = "bluespace"
max_level = 6
+ rare = 2
datum/tech/biotech
name = "Biological Technology"
@@ -236,6 +240,7 @@ datum/tech/syndicate
desc = "The study of technologies that violate standard Nanotrasen regulations."
id = "syndicate"
max_level = 0 // Don't count towards maxed research, since it's illegal.
+ rare = 4
/*
datum/tech/arcane
@@ -264,6 +269,23 @@ datum/tech/robotics
req_tech = list("materials" = 3, "programming" = 3)
*/
+/datum/tech/proc/getCost(var/current_level = null)
+ // Calculates tech disk's supply points sell cost
+ if(!current_level)
+ current_level = initial(level)
+
+ if(current_level >= level)
+ return 0
+
+ var/cost = 0
+ var/i
+ for(i=current_level+1, i<=level, i++)
+ if(i == initial(level))
+ continue
+ cost += i*5*rare
+
+ return cost
+
/obj/item/weapon/disk/tech_disk
name = "Technology Disk"
desc = "A disk for storing technology data for further research."
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 44b9e1f1f82..67cf7cd9217 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -23,7 +23,7 @@
component_parts += new /obj/item/stack/cable_coil(null,1)
RefreshParts()
initialize(); //Agouri
-
+
/obj/machinery/r_n_d/server/upgraded/New()
..()
component_parts = list()
@@ -63,16 +63,20 @@
if(0 to T0C)
health = min(100, health + 1)
if(T0C to (T20C + 20))
- health = between(0, health, 100)
+ health = Clamp(health, 0, 100)
if((T20C + 20) to (T0C + 70))
health = max(0, health - 1)
if(health <= 0)
- griefProtection() //I dont like putting this in process() but it's the best I can do without re-writing a chunk of rd servers.
+ /*griefProtection() This seems to get called twice before running any code that deletes/damages the server or it's files anwyay.
+ refreshParts and the hasReq procs that get called by this are laggy and do not need to be called by every server on the map every tick */
+ var/updateRD = 0
files.known_designs = list()
for(var/datum/tech/T in files.known_tech)
if(prob(1))
+ updateRD++
T.level--
- files.RefreshResearch()
+ if(updateRD)
+ files.RefreshResearch()
if(delay)
delay--
else
@@ -244,7 +248,7 @@
temp_server.id_with_download += num
else if(href_list["reset_tech"])
- var/choice = alert("Technology Data Rest", "Are you sure you want to reset this technology to its default data? Data lost cannot be recovered.", "Continue", "Cancel")
+ var/choice = alert("Technology Data Reset", "Are you sure you want to reset this technology to its default data? Data lost cannot be recovered.", "Continue", "Cancel")
if(choice == "Continue")
for(var/datum/tech/T in temp_server.files.known_tech)
if(T.id == href_list["reset_tech"])
@@ -257,7 +261,6 @@
if(choice == "Continue")
for(var/datum/design/D in temp_server.files.known_designs)
if(D.id == href_list["reset_design"])
- D.reliability_mod = 0
temp_server.files.known_designs -= D
break
temp_server.files.RefreshResearch()
@@ -279,7 +282,7 @@
if(istype(S, /obj/machinery/r_n_d/server/centcom) && !badmin)
continue
dat += "[S.name] || "
- dat += " Access Rights | "
+ dat += "Access Rights | "
dat += "Data Management"
if(badmin) dat += " | Server-to-Server Transfer"
dat += "
"
diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm
index 517b91c03ec..13d1446ccb8 100644
--- a/code/modules/shuttles/shuttle_supply.dm
+++ b/code/modules/shuttles/shuttle_supply.dm
@@ -1,12 +1,12 @@
/datum/shuttle/ferry/supply
var/away_location = 1 //the location to hide at while pretending to be in-transit
- var/late_chance = 80
+ var/late_chance = 0
var/max_late_time = 300
/datum/shuttle/ferry/supply/short_jump(var/area/origin,var/area/destination)
- if(moving_status != SHUTTLE_IDLE)
+ if(moving_status != SHUTTLE_IDLE)
return
-
+
if(isnull(location))
return
@@ -17,18 +17,18 @@
if (!at_station()) //at centcom
supply_controller.buy()
-
+
//it would be cool to play a sound here
moving_status = SHUTTLE_WARMUP
spawn(warmup_time*10)
- if (moving_status == SHUTTLE_IDLE)
+ if (moving_status == SHUTTLE_IDLE)
return //someone cancelled the launch
-
+
if (at_station() && forbidden_atoms_check())
//cancel the launch because of forbidden atoms. announce over supply channel?
moving_status = SHUTTLE_IDLE
return
-
+
//We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period.
var/area/away_area = get_location_area(away_location)
if (origin == away_area)
@@ -45,11 +45,11 @@
//late
if (prob(late_chance))
sleep(rand(0,max_late_time))
-
+
move(away_area, destination)
-
+
moving_status = SHUTTLE_IDLE
-
+
if (!at_station()) //at centcom
supply_controller.sell()
@@ -57,7 +57,7 @@
/datum/shuttle/ferry/supply/proc/forbidden_atoms_check()
if (!at_station())
return 0 //if badmins want to send mobs or a nuke on the supply shuttle from centcom we don't care
-
+
return supply_controller.forbidden_atoms_check(get_location_area())
/datum/shuttle/ferry/supply/proc/at_station()
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index e24c5c629af..19425d3a3c5 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -80,7 +80,7 @@ proc/spread_germs_to_organ(obj/item/organ/external/E, mob/living/carbon/human/us
proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool)
if(!istype(M))
return 0
- if (user.a_intent == "harm") //check for Hippocratic Oath
+ if (user.a_intent == I_HARM) //check for Hippocratic Oath
return 0
var/zone = user.zone_sel.selecting
if(zone in M.op_stage.in_progress) //Can't operate on someone repeatedly.
@@ -105,7 +105,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool)
M.op_stage.in_progress -= zone // Clear the in-progress flag.
return 1 //don't want to do weapony things after surgery
- if (user.a_intent == "help")
+ if (user.a_intent == I_HELP)
user << "\red You can't see any useful way to use [tool] on [M]."
return 1
return 0
diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi
index 1805d1caf3d..7efb1671607 100644
Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index 5c303cbf642..d91548da434 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 1883f0a2cb7..7d3c63af612 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi
index 0f9dc460825..b50ef0e13e3 100644
Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 64e1b4941be..c7575075901 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 4a3c4172c7f..f85a3167582 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index fdec926068f..888f4461135 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -315,11 +315,11 @@ macro "AZERTYon"
is-disabled = false
elem
name = "H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "CTRL+H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "Q+REP"
@@ -751,11 +751,11 @@ macro "hotkeymode"
is-disabled = false
elem
name = "H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "CTRL+H"
- command = ".holster"
+ command = "holster"
is-disabled = false
elem
name = "Q"
diff --git a/paradise.dme b/paradise.dme
index b8184ad6713..12deff3c44e 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -959,6 +959,7 @@
#include "code\modules\alarm\power_alarm.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm"
+#include "code\modules\assembly\health.dm"
#include "code\modules\assembly\helpers.dm"
#include "code\modules\assembly\holder.dm"
#include "code\modules\assembly\igniter.dm"
@@ -1624,8 +1625,6 @@
#include "code\modules\reagents\Chemistry-Holder.dm"
#include "code\modules\reagents\Chemistry-Machinery.dm"
#include "code\modules\reagents\Chemistry-Readme.dm"
-#include "code\modules\reagents\Chemistry-Reagents.dm"
-#include "code\modules\reagents\Chemistry-Recipes.dm"
#include "code\modules\reagents\dartgun.dm"
#include "code\modules\reagents\grenade_launcher.dm"
#include "code\modules\reagents\reagent_containers.dm"
@@ -1642,6 +1641,27 @@
#include "code\modules\reagents\newchem\patch.dm"
#include "code\modules\reagents\newchem\pyro.dm"
#include "code\modules\reagents\newchem\toxins.dm"
+#include "code\modules\reagents\oldchem\chemical_reaction\_chemical_reaction_base.dm"
+#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_drink.dm"
+#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_food.dm"
+#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_harm.dm"
+#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_med.dm"
+#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_misc.dm"
+#include "code\modules\reagents\oldchem\chemical_reaction\chemical_reaction_slime.dm"
+#include "code\modules\reagents\oldchem\reagents\__oldchem_defines.dm"
+#include "code\modules\reagents\oldchem\reagents\_reagent_base.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_admin.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_drugs.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_flammable.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_food.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_med.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_misc.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_toxin.dm"
+#include "code\modules\reagents\oldchem\reagents\reagents_water.dm"
+#include "code\modules\reagents\oldchem\reagents\drink\reagents_alcohol.dm"
+#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink.dm"
+#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_base.dm"
+#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_cold.dm"
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
diff --git a/sound/magic/Disintegrate.ogg b/sound/magic/Disintegrate.ogg
new file mode 100644
index 00000000000..d36217a5b34
Binary files /dev/null and b/sound/magic/Disintegrate.ogg differ
diff --git a/sound/magic/FleshToStone.ogg b/sound/magic/FleshToStone.ogg
new file mode 100644
index 00000000000..9033d4425ed
Binary files /dev/null and b/sound/magic/FleshToStone.ogg differ