diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index cca97fd306f..90752643f90 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -8104,9 +8104,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaacZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaacZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaacZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaacZhcZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZhcZhcZhcZhcZhcZhcZhaaaaaaaaaaaaaaaaaaaaacZhcZhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index d3167f37101..2181ff1179f 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -497,8 +497,8 @@ "jC" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "jD" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 0},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "jE" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"jF" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"jG" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"jF" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/twohanded/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"jG" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/gun/energy/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "jH" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "jI" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "jJ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) @@ -523,9 +523,9 @@ "kc" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "kd" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/mugwort,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "ke" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"kf" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"kf" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/gun/energy/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "kg" = (/obj/machinery/light/spot,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"kh" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) +"kh" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/gun/energy/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "ki" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "kj" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/space,/area/syndicate_mothership/elite_squad) "kk" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/syndicate_mothership/elite_squad) diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index b6461350077..126482bfda4 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -90,14 +90,14 @@ "bL" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start) "bM" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/derelict/ship/start) "bN" = (/obj/effect/decal/cleanable/blood{amount = 0},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start) -"bO" = (/obj/machinery/mass_driver{dir = 8; icon_state = "mass_driver"; id = "oldship_gun"},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start) -"bP" = (/obj/machinery/door/poddoor{id = "oldship_gun"; name = "Pod Bay Door"},/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start) -"bQ" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start) +"bO" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/derelict/ship/start) +"bP" = (/obj/structure/spacepoddoor,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start) +"bQ" = (/obj/machinery/door/poddoor/two_tile_ver,/obj/structure/spacepoddoor,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start) "bR" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start) "bS" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start) "bT" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/derelict/ship/start) "bU" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/plating,/area/shuttle/derelict/ship/start) -"bV" = (/obj/machinery/computer/pod{id = "oldship_gun"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/derelict/ship/start) +"bV" = (/obj/structure/spacepoddoor,/turf/space,/area) "bW" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area) "bX" = (/obj/machinery/power/solar/fake,/turf/simulated/floor{icon_state = "solarpanel"},/area) "bY" = (/turf/simulated/floor/plating/airless,/area) @@ -483,17 +483,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRahahahahahaGahahalad aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxahahahahbyawauahahahahahahahahaGahahafakbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaabzbAbdbdbdbdbdbdbdbAbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGbCbEbDahaNaqakadadafauahahahahawadaqbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaubGbFaNaqagbHbJbIalanbKahaHbLaIaxbMadamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakafadaqagahahahahahaGahahaNafanaxbNarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbObQahahahahahahbRbSaNaqbsbtbTbUarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtadanbVahahahahahawafaqbsaaaabtbTarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtafauahhYhXaNaqakbsaaaaaaaabtafaKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakadbOakagahahahahahaGahahaNafanaxbNarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPahahahahahahahbRbSaNaqbsbtbTbUarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQahahahahahahahawafaqbsaaaabtbTarataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtadafauahhYhXaNaqakbsaaaaaaaabtafaKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakadadadakbsaaaaaaaaaaaaaabtbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index 1a8313f7337..5741962bdc3 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -482,9 +482,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufufqfufqfufqfufqfufqfwdididifxflfmfmfmfmfmfmfmfmfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufqfufufufqfufqfqfqfqfqfqdFdidididFflfmfmfmfmfmfmfmfmfmfmfmfmfldgdtdtdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufufqfufqfufqfufqfufqdFdidididFflfmfmfmfmfmfmfmflfmfmfmfmfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufqfufqfufqfqfqfqfqfqdFdidididFflfmflflfmfmfmfmfmflfmflflfldgdtdtdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNaaaagNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufvfufufqfufqfufqfufqdFdhdhdhdFflflflflfmfmfmfmflflflflflfldgdididgabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNaaaaaaaagNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufufufufufqfqfqfqdgdgdgdhdhdhdgdgdgflflfmfmfmfmflflflflflfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufqfufqfufqfqfqfqfqfqdFdidididFflfmflflfmfmfmfmfmflfmflflfldgdtdtdFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNgNaaaagNgNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfvfufvfufvfufufqfufqfufqfufqdFdhdhdhdFflflflflfmfmfmfmflflflflflfldgdididgabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNgNgNgNgNaaaaaaaagNgNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgdtdtdgfufufufufufufufufqfqfqfqdgdgdgdhdhdhdgdgdgflflfmfmfmfmflflflflflfldgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgNgNgNgNgNgNaaaaaaaaaaaaaagNgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadtdtdtfyfvfufvfufvfufvfvfvfufudgdgdhdhdhdhdhdhdhdgdgfmfmfmfmfmflflflfzfzfzdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafydtdtdtfufufufufufufufufufufudgdhdhdhdhdhdhdhdhdhdgfmfmfmfmfmfmfAfBfCfDfEdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafydtdtfyfvfvfvfvfvfvfvfvfvfufudgdhdhdhdhdhdhdhdhdhdgfmfmfmflflflfFfAfGfHfIdgdididFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 5ee5d4add96..38f7af1a658 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -5,13 +5,15 @@ //node2 is output port //node1 is input port + req_one_access_txt = "24;10" + name = "Dual Port Air Vent" desc = "Has a valve and pump attached to it. There are two ports." level = 1 - connect_types = list(1,2,3) //connects to regular, supply and scrubbers pipes - + connect_types = list(1,2,3) //connects to regular, supply and scrubbers pipes + var/on = 0 var/pump_direction = 1 //0 = siphoning, 1 = releasing @@ -19,17 +21,49 @@ var/input_pressure_min = 0 var/output_pressure_max = 0 - var/frequency = 0 - var/id = null + var/frequency = 1439 + var/id_tag = null var/datum/radio_frequency/radio_connection + var/advcontrol = 0//does this device listen to the AAC + + settagwhitelist = list("id_tag") var/pressure_checks = 1 //1: Do not pass external_pressure_bound //2: Do not pass input_pressure_min //4: Do not pass output_pressure_max +/obj/machinery/atmospherics/binary/volume_pump/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + add_underlay(T, node1, turn(dir, -180)) + add_underlay(T, node2, dir) + +/obj/machinery/atmospherics/binary/dp_vent_pump/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) + return {" + + "} + +/obj/machinery/atmospherics/binary/dp_vent_pump/multitool_topic(var/mob/user, var/list/href_list, var/obj/O) + . = ..() + if(.) + return . + if("toggleadvcontrol" in href_list) + advcontrol = !advcontrol + return MT_UPDATE + /obj/machinery/atmospherics/binary/dp_vent_pump/New() ..() + if (!id_tag) + assign_uid() + id_tag = num2text(uid) icon = null /obj/machinery/atmospherics/binary/dp_vent_pump/high_volume @@ -45,7 +79,7 @@ return overlays.Cut() - + var/vent_icon = "vent" var/turf/T = get_turf(src) @@ -54,7 +88,7 @@ if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) vent_icon += "h" - + if(!powered()) vent_icon += "off" else @@ -111,6 +145,8 @@ if(network1) network1.update = 1 + air_update_turf() + else //external -> output var/pressure_delta = 10000 @@ -130,6 +166,8 @@ if(network2) network2.update = 1 + air_update_turf() + return 1 @@ -150,7 +188,7 @@ signal.source = src signal.data = list( - "tag" = id, + "tag" = id_tag, "device" = "ADVP", "power" = on, "direction" = pump_direction?("release"):("siphon"), @@ -170,43 +208,43 @@ set_frequency(frequency) /obj/machinery/atmospherics/binary/dp_vent_pump/receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command") || (signal.data["advcontrol"] && !advcontrol)) return 0 - if(signal.data["power"]) + if(signal.data["power"] != null) on = text2num(signal.data["power"]) - if(signal.data["power_toggle"]) + if(signal.data["power_toggle"] != null) on = !on - if(signal.data["direction"]) + if(signal.data["direction"] != null) pump_direction = text2num(signal.data["direction"]) - if(signal.data["checks"]) + if(signal.data["checks"] != null) pressure_checks = text2num(signal.data["checks"]) if(signal.data["purge"]) pressure_checks &= ~1 pump_direction = 0 - if(signal.data["stabalize"]) + if(signal.data["stabilize"])//the fact that this was "stabalize" shows how many fucks people give about these wonders, none pressure_checks |= 1 pump_direction = 1 - if(signal.data["set_input_pressure"]) + if(signal.data["set_input_pressure"] != null) input_pressure_min = between( 0, text2num(signal.data["set_input_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["set_output_pressure"]) + if(signal.data["set_output_pressure"] != null) output_pressure_max = between( 0, text2num(signal.data["set_output_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["set_external_pressure"]) + if(signal.data["set_external_pressure"] != null) external_pressure_bound = between( 0, text2num(signal.data["set_external_pressure"]), @@ -220,4 +258,54 @@ spawn(2) broadcast_status() - update_icon() \ No newline at end of file + update_icon() + +/obj/machinery/atmospherics/binary/dp_vent_pump/attackby(var/obj/item/W as obj, var/mob/user as mob) + /* + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if (WT.remove_fuel(0,user)) + user << "\blue Now welding the vent." + if(do_after(user, 20)) + if(!src || !WT.isOn()) return + playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1) + if(!welded) + user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + welded = 1 + update_icon() + else + user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + welded = 0 + update_icon() + else + user << "\blue The welding tool needs to be on to start this task." + else + user << "\blue You need more welding fuel to complete this task." + return 1*/ + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index a7705f7f11c..5577739369b 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -7,17 +7,27 @@ name = "Air Injector" desc = "Has a valve and pump attached to it" + req_one_access_txt = "24;10" + var/on = 0 var/injecting = 0 var/volume_rate = 50 var/frequency = 0 - var/id = null + var/id + var/id_tag = null var/datum/radio_frequency/radio_connection + Mtoollink = 1 + settagwhitelist = list("id_tag") level = 1 +/obj/machinery/atmospherics/unary/outlet_injector/New() + ..() + if(id && !id_tag)//I'm not dealing with any more merge conflicts + id_tag = id + /obj/machinery/atmospherics/unary/outlet_injector/update_icon() if(!powered()) icon_state = "off" @@ -91,7 +101,7 @@ signal.source = src signal.data = list( - "tag" = id, + "tag" = id_tag, "device" = "AO", "power" = on, "volume_rate" = volume_rate, @@ -104,24 +114,23 @@ /obj/machinery/atmospherics/unary/outlet_injector/initialize() ..() - set_frequency(frequency) /obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"] != "command")) return 0 - if(signal.data["power"]) + if(signal.data["power"] != null) on = text2num(signal.data["power"]) - if(signal.data["power_toggle"]) + if(signal.data["power_toggle"] != null) on = !on - if(signal.data["inject"]) + if(signal.data["inject"] != null) spawn inject() return - if(signal.data["set_volume_rate"]) + if(signal.data["set_volume_rate"] != null) var/number = text2num(signal.data["set_volume_rate"]) volume_rate = between(0, number, air_contents.volume) @@ -136,5 +145,57 @@ broadcast_status() update_icon() + /*hide(var/i) //to make the little pipe section invisible, the icon changes. + if(node) + if(on) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" + else + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" + else + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]exposed" + on = 0 + return*/ + +/obj/machinery/atmospherics/unary/outlet_injector/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) + return {" + +"} + +/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/device/multitool)) + interact(user) + return 1 + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) + +/obj/machinery/atmospherics/unary/outlet_injector/interact(mob/user as mob) + update_multitool_menu(user) + /obj/machinery/atmospherics/unary/outlet_injector/hide(var/i) - update_underlays() \ No newline at end of file + update_underlays() + diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 5b9ce52bb25..6e8377ab2db 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -16,6 +16,8 @@ var/area_uid var/id_tag = null + req_one_access_txt = "24;10" + var/on = 0 var/pump_direction = 1 //0 = siphoning, 1 = releasing @@ -36,6 +38,8 @@ var/frequency = 1439 var/datum/radio_frequency/radio_connection + Mtoollink = 1 + var/advcontrol = 0//does this device listen to the AAC var/radio_filter_out var/radio_filter_in @@ -181,6 +185,12 @@ frequency = new_frequency if(frequency) radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) + if(frequency != 1439) + initial_loc.air_vent_info -= id_tag + initial_loc.air_vent_names -= id_tag + name = "Vent Pump" + else + broadcast_status() /obj/machinery/atmospherics/unary/vent_pump/proc/broadcast_status() if(!radio_connection) @@ -202,12 +212,12 @@ "timestamp" = world.time, "sigtype" = "status" ) - - if(!initial_loc.air_vent_names[id_tag]) - var/new_name = "[initial_loc.name] Vent Pump #[initial_loc.air_vent_names.len+1]" - initial_loc.air_vent_names[id_tag] = new_name - src.name = new_name - initial_loc.air_vent_info[id_tag] = signal.data + if(frequency == 1439)//We're on the frequency the air alarms and stuff use + if(!initial_loc.air_vent_names[id_tag]) + var/new_name = "[initial_loc.name] Vent Pump #[initial_loc.air_vent_names.len+1]" + initial_loc.air_vent_names[id_tag] = new_name + src.name = new_name + initial_loc.air_vent_info[id_tag] = signal.data radio_connection.post_signal(src, signal, radio_filter_out) @@ -227,14 +237,14 @@ if(stat & (NOPOWER|BROKEN)) return //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") - if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command") || (signal.data["advcontrol"] && !advcontrol)) return 0 if(signal.data["purge"] != null) pressure_checks &= ~1 pump_direction = 0 - if(signal.data["stabalize"] != null) + if(signal.data["stabilize"] != null) pressure_checks |= 1 pump_direction = 1 @@ -327,10 +337,14 @@ welded = 0 update_icon() else + user << "\blue The welding tool needs to be on to start this task." else user << "\blue You need more welding fuel to complete this task." return 1 + else if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 else ..() @@ -346,7 +360,42 @@ if(old_stat != stat) update_icon() + +/obj/machinery/atmospherics/unary/vent_pump/interact(mob/user as mob) + update_multitool_menu(user) + +/obj/machinery/atmospherics/unary/vent_pump/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) + return {" + + "} + +/obj/machinery/atmospherics/unary/vent_pump/multitool_topic(var/mob/user, var/list/href_list, var/obj/O) + if("toggleadvcontrol" in href_list) + advcontrol = !advcontrol + return MT_UPDATE + + if("set_id" in href_list) + var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src.id_tag) as null|text), 1, MAX_MESSAGE_LEN) + if(!newid) + return + if(frequency == 1439) + initial_loc.air_vent_info -= id_tag + initial_loc.air_vent_names -= id_tag + + id_tag = newid + broadcast_status() + + return MT_UPDATE + + return ..() + /obj/machinery/atmospherics/unary/vent_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) + if (istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) @@ -370,11 +419,10 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) -/obj/machinery/atmospherics/unary/vent_pump/Del() +/obj/machinery/atmospherics/unary/vent_pump/Destroy() if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag - ..() - return + return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index bafdbd43e3b..2d2f87c7935 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -2,6 +2,8 @@ icon = 'icons/atmos/vent_scrubber.dmi' icon_state = "map_scrubber" + req_one_access_txt = "24;10" + name = "Air Scrubber" desc = "Has a valve and pump attached to it" use_power = 1 @@ -12,6 +14,7 @@ var/id_tag = null var/frequency = 1439 var/datum/radio_frequency/radio_connection + var/advcontrol = 0//does this device listen to the AAC? var/on = 0 var/scrubbing = 1 //0 = siphoning, 1 = scrubbing @@ -83,6 +86,12 @@ radio_controller.remove_object(src, frequency) frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, radio_filter_in) + if(frequency != 1439) + initial_loc.air_scrub_info -= id_tag + initial_loc.air_scrub_names -= id_tag + name = "air Scrubber" + else + broadcast_status() /obj/machinery/atmospherics/unary/vent_scrubber/proc/broadcast_status() if(!radio_connection) @@ -106,11 +115,12 @@ "filter_n2o" = scrub_N2O, "sigtype" = "status" ) - if(!initial_loc.air_scrub_names[id_tag]) - var/new_name = "[initial_loc.name] Air Scrubber #[initial_loc.air_scrub_names.len+1]" - initial_loc.air_scrub_names[id_tag] = new_name - src.name = new_name - initial_loc.air_scrub_info[id_tag] = signal.data + if(frequency == 1439)//We're on the frequency the air alarms and stuff use + if(!initial_loc.air_scrub_names[id_tag]) + var/new_name = "[initial_loc.name] Air Scrubber #[initial_loc.air_scrub_names.len+1]" + initial_loc.air_scrub_names[id_tag] = new_name + src.name = new_name + initial_loc.air_scrub_info[id_tag] = signal.data radio_connection.post_signal(src, signal, radio_filter_out) return 1 @@ -119,7 +129,7 @@ ..() radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null - if (frequency) + if(frequency) set_frequency(frequency) /obj/machinery/atmospherics/unary/vent_scrubber/process() @@ -203,7 +213,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) return - if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command") || (signal.data["advcontrol"] && !advcontrol)) return 0 if(signal.data["power"] != null) @@ -281,8 +291,35 @@ if(old_stat != stat) update_icon() -/obj/machinery/atmospherics/unary/vent_scrubber/can_crawl_through() - return !welded +/obj/machinery/atmospherics/unary/vent_scrubber/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) + return {" + + "} + +/obj/machinery/atmospherics/unary/vent_scrubber/multitool_topic(var/mob/user, var/list/href_list, var/obj/O) + if("toggleadvcontrol" in href_list) + advcontrol = !advcontrol + return MT_UPDATE + + if("set_id" in href_list) + var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src:id_tag) as null|text),1,MAX_MESSAGE_LEN) + if(!newid) + return + + if(frequency == 1439) + initial_loc.air_scrub_info -= id_tag + initial_loc.air_scrub_names -= id_tag + + id_tag = newid + broadcast_status() + + return MT_UPDATE + + return ..() /obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) if(istype(W, /obj/item/weapon/weldingtool)) @@ -305,6 +342,9 @@ else user << "You need more welding fuel to complete this task." return 1 + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) @@ -328,11 +368,10 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) + qdel(src) -/obj/machinery/atmospherics/unary/vent_scrubber/Del() - if(initial_loc) +/obj/machinery/atmospherics/unary/vent_scrubber/Destroy() + if(initial_loc && frequency == 1439) initial_loc.air_scrub_info -= id_tag initial_loc.air_scrub_names -= id_tag - ..() - return + return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index d004239acd9..1ec8bc13dce 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -18,6 +18,8 @@ var/datum/pipe_network/network_node1 var/datum/pipe_network/network_node2 + req_one_access_txt = "24;10" + /obj/machinery/atmospherics/valve/open open = 1 icon_state = "map_valve1" @@ -179,7 +181,7 @@ break build_network() - + update_icon() update_underlays() @@ -238,10 +240,11 @@ name = "digital valve" desc = "A digitally controlled valve." icon = 'icons/atmos/digital_valve.dmi' - - var/frequency = 0 - var/id = null + + var/frequency = 1439 + var/id_tag = null var/datum/radio_frequency/radio_connection + settagwhitelist = list("id_tag") /obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) @@ -281,7 +284,7 @@ set_frequency(frequency) /obj/machinery/atmospherics/valve/digital/receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id)) + if(!signal.data["tag"] || (signal.data["tag"] != id_tag)) return 0 switch(signal.data["command"]) @@ -298,13 +301,24 @@ close() else open() + if("valve_set") + if(signal.data["valve_set"] == 1) + if(!open) + open() + else + if(open) + close() + +/obj/machinery/atmospherics/valve/digital/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 + ..() /obj/machinery/atmospherics/valve/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) if (!istype(W, /obj/item/weapon/wrench)) return ..() - if (istype(src, /obj/machinery/atmospherics/valve/digital) && src:frequency) - user << "\red You cannot unwrench this [src], it's too complicated." - return 1 + var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) @@ -319,4 +333,12 @@ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) - del(src) \ No newline at end of file + del(src) + +/obj/machinery/atmospherics/valve/digital/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) + return {" + + "} diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index e13a5627236..7332b57e7de 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -1428,3 +1428,23 @@ dir = get_dir(src, node1) else icon_state = "exposed" + +/obj/machinery/atmospherics/pipe/vent/attackby(var/obj/item/weapon/W, var/mob/user) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + var/turf/T = get_turf(src) + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = T.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(T, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(T, make_from=src) + del(src) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 5282720932b..893847bfa75 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -24,4 +24,9 @@ #define HYDRO_SPEED_MULTIPLIER 1 -#define NANO_IGNORE_DISTANCE 1 \ No newline at end of file +#define NANO_IGNORE_DISTANCE 1 + +// multitool_topic() shit +#define MT_ERROR -1 +#define MT_UPDATE 1 +#define MT_REINIT 2 \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b067f268d88..5b561406f23 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -103,4 +103,28 @@ #define EASTER "Easter" #define HALLOWEEN "Halloween" #define CHRISTMAS "Christmas" -#define FRIDAY_13TH "Friday the 13th" \ No newline at end of file +#define FRIDAY_13TH "Friday the 13th" + +//Light color defs, for light-emitting things +//Some defs may be pure color- this is for neatness, and configurability. Changing #define COLOR_ is a bad idea. +#define LIGHT_COLOR_CYAN "#7BF9FF" +#define LIGHT_COLOR_PURE_CYAN "#00FFFF" + +#define LIGHT_COLOR_RED "#B40000" +#define LIGHT_COLOR_ORANGE "#FF9933" +#define LIGHT_COLOR_DARKRED "#A91515" +#define LIGHT_COLOR_PURE_RED "#FF0000" + +#define LIGHT_COLOR_GREEN "#00CC00" +#define LIGHT_COLOR_DARKGREEN "#50AB00" +#define LIGHT_COLOR_PURE_GREEN "#00FF00" + +#define LIGHT_COLOR_LIGHTBLUE "#0099FF" +#define LIGHT_COLOR_DARKBLUE "#315AB4" +#define LIGHT_COLOR_PURE_BLUE "#0000FF" + +#define LIGHT_COLOR_FADEDPURPLE "#A97FAA" +#define LIGHT_COLOR_PURPLE "#CD00CD" +#define LIGHT_COLOR_PINK "#FF33CC" + +#define LIGHT_COLOR_WHITE "#FFFFFF" diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 4dd134b57b2..2a936dde7b4 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -6,7 +6,13 @@ var/datum/nanomanager/nanomanager = new() // event manager, the manager for events var/datum/event_manager/event_manager = new() // Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. -var/global/obj/item/device/radio/intercom/global_announcer = new(null) +var/global/obj/item/device/radio/intercom/global_announcer = create_global_announcer() +// Load order issues means this can't be new'd until other code runs +// This is probably not the way I should be doing this, but I don't know how to do it right! +proc/create_global_announcer() + spawn(0) + global_announcer = new(null) + return var/list/paper_tag_whitelist = list("center","p","div","span","h1","h2","h3","h4","h5","h6","hr","pre", \ "big","small","font","i","u","b","s","sub","sup","tt","br","hr","ol","ul","li","caption","col", \ diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index b39df751896..5a84463c8f1 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -79,23 +79,6 @@ return loc.Adjacent(neighbor,recurse - 1) return 0 return ..() -/* - Special case: This allows you to reach a door when it is visally on top of, - but technically behind, a fire door - - You could try to rewrite this to be faster, but I'm not sure anything would be. - This can be safely removed if border firedoors are ever moved to be on top of doors - so they can be interacted with without opening the door. -*/ -/obj/machinery/door/Adjacent(var/atom/neighbor) - var/obj/machinery/door/firedoor/border_only/BOD = locate() in loc - if(BOD) - BOD.throwpass = 1 // allow click to pass - . = ..() - BOD.throwpass = 0 - return . - return ..() - /* This checks if you there is uninterrupted airspace between that turf and this one. diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 1dd064219a5..3edd0ba0bde 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -119,3 +119,7 @@ */ /mob/new_player/ClickOn() return + +// pAIs are not intended to interact with anything in the world +/mob/living/silicon/pai/UnarmedAttack(var/atom/A) + return diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index 9eff6b9c007..4be567c4ef2 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -30,7 +30,7 @@ var/global/datum/controller/mob_system/mob_master var/starttime /datum/controller/mob_system/proc/Setup() - world << "\red Mob ticker starting up." + world << "\red \b Mob ticker starting up." starttime = world.timeofday /datum/controller/mob_system/proc/process() diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 6fbe984e6ad..1388e088f8c 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -25,7 +25,7 @@ return /datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D) - add_logs(A, D, "punched") + add_logs(D, A, "punched") A.do_attack_animation(D) var/damage = rand(0,9) @@ -85,7 +85,7 @@ return 1 /datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - add_logs(A, D, "punched") + add_logs(D, A, "punched") A.do_attack_animation(D) var/atk_verb = pick("left hook","right hook","straight punch") @@ -136,7 +136,7 @@ return 1 /datum/martial_art/drunk_brawling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - add_logs(A, D, "punched") + add_logs(D, A, "punched") A.do_attack_animation(D) var/atk_verb = pick("jab","uppercut","overhand punch","drunken right hook","drunken left hook") @@ -197,7 +197,7 @@ /datum/martial_art/wrestling/proc/Suplex(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - add_logs(A, D, "suplexed") + add_logs(D, A, "suplexed") D.visible_message("[A] suplexes [D]!", \ "[A] suplexes [D]!") D.forceMove(A.loc) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 259f51a0930..ede77be29cc 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -71,7 +71,7 @@ var/obj/item/brain/B = new /obj/item/brain(user.loc) B.transfer_identity(C) C.death() - add_logs(user, C, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")*/ + add_logs(C, user, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")*/ if(C.stomach_contents && item_to_retrive in C.stomach_contents) C.stomach_contents -= item_to_retrive diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 484f3e2af24..e4557e12f48 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1217,7 +1217,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/misc/wizard name = "Wizard Costume Crate" - contains = list(/obj/item/weapon/staff, + contains = list(/obj/item/weapon/twohanded/staff, /obj/item/clothing/suit/wizrobe/fake, /obj/item/clothing/shoes/sandal, /obj/item/clothing/head/wizard/fake) @@ -1312,3 +1312,37 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/lipstick/random) cost = 30 //Lots of very expensive items. You gotta pay up to look good! containername = "formal-wear crate" + +/datum/supply_packs/misc/teamcolors //For team sports like space polo + name = "Team Jerseys Crate" + // 4 red jerseys, 4 blue jerseys, and 1 beach ball + contains = list(/obj/item/clothing/under/color/red/jersey, + /obj/item/clothing/under/color/red/jersey, + /obj/item/clothing/under/color/red/jersey, + /obj/item/clothing/under/color/red/jersey, + /obj/item/clothing/under/color/blue/jersey, + /obj/item/clothing/under/color/blue/jersey, + /obj/item/clothing/under/color/blue/jersey, + /obj/item/clothing/under/color/blue/jersey, + /obj/item/weapon/beach_ball) + cost = 15 + containername = "team jerseys crate" + +/datum/supply_packs/misc/polo //For space polo! Or horsehead Quiditch + name = "Polo Supply Crate" + // 6 brooms, 6 horse masks for the brooms, and 1 beach ball + contains = list(/obj/item/weapon/twohanded/staff/broom, + /obj/item/weapon/twohanded/staff/broom, + /obj/item/weapon/twohanded/staff/broom, + /obj/item/weapon/twohanded/staff/broom, + /obj/item/weapon/twohanded/staff/broom, + /obj/item/weapon/twohanded/staff/broom, + /obj/item/clothing/mask/horsehead, + /obj/item/clothing/mask/horsehead, + /obj/item/clothing/mask/horsehead, + /obj/item/clothing/mask/horsehead, + /obj/item/clothing/mask/horsehead, + /obj/item/clothing/mask/horsehead, + /obj/item/weapon/beach_ball) + cost = 20 + containername = "polo supply crate" \ No newline at end of file diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 206156f08ce..24bbaa3b2d8 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -265,6 +265,14 @@ var/list/uplink_items = list() excludefrom = list("nuclear emergency") surplus = 50 +/datum/uplink_item/dangerous/flamethrower + name = "Flamethrower" + desc = "A flamethrower, fueled by a portion of highly flammable biotoxins stolen previously from Nanotrasen stations. Make a statement by roasting the filth in their own greed. Use with caution." + item = /obj/item/weapon/flamethrower/full/tank + cost = 11 + gamemodes = list("nuclear emergency") + surplus = 40 + /datum/uplink_item/dangerous/sword name = "Energy Sword" desc = "The esword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise." @@ -587,6 +595,14 @@ var/list/uplink_items = list() item = /obj/item/weapon/aiModule/syndicate cost = 14 +/datum/uplink_item/device_tools/magboots + name = "Blood-Red Magboots" + desc = "A pair of magnetic boots with a Syndicate paintjob that assist with freer movement in space or on-station during gravitational generator failures. \ + These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' slow you down in simulated-gravity environments much like the standard issue variety." + item = /obj/item/clothing/shoes/magboots/syndie + cost = 5 + gamemodes = list("nuclear emergency") + /datum/uplink_item/device_tools/plastic_explosives name = "Composition C-4" desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds." diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index ce4c8f77887..48ea01b1a29 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -20,11 +20,6 @@ var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING) - for(var/datum/mind/player in possible_changelings) - for(var/job in restricted_jobs)//Removing robots from the list - if(player.assigned_role == job) - possible_changelings -= player - for(var/mob/new_player/player in player_list) if((player.mind in possible_changelings) && (player.client.prefs.species in protected_species_changeling)) possible_changelings -= player.mind @@ -34,6 +29,7 @@ //possible_changelings-=changeling changelings += changeling modePlayer += changelings + changeling.restricted_roles = restricted_jobs return ..() else return 0 diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index e6ae1d5d560..1f2e7ea2aa2 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -98,9 +98,11 @@ equip(var/mob/living/carbon/human/H) if(!H) return 0 + switch(H.backbag) + if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) + if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) - if(H.backbag == 2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back) - if(H.backbag == 3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_wear_pda) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index f39a7b06eca..fcc080124cd 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -222,7 +222,7 @@ idle_power_usage = 1250 active_power_usage = 2500 - light_color = "#7BF9FF" + light_color = LIGHT_COLOR_CYAN power_change() ..() diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index e6338b824e0..79ba3448c90 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -2,12 +2,16 @@ obj/machinery/air_sensor icon = 'icons/obj/stationobjs.dmi' icon_state = "gsensor1" name = "Gas Sensor" + req_one_access_txt = "24;10" anchored = 1 var/state = 0 + var/bolts = 1 var/id_tag var/frequency = 1439 + Mtoollink = 1 + settagwhitelist = list("id_tag") var/on = 1 var/output = 3 @@ -25,6 +29,62 @@ obj/machinery/air_sensor update_icon() icon_state = "gsensor[on]" + multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + return {" + Main + "} + + multitool_topic(var/mob/user, var/list/href_list, var/obj/O) + . = ..() + if(.) + return . + + if("toggle_out_flag" in href_list) + var/bitflag_value = text2num(href_list["toggle_out_flag"])//this is a string normally + if(!(bitflag_value in list(1, 2, 4, 8, 16, 32))) //Here to prevent breaking the sensors with HREF exploits + return 0 + if(output&bitflag_value)//the bitflag is on ATM + output &= ~bitflag_value + else//can't not be off + output |= bitflag_value + return MT_UPDATE + if("toggle_bolts" in href_list) + bolts = !bolts + if(bolts) + visible_message("You hear a quite click as the [src] bolts to the floor", "You hear a quite click") + else + visible_message("You hear a quite click as the [src]'s floor bolts raise", "You hear a quite click") + return MT_UPDATE + + + attackby(var/obj/item/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 + if(istype(W, /obj/item/weapon/wrench)) + if(bolts) + usr << "The [src] is bolted to the floor! You can't detach it like this." + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if(do_after(user, 40)) + user.visible_message("[user] unfastens \the [src].", "\blue You have unfastened \the [src].", "You hear ratchet.") + new /obj/item/pipe_gsensor(src.loc) + del(src) + return 1 + if(..()) + return 1 + process() if(on) var/datum/signal/signal = new @@ -77,11 +137,15 @@ obj/machinery/air_sensor /obj/machinery/computer/general_air_control icon = 'icons/obj/computer.dmi' icon_state = "tank" + circuit = "/obj/item/weapon/circuitboard/air_management" + req_one_access_txt = "24;10" name = "Computer" var/frequency = 1439 + var/show_sensors=1 var/list/sensors = list() + Mtoollink = 1 var/list/sensor_information = list() var/datum/radio_frequency/radio_connection @@ -97,42 +161,16 @@ obj/machinery/air_sensor process() ..() if(!sensors) - warning("[src.type] at [x],[y],[z] has null sensors. Please fix.") + //warning("[src.type] at [x],[y],[z] has null sensors. Please fix.")//commenting this line out because the admins will get a warning like this every time somebody builds another GAC sensors = list() src.updateUsrDialog() attackby(I as obj, user as mob, params) - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - getFromPool(/obj/item/weapon/shard, loc) - var/obj/item/weapon/circuitboard/air_management/M = new /obj/item/weapon/circuitboard/air_management( A ) - for (var/obj/C in src) - C.loc = src.loc - M.frequency = src.frequency - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/air_management/M = new /obj/item/weapon/circuitboard/air_management( A ) - for (var/obj/C in src) - C.loc = src.loc - M.frequency = src.frequency - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) - else - src.attack_hand(user) - return + if(istype(I, /obj/item/device/multitool)) + update_multitool_menu(user) + if(..()) + return 1 + receive_signal(datum/signal/signal) if(!signal || signal.encryption) return @@ -144,38 +182,39 @@ obj/machinery/air_sensor proc/return_text() var/sensor_data - if(sensors.len) - for(var/id_tag in sensors) - var/long_name = sensors[id_tag] - var/list/data = sensor_information[id_tag] - var/sensor_part = "
[long_name]" + if(show_sensors) + if(sensors.len) + for(var/id_tag in sensors) + var/long_name = sensors[id_tag] + var/list/data = sensor_information[id_tag] + var/sensor_part = "
[long_name]" - if(data) - sensor_part += "" - if(data["pressure"]) - sensor_part += "" - if(data["temperature"]) - sensor_part += "" - if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"]) - sensor_part += "" - sensor_part += "
Pressure:[data["pressure"]] kPa
Temperature:[data["temperature"]] K
Gas Composition :
    " - if(data["oxygen"]) - sensor_part += "
  • [data["oxygen"]]% O2
  • " - if(data["nitrogen"]) - sensor_part += "
  • [data["nitrogen"]]% N
  • " - if(data["carbon_dioxide"]) - sensor_part += "
  • [data["carbon_dioxide"]]% CO2
  • " - if(data["toxins"]) - sensor_part += "
  • [data["toxins"]]% Plasma
  • " - sensor_part += "
" + if(data) + sensor_part += "" + if(data["pressure"]) + sensor_part += "" + if(data["temperature"]) + sensor_part += "" + if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"]) + sensor_part += "" + sensor_part += "
Pressure:[data["pressure"]] kPa
Temperature:[data["temperature"]] K
Gas Composition :
    " + if(data["oxygen"]) + sensor_part += "
  • [data["oxygen"]]% O2
  • " + if(data["nitrogen"]) + sensor_part += "
  • [data["nitrogen"]]% N
  • " + if(data["carbon_dioxide"]) + sensor_part += "
  • [data["carbon_dioxide"]]% CO2
  • " + if(data["toxins"]) + sensor_part += "
  • [data["toxins"]]% Plasma
  • " + sensor_part += "
" - else - sensor_part += "[long_name] can not be found!
" - sensor_part += "
" - sensor_data += sensor_part + else + sensor_part += "[long_name] can not be found!
" + sensor_part += "
" + sensor_data += sensor_part - else - sensor_data = "No sensors connected." + else + sensor_data = "No sensors connected." var/output = {" @@ -217,8 +256,8 @@ legend {

[name]

-

Sensor Data:

- [sensor_data]"} + [show_sensors ? "

Sensor Data:

" + sensor_data : ""] + "} return output @@ -231,9 +270,96 @@ legend { initialize() set_frequency(frequency) + multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + var/dat= {" + Main + + Sensors: + "} + return dat + + multitool_topic(var/mob/user,var/list/href_list,var/obj/O) + . = ..() + if(.) return . + if("add_sensor" in href_list) + + // Make a list of all available sensors on the same frequency + var/list/sensor_list = list() + for(var/obj/machinery/air_sensor/G in machines) + if(!isnull(G.id_tag) && G.frequency == frequency) + sensor_list|=G.id_tag + if(!sensor_list.len) + user << "No sensors on this frequency." + return MT_ERROR + + // Have the user pick one of them and name its label + var/sensor = input(user, "Select a sensor:", "Sensor Data") as null|anything in sensor_list + if(!sensor) + return MT_ERROR + var/label = reject_bad_name( input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) + if(!label) + return MT_ERROR + + // Add the sensor's information to general_air_controler + sensors[sensor] = label + return MT_UPDATE + + if("edit_sensor" in href_list) + var/list/sensor_list = list() + for(var/obj/machinery/air_sensor/G in machines) + if(!isnull(G.id_tag) && G.frequency == frequency) + sensor_list|=G.id_tag + if(!sensor_list.len) + user << "No sensors on this frequency." + return MT_ERROR + var/label = sensors[href_list["edit_sensor"]] + var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list + if(!sensor) + return MT_ERROR + sensors.Remove(href_list["edit_sensor"]) + sensors[sensor] = label + return MT_UPDATE + + unlinkFrom(var/mob/user, var/obj/O) + ..() + if("id_tag" in O.vars && (istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))) + sensors.Remove(O:id_tag) + return 1 + return 0 + + linkMenu(var/obj/O) + if(isLinkedWith(O)) + return + + var/dat="" + + if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) + dat += " \[New Sensor\] " + return dat + + canLink(var/obj/O, var/list/context) + if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) + return O:id_tag + + isLinkedWith(var/obj/O) + if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)) + return O:id_tag in sensors + + linkWith(var/mob/user, var/obj/O, var/link/context) + sensors[O:id_tag] = reject_bad_name(input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1) + return 1 + large_tank_control icon = 'icons/obj/computer.dmi' icon_state = "tank" + circuit = "/obj/item/weapon/circuitboard/large_tank_control" + req_one_access_txt = "24;10" + settagwhitelist = list("input_tag", "output_tag") var/input_tag var/output_tag @@ -241,8 +367,90 @@ legend { var/list/input_info var/list/output_info + var/list/input_linkable=list( + /obj/machinery/atmospherics/unary/outlet_injector, + /obj/machinery/atmospherics/unary/vent_pump + ) + + var/list/output_linkable=list( + /obj/machinery/atmospherics/unary/vent_pump + ) + var/pressure_setting = ONE_ATMOSPHERE * 45 + attackby(I as obj, user as mob) + if(istype(I, /obj/item/device/multitool)) + update_multitool_menu(user) + if(..()) + return 1 + + + multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + var/dat= {" + + Sensors: + "} + return dat + + + linkWith(var/mob/user, var/obj/O, var/list/context) + if(context["slot"]=="input" && is_type_in_list(O,input_linkable)) + input_tag = O:id_tag + input_info = null + if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) + send_signal(list("tag"=input_tag, + "direction"=1, // Release + "checks" =0 // No pressure checks. + )) + return 1 + if(context["slot"]=="output" && is_type_in_list(O,output_linkable)) + output_tag = O:id_tag + output_info = null + if(istype(O,/obj/machinery/atmospherics/unary/vent_pump)) + send_signal(list("tag"=output_tag, + "direction"=0, // Siphon + "checks" =2 // Internal pressure checks. + )) + return 1 + + unlinkFrom(var/mob/user, var/obj/O) + if("id_tag" in O.vars) + if(O:id_tag == input_tag) + input_tag=null + input_info=null + return 1 + if(O:id_tag == output_tag) + output_tag=null + output_info=null + return 1 + return 0 + + linkMenu(var/obj/O) + var/dat="" + if(canLink(O,list("slot"="input"))) + dat += " \[Link @ Input\] " + if(canLink(O,list("slot"="output"))) + dat += " \[Link @ Output\] " + return dat + + canLink(var/obj/O, var/list/context) + return (context["slot"]=="input" && is_type_in_list(O,input_linkable)) || (context["slot"]=="output" && is_type_in_list(O,output_linkable)) + + isLinkedWith(var/obj/O) + if(O:id_tag == input_tag) + return 1 + if(O:id_tag == output_tag) + return 1 + return 0 + + process() ..() if(!input_info && input_tag) @@ -329,7 +537,7 @@ legend { Topic(href, href_list) if(..()) - return + return 1 add_fingerprint(usr) @@ -345,34 +553,35 @@ legend { signal.source = src if(href_list["in_refresh_status"]) input_info = null - signal.data = list ("tag" = input_tag, "status") + signal.data = list ("tag" = input_tag, "status" = 1) else if(href_list["in_toggle_injector"]) input_info = null - signal.data = list ("tag" = input_tag, "power_toggle") + signal.data = list ("tag" = input_tag, "power_toggle" = 1) else if(href_list["out_refresh_status"]) output_info = null - signal.data = list ("tag" = output_tag, "status") + signal.data = list ("tag" = output_tag, "status" = 1) else if(href_list["out_toggle_power"]) output_info = null - signal.data = list ("tag" = output_tag, "power_toggle") + signal.data = list ("tag" = output_tag, "power_toggle" = 1) else if(href_list["out_set_pressure"]) output_info = null signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]") - else + /*else testing("Bad Topic() to GAC \"[src.name]\": [href]") - return // NOPE. + return*/ // NOPE. // disabling because it spams when multitool menus are used - signal.data["sigtype"]="command" + signal.data["sigtype"] = "command" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) src.updateUsrDialog() fuel_injection icon = 'icons/obj/computer.dmi' icon_state = "atmos" + circuit = "/obj/item/weapon/circuitboard/injector_control" var/device_tag var/list/device_info @@ -383,37 +592,10 @@ legend { var/on_temperature = 1200 attackby(I as obj, user as mob, params) - if(istype(I, /obj/item/weapon/screwdriver)) - playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - if (src.stat & BROKEN) - user << "\blue The broken glass falls out." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - getFromPool(/obj/item/weapon/shard, loc) - var/obj/item/weapon/circuitboard/injector_control/M = new /obj/item/weapon/circuitboard/injector_control( A ) - for (var/obj/C in src) - C.loc = src.loc - M.frequency = src.frequency - A.circuit = M - A.state = 3 - A.icon_state = "3" - A.anchored = 1 - del(src) - else - user << "\blue You disconnect the monitor." - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/injector_control/M = new /obj/item/weapon/circuitboard/injector_control( A ) - for (var/obj/C in src) - C.loc = src.loc - M.frequency = src.frequency - A.circuit = M - A.state = 4 - A.icon_state = "4" - A.anchored = 1 - del(src) - else - src.attack_hand(user) - return + if(istype(I, /obj/item/device/multitool)) + update_multitool_menu(user) + if(..()) + return 1 process() if(automation) diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index f8e00b06950..ddd5973c0d7 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -9,7 +9,7 @@ var/range = 25 - light_color = "#7BF9FF" + light_color = LIGHT_COLOR_CYAN //Simple variable to prevent me from doing attack_hand in both this and the child computer var/zone = "This computer is working on a wireless range, the range is currently limited to 25 meters." diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index b1def8f6bad..4301e311c58 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -8,13 +8,19 @@ power_channel = ENVIRON var/frequency = 0 var/id + var/id_tag use_power = 1 idle_power_usage = 2 active_power_usage = 5 + req_one_access_txt = "24;10" + Mtoollink = 1 + settagwhitelist = list("id_tag") /obj/machinery/meter/New() ..() src.target = locate(/obj/machinery/atmospherics/pipe) in loc + if(id && !id_tag)//i'm not dealing with further merge conflicts, fuck it + id_tag = id return 1 /obj/machinery/meter/initialize() @@ -59,7 +65,7 @@ signal.source = src signal.transmission_method = 1 signal.data = list( - "tag" = id, + "tag" = id_tag, "device" = "AM", "pressure" = round(env_pressure), "sigtype" = "status" @@ -106,6 +112,10 @@ return ..() /obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 + if (!istype(W, /obj/item/weapon/wrench)) return ..() playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -131,4 +141,12 @@ src.target = loc /obj/machinery/meter/turf/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) - return + return + +/obj/machinery/meter/multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + return {" + Main + "} \ No newline at end of file diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index bf53df74ecf..b2455ab2aa4 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -134,7 +134,8 @@ dat += "
Error: No growns inside.
Please put growns into reactor.
" menustat = "menu" if("nobeakerspace") - dat += "
Not enough space left in container. Unable to create product.
" + // dat += "
Not enough space left in container. Unable to create product.
" + user << "Not enough space left in container. Unable to create product. Please empty container." menustat = "menu" if(beaker) dat += "
Biomass: [points] units.

" diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index ab9a848d2ac..5f57b20c53d 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -3,7 +3,7 @@ desc = "A little security robot. He looks less than thrilled." icon = 'icons/obj/aibots.dmi' icon_state = "secbot0" - light_color = "#FF0000" + light_color = LIGHT_COLOR_PURE_RED layer = 5.0 density = 0 anchored = 0 @@ -414,12 +414,12 @@ Auto Patrol: []"}, /obj/machinery/bot/secbot/proc/flashing_lights() if(mode == BOT_HUNT) switch(light_color) - if("#FF0000") - light_color = "#0000FF" - if("#0000FF") - light_color = "#FF0000" + if(LIGHT_COLOR_PURE_RED) + light_color = LIGHT_COLOR_PURE_BLUE + if(LIGHT_COLOR_PURE_BLUE) + light_color = LIGHT_COLOR_PURE_RED else - light_color = "#FF0000" + light_color = LIGHT_COLOR_PURE_RED //Secbot Construction diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ca74948ce0a..2ae38331a7b 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -24,7 +24,7 @@ var/speed_coeff var/efficiency - light_color = "#00FF00" + light_color = LIGHT_COLOR_PURE_GREEN power_change() ..() if(!(stat & (BROKEN|NOPOWER))) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index edb61d5a6fa..0143d6e4eeb 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -9,7 +9,7 @@ var/damaged = 0 var/last_change = 0 - light_color = "#7BF9FF" + light_color = LIGHT_COLOR_CYAN attack_ai(var/mob/user as mob) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 367918883e2..ea74d862e95 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -9,7 +9,7 @@ var/mob/living/carbon/human/victim = null var/obj/machinery/optable/table = null - light_color = "#0000FF" + light_color = LIGHT_COLOR_PURE_BLUE /obj/machinery/computer/operating/New() ..() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index f576ae8d1b8..417e781e640 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -7,7 +7,7 @@ var/mob/living/silicon/ai/occupant = null var/active = 0 - light_color = "#CD00CD" + light_color = LIGHT_COLOR_PURPLE /obj/machinery/computer/aifixer/New() src.overlays += image('icons/obj/computer.dmi', "ai-fixer-empty") diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index e59e5eec359..998d79b33ab 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -11,7 +11,7 @@ var/receive_frequency = 1437 var/datum/radio_frequency/radio_connection - light_color = "#7BF9FF" + light_color = LIGHT_COLOR_CYAN /obj/machinery/computer/atmos_alert/initialize() diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 37d9c46773a..56cbdf8069c 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -232,6 +232,13 @@ build_path = "/obj/machinery/computer/telescience" origin_tech = "programming=3;bluespace=2" +/obj/item/weapon/circuitboard/atmos_automation + name = "Circuit board (Atmospherics Automation)" + build_path = "/obj/machinery/computer/general_air_control/atmos_automation" +/obj/item/weapon/circuitboard/large_tank_control + name = "Circuit board (Atmospheric Tank Control)" + build_path = "/obj/machinery/computer/general_air_control/large_tank_control" + /obj/item/weapon/circuitboard/HONKputer name = "Circuit board (HONKputer)" build_path = "/obj/machinery/computer/HONKputer" diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 7c8abadd7e9..33ac065926d 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -11,7 +11,7 @@ var/camera_cache_id = 1 var/obj/machinery/camera/current = null var/list/network = list("") var/last_pic = 1.0 - light_color = "#B40000" + light_color = LIGHT_COLOR_RED var/mapping = 0 var/cache_id = 0 var/list/networks[0] diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 70e95c39a88..6f7c803c359 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -11,7 +11,7 @@ var/mode = 0.0 var/printing = null - light_color = "#0099FF" + light_color = LIGHT_COLOR_LIGHTBLUE proc/is_centcom() return istype(src, /obj/machinery/computer/card/centcom) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index f97aa4f3389..2fb6ddc6f9c 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -16,7 +16,7 @@ var/autoprocess = 0 var/data[0] - light_color = "#315AB4" + light_color = LIGHT_COLOR_DARKBLUE /obj/machinery/computer/cloning/New() ..() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index fc082b5a0aa..f476181db78 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -58,7 +58,7 @@ var/shuttle_call/shuttle_calls[0] var/datum/announcement/priority/crew_announcement = new - light_color = "#0099FF" + light_color = LIGHT_COLOR_LIGHTBLUE /obj/machinery/computer/communications/New() ..() diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 786c7dedaac..048aab3a39e 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -5,7 +5,7 @@ use_power = 1 idle_power_usage = 250 active_power_usage = 500 - light_color = "#315AB4" + light_color = LIGHT_COLOR_DARKBLUE circuit = "/obj/item/weapon/circuitboard/crew" var/obj/nano_module/crew_monitor/crew_monitor diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm index e5dde186881..f4eec63fc7a 100644 --- a/code/game/machinery/computer/honkputer.dm +++ b/code/game/machinery/computer/honkputer.dm @@ -3,7 +3,7 @@ desc = "A yellow computer used in case of critically low levels of HONK." icon = 'icons/obj/machines/HONKputer.dmi' icon_state = "honk" - light_color = "#FF33CC" + light_color = LIGHT_COLOR_PINK req_access = list(access_clown) circuit = "/obj/item/weapon/circuitboard/HONKputer" var/authenticated = 0 diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 670dabcccc1..8137fd53a60 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -8,8 +8,8 @@ var/mob/living/silicon/ai/current = null var/opened = 0 - light_color = "#FFFFFF" - light_range_on = "2" + light_color = LIGHT_COLOR_WHITE + light_range_on = 2 verb/AccessInternals() diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index ec3460f2463..1b094542a42 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -16,7 +16,7 @@ var/temp = null var/printing = null - light_color = "#315AB4" + light_color = LIGHT_COLOR_DARKBLUE /obj/machinery/computer/med_data/attack_ai(user as mob) return src.attack_hand(user) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index eca2511611c..caf0ead1a8b 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -8,7 +8,7 @@ name = "Message Monitor Console" desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages." icon_state = "comm_logs" - light_color = "#00b000" + light_color = LIGHT_COLOR_GREEN var/hack_icon = "comm_logsc" var/normal_icon = "comm_logs" circuit = "/obj/item/weapon/circuitboard/message_monitor" @@ -34,7 +34,7 @@ var/customjob = "Admin" var/custommessage = "This is a test, please ignore." - light_color = "#50AB00" + light_color = LIGHT_COLOR_DARKGREEN /obj/machinery/computer/message_monitor/attackby(obj/item/weapon/O as obj, mob/living/user as mob, params) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 2311203b0d4..e77c73758fd 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -4,7 +4,7 @@ name = "Pod Launch Control" desc = "A controll for launching pods. Some people prefer firing Mechas." icon_state = "computer_generic" - light_color = "#00B000" + light_color = LIGHT_COLOR_GREEN circuit = /obj/item/weapon/circuitboard/pod var/id = 1.0 var/obj/machinery/mass_driver/connected = null diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm index f80026b2b41..5de9643fd7d 100644 --- a/code/game/machinery/computer/pod_tracking_console.dm +++ b/code/game/machinery/computer/pod_tracking_console.dm @@ -2,7 +2,7 @@ name = "Pod Tracking Console" icon = 'icons/obj/computer.dmi' icon_state = "podtracking" - light_color = "#C860C8" + light_color = LIGHT_COLOR_PURPLE req_access = list(access_robotics) circuit = "/obj/item/weapon/circuitboard/pod_locater" diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 69c9b4a54e0..f713732ff69 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -11,7 +11,7 @@ idle_power_usage = 20 active_power_usage = 80 - light_color = "#FF9933" + light_color = LIGHT_COLOR_ORANGE //fix for issue 521, by QualityVan. //someone should really look into why circuits have a powernet var, it's several kinds of retarded. diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index e2347cce9eb..1e667aae3b3 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -14,7 +14,7 @@ var/screen = 0 // 0 - No Access Denied, 1 - Access allowed var/obj/item/weapon/card/id/prisoner/inserted_id - light_color = "#A91515" + light_color = LIGHT_COLOR_DARKRED attack_ai(var/mob/user as mob) diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index 2e163a037cf..a19bc96211d 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -14,7 +14,7 @@ var/prison_shuttle_timeleft = 0 name = "Prison Shuttle Console" icon = 'icons/obj/computer.dmi' icon_state = "shuttle" - light_color = "#00ffff" + light_color = LIGHT_COLOR_PURE_CYAN req_access = list(access_security) circuit = "/obj/item/weapon/circuitboard/prison_shuttle" var/temp = null diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 8ecc35cdc70..fb9c89bbcae 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -10,7 +10,7 @@ circuit = /obj/item/weapon/circuitboard/robotics var/temp = null - light_color = "#CD00CD" + light_color = LIGHT_COLOR_PURPLE /obj/machinery/computer/robotics/proc/can_control(var/mob/user, var/mob/living/silicon/robot/R) if(!istype(R)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 20e05123ef8..4432de9d1cf 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -22,7 +22,7 @@ var/sortBy = "name" var/order = 1 // -1 = Descending - 1 = Ascending - light_color = "#B40000" + light_color = LIGHT_COLOR_RED /obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob, params) diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 74a0dab54e5..5af7663db5d 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -5,7 +5,7 @@ var/auth_need = 3.0 var/list/authorized = list( ) - light_color = "#7BF9FF" + light_color = LIGHT_COLOR_CYAN attackby(var/obj/item/weapon/card/W as obj, var/mob/user as mob, params) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 7430442ba5b..1717a25a92e 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -4,7 +4,7 @@ name = "Employment Records" desc = "Used to view personnel's employment records" icon_state = "medlaptop" - light_color = "#00b000" + light_color = LIGHT_COLOR_GREEN req_one_access = list(access_heads) circuit = "/obj/item/weapon/circuitboard/skills" var/obj/item/weapon/card/id/scan = null diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 3171da666c1..bc62e4eecd3 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -15,7 +15,7 @@ var/specops_shuttle_timeleft = 0 name = "Spec. Ops. Shuttle Console" icon = 'icons/obj/computer.dmi' icon_state = "shuttle" - light_color = "#00ffff" + light_color = LIGHT_COLOR_PURE_CYAN req_access = list(access_cent_specops) // req_access = list(ACCESS_CENT_SPECOPS) var/temp = null diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 772fe446e4e..eb9709470c6 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -6,7 +6,7 @@ circuit = "/obj/item/weapon/circuitboard/stationalert" var/alarms = list("Fire"=list(), "Atmosphere"=list(), "Power"=list()) - light_color = "#7BF9FF" + light_color = LIGHT_COLOR_CYAN attack_ai(mob/user) diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm index f110ca0dfd1..6578eaf8673 100644 --- a/code/game/machinery/computer/store.dm +++ b/code/game/machinery/computer/store.dm @@ -4,7 +4,7 @@ icon_state = "comm_logs" circuit = "/obj/item/weapon/circuitboard/merch" - light_color = "#00CC00" + light_color = LIGHT_COLOR_GREEN /obj/item/weapon/circuitboard/merch name = "\improper Merchandise Computer Circuitboard" diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 7c2f3c3987d..45455b9c663 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -14,7 +14,7 @@ var/syndicate_elite_shuttle_timeleft = 0 name = "Elite Syndicate Squad Shuttle Console" icon = 'icons/obj/computer.dmi' icon_state = "syndishuttle" - light_color = "#00ffff" + light_color = LIGHT_COLOR_PURE_CYAN req_access = list(access_syndicate) var/temp = null var/hacked = 0 diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index b89caed1dc3..ec0a06f969c 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -17,7 +17,7 @@ var/current_heat_capacity = 50 var/efficiency - light_color = "#FFFFFF" + light_color = LIGHT_COLOR_WHITE power_change() ..() if(!(stat & (BROKEN|NOPOWER))) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 04d83139453..30db6a7d225 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -307,6 +307,13 @@ W.loc = src if(W.contents.len) //Make sure we catch anything not handled by del() on the items. + var/preserve = null + for(var/T in preserve_items) + if(istype(W,T)) + preserve = 1 + break + if(preserve) // Don't remove the contents of things that need preservation + continue for(var/obj/item/O in W.contents) if(istype(O,/obj/item/weapon/tank)) //Stop eating pockets, you fuck! continue diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2c0bd7a6ae9..7fbc689bbbb 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -239,7 +239,7 @@ sleep(5) src.density = 0 sleep(5) - src.layer = 2.7 + src.layer = open_layer update_icon() set_opacity(0) operating = 0 @@ -263,7 +263,7 @@ operating = 1 do_animate("closing") - src.layer = 3.1 + src.layer = closed_layer sleep(5) src.density = 1 sleep(5) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index afe8fe92580..da899d48626 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -18,6 +18,7 @@ var/nextstate = null var/logged_users + closed_layer = 3.11 /obj/machinery/door/firedoor/New() . = ..() diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 7bbc05fb073..c829f3e01a6 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -19,6 +19,10 @@ name = "Large Pod Door" icon = 'icons/obj/doors/1x3blast_vert.dmi' +/obj/machinery/door/poddoor/two_tile_ver/ + name = "Large Pod Door" + icon = 'icons/obj/doors/1x2blast_vert.dmi' + /obj/machinery/door/poddoor/Bumped(atom/AM) if(!density) return ..() @@ -105,7 +109,7 @@ src.operating = 0 return -/* +/ /obj/machinery/door/poddoor/two_tile_hor/open() if (src.operating == 1) //doors can still open when emag-disabled return @@ -115,16 +119,17 @@ src.operating = 1 flick("pdoorc0", src) src.icon_state = "pdoor0" - src.set_opacity(0) - f1.set_opacity(0) - f2.set_opacity(0) - sleep(10) src.density = 0 - f1.density = 0 - f2.density = 0 + src.set_opacity(0) - update_nearby_tiles() + f1.density = 0 + f1.set_opacity(0) + f2.density = 0 + f2.set_opacity(0) + + air_update_turf(1) + update_freelok_sight() if(operating == 1) //emag again src.operating = 0 @@ -139,21 +144,22 @@ src.operating = 1 flick("pdoorc1", src) src.icon_state = "pdoor1" - src.density = 1 + f1.density = 1 + f1.set_opacity(1) f2.density = 1 + f2.set_opacity(1) + + if (src.visible) + src.set_opacity(1) + air_update_turf(1) + update_freelok_sight() sleep(10) - src.set_opacity(initial(opacity)) - f1.set_opacity(initial(opacity)) - f2.set_opacity(initial(opacity)) - - update_nearby_tiles() - src.operating = 0 return -*/ + /obj/machinery/door/poddoor/three_tile_hor/open() if (src.operating == 1) //doors can still open when emag-disabled return @@ -265,7 +271,9 @@ sleep(10) src.operating = 0 return -/* + + + /obj/machinery/door/poddoor/two_tile_ver/open() if (src.operating == 1) //doors can still open when emag-disabled return @@ -277,14 +285,15 @@ src.icon_state = "pdoor0" sleep(10) src.density = 0 - src.sd_set_opacity(0) + src.set_opacity(0) f1.density = 0 - f1.sd_set_opacity(0) + f1.set_opacity(0) f2.density = 0 - f2.sd_set_opacity(0) + f2.set_opacity(0) - update_nearby_tiles() + air_update_turf(1) + update_freelok_sight() if(operating == 1) //emag again src.operating = 0 @@ -302,18 +311,18 @@ src.density = 1 f1.density = 1 - f1.sd_set_opacity(1) + f1.set_opacity(1) f2.density = 1 - f2.sd_set_opacity(1) + f2.set_opacity(1) if (src.visible) - src.sd_set_opacity(1) - update_nearby_tiles() + src.set_opacity(1) + air_update_turf(1) + update_freelok_sight() sleep(10) src.operating = 0 return -*/ /obj/machinery/door/poddoor/three_tile_ver/open() if (src.operating == 1) //doors can still open when emag-disabled @@ -428,8 +437,6 @@ return -/* - /obj/machinery/door/poddoor/two_tile_hor var/obj/machinery/door/poddoor/filler_object/f1 var/obj/machinery/door/poddoor/filler_object/f2 @@ -438,11 +445,11 @@ New() ..() f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,EAST)) + f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,EAST)) f1.density = density f2.density = density - f1.sd_set_opacity(opacity) - f2.sd_set_opacity(opacity) + f1.set_opacity(opacity) + f2.set_opacity(opacity) Destroy() del f1 @@ -457,17 +464,17 @@ New() ..() f1 = new/obj/machinery/door/poddoor/filler_object (src.loc) - f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,NORTH)) + f2 = new/obj/machinery/door/poddoor/filler_object (get_step(f1,NORTH)) f1.density = density f2.density = density - f1.sd_set_opacity(opacity) - f2.sd_set_opacity(opacity) + f1.set_opacity(opacity) + f2.set_opacity(opacity) Destroy() del f1 del f2 ..() -*/ + /obj/machinery/door/poddoor/three_tile_hor var/obj/machinery/door/poddoor/filler_object/f1 var/obj/machinery/door/poddoor/filler_object/f2 diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index b9ab86027ce..e815ffc3257 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -233,11 +233,11 @@ user << "Subject may not have abiotic items on." return - user.visible_message("\red [user] starts to put [victim] into the gibber!") + user.visible_message("[user] starts to put [victim] into the gibber!") src.add_fingerprint(user) if(do_after(user, 30) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) - user.visible_message("\red [user] stuffs [victim] into the gibber!") + user.visible_message("[user] stuffs [victim] into the gibber!") if(victim.client) victim.client.perspective = EYE_PERSPECTIVE diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 17b260747dd..1fba31f1da9 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -33,7 +33,11 @@ if (!available_recipes) available_recipes = new for (var/type in (typesof(/datum/recipe/microwave)-/datum/recipe/microwave)) - available_recipes+= new type + var/datum/recipe/recipe = new type + if(recipe.result) // Ignore recipe subtypes that lack a result + available_recipes += recipe + else + del(recipe) acceptable_items = new acceptable_reagents = new for (var/datum/recipe/microwave/recipe in available_recipes) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index eac8e4d8121..367e31f7ac6 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -114,6 +114,7 @@ Class Procs: var/area/myArea var/interact_offline = 0 // Can the machine be interacted with while de-powered. var/use_log = list() + var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST. /obj/machinery/New() addAtProcessing() @@ -184,6 +185,119 @@ Class Procs: use_power(active_power_usage,power_channel, 1) return 1 +/obj/machinery/proc/multitool_topic(var/mob/user,var/list/href_list,var/obj/O) + if("set_id" in href_list) + if(!("id_tag" in vars)) + warning("set_id: [type] has no id_tag var.") + var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src:id_tag) as null|text),1,MAX_MESSAGE_LEN) + if(newid) + src:id_tag = newid + return MT_UPDATE|MT_REINIT + if("set_freq" in href_list) + if(!("frequency" in vars)) + warning("set_freq: [type] has no frequency var.") + return 0 + var/newfreq=src:frequency + if(href_list["set_freq"]!="-1") + newfreq=text2num(href_list["set_freq"]) + else + newfreq = input(usr, "Specify a new frequency (GHz). Decimals assigned automatically.", src, src:frequency) as null|num + if(newfreq) + if(findtext(num2text(newfreq), ".")) + newfreq *= 10 // shift the decimal one place + if(newfreq < 10000) + src:frequency = newfreq + return MT_UPDATE|MT_REINIT + return 0 + +/obj/machinery/proc/handle_multitool_topic(var/href, var/list/href_list, var/mob/user) + if(!allowed(user))//no, not even HREF exploits + return 0 + var/obj/item/device/multitool/P = get_multitool(usr) + if(P && istype(P)) + var/update_mt_menu=0 + var/re_init=0 + if("set_tag" in href_list) + if(!(href_list["set_tag"] in settagwhitelist))//I see you're trying Href exploits, I see you're failing, I SEE ADMIN WARNING. (seriously though, this is a powerfull HREF, I originally found this loophole, I'm not leaving it in on my PR) + message_admins("set_tag HREF (var attempted to edit: [href_list["set_tag"]]) exploit attempted by [key_name(user, user.client)] (?) on [src] ([x],[y],[z] - JMP)") + return 1 + if(!(href_list["set_tag"] in vars)) + usr << "Something went wrong: Unable to find [href_list["set_tag"]] in vars!" + return 1 + var/current_tag = src.vars[href_list["set_tag"]] + var/newid = copytext(reject_bad_text(input(usr, "Specify the new value", src, current_tag) as null|text),1,MAX_MESSAGE_LEN) + if(newid) + vars[href_list["set_tag"]] = newid + re_init=1 + + if("unlink" in href_list) + var/idx = text2num(href_list["unlink"]) + if (!idx) + return 1 + + var/obj/O = getLink(idx) + if(!O) + return 1 + if(!canLink(O)) + usr << "\red You can't link with that device." + return 1 + + if(unlinkFrom(usr, O)) + usr << "\blue A green light flashes on \the [P], confirming the link was removed." + else + usr << "\red A red light flashes on \the [P]. It appears something went wrong when unlinking the two devices." + update_mt_menu=1 + + if("link" in href_list) + var/obj/O = P.buffer + if(!O) + return 1 + if(!canLink(O,href_list)) + usr << "\red You can't link with that device." + return 1 + if (isLinkedWith(O)) + usr << "\red A red light flashes on \the [P]. The two devices are already linked." + return 1 + + if(linkWith(usr, O, href_list)) + usr << "\blue A green light flashes on \the [P], confirming the link was added." + else + usr << "\red A red light flashes on \the [P]. It appears something went wrong when linking the two devices." + update_mt_menu=1 + + if("buffer" in href_list) + P.buffer = src + usr << "\blue A green light flashes, and the device appears in the multitool buffer." + update_mt_menu=1 + + if("flush" in href_list) + usr << "\blue A green light flashes, and the device disappears from the multitool buffer." + P.buffer = null + update_mt_menu=1 + + var/ret = multitool_topic(usr,href_list,P.buffer) + if(ret == MT_ERROR) + return 1 + if(ret & MT_UPDATE) + update_mt_menu=1 + if(ret & MT_REINIT) + re_init=1 + + if(re_init) + initialize() + if(update_mt_menu) + //usr.set_machine(src) + update_multitool_menu(usr) + return 1 + +/obj/machinery/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/custom_state = default_state) + if(..()) + return 1 + handle_multitool_topic(href,href_list,usr) + add_fingerprint(usr) + return 0 + + /obj/machinery/CanUseTopic(var/mob/user, var/be_close) if(!interact_offline && (stat & (NOPOWER|BROKEN))) return STATUS_CLOSE @@ -197,8 +311,8 @@ Class Procs: /obj/machinery/CouldNotUseTopic(var/mob/user) usr.unset_machine() -//////////////////////////////////////////////////////////////////////////////////////////// - +//////////////////////////////////////////////////////////////////////////////////////////// + /obj/machinery/attack_ai(var/mob/user as mob) if(isrobot(user)) // For some reason attack_robot doesn't work @@ -354,7 +468,7 @@ Class Procs: I.loc = loc del(src) return 1 - + /obj/machinery/proc/on_assess_perp(mob/living/carbon/human/perp) return 0 diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index f553034eb19..169641a452c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -45,6 +45,12 @@ Buildable meters #define PIPE_SUPPLY_CAP 37 #define PIPE_SCRUBBERS_CAP 38 +///// /vg/ ported stuff +#define PIPE_INJECTOR 39 +#define PIPE_DVALVE 40 +#define PIPE_DP_VENT 41 +#define PIPE_PASV_VENT 42 + /obj/item/pipe name = "pipe" desc = "A pipe" @@ -103,6 +109,8 @@ Buildable meters src.pipe_type = PIPE_MANIFOLD else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_pump)) src.pipe_type = PIPE_UVENT + else if(istype(make_from, /obj/machinery/atmospherics/valve/digital)) + src.pipe_type = PIPE_DVALVE else if(istype(make_from, /obj/machinery/atmospherics/valve)) src.pipe_type = PIPE_MVALVE else if(istype(make_from, /obj/machinery/atmospherics/binary/pump)) @@ -147,6 +155,15 @@ Buildable meters src.color = PIPE_COLOR_RED else if(istype(make_from, /obj/machinery/atmospherics/pipe/cap)) src.pipe_type = PIPE_CAP + + else if(istype(make_from, /obj/machinery/atmospherics/unary/outlet_injector)) + src.pipe_type = PIPE_INJECTOR + else if(istype(make_from, /obj/machinery/atmospherics/binary/dp_vent_pump)) + src.pipe_type = PIPE_DP_VENT + else if(istype(make_from, /obj/machinery/atmospherics/pipe/vent)) + src.pipe_type = PIPE_PASV_VENT + + else if(istype(make_from, /obj/machinery/atmospherics/omni/mixer)) src.pipe_type = PIPE_OMNI_MIXER else if(istype(make_from, /obj/machinery/atmospherics/omni/filter)) @@ -157,6 +174,7 @@ Buildable meters else if(istype(make_from, /obj/machinery/atmospherics/pipe/zpipe/down)) src.pipe_type = PIPE_DOWN*/ ///// Z-Level stuff + else src.pipe_type = pipe_type src.dir = dir @@ -219,6 +237,11 @@ Buildable meters "scrubbers 4-way manifold", \ "supply pipe cap", \ "scrubbers pipe cap", \ + // /vg/ ported stuff + "air injector", \ + "Digital Valve", \ + "dual-port vent", \ + "passive vent", \ ) name = nlist[pipe_type+1] + " fitting" var/list/islist = list( \ @@ -264,11 +287,12 @@ Buildable meters "manifold4w", \ "cap", \ "cap", \ - "cap", \ - "cap", \ - "cap", \ - "cap", \ - ) + // /vg/ ported stuff + "injector", \ + "dvalve", \ + "dual-port vent", \ + "passive vent", \ + ) icon_state = islist[pipe_type + 1] //called when a turf is attacked with a pipe item @@ -286,7 +310,7 @@ Buildable meters src.dir = turn(src.dir, -90) - if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) + if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) if(dir==2) dir = 1 else if(dir==8) @@ -301,7 +325,7 @@ Buildable meters if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \ && (src.dir in cardinal)) src.dir = src.dir|turn(src.dir, 90) - else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) + else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) if(dir==2) dir = 1 else if(dir==8) @@ -325,6 +349,9 @@ Buildable meters PIPE_PUMP ,\ PIPE_VOLUME_PUMP ,\ PIPE_PASSIVE_GATE ,\ + PIPE_MVALVE, \ + PIPE_DVALVE, \ + PIPE_DP_VENT, \ PIPE_MVALVE ,\ PIPE_SUPPLY_STRAIGHT, \ PIPE_SCRUBBERS_STRAIGHT, \ @@ -333,7 +360,7 @@ Buildable meters return dir|flip if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT) return dir //dir|acw - if(PIPE_CONNECTOR,PIPE_UVENT,PIPE_SCRUBBER,PIPE_HEAT_EXCHANGE) + if(PIPE_CONNECTOR,PIPE_UVENT,PIPE_PASV_VENT,PIPE_SCRUBBER,PIPE_HEAT_EXCHANGE, PIPE_INJECTOR) return dir if(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER) return dir|flip|cw|acw @@ -395,7 +422,7 @@ Buildable meters return ..() if (!isturf(src.loc)) return 1 - if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE)) + if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) if(dir==2) dir = 1 else if(dir==8) @@ -1003,6 +1030,74 @@ Buildable meters C.node.build_network() machineReference = C + if(PIPE_INJECTOR) // air injector + var/obj/machinery/atmospherics/unary/outlet_injector/P = new( src.loc ) + P.dir = dir + P.initialize_directions = get_pipe_dir() + if (pipename) + name = pipename + var/turf/T = loc + P.level = T.intact ? 2 : 1 + P.initialize() + P.build_network() + if (P.node) + P.node.initialize() + P.node.build_network() + machineReference = P + + if(PIPE_DVALVE) + var/obj/machinery/atmospherics/valve/digital/V = new( src.loc ) + V.dir = dir + V.initialize_directions = pipe_dir + if (pipename) + V.name = pipename + var/turf/T = V.loc + V.level = T.intact ? 2 : 1 + V.initialize() + V.build_network() + if (V.node1) +// world << "[V.node1.name] is connected to valve, forcing it to update its nodes." + V.node1.initialize() + V.node1.build_network() + if (V.node2) +// world << "[V.node2.name] is connected to valve, forcing it to update its nodes." + V.node2.initialize() + V.node2.build_network() + machineReference = V + + if(PIPE_DP_VENT) + var/obj/machinery/atmospherics/binary/dp_vent_pump/P = new(src.loc) + P.dir = dir + P.initialize_directions = pipe_dir + if (pipename) + P.name = pipename + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() + machineReference = P + + if(PIPE_PASV_VENT) + var/obj/machinery/atmospherics/pipe/vent/P = new(src.loc) + P.dir = dir + P.initialize_directions = get_pipe_dir() + if (pipename) + name = pipename + var/turf/T = loc + level = T.intact ? 2 : 1 + initialize() + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + machineReference = P + ///// Z-Level stuff /* if(PIPE_UP) var/obj/machinery/atmospherics/pipe/zpipe/up/P = new(src.loc) @@ -1029,10 +1124,6 @@ Buildable meters var/turf/T = P.loc P.level = T.intact ? 2 : 1 P.initialize() - P.build_network() - if (P.node1) - P.node1.initialize() - P.node1.build_network() if (P.node2) P.node2.initialize() P.node2.build_network()*/ @@ -1090,6 +1181,23 @@ Buildable meters playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "\blue You have fastened the meter to the pipe" del(src) + +/obj/item/pipe_gsensor + name = "gas sensor" + desc = "A sensor that can be hooked to a computer" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "gsensor0" + item_state = "buildpipe" + w_class = 4 + +/obj/item/pipe_gsensor/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + ..() + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + new/obj/machinery/air_sensor( src.loc ) + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You have fastened the gas sensor" + del(src) //not sure why these are necessary #undef PIPE_SIMPLE_STRAIGHT #undef PIPE_SIMPLE_BENT @@ -1120,4 +1228,8 @@ Buildable meters #undef PIPE_SUPPLY_MANIFOLD #undef PIPE_SCRUBBERS_MANIFOLD #undef PIPE_UNIVERSAL +#undef PIPE_INJECTOR +#undef PIPE_DVALVE +#undef PIPE_DP_VENT +#undef PIPE_PASV_VENT //#undef PIPE_MANIFOLD4W diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 959df353b38..d7b47e15aeb 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -19,6 +19,7 @@ Bent Pipe
Manifold
Manual Valve
+Digital Valve
Pipe Cap
4-Way Manifold
Manual T-Valve
@@ -43,8 +44,12 @@ Volume Pump
Scrubber
Meter
+Gas Sensor
Gas Filter
Gas Mixer
+Air Injector
+Dual-Port Vent Pump
+Passive Vent
Heat exchange:
Pipe
Bent Pipe
@@ -56,6 +61,7 @@ "} //What number the make points to is in the define # at the top of construction.dm in same folder +//which for some reason couldn't just be left defined, so it could be used here, top kek user << browse("[src][dat]", "window=pipedispenser") onclose(user, "pipedispenser") @@ -85,6 +91,12 @@ wait = 1 spawn(15) wait = 0 + if(href_list["makegsensor"]) + if(!wait) + new /obj/item/pipe_gsensor(/*usr.loc*/ src.loc) + wait = 1 + spawn(15) + wait = 0 return /obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob, params) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 713d326edc1..36b74f897a6 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -1,7 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 /obj/machinery/computer/telecomms - light_color = "#50AB00" + light_color = LIGHT_COLOR_DARKGREEN /obj/machinery/computer/telecomms/server name = "Telecommunications Server Monitor" diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 98d7835bdb6..1fbfdb1c1fe 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -105,12 +105,19 @@ F.loc = src.loc del(src) +/obj/machinery/telecomms/proc/formatInput(var/label,var/varname, var/input) + var/value = vars[varname] + if(!value || value=="") + value="-----" + return "[label]: [value]" /obj/machinery/telecomms/attack_ai(var/mob/user as mob) attack_hand(user) /obj/machinery/telecomms/attack_hand(var/mob/user as mob) + update_multitool_menu(user) +/obj/machinery/telecomms/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) // You need a multitool to use this, or be silicon if(!issilicon(user)) // istype returns false if the value is null @@ -120,62 +127,62 @@ if(stat & (BROKEN|NOPOWER)) return - var/obj/item/device/multitool/P = get_multitool(user) - - user.set_machine(src) var/dat - dat = "[src.name]

[src.name] Access

" - dat += "
[temp]
" - dat += "
Power Status: [src.toggled ? "On" : "Off"]" + + dat = {" +

[temp]

+

Power Status: [src.toggled ? "On" : "Off"]

"} if(on && toggled) - if(id != "" && id) - dat += "
Identification String: [id]" - else - dat += "
Identification String: NULL" - dat += "
Network: [network]" - dat += "
Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]" - if(hide) dat += "
Shadow Link: ACTIVE" + dat += {" +

[formatInput("Identification String","id","id")]

+

[formatInput("Network","network","network")]

+

Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]

+ "} + if(hide) + dat += "

Shadow Link: ACTIVE

" //Show additional options for certain machines. dat += Options_Menu() - dat += "
Linked Network Entities:
    " - + dat += {"

    Linked Network Entities:

      "} var/i = 0 for(var/obj/machinery/telecomms/T in links) i++ if(T.hide && !src.hide) continue dat += "
    1. \ref[T] [T.name] ([T.id]) \[X\]
    2. " - dat += "
    " - - dat += "
    Filtering Frequencies: " + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\telecomms\machine_interactions.dm:140: dat += "
" + dat += {" +

Filtering Frequencies:

"} + // END AUTOFIX i = 0 if(length(freq_listening)) + dat += "" else - dat += "NONE" + dat += "
  • NONE
  • " - dat += "
    \[Add Filter\]" - dat += "
    " - if(P) - if(P.buffer) - dat += "

    MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]" - else - dat += "

    MULTITOOL BUFFER:
    \[Add Machine\]" + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\telecomms\machine_interactions.dm:155: dat += "
    \[Add Filter\]" + dat += {"

    \[Add Filter\]

    +
    "} + // END AUTOFIX - dat += "
    " - temp = "" - user << browse(dat, "window=tcommachine;size=520x500;can_resize=0") - onclose(user, "dormitory") + return dat +/obj/machinery/telecomms/canLink(var/obj/O) + return istype(O,/obj/machinery/telecomms) + +/obj/machinery/telecomms/isLinkedWith(var/obj/O) + return O != null && O in links + +/obj/machinery/telecomms/getLink(var/idx) + return (idx >= 1 && idx <= links.len) ? links[idx] : null // Off-Site Relays // @@ -368,8 +375,8 @@ if(P) if(P.buffer && P.buffer != src) - if(!(src in P.buffer.links)) - P.buffer.links.Add(src) + if(!(src in P.buffer:links)) + P.buffer:links.Add(src) if(!(P.buffer in src.links)) src.links.Add(P.buffer) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index fe8910962c4..0450905528f 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -36,7 +36,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/circuitboard = null // string pointing to a circuitboard type var/hide = 0 // Is it a hidden machine? var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to. - + Mtoollink = 1 /obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20) // relay signal to all linked machinery that are of type [filter]. If signal has been sent [amount] times, stop sending diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index d8bc0fb0972..1899ee09ac3 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -20,7 +20,7 @@ var/temp = "" // temporary feedback messages circuit = "/obj/item/weapon/circuitboard/comm_monitor" - light_color = "#50AB00" + light_color = LIGHT_COLOR_DARKGREEN attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 58239808add..967cef6617c 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -14,7 +14,7 @@ var/storedcode = "" // code stored - light_color = "#50AB00" + light_color = LIGHT_COLOR_DARKGREEN req_access = list(access_tcomsat) circuit = "/obj/item/weapon/circuitboard/comm_traffic" diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index e6bf09f19af..7b69d8fdee2 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -168,9 +168,7 @@ /obj/machinery/vending/RefreshParts() //Better would be to make constructable child if(component_parts) - build_inventory(products, start_empty = 1) - build_inventory(contraband, 1, 1) - build_inventory(premium, 0, 1, 1) + build_inventory() for(var/obj/item/weapon/vending_refill/VR in component_parts) refill_inventory(VR, product_records) @@ -1017,7 +1015,7 @@ vend_delay = 15 vend_reply = "Have an enchanted evening!" product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!" - products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2) + products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/twohanded/staff = 2) /obj/machinery/vending/autodrobe name = "\improper AutoDrobe" @@ -1038,13 +1036,13 @@ /obj/item/clothing/under/pirate = 1,/obj/item/clothing/suit/pirate_brown = 1,/obj/item/clothing/suit/pirate_black =1,/obj/item/clothing/under/pirate_rags =1,/obj/item/clothing/head/pirate = 1,/obj/item/clothing/head/bandana = 1, /obj/item/clothing/head/bandana = 1,/obj/item/clothing/under/soviet = 1,/obj/item/clothing/head/ushanka = 1,/obj/item/clothing/suit/imperium_monk = 1, /obj/item/clothing/mask/gas/cyborg = 1,/obj/item/clothing/suit/holidaypriest = 1,/obj/item/clothing/head/wizard/marisa/fake = 1, - /obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/weapon/staff/broom = 1, - /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1, + /obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/weapon/twohanded/staff/broom = 1, + /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/twohanded/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1, /obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1, /obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero = 1, /obj/item/clothing/suit/poncho = 1, /obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, /obj/item/clothing/accessory/blue = 1, /obj/item/clothing/accessory/red = 1, /obj/item/clothing/accessory/black = 1, /obj/item/clothing/accessory/horrible = 1, /obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1, /obj/item/clothing/under/pants/camo = 1, /obj/item/clothing/mask/bandana = 1, /obj/item/clothing/mask/bandana/black = 1) - contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1) + contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2) premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1) refill_canister = /obj/item/weapon/vending_refill/autodrobe diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index bfe5ade766a..dd13db06290 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -1080,16 +1080,4 @@ set_ready_state(0) chassis.use_power(energy_drain) do_after_cooldown() - return 1 - -/obj/item/weapon/paintkit //Please don't use this for anything, it's a base type for custom mech paintjobs. - name = "mecha customisation kit" - desc = "A generic kit containing all the needed tools and parts to turn a mech into another mech." - icon = 'icons/obj/custom_items.dmi' - icon_state = "royce_kit" - - var/new_name = "mech" //What is the variant called? - var/new_desc = "A mech." //How is the new mech described? - var/new_icon = "ripley" //What base icon will the new mech use? - var/removable = null //Can the kit be removed? - var/list/allowed_types = list() //Types of mech that the kit will work on. \ No newline at end of file + return 1 \ No newline at end of file diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 5925d46fc61..2116c56faed 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -99,7 +99,7 @@ anchored = 1 icon = 'icons/obj/computer.dmi' icon_state = "recharge_comp" - light_color = "#a97faa" + light_color = LIGHT_COLOR_FADEDPURPLE circuit = /obj/item/weapon/circuitboard/mech_bay_power_console var/obj/machinery/mech_bay_recharge_port/recharge_port diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index a56dc0db575..c4965210c95 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -2,7 +2,7 @@ name = "Exosuit Control" icon = 'icons/obj/computer.dmi' icon_state = "mecha" - light_color = "#a97faa" + light_color = LIGHT_COLOR_FADEDPURPLE req_access = list(access_robotics) circuit = "/obj/item/weapon/circuitboard/mecha_control" var/list/located = list() diff --git a/code/game/mecha/paintkits.dm b/code/game/mecha/paintkits.dm new file mode 100644 index 00000000000..872138c9b40 --- /dev/null +++ b/code/game/mecha/paintkits.dm @@ -0,0 +1,33 @@ +/obj/item/weapon/paintkit //Please don't use this for anything, it's a base type for custom mech paintjobs. + name = "mecha customisation kit" + desc = "A generic kit containing all the needed tools and parts to turn a mech into another mech." + icon = 'icons/obj/custom_items.dmi' + icon_state = "royce_kit" + + var/new_name = "mech" //What is the variant called? + var/new_desc = "A mech." //How is the new mech described? + var/new_icon = "ripley" //What base icon will the new mech use? + var/removable = null //Can the kit be removed? + var/list/allowed_types = list() //Types of mech that the kit will work on. + +/obj/item/weapon/paintkit/titansfist + name = "Ripley customisation kit" + desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech." + icon = 'icons/obj/custom_items.dmi' + icon_state = "royce_kit" + + new_name = "APLU \"Titan's Fist\"" + new_desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist." + new_icon = "titan" + allowed_types = list("ripley","firefighter") + +/obj/item/weapon/paintkit/mercenary + name = "Mercenary APLU kit" + desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU." + icon = 'icons/obj/custom_items.dmi' + icon_state = "sven_kit" + + new_name = "APLU \"Strike the Earth!\"" + new_desc = "Looks like an over worked, under maintained Ripley with some horrific damage." + new_icon = "earth" + allowed_types = list("ripley","firefighter") \ No newline at end of file diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 2e00c5d99d8..5b13f3258dc 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -39,7 +39,7 @@ if("JoinLate") latejoin += loc del(src) - + if("JoinLateGateway") latejoin_gateway += loc del(src) @@ -47,7 +47,7 @@ if("JoinLateCryo") latejoin_cryo += loc del(src) - + if("JoinLateCyborg") latejoin_cyborg += loc del(src) @@ -90,7 +90,7 @@ if("carpspawn") carplist += loc - + if("voxstart") raider_spawn += loc @@ -252,13 +252,13 @@ /obj/effect/landmark/costume/cutewitch/New() new /obj/item/clothing/under/sundress(src.loc) new /obj/item/clothing/head/witchwig(src.loc) - new /obj/item/weapon/staff/broom(src.loc) + new /obj/item/weapon/twohanded/staff/broom(src.loc) del(src) /obj/effect/landmark/costume/fakewizard/New() new /obj/item/clothing/suit/wizrobe/fake(src.loc) new /obj/item/clothing/head/wizard/fake(src.loc) - new /obj/item/weapon/staff/(src.loc) + new /obj/item/weapon/twohanded/staff/(src.loc) del(src) /obj/effect/landmark/costume/sexyclown/New() diff --git a/code/game/objects/effects/sm_crystals.dm b/code/game/objects/effects/sm_crystals.dm new file mode 100644 index 00000000000..d725b23d0bc --- /dev/null +++ b/code/game/objects/effects/sm_crystals.dm @@ -0,0 +1,179 @@ +//separate dm since hydro is getting bloated already + +/obj/effect/supermatter_crystal + name = "supermatter growth" + anchored = 1 + opacity = 0 + density = 0 + icon = 'icons/obj/lighting.dmi' + icon_state = "supermatter_crystalf" + layer = 2.1 + light_color = "#8A8A00" + + var/endurance = 100 + var/delay = 1200 + var/floor = 0 + var/spreadChance = 10 + var/spreadIntoAdjacentChance = 10 + var/lastTick = 0 + var/spreaded = 1 + var/deleted = 0 + +/obj/effect/supermatter_crystal/single + spreadChance = 0 + +/obj/effect/supermatter_crystal/New() + ..() + light_color = "#8A8A00" + + dir = CalcDir() + + if(!floor) + switch(dir) //offset to make it be on the wall rather than on the floor + if(NORTH) + pixel_y = 32 + if(SOUTH) + pixel_y = -32 + if(EAST) + pixel_x = 32 + if(WEST) + pixel_x = -32 + icon_state = "supermatter_crystal" + else + if( prob( 10 )) // Only 10% of all floor crystals survive, so there's not a forest of 'em + icon_state = "supermatter_crystalf" + name = "supermatter crystal" + density = 1 + else + deleted = 1 + del( src ) + + processing_objects += src + + set_light(3) + lastTick = world.timeofday + +/obj/effect/supermatter_crystal/Del() + if( !deleted ) + visible_message("\red \The [src] shatters!") + new /obj/item/weapon/shard/supermatter( src.loc ) + + processing_objects -= src + ..() + +/obj/effect/supermatter_crystal/process() + if(!spreaded) + return + + if(((world.timeofday - lastTick) > delay) || ((world.timeofday - lastTick) < 0)) + lastTick = world.timeofday + spreaded = 0 + + for(var/mob/living/l in range( src, 2 )) + var/rads = 5 + l.apply_effect(rads, IRRADIATE) + + for(var/i=1,i<=3,i++) + if(prob(spreadChance)) + var/list/possibleLocs = list() + var/spreadsIntoAdjacent = 0 + + if(prob(spreadIntoAdjacentChance)) + spreadsIntoAdjacent = 1 + + for(var/turf/simulated/floor/floor in view(3,src)) + if(spreadsIntoAdjacent || !locate(/obj/effect/supermatter_crystal) in view(1,floor)) + possibleLocs += floor + + if(!possibleLocs.len) + break + + var/turf/newLoc = pick(possibleLocs) + + var/crystalCount = 0 //hacky + var/placeCount = 1 + for(var/obj/effect/supermatter_crystal/shroom in newLoc) + crystalCount++ + for(var/wallDir in cardinal) + var/turf/isWall = get_step(newLoc,wallDir) + if(isWall.density) + placeCount++ + if(crystalCount >= placeCount) + continue + + var/obj/effect/supermatter_crystal/child = new /obj/effect/supermatter_crystal(newLoc) + if( child ) + child.delay = delay + child.endurance = endurance + + spreaded++ + +/obj/effect/supermatter_crystal/proc/CalcDir(turf/location = loc) + for(var/wallDir in cardinal) + var/turf/newTurf = get_step(location,wallDir) + if(newTurf.density) + return wallDir + +/* + var/direction = 16 + + for(var/wallDir in cardinal) + var/turf/newTurf = get_step(location,wallDir) + if(newTurf.density) + direction |= wallDir + + for(var/obj/effect/supermatter_crystal/crystal in location) + if(crystal == src) + continue + if(crystal.floor) //special + direction &= ~16 + else + direction &= ~crystal.dir + + var/list/dirList = list() + + for(var/i=1,i<=16,i <<= 1) + if(direction & i) + dirList += i + + if(dirList.len) + var/newDir = pick(dirList) + if(newDir == 16) + floor = 1 + newDir = 1 + return newDir +*/ + floor = 1 + return 1 + +/obj/effect/supermatter_crystal/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + + endurance -= W.force + + CheckEndurance() + +/obj/effect/supermatter_crystal/ex_act(severity) + switch(severity) + if(1.0) + del(src) + return + if(2.0) + if (prob(50)) + del(src) + return + if(3.0) + if (prob(5)) + del(src) + return + else + return + +/obj/effect/supermatter_crystal/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + endurance -= 5 + CheckEndurance() + +/obj/effect/supermatter_crystal/proc/CheckEndurance() + if(endurance <= 0) + del(src) \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index a6879546e11..f73a366ea94 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -634,7 +634,7 @@ eyes.take_damage(rand(3,4), 1) if(eyes.damage >= eyes.min_bruised_damage) if(M.stat != 2) - if(!(eyes & ORGAN_ROBOT) || !(eyes & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly + if(!(eyes.status & ORGAN_ROBOT) || !(eyes.status & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly M << "\red Your eyes start to bleed profusely!" if(prob(50)) if(M.stat != 2) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 71731ca138d..91e264715b0 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -116,8 +116,8 @@ name = "flare" desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'." w_class = 2.0 - brightness_on = 7 // Pretty bright. - light_color = "#e58775" + brightness_on = 8 // Made it brighter (from 7 to 8). + light_color = "#ff0000" // changed colour to a more brighter red. icon_state = "flare" item_state = "flare" var/fuel = 0 @@ -223,7 +223,7 @@ "[user] blinks \the [src] at \the [A].") if(ismob(A)) var/mob/M = A - add_logs(user, M, "attacked", object="EMP-light") + add_logs(M, user, "attacked", object="EMP-light") user << "\The [src] now has [emp_cur_charges] charge\s." A.emp_act(1) else diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 21bd2c49ddf..9c1072cfa65 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -18,7 +18,12 @@ m_amt = 50 g_amt = 20 origin_tech = "magnets=1;engineering=1" - var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage + var/obj/machinery/buffer // simple machine buffer for device linkage + +/obj/item/device/multitool/proc/IsBufferA(var/typepath) + if(!buffer) + return 0 + return istype(buffer,typepath) // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index de473470896..019e5f02896 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -227,6 +227,8 @@ REAGENT SCANNER for(var/name in H.organs_by_name) var/obj/item/organ/external/e = H.organs_by_name[name] + if(!e) + continue if(e.status & ORGAN_BROKEN) user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1) break diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 32c04c5b6a7..f7e53bde3ab 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -126,7 +126,7 @@ if (R.one_per_turf && (locate(R.result_type) in usr.loc)) usr << "\red There is another [R.title] here!" return - if (R.on_floor && !istype(usr.loc, /turf/simulated/floor)) + if (R.on_floor && !istype(usr.loc, /turf/simulated)) usr << "\red \The [R.title] must be constructed on the floor!" return if (R.time) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 2bf38626404..db8945d9063 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -166,14 +166,6 @@ /obj/item/weapon/card/id/attackby(obj/item/weapon/W as obj, mob/user as mob, params) ..() - if(istype(W,/obj/item/weapon/id_wallet)) - user << "You slip [src] into [W]." - src.name = "[src.registered_name]'s [W.name] ([src.assignment])" - src.desc = W.desc - src.icon = W.icon - src.icon_state = W.icon_state - del(W) - return if(istype(W, /obj/item/weapon/id_decal/)) var/obj/item/weapon/id_decal/decal = W diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs.dm similarity index 76% rename from code/game/objects/items/weapons/cigs_lighters.dm rename to code/game/objects/items/weapons/cigs.dm index 1525681adc7..e6ca596f519 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -2,52 +2,14 @@ /* CONTAINS: -MATCHES CIGARETTES CIGARS SMOKING PIPES -CHEAP LIGHTERS -ZIPPO CIGARETTE PACKETS ARE IN FANCY.DM +LIGHTERS ARE IN LIGHTERS.DM */ -/////////// -//MATCHES// -/////////// -/obj/item/weapon/match - name = "match" - desc = "A simple match stick, used for lighting fine smokables." - icon = 'icons/obj/cigarettes.dmi' - icon_state = "match_unlit" - var/lit = 0 - var/smoketime = 5 - w_class = 1.0 - origin_tech = "materials=1" - attack_verb = list("burnt", "singed") - -/obj/item/weapon/match/process() - var/turf/location = get_turf(src) - smoketime-- - if(smoketime < 1) - icon_state = "match_burnt" - lit = -1 - processing_objects.Remove(src) - return - if(location) - location.hotspot_expose(700, 5) - return - -/obj/item/weapon/match/dropped(mob/user as mob) - if(lit == 1) - lit = -1 - damtype = "brute" - icon_state = "match_burnt" - item_state = "cigoff" - name = "burnt match" - desc = "A match. This one has seen better days." - return ..() - ////////////////// //FINE SMOKABLES// ////////////////// @@ -391,105 +353,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM smoketime = 800 chem_volume = 40 - - -///////// -//ZIPPO// -///////// -/obj/item/weapon/lighter - name = "cheap lighter" - desc = "A cheap-as-free lighter." - icon = 'icons/obj/items.dmi' - icon_state = "lighter-g" - item_state = "lighter-g" - var/icon_on = "lighter-g-on" - var/icon_off = "lighter-g" - w_class = 1 - throwforce = 4 - flags = CONDUCT - slot_flags = SLOT_BELT - attack_verb = list("burnt", "singed") - var/lit = 0 - -/obj/item/weapon/lighter/zippo - name = "Zippo lighter" - desc = "The zippo." - icon_state = "zippo" - item_state = "zippo" - icon_on = "zippoon" - icon_off = "zippo" - -/obj/item/weapon/lighter/random - New() - var/color = pick("r","c","y","g") - icon_on = "lighter-[color]-on" - icon_off = "lighter-[color]" - icon_state = icon_off - -/obj/item/weapon/lighter/attack_self(mob/living/user) - if(user.r_hand == src || user.l_hand == src || isrobot(user)) - if(!lit) - lit = 1 - w_class = 4 - icon_state = icon_on - item_state = icon_on - if(istype(src, /obj/item/weapon/lighter/zippo) ) - user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.") - playsound(src.loc, 'sound/items/ZippoLight.ogg', 25, 1) - else - if(prob(75)) - user.visible_message("After a few attempts, [user] manages to light the [src].") - else - user << "You burn yourself while lighting the lighter." - user.adjustFireLoss(5) - user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") - - set_light(2) - processing_objects.Add(src) - else - lit = 0 - w_class = 1 - icon_state = icon_off - item_state = icon_off - if(istype(src, /obj/item/weapon/lighter/zippo) ) - user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing. Wow.") - playsound(src.loc, 'sound/items/ZippoClose.ogg', 25, 1) - else - user.visible_message("[user] quietly shuts off the [src].") - - set_light(0) - processing_objects.Remove(src) - else - return ..() - return - - -/obj/item/weapon/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!isliving(M)) - return - M.IgniteMob() - if(!istype(M, /mob)) - return - - if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette) && user.zone_sel.selecting == "mouth" && lit) - var/obj/item/clothing/mask/cigarette/cig = M.wear_mask - if(M == user) - cig.attackby(src, user) - else - if(istype(src, /obj/item/weapon/lighter/zippo)) - cig.light("[user] whips the [name] out and holds it for [M]. Their arm is as steady as the unflickering flame they light \the [cig] with.") - else - cig.light("[user] holds the [name] out for [M], and lights the [cig.name].") - else - ..() - -/obj/item/weapon/lighter/process() - var/turf/location = get_turf(src) - if(location) - location.hotspot_expose(700, 5) - return - - /////////// //ROLLING// /////////// diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 84dc2d0c8b7..0b27c34c607 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -27,6 +27,8 @@ return if(istype(M, /mob/living/carbon/human) && M:species.bodyflags & FEET_NOSLIP) return + if(M.flying) + return M.stop_pulling() M << "\blue You slipped on the [name]!" @@ -42,6 +44,8 @@ var/mob/M = AM if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP) || M.buckled) return + if(M.flying) + return M.stop_pulling() M << "\blue You slipped on the [name]!" @@ -57,7 +61,7 @@ user << "You need to take that [target.name] off before cleaning it." else if(istype(target,/obj/effect/decal/cleanable)) user.visible_message("[user] begins to scrub \the [target.name] out with [src].") - if(do_after(user, src.cleanspeed)) + if(do_after(user, src.cleanspeed) && target) user << "You scrub \the [target.name] out." del(target) else diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index b0ef2bb03db..58ebf621f7d 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -325,7 +325,7 @@ H.updatehealth() //forces health update before next life tick playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) H.emote("gasp") - add_logs(user, M, "stunned", object="defibrillator") + add_logs(M, user, "stunned", object="defibrillator") defib.deductcharge(revivecost) cooldown = 1 busy = 0 @@ -379,7 +379,7 @@ if(tplus > tloss) H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) defib.deductcharge(revivecost) - add_logs(user, M, "revived", object="defibrillator") + add_logs(M, user, "revived", object="defibrillator") else if(tplus > tlimit) user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") @@ -440,7 +440,7 @@ H.updatehealth() //forces health update before next life tick playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) H.emote("gasp") - add_logs(user, M, "stunned", object="defibrillator") + add_logs(M, user, "stunned", object="defibrillator") if(isrobot(user)) var/mob/living/silicon/robot/R = user R.cell.use(revivecost) @@ -490,7 +490,7 @@ if(isrobot(user)) var/mob/living/silicon/robot/R = user R.cell.use(revivecost) - add_logs(user, M, "revived", object="defibrillator") + add_logs(M, user, "revived", object="defibrillator") else if(tplus > tlimit) user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 1965473e717..c8d2c4c20da 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -76,7 +76,7 @@ loc = null if (ismob(target)) - add_logs(user, target, "planted [name] on") + add_logs(target, user, "planted [name] on") user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") message_admins("[key_name(user, user.client)](?) planted C4 on [key_name(target)](?) with [timer] second fuse",0,1) log_game("[key_name(user)] planted C4 on [key_name(target)] with [timer] second fuse") diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index af8b8e2fe5f..70b2b5fe03e 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -24,13 +24,12 @@ /obj/item/weapon/flamethrower/Destroy() if(weldtool) - del(weldtool) + qdel(weldtool) if(igniter) - del(igniter) + qdel(igniter) if(ptank) - del(ptank) + qdel(ptank) ..() - return /obj/item/weapon/flamethrower/process() @@ -60,8 +59,8 @@ item_state = "flamethrower_0" return -/obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, proximity) - if(!proximity) return +/obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, flag) + if(flag) return // too close // Make sure our user is still holding us if(user && user.get_active_hand() == src) var/turf/target_turf = get_turf(target) @@ -83,7 +82,7 @@ ptank.loc = T ptank = null new /obj/item/stack/rods(T) - del(src) + qdel(src) return if(isscrewdriver(W) && igniter && !lit) @@ -163,7 +162,6 @@ usr.set_machine(src) if(href_list["light"]) if(!ptank) return - if(ptank.air_contents.toxins < 1) return if(!status) return lit = !lit if(lit) @@ -184,22 +182,26 @@ update_icon() return +/obj/item/weapon/flamethrower/CheckParts() + weldtool = locate(/obj/item/weapon/weldingtool) in contents + igniter = locate(/obj/item/device/assembly/igniter) in contents + update_icon() //Called from turf.dm turf/dblclick /obj/item/weapon/flamethrower/proc/flame_turf(turflist) if(!lit || operating) return operating = 1 + var/turf/previousturf = get_turf(src) for(var/turf/simulated/T in turflist) if(!T.air) break - if(!previousturf && length(turflist)>1) - previousturf = get_turf(src) + if(T == previousturf) continue //so we don't burn the tile we be standin on - if(previousturf && LinkBlocked(previousturf, T)) + if(!T.CanAtmosPass(previousturf)) break ignite_turf(T) sleep(1) - previousturf = null + previousturf = T operating = 0 for(var/mob/M in viewers(1, loc)) if((M.client && M.machine == src)) @@ -222,10 +224,16 @@ /obj/item/weapon/flamethrower/full/New(var/loc) ..() - weldtool = new /obj/item/weapon/weldingtool(src) + if(!weldtool) + weldtool = new /obj/item/weapon/weldingtool(src) weldtool.status = 0 - igniter = new /obj/item/device/assembly/igniter(src) + if(!igniter) + igniter = new /obj/item/device/assembly/igniter(src) igniter.secured = 0 status = 1 update_icon() - return \ No newline at end of file + +/obj/item/weapon/flamethrower/full/tank/New(var/loc) + ..() + ptank = new /obj/item/weapon/tank/plasma/full(src) + update_icon() \ No newline at end of file diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 6a7e86dfea0..329edef72f6 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -34,7 +34,7 @@ else feedback_add_details("handcuffs","H") - add_logs(user, C, "handcuffed") + add_logs(C, user, "handcuffed", src) else user << "You fail to handcuff [C]." diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm new file mode 100644 index 00000000000..04dccdc4da1 --- /dev/null +++ b/code/game/objects/items/weapons/lighters.dm @@ -0,0 +1,196 @@ +///////// +//ZIPPO// +///////// +/obj/item/weapon/lighter + name = "cheap lighter" + desc = "A cheap-as-free lighter." + icon = 'icons/obj/items.dmi' + icon_state = "lighter-g" + item_state = "lighter-g" + var/icon_on = "lighter-g-on" + var/icon_off = "lighter-g" + w_class = 1 + throwforce = 4 + flags = CONDUCT + slot_flags = SLOT_BELT + attack_verb = list("burnt", "singed") + var/lit = 0 + +/obj/item/weapon/lighter/zippo + name = "Zippo lighter" + desc = "The zippo." + icon_state = "zippo" + item_state = "zippo" + icon_on = "zippoon" + icon_off = "zippo" + +/obj/item/weapon/lighter/random + New() + var/color = pick("r","c","y","g") + icon_on = "lighter-[color]-on" + icon_off = "lighter-[color]" + icon_state = icon_off + +/obj/item/weapon/lighter/attack_self(mob/living/user) + if(user.r_hand == src || user.l_hand == src || isrobot(user)) + if(!lit) + lit = 1 + w_class = 4 + icon_state = icon_on + item_state = icon_on + if(istype(src, /obj/item/weapon/lighter/zippo) ) + user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.") + playsound(src.loc, 'sound/items/ZippoLight.ogg', 25, 1) + else + if(prob(75)) + user.visible_message("After a few attempts, [user] manages to light the [src].") + else + user << "You burn yourself while lighting the lighter." + user.adjustFireLoss(5) + user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") + + set_light(2) + processing_objects.Add(src) + else + lit = 0 + w_class = 1 + icon_state = icon_off + item_state = icon_off + if(istype(src, /obj/item/weapon/lighter/zippo) ) + user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing. Wow.") + playsound(src.loc, 'sound/items/ZippoClose.ogg', 25, 1) + else + user.visible_message("[user] quietly shuts off the [src].") + + set_light(0) + processing_objects.Remove(src) + else + return ..() + return + + +/obj/item/weapon/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!isliving(M)) + return + M.IgniteMob() + if(!istype(M, /mob)) + return + + if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette) && user.zone_sel.selecting == "mouth" && lit) + var/obj/item/clothing/mask/cigarette/cig = M.wear_mask + if(M == user) + cig.attackby(src, user) + else + if(istype(src, /obj/item/weapon/lighter/zippo)) + cig.light("[user] whips the [name] out and holds it for [M]. Their arm is as steady as the unflickering flame they light \the [cig] with.") + else + cig.light("[user] holds the [name] out for [M], and lights the [cig.name].") + else + ..() + +/obj/item/weapon/lighter/process() + var/turf/location = get_turf(src) + if(location) + location.hotspot_expose(700, 5) + return + +//EXTRA LIGHTERS +/obj/item/weapon/lighter/zippo/fluff/li_matsuda_1 //mangled: Li Matsuda + name = "blue zippo lighter" + desc = "A zippo lighter made of some blue metal." + icon = 'icons/obj/custom_items.dmi' + icon_state = "bluezippo" + icon_on = "bluezippoon" + icon_off = "bluezippo" + +/obj/item/weapon/lighter/zippo/fluff/michael_guess_1 //Dragor23: Michael Guess + name = "engraved lighter" + desc = "A golden lighter, engraved with some ornaments and a G." + icon = 'icons/obj/custom_items.dmi' + icon_state = "guessip" + icon_on = "guessipon" + icon_off = "guessip" + +/obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1 //rawrtaicho: Riley Rohtin + name = "Riley's black zippo" + desc = "A black zippo lighter, which holds some form of sentimental value." + icon = 'icons/obj/custom_items.dmi' + icon_state = "blackzippo" + icon_on = "blackzippoon" + icon_off = "blackzippo" + +/obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1 //furohman: Fay Sullivan + name = "Graduation Lighter" + desc = "A silver engraved lighter with 41 on one side and Tharsis University on the other. The lid reads Fay Sullivan, Cybernetic Engineering, 2541" + icon = 'icons/obj/custom_items.dmi' + icon_state = "gradzippo" + icon_on = "gradzippoon" + icon_off = "gradzippo" + +/obj/item/weapon/lighter/zippo/fluff/executivekill_1 //executivekill: Hunter Duke + name = "Gonzo Fist zippo" + desc = "A Zippo lighter with the iconic Gonzo Fist on a matte black finish." + icon = 'icons/obj/custom_items.dmi' + icon_state = "gonzozippo" + icon_on = "gonzozippoon" + icon_off = "gonzozippo" + +/obj/item/weapon/lighter/zippo/fluff/naples_1 //naples: Russell Vierson + name = "Engraved zippo" + desc = "A intricately engraved Zippo lighter." + icon = 'icons/obj/custom_items.dmi' + icon_state = "engravedzippo" + icon_on = "engravedzippoon" + icon_off = "engravedzippo" + +/obj/item/weapon/lighter/zippo/fluff/nt_rep + name = "gold engraved zippo" + desc = "An engraved golden Zippo lighter with the letters NT on it." + icon = 'icons/obj/custom_items.dmi' + icon_state = "zippo_nt_off" + icon_on = "zippo_nt_on" + icon_off = "zippo_nt_off" + +/obj/item/weapon/lighter/zippo/fluff/purple + name = "purple engraved zippo" + desc = "All craftsspacemanship is of the highest quality. It is encrusted with refined plasma sheets. On the item is an image of a dwarf and the words 'Strike the Earth!' etched onto the side." + icon = 'icons/obj/custom_items.dmi' + icon_state = "purple_zippo_off" + icon_on = "purple_zippo_on" + icon_off = "purple_zippo_off" + +/////////// +//MATCHES// +/////////// +/obj/item/weapon/match + name = "match" + desc = "A simple match stick, used for lighting fine smokables." + icon = 'icons/obj/cigarettes.dmi' + icon_state = "match_unlit" + var/lit = 0 + var/smoketime = 5 + w_class = 1.0 + origin_tech = "materials=1" + attack_verb = list("burnt", "singed") + +/obj/item/weapon/match/process() + var/turf/location = get_turf(src) + smoketime-- + if(smoketime < 1) + icon_state = "match_burnt" + lit = -1 + processing_objects.Remove(src) + return + if(location) + location.hotspot_expose(700, 5) + return + +/obj/item/weapon/match/dropped(mob/user as mob) + if(lit == 1) + lit = -1 + damtype = "brute" + icon_state = "match_burnt" + item_state = "cigoff" + name = "burnt match" + desc = "A match. This one has seen better days." + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/sm_shard.dm b/code/game/objects/items/weapons/sm_shard.dm new file mode 100644 index 00000000000..a4367cba413 --- /dev/null +++ b/code/game/objects/items/weapons/sm_shard.dm @@ -0,0 +1,103 @@ + +/obj/item/weapon/shard/supermatter + name = "supermatter shard" + desc = "A shard of supermatter. Incredibly dangerous, though not large enough to go critical." + force = 10.0 + throwforce = 20.0 + icon_state = "supermatter" + sharp = 1 + edge = 1 + w_class = 2 + flags = CONDUCT + light_color = "#8A8A00" + var/brightness = 2 + +/obj/item/weapon/shard/supermatter/New() + src.icon_state = pick("supermatter") + switch(src.icon_state) + if("supermattersmall") + src.pixel_x = rand(-12, 12) + src.pixel_y = rand(-12, 12) + if("supermattermedium") + src.pixel_x = rand(-8, 8) + src.pixel_y = rand(-8, 8) + if("supermatterlarge") + src.pixel_x = rand(-5, 5) + src.pixel_y = rand(-5, 5) + else + + set_light(brightness) + +/obj/item/weapon/shard/supermatter/attackby(obj/item/weapon/W as obj, mob/user as mob) + if( istype( W, /obj/item/weapon/tongs )) + var/obj/item/weapon/tongs/T = W + T.pick_up( src ) + T.icon_state = "tongs_supermatter" + return + + ..() + +/obj/item/weapon/shard/supermatter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) + return ..() + +/obj/item/weapon/shard/supermatter/Crossed(AM as mob|obj) + if(ismob(AM)) + var/mob/M = AM + M << "\red You step on \the [src]!" + playsound(src.loc, 'sound/effects/glass_step_sm.ogg', 70, 1) // not sure how to handle metal shards with sounds + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(H.species.flags & IS_SYNTHETIC) //Thick skin. + return + + if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) ) + var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) + if(affecting.status & ORGAN_ROBOT) + return + if(affecting.take_damage(5, 20)) + H.UpdateDamageIcon() + H.updatehealth() + if(!(H.species && (H.species.flags & NO_PAIN))) + H.Weaken(3) + ..() + + +/obj/item/weapon/shard/supermatter/attack_hand(var/mob/user) + if(!istype(user,/mob/living/carbon/human/nucleation)) + user << pick( "\red You think twice before touching that without protection.", + "\red You don't want to touch that without some protection.", + "\red You probably should get something else to pick that up.", + "\red You aren't sure that's a good idea.", + "\red You aren't in the mood to get vaporized today.", + "\red You really don't feel like frying your hand off.", + "\red You assume that's a bad idea." ) + return + + ..() + +/obj/item/weapon/tongs + name = "tongs" + desc = "Tungsten-alloy tongs used for handling dangerous materials." + force = 7.0 + throwforce = 12.0 + icon = 'icons/obj/weapons.dmi' + icon_state = "tongs" + edge = 1 + w_class = 2 + flags = CONDUCT + var/obj/item/held = null // The item currently being held + +/obj/item/weapon/tongs/proc/pick_up( var/obj/item/I ) + held = I + I.loc = src + playsound(loc, 'sound/effects/tong_pickup.ogg', 50, 1, -1) + +/obj/item/weapon/tongs/attack_self(var/mob/user as mob) + if( held ) + var/turf/T = get_turf(user.loc) + held.loc = T + held = null + icon_state = initial(icon_state) + ..() diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index a97ae394244..021c3a7618f 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -1,4 +1,4 @@ -/obj/item/weapon/staff +/obj/item/weapon/twohanded/staff name = "wizards staff" desc = "Apparently a staff used by the wizard." icon = 'icons/obj/wizard.dmi' @@ -11,13 +11,60 @@ flags = NOSHIELD attack_verb = list("bludgeoned", "whacked", "disciplined") -/obj/item/weapon/staff/broom +/obj/item/weapon/twohanded/staff/broom name = "broom" desc = "Used for sweeping, and flying into the night while cackling. Black cat not included." icon = 'icons/obj/wizard.dmi' icon_state = "broom" + item_state = "broom0" + icon_override = 'icons/mob/in-hand/staff.dmi' -/obj/item/weapon/staff/stick +/obj/item/weapon/twohanded/staff/broom/attack_self(mob/user as mob) + ..() + item_state = "broom[wielded ? 1 : 0]" + force = wielded ? 5 : 3 + attack_verb = wielded ? list("rammed into", "charged at") : list("bludgeoned", "whacked", "cleaned") + if(user) + user.update_inv_l_hand() + user.update_inv_r_hand() + if(user.mind in ticker.mode.wizards) + user.flying = wielded ? 1 : 0 + if(wielded) + user << "You hold \the [src] between your legs." + user.say("QUID 'ITCH") + animate(user, pixel_y = pixel_y + 10 , time = 10, loop = 1, easing = SINE_EASING) + else + animate(user, pixel_y = pixel_y + 10 , time = 1, loop = 1) + animate(user, pixel_y = pixel_y, time = 10, loop = 1, easing = SINE_EASING) + animate(user) + if(user.lying)//aka. if they have just been stunned + user.pixel_y -= 6 + else + if(wielded) + user << "You hold \the [src] between your legs." + +/obj/item/weapon/twohanded/staff/broom/attackby(var/obj/O, mob/user) + if(istype(O, /obj/item/clothing/mask/horsehead)) + new/obj/item/weapon/twohanded/staff/broom/horsebroom(get_turf(src)) + user.unEquip(O) + qdel(O) + qdel(src) + return + ..() + +/obj/item/weapon/twohanded/staff/broom/horsebroom + name = "broomstick horse" + desc = "Saddle up!" + icon = 'icons/obj/wizard.dmi' + icon_state = "horsebroom" + item_state = "horsebroom0" + icon_override = 'icons/mob/in-hand/staff.dmi' + +/obj/item/weapon/twohanded/staff/broom/horsebroom/attack_self(mob/user as mob) + ..() + item_state = "horsebroom[wielded ? 1 : 0]" + +/obj/item/weapon/twohanded/staff/stick name = "stick" desc = "A great tool to drag someone else's drinks across the bar." icon = 'icons/obj/weapons.dmi' diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm deleted file mode 100644 index edb18ae8d58..00000000000 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ /dev/null @@ -1,827 +0,0 @@ -/* Surgery Tools - * Contains: - * Retractor - * Hemostat - * Cautery - * Surgical Drill - * Scalpel - * Circular Saw - */ - -/* - * Retractor - */ -/obj/item/weapon/retractor - name = "retractor" - desc = "Retracts stuff." - icon = 'icons/obj/surgery.dmi' - icon_state = "retractor" - m_amt = 6000 - g_amt = 3000 - flags = CONDUCT - w_class = 2.0 - origin_tech = "materials=1;biotech=1" - -/*HAHA, SUCK IT, 2000 LINES OF SPAGHETTI CODE! - -NOW YOUR JOB IOS DONE BY ONLY 500 LINES OF SPAGHETTI CODE! - -LOOK FOR SURGERY.DM*/ - -/* -/obj/item/weapon/retractor/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) - return - - var/mob/living/carbon/human/H = M - if(istype(H) && ( \ - (H.head && H.head.flags & HEADCOVERSEYES) || \ - (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ - (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - var/mob/living/carbon/monkey/Mo = M - if(istype(Mo) && ( \ - (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N - user << "\red You cannot locate any eyes on this creature!" - return - - switch(M.eye_op_stage) - if(1.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes retracted by [user].", 1) - M << "\red [user] begins to seperate your eyes with [src]!" - user << "\red You seperate [M]'s eyes with [src]!" - else - user.visible_message( \ - "\red [user] begins to have his eyes retracted.", \ - "\red You begin to pry open your eyes with [src]!" \ - ) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - if(affecting.take_damage(15)) - M:UpdateDamageIcon() - M.updatehealth() - else - M.take_organ_damage(15) - - M:eye_op_stage = 2.0 - - else if(user.zone_sel.selecting == "chest") - switch(M:alien_op_stage) - if(3.0) - var/mob/living/carbon/human/H = M - if(!istype(H)) - return ..() - - if(H.wear_suit || H.w_uniform) - user << "\red You're going to need to remove that suit/jumpsuit first." - return - - var/obj/item/alien_embryo/A = locate() in M.contents - if(!A) - return ..() - user.visible_message("\red [user] begins to pull something out of [M]'s chest.", "\red You begin to pull the alien organism out of [M]'s chest.") - - spawn(20 + rand(0,50)) - if(!A || A.loc != M) - return - - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("chest") - if(affecting.take_damage(30)) - M:UpdateDamageIcon() - else - M.take_organ_damage(30) - - if(A.stage > 3) - var/chance = 15 + max(0, A.stage - 3) * 10 - if(prob(chance)) - A.AttemptGrow(0) - M:alien_op_stage = 4.0 - - if(M) - user.visible_message("\red [user] pulls an alien organism out of [M]'s chest.", "\red You pull the alien organism out of [M]'s chest.") - A.loc = M.loc //alien embryo handles cleanup - - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() - - return -*/ - -/* - * Hemostat - */ -/obj/item/weapon/hemostat - name = "hemostat" - desc = "You think you have seen this before." - icon = 'icons/obj/surgery.dmi' - icon_state = "hemostat" - m_amt = 5000 - g_amt = 2500 - flags = CONDUCT - w_class = 2.0 - origin_tech = "materials=1;biotech=1" - attack_verb = list("attacked", "pinched") - -/* -/obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) - return - - if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) - return ..() - - if(user.zone_sel.selecting == "groin") - if(istype(M, /mob/living/carbon/human)) - switch(M:appendix_op_stage) - if(1.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [user] is beginning to clamp bleeders in [M]'s abdomen cut open with [src].", 1) - M << "\red [user] begins to clamp bleeders in your abdomen with [src]!" - user << "\red You clamp bleeders in [M]'s abdomen with [src]!" - M:appendix_op_stage = 2.0 - if(4.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [user] is removing [M]'s appendix with [src].", 1) - M << "\red [user] begins to remove your appendix with [src]!" - user << "\red You remove [M]'s appendix with [src]!" - for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/appendicitis)) - new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(M)) - M:appendix_op_stage = 5.0 - return - new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(M)) - M:appendix_op_stage = 5.0 - return - - if (user.zone_sel.selecting == "eyes") - - var/mob/living/carbon/human/H = M - if(istype(H) && ( \ - (H.head && H.head.flags & HEADCOVERSEYES) || \ - (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ - (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - var/mob/living/carbon/monkey/Mo = M - if(istype(Mo) && ( \ - (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N - user << "\red You cannot locate any eyes on this creature!" - return - - switch(M.eye_op_stage) - if(2.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes mended by [user].", 1) - M << "\red [user] begins to mend your eyes with [src]!" - user << "\red You mend [M]'s eyes with [src]!" - else - user.visible_message( \ - "\red [user] begins to have his eyes mended.", \ - "\red You begin to mend your eyes with [src]!" \ - ) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - if(affecting.take_damage(15)) - M:UpdateDamageIcon() - M.updatehealth() - else - M.take_organ_damage(15) - M:eye_op_stage = 3.0 - - else if(user.zone_sel.selecting == "chest") - if(M:alien_op_stage == 2.0 || M:alien_op_stage == 3.0) - var/mob/living/carbon/human/H = M - if(!istype(H)) - return ..() - - if(H.wear_suit || H.w_uniform) - user << "\red You're going to need to remove that suit/jumpsuit first." - return - - user.visible_message("\red [user] begins to dig around in [M]'s chest.", "\red You begin to dig around in [M]'s chest.") - - spawn(20 + (M:alien_op_stage == 3 ? 0 : rand(0,50))) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("chest") - if(affecting.take_damage(30)) - M:UpdateDamageIcon() - else - M.take_organ_damage(30) - - var/obj/item/alien_embryo/A = locate() in M.contents - if(A) - var/dat = "\blue You found an unknown alien organism in [M]'s chest!" - if(A.stage < 4) - dat += " It's small and weak, barely the size of a foetus." - if(A.stage > 3) - dat += " It's grown quite large, and writhes slightly as you look at it." - if(prob(10)) - A.AttemptGrow() - user << dat - M:alien_op_stage = 3.0 - else - user << "\blue You find nothing of interest." - - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() - - return -*/ - -/* - * Cautery - */ -/obj/item/weapon/cautery - name = "cautery" - desc = "This stops bleeding." - icon = 'icons/obj/surgery.dmi' - icon_state = "cautery" - m_amt = 2500 - g_amt = 750 - flags = CONDUCT - w_class = 2.0 - origin_tech = "materials=1;biotech=1" - attack_verb = list("burnt") - -/* -/obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) - return - - if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) - return ..() - - if(user.zone_sel.selecting == "groin") - if(istype(M, /mob/living/carbon/human)) - switch(M:appendix_op_stage) - if(5.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [user] is beginning to cauterize the incision in [M]'s abdomen with [src].", 1) - M << "\red [user] begins to cauterize the incision in your abdomen with [src]!" - user << "\red You cauterize the incision in [M]'s abdomen with [src]!" - M:appendix_op_stage = 6.0 - for(var/datum/disease/appendicitis in M.viruses) - appendicitis.cure() - return - - if (user.zone_sel.selecting == "eyes") - - var/mob/living/carbon/human/H = M - if(istype(H) && ( \ - (H.head && H.head.flags & HEADCOVERSEYES) || \ - (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ - (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - var/mob/living/carbon/monkey/Mo = M - if(istype(Mo) && ( \ - (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N - user << "\red You cannot locate any eyes on this creature!" - return - - switch(M.eye_op_stage) - if(3.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes cauterized by [user].", 1) - M << "\red [user] begins to cauterize your eyes!" - user << "\red You cauterize [M]'s eyes with [src]!" - else - user.visible_message( \ - "\red [user] begins to have his eyes cauterized.", \ - "\red You begin to cauterize your eyes!" \ - ) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - if(affecting.take_damage(15)) - M:UpdateDamageIcon() - M.updatehealth() - else - M.take_organ_damage(15) - M.sdisabilities &= ~BLIND - M.eye_stat = 0 - M:eye_op_stage = 0.0 - - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() - - return -*/ - -/* - * Surgical Drill - */ -/obj/item/weapon/surgicaldrill - name = "surgical drill" - desc = "You can drill using this item. You dig?" - icon = 'icons/obj/surgery.dmi' - icon_state = "drill" - hitsound = 'sound/weapons/circsawhit.ogg' - m_amt = 10000 - g_amt = 6000 - flags = CONDUCT - force = 15.0 - w_class = 2.0 - origin_tech = "materials=1;biotech=1" - attack_verb = list("drilled") - - suicide_act(mob/user) - viewers(user) << pick("\red [user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.", \ - "\red [user] is pressing [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.") - return (BRUTELOSS) - -/* - * Scalpel - */ -/obj/item/weapon/scalpel - name = "scalpel" - desc = "Cut, cut, and once more cut." - icon = 'icons/obj/surgery.dmi' - icon_state = "scalpel" - flags = CONDUCT - force = 10.0 - sharp = 1 - edge = 1 - w_class = 2.0 - throwforce = 5.0 - throw_speed = 3 - throw_range = 5 - m_amt = 4000 - g_amt = 1000 - origin_tech = "materials=1;biotech=1" - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - - suicide_act(mob/user) - viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") - return (BRUTELOSS) - -/* -/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) - return ..() - - //if(M.mutations & HUSK) return ..() - - if((CLUMSY in user.mutations) && prob(50)) - M = user - return eyestab(M,user) - - if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) - return ..() - - src.add_fingerprint(user) - - if(user.zone_sel.selecting == "groin") - if(istype(M, /mob/living/carbon/human)) - switch(M:appendix_op_stage) - if(0.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1) - M << "\red [user] begins to cut open your abdomen with [src]!" - user << "\red You cut [M]'s abdomen open with [src]!" - M:appendix_op_stage = 1.0 - if(3.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1) - M << "\red [user] begins to seperate your appendix with [src]!" - user << "\red You seperate [M]'s appendix with [src]!" - M:appendix_op_stage = 4.0 - return - - if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/slime)) - - var/mob/living/carbon/human/H = M - if(istype(H) && ( \ - (H.head && H.head.flags & HEADCOVERSEYES) || \ - (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ - (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - var/mob/living/carbon/monkey/Mo = M - if(istype(Mo) && ( \ - (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - switch(M:brain_op_stage) - if(0.0) - if(istype(M, /mob/living/carbon/slime)) - if(M.stat == 2) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M.name] is beginning to have its flesh cut open with [src] by [user].", 1) - M << "\red [user] begins to cut open your flesh with [src]!" - user << "\red You cut [M]'s flesh open with [src]!" - M:brain_op_stage = 1.0 - - return - - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1) - M << "\red [user] begins to cut open your head with [src]!" - user << "\red You cut [M]'s head open with [src]!" - else - user.visible_message( \ - "\red [user] begins to cut open his skull with [src]!", \ - "\red You begin to cut open your head with [src]!" \ - ) - - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - if(affecting.take_damage(15)) - M:UpdateDamageIcon() - else - M.take_organ_damage(15) - - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - affecting.take_damage(7) - else - M.take_organ_damage(7) - - M.updatehealth() - M:brain_op_stage = 1.0 - - if(1) - if(istype(M, /mob/living/carbon/slime)) - if(M.stat == 2) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M.name] is having its silky innards cut apart with [src] by [user].", 1) - M << "\red [user] begins to cut apart your innards with [src]!" - user << "\red You cut [M]'s silky innards apart with [src]!" - M:brain_op_stage = 2.0 - return - if(2.0) - if(istype(M, /mob/living/carbon/slime)) - if(M.stat == 2) - var/mob/living/carbon/slime/slime = M - if(slime.cores > 0) - if(istype(M, /mob/living/carbon/slime)) - user << "\red You attempt to remove [M]'s core, but [src] is ineffective!" - return - - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1) - M << "\red [user] begins to cut open your head with [src]!" - user << "\red You cut [M]'s head open with [src]!" - else - user.visible_message( \ - "\red [user] begin to delicately remove the connections to his brain with [src]!", \ - "\red You begin to cut open your head with [src]!" \ - ) - if(M == user && prob(25)) - user << "\red You nick an artery!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - if(affecting.take_damage(75)) - M:UpdateDamageIcon() - else - M.take_organ_damage(75) - - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - affecting.take_damage(7) - else - M.take_organ_damage(7) - - M.updatehealth() - M:brain_op_stage = 3.0 - else - ..() - return - - else if(user.zone_sel.selecting == "eyes") - user << "\blue So far so good." - - var/mob/living/carbon/human/H = M - if(istype(H) && ( \ - (H.head && H.head.flags & HEADCOVERSEYES) || \ - (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ - (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - var/mob/living/carbon/monkey/Mo = M - if(istype(Mo) && ( \ - (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N - user << "\red You cannot locate any eyes on this creature!" - return - - switch(M:eye_op_stage) - if(0.0) - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1) - M << "\red [user] begins to cut open your eyes with [src]!" - user << "\red You make an incision around [M]'s eyes with [src]!" - else - user.visible_message( \ - "\red [user] begins to cut around his eyes with [src]!", \ - "\red You begin to cut open your eyes with [src]!" \ - ) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - if(affecting.take_damage(15)) - M:UpdateDamageIcon() - else - M.take_organ_damage(15) - - user << "\blue So far so good before." - M.updatehealth() - M:eye_op_stage = 1.0 - user << "\blue So far so good after." - - else if(user.zone_sel.selecting == "chest") - switch(M:alien_op_stage) - if(0.0) - var/mob/living/carbon/human/H = M - if(!istype(H)) - return ..() - - if(H.wear_suit || H.w_uniform) - user << "\red You're going to need to remove that suit/jumpsuit first." - return - - user.visible_message("\red [user] begins to slice open [M]'s chest.", "\red You begin to slice open [M]'s chest.") - - spawn(rand(20,50)) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("chest") - if(affecting.take_damage(15)) - M:UpdateDamageIcon() - else - M.take_organ_damage(15) - - M:alien_op_stage = 1.0 - user << "\blue So far so good." - - else - return ..() -/* wat - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..()*/ - return -*/ - -/* - * Circular Saw - */ -/obj/item/weapon/circular_saw - name = "circular saw" - desc = "For heavy duty cutting." - icon = 'icons/obj/surgery.dmi' - icon_state = "saw3" - hitsound = 'sound/weapons/circsawhit.ogg' - flags = CONDUCT - force = 15.0 - w_class = 2.0 - throwforce = 9.0 - throw_speed = 3 - throw_range = 5 - m_amt = 10000 - g_amt = 6000 - origin_tech = "materials=1;biotech=1" - attack_verb = list("attacked", "slashed", "sawed", "cut") - sharp = 1 - edge = 1 - -/* -/obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) - return ..() - - if((CLUMSY in user.mutations) && prob(50)) - M = user - return eyestab(M,user) - - if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) - return ..() - - src.add_fingerprint(user) - - if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/slime)) - - var/mob/living/carbon/human/H = M - if(istype(H) && ( \ - (H.head && H.head.flags & HEADCOVERSEYES) || \ - (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ - (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - var/mob/living/carbon/monkey/Mo = M - if(istype(Mo) && ( \ - (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ - )) - user << "\red You're going to need to remove that mask/helmet/glasses first." - return - - switch(M:brain_op_stage) - if(1.0) - if(istype(M, /mob/living/carbon/slime)) - return - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1) - M << "\red [user] begins to saw open your head with [src]!" - user << "\red You saw [M]'s head open with [src]!" - else - user.visible_message( \ - "\red [user] saws open his skull with [src]!", \ - "\red You begin to saw open your head with [src]!" \ - ) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - if(affecting.take_damage(40)) - M:UpdateDamageIcon() - M.updatehealth() - else - M.take_organ_damage(40) - - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("head") - affecting.take_damage(7) - else - M.take_organ_damage(7) - - M.updatehealth() - M:brain_op_stage = 2.0 - - if(2.0) - if(istype(M, /mob/living/carbon/slime)) - if(M.stat == 2) - var/mob/living/carbon/slime/slime = M - if(slime.cores > 0) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1) - - slime.cores-- - M << "\red [user] begins to remove one of your cores with [src]! ([slime.cores] cores remaining)" - user << "\red You cut one of [M]'s cores out with [src]! ([slime.cores] cores remaining)" - - new slime.coretype(M.loc) - - if(slime.cores <= 0) - M.icon_state = "[slime.colour] baby slime dead-nocore" - - return - - if(3.0) - /*if(M.mind && M.mind.changeling) - user << "\red The neural tissue regrows before your eyes as you cut it." - return*/ - - if(M != user) - for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1) - M << "\red [user] severs your brain's connection to the spine with [src]!" - user << "\red You sever [M]'s brain's connection to the spine with [src]!" - else - user.visible_message( \ - "\red [user] severs his brain's connection to the spine with [src]!", \ - "\red You sever your brain's connection to the spine with [src]!" \ - ) - - user.attack_log += "\[[time_stamp()]\] Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" - M.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" - - log_attack("[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") - - - var/obj/item/brain/B = new() - M.put_in_hands(B) - B.transfer_identity(M) - - M:brain_op_stage = 4.0 - M.death()//You want them to die after the brain was transferred, so not to trigger client death() twice. - - else - ..() - return - - else if(user.zone_sel.selecting == "chest") - switch(M:alien_op_stage) - if(1.0) - var/mob/living/carbon/human/H = M - if(!istype(H)) - return ..() - - if(H.wear_suit || H.w_uniform) - user << "\red You're going to need to remove that suit/jumpsuit first." - return - - user.visible_message("\red [user] begins to slice through the bone of [M]'s chest.", "\red You begin to slice through the bone of [M]'s chest.") - - spawn(20 + rand(0,50)) - if(M == user && prob(25)) - user << "\red You mess up!" - if(istype(M, /mob/living/carbon/human)) - var/obj/item/organ/external/affecting = M:get_organ("chest") - if(affecting.take_damage(15)) - M:UpdateDamageIcon() - else - M.take_organ_damage(15) - - M:alien_op_stage = 2.0 - user << "\blue So far so good." - - else - return ..() -/* - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() -*/ - return -*/ - -//misc, formerly from code/defines/weapons.dm -/obj/item/weapon/bonegel - name = "bone gel" - icon = 'icons/obj/surgery.dmi' - icon_state = "bone-gel" - force = 0 - w_class = 2.0 - throwforce = 1.0 - -/obj/item/weapon/FixOVein - name = "FixOVein" - icon = 'icons/obj/surgery.dmi' - icon_state = "fixovein" - force = 0 - throwforce = 1.0 - origin_tech = "materials=1;biotech=3" - w_class = 2.0 - var/usage_amount = 10 - -/obj/item/weapon/bonesetter - name = "bone setter" - icon = 'icons/obj/surgery.dmi' - icon_state = "bone setter" - force = 8.0 - throwforce = 9.0 - throw_speed = 3 - throw_range = 5 - w_class = 2.0 - attack_verb = list("attacked", "hit", "bludgeoned") diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 70f7a8235a4..6ed37dac59f 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -95,7 +95,6 @@ /obj/item/weapon/tank/plasma/New() ..() - src.air_contents.toxins = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) return @@ -110,6 +109,12 @@ F.ptank = src user.unEquip(src) src.loc = F + F.update_icon() + return + +/obj/item/weapon/tank/plasma/full/New() + ..() + src.air_contents.toxins = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) return /obj/item/weapon/tank/plasma/plasmaman diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 5f4cfbe49c9..6cb621d8cce 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -117,14 +117,15 @@ icon_state = "cutters-y" item_state = "cutters_yellow" -/obj/item/weapon/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob) - if((C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))) - usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\ - "You cut \the [C]'s restraints with \the [src]!",\ - "You hear cable being cut.") - C.handcuffed = null - C.update_inv_handcuffed() - return +/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob) + if(C.handcuffed) + if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) + usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\ + "You cut \the [C]'s restraints with \the [src]!",\ + "You hear cable being cut.") + C.handcuffed = null + C.update_inv_handcuffed() + return else ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 168134c6591..31ff44b64f1 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -17,10 +17,12 @@ var/damtype = "brute" var/force = 0 + var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it + // What reagents should be logged when transferred TO this object? // Reagent ID => friendly name var/list/reagents_to_log=list() - + /obj/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/custom_state = default_state) // Calling Topic without a corresponding window open causes runtime errors if(!nowindow && ..()) @@ -161,3 +163,85 @@ mo.show_message(rendered, 2) */ return + +/obj/proc/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) + return "NO MULTITOOL_MENU!" + +/obj/proc/linkWith(var/mob/user, var/obj/buffer, var/link/context) + return 0 + +/obj/proc/unlinkFrom(var/mob/user, var/obj/buffer) + return 0 + +/obj/proc/canLink(var/obj/O, var/link/context) + return 0 + +/obj/proc/isLinkedWith(var/obj/O) + return 0 + +/obj/proc/getLink(var/idx) + return null + +/obj/proc/linkMenu(var/obj/O) + var/dat="" + if(canLink(O, list())) + dat += " \[Link\] " + return dat + +/obj/proc/format_tag(var/label,var/varname, var/act="set_tag") + var/value = vars[varname] + if(!value || value=="") + value="-----" + return "[label]: [value]" + + +/obj/proc/update_multitool_menu(mob/user as mob) + var/obj/item/device/multitool/P = get_multitool(user) + + if(!istype(P)) + return 0 + var/dat = {" + + [name] Configuration + + + +

    [name]

    +"} + if(allowed(user))//no, assistants, you're not ruining all vents on the station with just a multitool + dat += multitool_menu(user,P) + if(Mtoollink) + if(P) + if(P.buffer) + var/id = null + if(istype(P.buffer, /obj/machinery/telecomms)) + id=P.buffer:id + else if("id_tag" in P.buffer.vars) + id=P.buffer:id_tag + dat += "

    MULTITOOL BUFFER: [P.buffer] [id ? "([id])" : ""]" + + dat += linkMenu(P.buffer) + + if(P.buffer) + dat += "\[Flush\]" + dat += "

    " + else + dat += "

    MULTITOOL BUFFER: \[Add Machine\]

    " + else + dat += "ACCESS DENIED" + dat += "" + user << browse(dat, "window=mtcomputer") + user.set_machine(src) + onclose(user, "mtcomputer") diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 09dcc02bafd..2755ddafed5 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -29,7 +29,6 @@ new /obj/item/clothing/mask/gas/syndicate(src) new /obj/item/clothing/suit/space/rig/syndi(src) new /obj/item/weapon/tank/jetpack/oxygen/harness(src) - new /obj/item/clothing/shoes/magboots/syndie(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party.." diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 9d50bbd9c4e..523aa5a8e7a 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -334,6 +334,10 @@ if(air_group || (height==0)) return 1 if(istype(mover,/obj/item/projectile)) return (check_cover(mover,target)) + if(ismob(mover)) + var/mob/M = mover + if(M.flying) + return 1 if(istype(mover) && mover.checkpass(PASSTABLE)) return 1 if(locate(/obj/structure/table) in get_turf(mover)) diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm index e98c839150a..65ada91e40d 100644 --- a/code/game/smoothwall.dm +++ b/code/game/smoothwall.dm @@ -114,6 +114,12 @@ shroom.icon_state = "glowshroomf" shroom.pixel_x = 0 shroom.pixel_y = 0 + for(var/obj/effect/supermatter_crystal/crystal in get_step(src,direction)) + if(!crystal.floor) //crystals drop to the floor + crystal.floor = 1 + crystal.icon_state = "supermatter_crystalf" + crystal.pixel_x = 0 + crystal.pixel_y = 0 ..() /turf/simulated/wall/relativewall() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index a09ee1d40c2..d7ec46b7416 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -78,6 +78,8 @@ else playsound(src, "jackboot", 20, 1) + if(M.flying) + return ..() // Tracking blood var/list/bloodDNA = null diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 76240d2f627..4f8b13a36e2 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1037,7 +1037,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) @@ -1049,7 +1049,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) @@ -1061,7 +1061,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) diff --git a/code/modules/atmos_automation/console.dm b/code/modules/atmos_automation/console.dm new file mode 100644 index 00000000000..486894179bf --- /dev/null +++ b/code/modules/atmos_automation/console.dm @@ -0,0 +1,451 @@ +/obj/machinery/computer/general_air_control/atmos_automation + icon = 'icons/obj/computer.dmi' + icon_state = "aac" + circuit = "/obj/item/weapon/circuitboard/atmos_automation" + req_one_access_txt = "24;10" + Mtoollink = 1 + + show_sensors = 0 + var/on = 0 + + name = "Atmospherics Automations Console" + + var/list/datum/automation/automations = list() + + receive_signal(datum/signal/signal) + if(!signal || signal.encryption) return + + var/id_tag = signal.data["tag"] + if(!id_tag) + return + + sensor_information[id_tag] = signal.data + + process() + if(on) + for(var/datum/automation/A in automations) + A.process() + + update_icon() + icon_state = initial(icon_state) + // Broken + if(stat & BROKEN) + icon_state += "b" + + // Powered + else if(stat & NOPOWER) + icon_state = initial(icon_state) + icon_state += "0" + else if(on) + icon_state += "_active" + + proc/request_device_refresh(var/device) + send_signal(list("tag"=device, "status")) + + proc/send_signal(var/list/data, var/filter = RADIO_ATMOSIA)//filter's here so the AAC can cross communicate to things like vents, which have a different filter + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data=data + signal.data["sigtype"]="command" + signal.data["advcontrol"]=1//AAC balancing, you need to manually get up to the machine to make it listen to this + radio_connection.post_signal(src, signal, range = 8, filter = filter) + + proc/selectValidChildFor(var/datum/automation/parent, var/mob/user, var/list/valid_returntypes) + var/list/choices=list() + for(var/childtype in automation_types) + var/datum/automation/A = new childtype(src) + if(A.returntype == null) + continue + if(!(A.returntype in valid_returntypes)) + continue + choices[A.name]=A + if (choices.len==0) + testing("Unable to find automations with returntype in [english_list(valid_returntypes)]!") + return 0 + var/label=input(user, "Select new automation:", "Automations", "Cancel") as null|anything in choices + if(!label) + return 0 + return choices[label] + + return_text() + var/out=..() + + if(on) + out += "RUNNING" + else + out += "STOPPED" + + out += {" +

    Automations

    +

    \[ + + Add + + | + + Reset All + + | + + Clear + + \]

    +

    \[ + + Export + + | + + Import + + \]

    "} + if(automations.len==0) + out += "No automations present." + else + for(var/datum/automation/A in automations) + out += {" +
    + + [A.label] + (Reset | + ×) + + [A.GetText()] +
    + "} + return out + + Topic(href,href_list) + if(..()) + return 1 + + if(href_list["on"]) + on = !on + updateUsrDialog() + update_icon() + return 1 + + if(href_list["add"]) + var/new_child=selectValidChildFor(null,usr,list(0)) + if(!new_child) + return 1 + automations += new_child + updateUsrDialog() + return 1 + + if(href_list["label"]) + var/datum/automation/A=locate(href_list["label"]) + if(!A) return 1 + var/nl=input(usr, "Please enter a label for this automation task.") as text|null + if(!nl) return 1 + nl = copytext(sanitize(nl), 1, 50) + A.label=nl + updateUsrDialog() + return 1 + + if(href_list["reset"]) + if(href_list["reset"]=="*") + for(var/datum/automation/A in automations) + if(!A) continue + A.OnReset() + else + var/datum/automation/A=locate(href_list["reset"]) + if(!A) return 1 + A.OnReset() + updateUsrDialog() + return 1 + + if(href_list["remove"]) + if(href_list["remove"]=="*") + var/confirm=alert("Are you sure you want to remove ALL automations?","Automations","Yes","No") + if(confirm == "No") return 0 + for(var/datum/automation/A in automations) + if(!A) continue + A.OnRemove() + automations.Remove(A) + else + var/datum/automation/A=locate(href_list["remove"]) + if(!A) return 1 + A.OnRemove() + automations.Remove(A) + updateUsrDialog() + return 1 + + if(href_list["read"]) + var/code = input("Input exported AAC code.","Automations","") as message|null + if(!code) return 0 + ReadCode(code) + updateUsrDialog() + return 1 + + if(href_list["dump"]) + input("Exported AAC code:","Automations",DumpCode()) as message|null + return 0 + + proc/MakeCompare(var/datum/automation/a, var/datum/automation/b, var/comparetype) + var/datum/automation/compare/compare=new(src) + compare.comparator = comparetype + compare.children[1] = a + compare.children[2] = b + return compare + + proc/MakeNumber(var/value) + var/datum/automation/static_value/val = new(src) + val.value=value + return val + + proc/MakeGetSensorData(var/sns_tag,var/field) + var/datum/automation/get_sensor_data/sensor=new(src) + sensor.sensor=sns_tag + sensor.field=field + return sensor + + proc/DumpCode() + var/list/json[0] + for(var/datum/automation/A in automations) + json += list(A.Export()) + return list2json(json) + + proc/ReadCode(var/jsonStr) + automations.Cut() + var/list/json=json2list(jsonStr) + if(json.len>0) + for(var/list/cData in json) + if(isnull(cData) || !("type" in cData)) + testing("AAC: Null cData in root JS array.") + continue + var/Atype=text2path(cData["type"]) + if(!(Atype in automation_types)) + testing("AAC: Unrecognized Atype [Atype].") + continue + var/datum/automation/A = new Atype(src) + A.Import(cData) + automations += A + +/obj/machinery/computer/general_air_control/atmos_automation/burnchamber + var/injector_tag="inc_in" + var/output_tag="inc_out" + var/sensor_tag="inc_sensor" + frequency=1449 + var/temperature=1000 + New() + ..() + + // On State + // Pretty much this: + /* + if(get_sensor("inc_sensor","temperature") < 200) + set_injector_state("inc_in",1) + set_vent_pump_power("inc_out",0) + else + set_vent_pump_power("inc_out",1 + */ + + var/datum/automation/get_sensor_data/sensor=new(src) + sensor.sensor=sensor_tag + sensor.field="temperature" + + var/datum/automation/static_value/val = new(src) + val.value=temperature - 800 + + var/datum/automation/compare/compare=new(src) + compare.comparator = "Less Than" + compare.children[1] = sensor + compare.children[2] = val + + var/datum/automation/set_injector_power/inj_on=new(src) + inj_on.injector=injector_tag + inj_on.state=1 + + var/datum/automation/set_vent_pump_power/vp_on=new(src) + vp_on.vent_pump=output_tag + vp_on.state=1 + + var/datum/automation/set_vent_pump_power/vp_off=new(src) + vp_off.vent_pump=output_tag + vp_off.state=0 + + var/datum/automation/if_statement/i = new (src) + i.label = "Fuel Injector On" + i.condition = compare + i.children_then.Add(inj_on) + i.children_then.Add(vp_off) + i.children_else.Add(vp_on) + + automations += i + + // Off state + /* + if(get_sensor("inc_sensor","temperature") > 1000) + set_injector_state("inc_in",0) + */ + sensor=new(src) + sensor.sensor=sensor_tag + sensor.field="temperature" + + val = new(src) + val.value=temperature + + compare=new(src) + compare.comparator = "Greater Than" + compare.children[1] = sensor + compare.children[2] = val + + var/datum/automation/set_injector_power/inj_off=new(src) + inj_off.injector=injector_tag + inj_off.state=0 + + i = new (src) + i.label = "Fuel Injector Off" + i.condition = compare + i.children_then.Add(inj_off) + + automations += i + +/obj/machinery/computer/general_air_control/atmos_automation/air_mixing + var/n2_injector_tag="air_n2_in" + var/o2_injector_tag="air_o2_in" + var/output_tag="air_out" + var/sensor_tag="air_sensor" + frequency=1443 + var/temperature=1000 + New() + ..() + buildO2() + buildN2() + buildOutletVent() + + proc/buildO2() + /////////////////////////////////////////////////////////////// + // Oxygen Injection + /////////////////////////////////////////////////////////////// + + var/datum/automation/set_injector_power/inj_on=new(src) + inj_on.injector=o2_injector_tag + inj_on.state=1 + + var/datum/automation/set_injector_power/inj_off=new(src) + inj_off.injector=o2_injector_tag + inj_off.state=0 + + var/datum/automation/if_statement/i = new (src) + i.label = "Oxygen Injection" + i.condition = MakeCompare( + MakeGetSensorData(sensor_tag,"oxygen"), + MakeNumber(20), + "Less Than or Equal to" + ) + i.children_then.Add(inj_on) + i.children_else.Add(inj_off) + + automations += i + + proc/buildN2() + /////////////////////////////////////////////////////////////// + // Nitrogen Injection + /////////////////////////////////////////////////////////////// + /* + if(get_sensor_data("pressure") < 100) + injector_on() + else + if(get_sensor_data("pressure") > 5000) + injector_off() + */ + + var/datum/automation/set_injector_power/inj_on=new(src) + inj_on.injector=n2_injector_tag + inj_on.state=1 + + var/datum/automation/set_injector_power/inj_off=new(src) + inj_off.injector=n2_injector_tag + inj_off.state=0 + + var/datum/automation/if_statement/if_on = new (src) + if_on.label = "Nitrogen Injection" + if_on.condition = MakeCompare( + MakeGetSensorData(sensor_tag,"pressure"), + MakeNumber(100), + "Less Than" + ) + if_on.children_then.Add(inj_on) + + + var/datum/automation/if_statement/if_off=new(src) + if_off.condition=MakeCompare( + MakeGetSensorData(sensor_tag,"pressure"), + MakeNumber(5000), + "Greater Than" + ) + if_off.children_then.Add(inj_off) + + if_on.children_else.Add(if_off) + + automations += if_on + + proc/buildOutletVent() + /////////////////////////////////////////////////////////////// + // Outlet Management + /////////////////////////////////////////////////////////////// + /* + if(get_sensor_data("pressure") >= 5000 && get_sensor_data("oxygen") >= 20) + vent_on() + else + if(get_sensor_data("oxygen") < 20 || get_sensor_data("pressure") < 100) + vent_off() + */ + + var/datum/automation/set_vent_pump_power/vp_on=new(src) + vp_on.vent_pump=output_tag + vp_on.state=1 + + var/datum/automation/set_vent_pump_power/vp_off=new(src) + vp_off.vent_pump=output_tag + vp_off.state=0 + + var/datum/automation/if_statement/if_on=new(src) + if_on.label="Air Output" + + var/datum/automation/and/and_on=new(src) + and_on.children.Add( + MakeCompare( + MakeGetSensorData(sensor_tag,"pressure"), + MakeNumber(5000), + "Greater Than or Equal to" + ) + ) + and_on.children.Add( + MakeCompare( + MakeGetSensorData(sensor_tag,"oxygen"), + MakeNumber(20), + "Greater Than or Equal to" + ) + ) + if_on.condition=and_on + if_on.children_then.Add(vp_on) + + ////////////////////////////// + + var/datum/automation/if_statement/if_off=new(src) + + var/datum/automation/or/or_off=new(src) + or_off.children.Add( + MakeCompare( + MakeGetSensorData(sensor_tag,"pressure"), + MakeNumber(100), + "Less Than" + ) + ) + or_off.children.Add( + MakeCompare( + MakeGetSensorData(sensor_tag,"oxygen"), + MakeNumber(20), + "Less Than" + ) + ) + if_off.condition=or_off + if_off.children_then.Add(vp_off) + + if_on.children_else.Add(if_off) + + automations += if_on diff --git a/code/modules/atmos_automation/implementation/digital_valves.dm b/code/modules/atmos_automation/implementation/digital_valves.dm new file mode 100644 index 00000000000..4d91ebbddc8 --- /dev/null +++ b/code/modules/atmos_automation/implementation/digital_valves.dm @@ -0,0 +1,44 @@ + + +/datum/automation/set_valve_state + name = "Digital Valve: Set Open/Closed" + var/valve=null + var/state=0 + + Export() + var/list/json = ..() + json["valve"]=valve + json["state"]=state + return json + + Import(var/list/json) + ..(json) + valve = json["valve"] + state = text2num(json["state"]) + + process() + if(valve) + parent.send_signal(list ("tag" = valve, "command"="valve_set","valve_set"=state)) + return 0 + + GetText() + return "Set digital valve [fmtString(valve)] to [state?"open":"closed"]." + + Topic(href,href_list) + if(..()) + return 1 + if(href_list["set_state"]) + state=!state + parent.updateUsrDialog() + return 1 + if(href_list["set_subject"]) + var/list/valves=list() + for(var/obj/machinery/atmospherics/valve/digital/V in world) + if(!isnull(V.id_tag) && V.frequency == parent.frequency) + valves|=V.id_tag + if(valves.len==0) + usr << "Unable to find any digital valves on this frequency." + return + valve = input("Select a valve:", "Sensor Data", valve) as null|anything in valves + parent.updateUsrDialog() + return 1 \ No newline at end of file diff --git a/code/modules/atmos_automation/implementation/emitters.dm b/code/modules/atmos_automation/implementation/emitters.dm new file mode 100644 index 00000000000..0e0dc2720cf --- /dev/null +++ b/code/modules/atmos_automation/implementation/emitters.dm @@ -0,0 +1,42 @@ +/datum/automation/set_emitter_power + name = "Emitter: Set Power" + var/emitter=null + var/on=0 + + Export() + var/list/json = ..() + json["emitter"]=emitter + json["on"]=on + return json + + Import(var/list/json) + ..(json) + emitter = json["emitter"] + on = text2num(json["on"]) + + process() + if(emitter) + parent.send_signal(list("tag" = emitter, "command"="set", "state" = on, "hiddenprints" = parent.fingerprintshidden)) + return 0 + + GetText() + return "Set emitter [fmtString(emitter)] to [on?"on":"off"]." + + Topic(href,href_list) + if(..()) + return 1 + if(href_list["set_power"]) + on=!on + parent.updateUsrDialog() + return 1 + if(href_list["set_subject"]) + var/list/emitters=list() + for(var/obj/machinery/power/emitter/E in machines) + if(!isnull(E.id_tag) && E.frequency == parent.frequency) + emitters|=E.id_tag + if(emitters.len==0) + usr << "Unable to find any emitters on this frequency." + return + emitter = input("Select an emitter:", "Emitter", emitter) as null|anything in emitters + parent.updateUsrDialog() + return 1 \ No newline at end of file diff --git a/code/modules/atmos_automation/implementation/injectors.dm b/code/modules/atmos_automation/implementation/injectors.dm new file mode 100644 index 00000000000..32bc06551f0 --- /dev/null +++ b/code/modules/atmos_automation/implementation/injectors.dm @@ -0,0 +1,83 @@ + +//////////////////////////////////////////// +// Injector +//////////////////////////////////////////// +/datum/automation/set_injector_power + name = "Injector: Power" + var/injector=null + var/state=0 + + Export() + var/list/json = ..() + json["injector"]=injector + json["state"]=state + return json + + Import(var/list/json) + ..(json) + injector = json["injector"] + state = text2num(json["state"]) + + process() + if(injector) + parent.send_signal(list ("tag" = injector, "power"=state)) + return 0 + + GetText() + return "Set injector [fmtString(injector)] power to [state ? "on" : "off"]." + + Topic(href,href_list) + if(..()) + return 1 + if(href_list["toggle_state"]) + state = !state + parent.updateUsrDialog() + return 1 + if(href_list["set_injector"]) + var/list/injector_names=list() + for(var/obj/machinery/atmospherics/unary/outlet_injector/I in machines) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + injector = input("Select an injector:", "Sensor Data", injector) as null|anything in injector_names + parent.updateUsrDialog() + return 1 + +/datum/automation/set_injector_rate + name = "Injector: Rate" + var/injector = null + var/rate = 0 + + Export() + var/list/json = ..() + json["injector"] = injector + json["rate"] = rate + return json + + Import(var/list/json) + ..(json) + injector = json["injector"] + rate = text2num(json["rate"]) + + process() + if(injector) + parent.send_signal(list ("tag" = injector, "set_volume_rate"=rate)) + return 0 + + GetText() + return "Set injector [fmtString(injector)] transfer rate to [rate] L/s." + + Topic(href,href_list) + if(..()) + return 1 + if(href_list["set_rate"]) + rate = input("Set rate in L/s.", "Rate", rate) as num + parent.updateUsrDialog() + return 1 + if(href_list["set_injector"]) + var/list/injector_names=list() + for(var/obj/machinery/atmospherics/unary/outlet_injector/I in machines) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + injector = input("Select an injector:", "Sensor Data", injector) as null|anything in injector_names + parent.updateUsrDialog() + return 1 \ No newline at end of file diff --git a/code/modules/atmos_automation/implementation/scrubbers.dm b/code/modules/atmos_automation/implementation/scrubbers.dm new file mode 100644 index 00000000000..eb6f13f83bf --- /dev/null +++ b/code/modules/atmos_automation/implementation/scrubbers.dm @@ -0,0 +1,153 @@ +/datum/automation/set_scrubber_mode + name="Scrubber: Mode" + + var/scrubber=null + var/mode=1 + + Export() + var/list/json = ..() + json["scrubber"]=scrubber + json["mode"]=mode + return json + + Import(var/list/json) + ..(json) + scrubber = json["scrubber"] + mode = text2num(json["mode"]) + + New(var/obj/machinery/computer/general_air_control/atmos_automation/aa) + ..(aa) + children=list(null) + + process() + if(scrubber) + parent.send_signal(list ("tag" = scrubber, "sigtype"="command", "scrubbing"=mode),filter = RADIO_FROM_AIRALARM) + return 0 + + GetText() + return "Set Scrubber [fmtString(scrubber)] mode to [mode?"Scrubbing":"Syphoning"]." + + Topic(href,href_list) + if(..()) return + if(href_list["set_mode"]) + mode=!mode + parent.updateUsrDialog() + return 1 + if(href_list["set_scrubber"]) + var/list/injector_names=list() + for(var/obj/machinery/atmospherics/unary/vent_scrubber/S in machines) + if(!isnull(S.id_tag) && S.frequency == parent.frequency) + injector_names|=S.id_tag + scrubber = input("Select a scrubber:", "Scrubbers", scrubber) as null|anything in injector_names + parent.updateUsrDialog() + return 1 + +/datum/automation/set_scrubber_power + name="Scrubber: Power" + + var/scrubber=null + var/state=0 + + Export() + var/list/json = ..() + json["scrubber"]=scrubber + json["state"]=state + return json + + Import(var/list/json) + ..(json) + scrubber = json["scrubber"] + state = text2num(json["state"]) + + New(var/obj/machinery/computer/general_air_control/atmos_automation/aa) + ..(aa) + + process() + if(scrubber) + parent.send_signal(list ("tag" = scrubber, "sigtype"="command", "power"=state),filter = RADIO_FROM_AIRALARM) + + GetText() + return "Set Scrubber [fmtString(scrubber)] power to [state ? "on" : "off"]." + + Topic(href,href_list) + if(..()) return + if(href_list["set_power"]) + state = !state + parent.updateUsrDialog() + return 1 + if(href_list["set_scrubber"]) + var/list/injector_names=list() + for(var/obj/machinery/atmospherics/unary/vent_scrubber/S in machines) + if(!isnull(S.id_tag) && S.frequency == parent.frequency) + injector_names|=S.id_tag + scrubber = input("Select a scrubber:", "Scrubbers", scrubber) as null|anything in injector_names + parent.updateUsrDialog() + return 1 + +var/global/list/gas_labels=list( + "co2" = "CO2", + "tox" = "Plasma", + "n2o" = "N2O", + "o2" = "O2", + "n2" = "N2" +) +/datum/automation/set_scrubber_gasses + name="Scrubber: Gasses" + + var/scrubber=null + var/list/gasses=list( + "co2" = 1, + "tox" = 0, + "n2o" = 0, + "o2" = 0, + "n2" = 0 + ) + + Export() + var/list/json = ..() + json["scrubber"]=scrubber + json["gasses"]=gasses + return json + + Import(var/list/json) + ..(json) + scrubber = json["scrubber"] + + var/list/newgasses=json["gasses"] + for(var/key in newgasses) + gasses[key]=newgasses[key] + + + New(var/obj/machinery/computer/general_air_control/atmos_automation/aa) + ..(aa) + + process() + if(scrubber) + var/list/data = list ("tag" = scrubber, "sigtype"="command") + for(var/gas in gasses) + data[gas+"_scrub"]=gasses[gas] + parent.send_signal(data,filter = RADIO_FROM_AIRALARM) + + GetText() + var/txt = "Set Scrubber [fmtString(scrubber)] to scrub " + for(var/gas in gasses) + txt += " [gas_labels[gas]] ([gasses[gas] ? "on" : "off"])," + return txt + + Topic(href,href_list) + if(..()) return + if(href_list["tog_gas"]) + var/gas = href_list["tog_gas"] + if(!(gas in gasses)) + return + gasses[gas] = !gasses[gas] + parent.updateUsrDialog() + return 1 + if(href_list["set_scrubber"]) + var/list/injector_names=list() + for(var/obj/machinery/atmospherics/unary/vent_scrubber/S in machines) + if(!isnull(S.id_tag) && S.frequency == parent.frequency) + injector_names|=S.id_tag + scrubber = input("Select a scrubber:", "Scrubbers", scrubber) as null|anything in injector_names + parent.updateUsrDialog() + return 1 \ No newline at end of file diff --git a/code/modules/atmos_automation/implementation/sensors.dm b/code/modules/atmos_automation/implementation/sensors.dm new file mode 100644 index 00000000000..57a36e2999b --- /dev/null +++ b/code/modules/atmos_automation/implementation/sensors.dm @@ -0,0 +1,56 @@ + +/////////////////////////////////////////// +// sensor data +/////////////////////////////////////////// + +/datum/automation/get_sensor_data + name = "Sensor: Get Data" + var/field="temperature" + var/sensor=null + + returntype=AUTOM_RT_NUM + + Export() + var/list/json = ..() + json["sensor"]=sensor + json["field"]=field + return json + + Import(var/list/json) + ..(json) + sensor = json["sensor"] + field = json["field"] + + Evaluate() + if(sensor && field && sensor in parent.sensor_information) + return parent.sensor_information[sensor][field] + return 0 + + GetText() + return "[fmtString(field)] from sensor [fmtString(sensor)]" + + Topic(href,href_list) + if(..()) + return 1 + if(href_list["set_field"]) + field = input("Select a sensor output:", "Sensor Data", field) as null|anything in list( + "temperature", + "pressure", + "oxygen", + "toxins", + "nitrogen", + "carbon_dioxide" + ) + parent.updateUsrDialog() + return 1 + if(href_list["set_sensor"]) + var/list/sensor_list = list() + for(var/obj/machinery/air_sensor/G in machines) + if(!isnull(G.id_tag) && G.frequency == parent.frequency) + sensor_list|=G.id_tag + for(var/obj/machinery/meter/M in machines) + if(!isnull(M.id_tag) && M.frequency == parent.frequency) + sensor_list|=M.id_tag + sensor = input("Select a sensor:", "Sensor Data", field) as null|anything in sensor_list + parent.updateUsrDialog() + return 1 \ No newline at end of file diff --git a/code/modules/atmos_automation/implementation/vent_pump.dm b/code/modules/atmos_automation/implementation/vent_pump.dm new file mode 100644 index 00000000000..ff1c2cbdc44 --- /dev/null +++ b/code/modules/atmos_automation/implementation/vent_pump.dm @@ -0,0 +1,314 @@ +/datum/automation/set_vent_pump_mode + name="Vent Pump: Mode" + + var/vent_pump = null + var/mode = "stabilize" + var/vent_type = 0//0 for unary vents, 1 for DP vents + + var/list/modes = list("stabilize","purge") + + Export() + var/list/json = ..() + json["vent_pump"] = vent_pump + json["mode"] = mode + json["vent_type"] = vent_type + return json + + Import(var/list/json) + ..(json) + vent_pump = json["vent_pump"] + mode = json["mode"] + vent_type = text2num(json["vent_type"]) + + process() + if(vent_pump) + var/dirvalue = (mode == "stabilize" ? 1 : mode == "purge" ? 0 : 1) + parent.send_signal(list("tag" = vent_pump, "direction" = dirvalue), filter = (vent_type ? RADIO_ATMOSIA : RADIO_FROM_AIRALARM)) + return 0 + + GetText() + return "Set [vent_type ? "Dual-Port" : "Unary"] vent pump [fmtString(vent_pump)] mode to [mode]." + + Topic(href,href_list) + if(..()) + return 1 + + if(href_list["set_mode"]) + mode = input("Select a mode to put this pump into.",mode) in modes + parent.updateUsrDialog() + return 1 + + if(href_list["set_vent_pump"]) + var/list/injector_names = list() + if(!vent_type) + for(var/obj/machinery/atmospherics/unary/vent_pump/I in machines) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names |= I.id_tag + else + for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world) + //world << "test" + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names |= I.id_tag + + vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names + parent.updateUsrDialog() + return 1 + + if(href_list["toggle_type"]) + vent_type = !vent_type + parent.updateUsrDialog() + return 1 + +/datum/automation/set_vent_pump_power + name="Vent Pump: Power" + + var/vent_pump = null + var/state = 0 + var/mode = 0//0 for unary vents, 1 for DP vents. + + Export() + var/list/json = ..() + json["vent_pump"] = vent_pump + json["state"] = state + json["mode"] = mode + return json + + Import(var/list/json) + ..(json) + vent_pump = json["vent_pump"] + state = text2num(json["state"]) + mode = text2num(json["mode"]) + + process() + if(vent_pump) + parent.send_signal(list ("tag" = vent_pump, "power" = state), filter = (mode ? RADIO_ATMOSIA : RADIO_FROM_AIRALARM)) + + GetText() + return "Set [mode ? "Dual-Port" : "Unary"] vent pump [fmtString(vent_pump)] power to [state ? "on" : "off"]." + + Topic(href,href_list) + if(..()) + return 1 + + if(href_list["set_power"]) + state = !state + parent.updateUsrDialog() + return 1 + + if(href_list["set_vent_pump"]) + var/list/injector_names=list() + if(!mode) + for(var/obj/machinery/atmospherics/unary/vent_pump/I in machines) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + else + for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names + parent.updateUsrDialog() + return 1 + + if(href_list["toggle_mode"]) + mode = !mode + parent.updateUsrDialog() + return 1 + +/datum/automation/set_vent_pump_pressure//controls the internal/external pressure bounds of a vent pump. + name = "Vent Pump: Pressure Settings" + + var/vent_pump = null + var/intpressureout = 0//these 2 are for DP vents, if it's a unary vent you're sending to it will take intpressureout as var + var/intpressurein = 0 + var/extpressure = 0 + var/mode = 0//0 for unary vents, 1 for DP vents. + + Export() + var/list/json = ..() + json["vent_pump"] = vent_pump + json["intpressureout"] = intpressureout + json["intpressurein"] = intpressurein + json["extpressure"] = extpressure + json["mode"] = mode + return json + + Import(var/list/json) + ..(json) + vent_pump = json["vent_pump"] + intpressureout = text2num(json["intpressureout"]) + intpressurein = text2num(json["intpressurein"]) + extpressure = text2num(json["extpressure"]) + mode = text2num(json["mode"]) + + New(var/obj/machinery/computer/general_air_control/atmos_automation/aa) + ..(aa) + + process() + if(vent_pump) + var/list/data = list( \ + "tag" = vent_pump, \ + ) + var/filter = RADIO_ATMOSIA + if(mode)//it's a DP vent + if(intpressurein) + data.Add(list("set_input_pressure" = intpressurein)) + if(intpressureout) + data.Add(list("set_output_pressure" = intpressureout)) + if(extpressure) + data.Add(list("set_external_pressure" = extpressure)) + + else + if(intpressureout) + data.Add(list("set_internal_pressure" = intpressureout)) + if(extpressure) + data.Add(list("set_external_pressure" = extpressure)) + filter = RADIO_FROM_AIRALARM + + parent.send_signal(data, filter) + + GetText() + if(mode)//DP vent + return {"Set dual-port vent pump [fmtString(vent_pump)] + pressure bounds: internal outwards: [fmtString(intpressureout)] + internal inwards: [fmtString(intpressurein)] + external: [fmtString(extpressure)] + "}//well that was a lot to type + else + return {"Set unary vent pump [fmtString(vent_pump)] + pressure bounds: internal: [fmtString(intpressureout)] + external: [fmtString(extpressure)] + "}//copy paste FTW + + Topic(href, href_list) + if(..()) + return 1 + + if(href_list["set_vent_pump"]) + var/list/injector_names=list() + if(mode)//DP vent selection + for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + else + for(var/obj/machinery/atmospherics/unary/vent_pump/I in machines) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names + parent.updateUsrDialog() + return 1 + + if(href_list["set_intpressure_out"]) + var/response = input("Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num + intpressureout = text2num(response) + intpressureout = between(0, intpressureout, 50*ONE_ATMOSPHERE) + parent.updateUsrDialog() + return 1 + + if(href_list["set_intpressure_in"]) + var/response = input("Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num + intpressurein = text2num(response) + intpressurein = between(0, intpressurein, 50*ONE_ATMOSPHERE) + parent.updateUsrDialog() + return 1 + + if(href_list["set_external"]) + var/response = input(usr,"Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num + extpressure = text2num(response) + extpressure = between(0, extpressure, 50*ONE_ATMOSPHERE) + parent.updateUsrDialog() + return 1 + + if(href_list["swap_modes"]) + mode = !mode + vent_pump = null//if we don't clear this is could get glitchy, by which I mean not at all, whatever, stay clean + parent.updateUsrDialog() + return 1 + +/datum/automation/set_vent_pressure_checks + name = "Vent Pump: Pressure Checks" + + var/vent_pump = null + var/checks = 1 + var/mode = 0//1 for DP vent, 0 for unary vent +/* +checks bitflags +1 = external +2 = internal in (regular internal for unaries) +4 = internal out (ignored by unaries) +*/ + + + Export() + var/list/json = ..() + json["vent_pump"] = vent_pump + json["checks"] = checks + json["mode"] = mode + return json + + Import(var/list/json) + ..(json) + vent_pump = json["vent_pump"] + checks = text2num(json["checks"]) + mode = text2num(json["mode"]) + + New(var/obj/machinery/computer/general_air_control/atmos_automation/aa) + ..(aa) + + process() + if(vent_pump) + parent.send_signal(list("tag" = vent_pump, "checks" = checks), filter = (mode ? RADIO_ATMOSIA : RADIO_FROM_AIRALARM))//not gonna bother with a sanity check here, there *should* not be any problems + + GetText() + if(mode) + return {"Set dual-port vent pump [fmtString(vent_pump)] pressure checks to: + external [checks&1 ? "Enabled" : "Disabled"] + internal inwards [checks&2 ? "Enabled" : "Disabled"] + internal outwards [checks&4 ? "Enabled" : "Disabled"] + "} + else + return {"Set unary vent pump [fmtString(vent_pump)] pressure checks to: + external: [checks&1 ? "Enabled" : "Disabled"], + internal: [checks&2 ? "Enabled" : "Disabled"] + "} + + Topic(href, href_list) + if(..()) + return 1 + + if(href_list["set_vent_pump"]) + var/list/injector_names=list() + if(mode)//DP vent selection + for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + else + for(var/obj/machinery/atmospherics/unary/vent_pump/I in machines) + if(!isnull(I.id_tag) && I.frequency == parent.frequency) + injector_names|=I.id_tag + vent_pump = input("Select a vent:", "Vent Pumps", vent_pump) as null|anything in injector_names + parent.updateUsrDialog() + return 1 + + if(href_list["swap_modes"]) + mode = !mode + vent_pump = null//if we don't clear this is could get glitchy, by which I mean not at all, whatever, stay clean + if(!mode && checks&4)//disable this bitflag since we're switching to unaries + checks &= ~4 + parent.updateUsrDialog() + return 1 + + if(href_list["togglecheck"]) + var/bitflagvalue = text2num(href_list["togglecheck"]) + if(mode) + if(!(bitflagvalue in list(1, 2, 4))) + return 0 + else if(!(bitflagvalue in list(1, 2))) + return 0 + + if(checks&bitflagvalue)//the bitflag is on ATM + checks &= ~bitflagvalue + else//can't not be off + checks |= bitflagvalue + parent.updateUsrDialog() + return 1 + diff --git a/code/modules/atmos_automation/statements.dm b/code/modules/atmos_automation/statements.dm new file mode 100644 index 00000000000..5062de3f087 --- /dev/null +++ b/code/modules/atmos_automation/statements.dm @@ -0,0 +1,457 @@ +var/global/automation_types=typesof(/datum/automation) - /datum/automation + +#define AUTOM_RT_NULL 0 +#define AUTOM_RT_NUM 1 +#define AUTOM_RT_STRING 2 +/datum/automation + // Name of the Automation + var/name="Base Automation" + + // For labelling what shit does on the AAC. + var/label="Unnamed Script" + var/desc ="No Description." + + var/obj/machinery/computer/general_air_control/atmos_automation/parent + var/list/valid_child_returntypes=list() + var/list/datum/automation/children=list() + + var/returntype=AUTOM_RT_NULL + +/datum/automation/New(var/obj/machinery/computer/general_air_control/atmos_automation/aa) + parent=aa + +/datum/automation/proc/GetText() + return "[type] doesn't override GetText()!" + +/datum/automation/proc/OnReset() + return + +/datum/automation/proc/OnRemove() + return + +/datum/automation/proc/process() + return + +/datum/automation/proc/Evaluate() + return 0 + +/datum/automation/proc/Export() + var/list/R = list("type"=type) + + if(initial(label)!=label) + R["label"]=label + + if(initial(desc)!=desc) + R["desc"]=desc + + if(children.len>0) + var/list/C=list() + for(var/datum/automation/A in children) + C += list(A.Export()) + R["children"]=C + + return R + +/datum/automation/proc/unpackChild(var/list/cData) + if(isnull(cData) || !("type" in cData)) + return null + var/Atype=text2path(cData["type"]) + if(!(Atype in automation_types)) + return null + var/datum/automation/A = new Atype(parent) + A.Import(cData) + return A + +/datum/automation/proc/unpackChildren(var/list/childList) + . = list() + if(childList.len>0) + for(var/list/cData in childList) + if(isnull(cData) || !("type" in cData)) + . += null + continue + var/Atype=text2path(cData["type"]) + if(!(Atype in automation_types)) + continue + var/datum/automation/A = new Atype(parent) + A.Import(cData) + . += A + +/datum/automation/proc/packChildren(var/list/childList) + . = list() + if(childList.len>0) + for(var/datum/automation/A in childList) + if(isnull(A) || !istype(A)) + . += null + continue + . += list(A.Export()) + +/datum/automation/proc/Import(var/list/json) + if("label" in json) + label = json["label"] + + if("desc" in json) + desc = json["desc"] + + if("children" in json) + children = unpackChildren(json["children"]) + +/datum/automation/proc/fmtString(var/str) + if(str==null || str == "") + return "-----" + return str + +/datum/automation/Topic(href,href_list) + if(parent.Topic("src=\ref[parent]", list("src" = parent)))//dumb hack to check sanity, empty topic shouldn't trigger a 1 on anything but sanity checks + return 1 + + if(href_list["add"]) + var/new_child=selectValidChildFor(usr) + if(!new_child) return 1 + children += new_child + parent.updateUsrDialog() + return 1 + + if(href_list["remove"]) + if(href_list["remove"]=="*") + var/confirm=alert("Are you sure you want to remove ALL automations?","Automations","Yes","No") + if(confirm == "No") return 0 + for(var/datum/automation/A in children) + A.OnRemove() + children.Remove(A) + else + var/datum/automation/A=locate(href_list["remove"]) + if(!A) return 1 + var/confirm=alert("Are you sure you want to remove this automation?","Automations","Yes","No") + if(confirm == "No") return 0 + A.OnRemove() + children.Remove(A) + parent.updateUsrDialog() + return 1 + + if(href_list["reset"]) + if(href_list["reset"]=="*") + for(var/datum/automation/A in children) + A.OnReset() + else + var/datum/automation/A=locate(href_list["reset"]) + if(!A) return 1 + A.OnReset() + parent.updateUsrDialog() + return 1 + return 0 // 1 if handled + +/datum/automation/proc/selectValidChildFor(var/mob/user, var/list/returntypes=valid_child_returntypes) + return parent.selectValidChildFor(src, user, returntypes) + +/////////////////////////////////////////// +// AND +/////////////////////////////////////////// +/datum/automation/and + name = "AND statement" + returntype=AUTOM_RT_NUM + valid_child_returntypes=list(AUTOM_RT_NUM) + + Evaluate() + if(children.len==0) return 0 + for(var/datum/automation/stmt in children) + if(!stmt.Evaluate()) + return 0 + return 1 + + GetText() + var/out="AND (Add)" + if(children.len>0) + out += "
      " + for(var/datum/automation/stmt in children) + out += {"
    • + \[Reset | + ×\] + [stmt.GetText()] +
    • "} + out += "
    " + else + out += "
    No statements to evaluate.
    " + return out + +/////////////////////////////////////////// +// OR +/////////////////////////////////////////// + +/datum/automation/or + name = "OR statement" + returntype=AUTOM_RT_NUM + valid_child_returntypes=list(AUTOM_RT_NUM) + + Evaluate() + if(children.len==0) return 0 + for(var/datum/automation/stmt in children) + if(stmt.Evaluate()) + return 1 + return 0 + + GetText() + var/out="OR (Add)" + if(children.len>0) + out += "
      " + for(var/datum/automation/stmt in children) + out += {"
    • + \[Reset | + ×\] + [stmt.GetText()] +
    • "} + out += "
    " + else + out += "
    No statements to evaluate.
    " + return out + +/////////////////////////////////////////// +// if .. then +/////////////////////////////////////////// + +/datum/automation/if_statement + name = "IF statement" + var/datum/automation/condition=null + valid_child_returntypes=list(AUTOM_RT_NULL) + var/list/valid_conditions=list(AUTOM_RT_NUM) + + var/list/children_then=list() + var/list/children_else=list() + + Export() + var/list/R = ..() + + if(children_then.len>0) + R["then"]=packChildren(children_then) + + if(children_else.len>0) + R["else"]=packChildren(children_else) + + if(condition) + R["condition"]=condition.Export() + + return R + + Import(var/list/json) + ..(json) + + if("then" in json) + children_then = unpackChildren(json["then"]) + + if("else" in json) + children_else = unpackChildren(json["else"]) + + if("condition" in json) + condition = unpackChild(json["condition"]) + + GetText() + var/out="IF (SET):
    " + if(condition) + out += condition.GetText() + else + out += "Not set" + out += "
    " + out += "THEN: (Add)" + if(children_then.len>0) + out += "
      " + for(var/datum/automation/stmt in children_then) + out += {"
    • + \[Reset | + ×\] + [stmt.GetText()] +
    • "} + out += "
    " + else + out += "
    (No statements to run)
    " + out += "ELSE: (Add)" + if(children_then.len>0) + out += "
      " + for(var/datum/automation/stmt in children_else) + out += {"
    • + \[Reset | + ×\] + [stmt.GetText()] +
    • "} + out += "
    " + else + out += "
    (No statements to run)
    " + return out + + Topic(href,href_list) + if(href_list["add"]) + var/new_child=selectValidChildFor(usr) + if(!new_child) return 1 + switch(href_list["add"]) + if("then") + children_then += new_child + if("else") + children_else += new_child + else + warning("Unknown add value given to [type]/Topic():[__LINE__]: [href]") + return 1 + parent.updateUsrDialog() + return 1 + if(href_list["remove"]) + if(href_list["remove"]=="*") + var/confirm=input("Are you sure you want to remove ALL automations?","Automations","No") in list("Yes","No") + if(confirm == "No") return 0 + for(var/datum/automation/A in children_then) + A.OnRemove() + children_then.Remove(A) + for(var/datum/automation/A in children_else) + A.OnRemove() + children_else.Remove(A) + else + var/datum/automation/A=locate(href_list["remove"]) + if(!A) return 1 + var/confirm=input("Are you sure you want to remove this automation?","Automations","No") in list("Yes","No") + if(confirm == "No") return 0 + A.OnRemove() + switch(href_list["context"]) + if("then") + children_then.Remove(A) + if("else") + children_else.Remove(A) + parent.updateUsrDialog() + return 1 + if(href_list["reset"]) + if(href_list["reset"]=="*") + for(var/datum/automation/A in children_then) + A.OnReset() + for(var/datum/automation/A in children_else) + A.OnReset() + else + var/datum/automation/A=locate(href_list["reset"]) + if(!A) return 1 + A.OnReset() + parent.updateUsrDialog() + return 1 + if(href_list["set_condition"]) + var/new_condition = selectValidChildFor(usr,valid_conditions) + testing("Selected condition: [new_condition]") + if(!new_condition) + return 1 + condition = new_condition + parent.updateUsrDialog() + return 1 + + process() + if(condition) + if(condition.Evaluate()) + for(var/datum/automation/stmt in children_then) + stmt.process() + else + for(var/datum/automation/stmt in children_else) + stmt.process() + +/////////////////////////////////////////// +// compare +/////////////////////////////////////////// + +/datum/automation/compare + name = "comparison" + var/comparator="Greater Than" + returntype=AUTOM_RT_NUM + valid_child_returntypes=list(AUTOM_RT_NUM) + + New(var/obj/machinery/computer/general_air_control/atmos_automation/aa) + ..(aa) + children=list(null,null) + + Export() + var/list/json = ..() + json["cmp"]=comparator + return json + + Import(var/list/json) + ..(json) + comparator = json["cmp"] + + Evaluate() + if(children.len<2) + return 0 + var/datum/automation/d_left =children[1] + var/datum/automation/d_right=children[2] + if(!d_left || !d_right) + return 0 + var/left=d_left.Evaluate() + var/right=d_right.Evaluate() + switch(comparator) + if("Greater Than") + return left>right + if("Greater Than or Equal to") + return left>=right + if("Less Than") + return left(Set Left) (" + if(left==null) + out += "-----" + else + out += left.GetText() + + out += ") is [comparator]: (Set Right) (" + + if(right==null) + out += "-----" + else + out += right.GetText() + out +=")" + return out + + Topic(href,href_list) + if(href_list["set_comparator"]) + comparator = input("Select a comparison operator:", "Compare", "Greater Than") in list("Greater Than","Greater Than or Equal to","Less Than","Less Than or Equal to","Equal to","NOT Equal To") + parent.updateUsrDialog() + return 1 + if(href_list["set_field"]) + var/idx = text2num(href_list["set_field"]) + var/new_child = selectValidChildFor(usr) + if(!new_child) + return 1 + children[idx] = new_child + parent.updateUsrDialog() + return 1 + +/////////////////////////////////////////// +// static value +/////////////////////////////////////////// + +/datum/automation/static_value + name = "Number" + + var/value=0 + + returntype=AUTOM_RT_NUM + + Evaluate() + return value + + Export() + var/list/json = ..() + json["value"]=value + return json + + Import(var/list/json) + ..(json) + value = text2num(json["value"]) + + GetText() + return "[value]" + + Topic(href,href_list) + if(href_list["set_value"]) + value = input("Set a value:", "Static Value", value) as num + parent.updateUsrDialog() + return 1 \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 77e005c0422..93c4a366bf6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -970,7 +970,7 @@ datum/preferences if("age") age = rand(AGE_MIN, AGE_MAX) if("hair") - if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine") + if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Wryn") r_hair = rand(0,255) g_hair = rand(0,255) b_hair = rand(0,255) @@ -996,7 +996,7 @@ datum/preferences if(species == "Human") s_tone = random_skin_tone() if("s_color") - if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People") + if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Wryn") r_skin = rand(0,255) g_skin = rand(0,255) b_skin = rand(0,255) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 05519f99a7e..9c2f0beb67a 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -45,7 +45,7 @@ //Set species_restricted list switch(target_species) if("Human", "Skrell") //humanoid bodytypes - species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox","Wryn") else species_restricted = list(target_species) @@ -161,7 +161,7 @@ BLIND // can't see anything var/transfer_prints = FALSE var/pickpocket = 0 //Master pickpocket? var/clipped = 0 - species_restricted = list("exclude","Unathi","Tajaran") + species_restricted = list("exclude","Unathi","Tajaran","Wryn") /obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/wirecutters)) @@ -295,7 +295,7 @@ BLIND // can't see anything permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN - species_restricted = list("exclude","Unathi","Tajaran") + species_restricted = list("exclude","Unathi","Tajaran","Wryn") /obj/item/proc/negates_gravity() return 0 @@ -328,7 +328,7 @@ BLIND // can't see anything heat_protection = HEAD max_heat_protection_temperature = SPACE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.9 - species_restricted = list("exclude","Diona","Vox") + species_restricted = list("exclude","Diona","Vox","Wryn") loose = 0 // What kind of idiot designs a pressurized suit where the helmet can fall off? flash_protect = 2 @@ -351,7 +351,7 @@ BLIND // can't see anything heat_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.9 - species_restricted = list("exclude","Diona","Vox") + species_restricted = list("exclude","Diona","Vox","Wryn") //Under clothing /obj/item/clothing/under diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index d274f24815c..1a761bd8417 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -45,4 +45,4 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team desc = "Reverse-engineered magboots that appear to be based on an advanced model, as they have a lighter magnetic pull. Property of Gorlex Marauders." name = "advanced blood-red magboots" - slowdown_active = SHOES_SLOWDOWN + slowdown_active = SHOES_SLOWDOWN \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 0bdb722f213..f92c7fcde21 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -13,7 +13,7 @@ action_button_name = "Toggle Helmet Light" //Species-specific stuff. - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") + species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox","Wryn") sprite_sheets = list( "Unathi" = 'icons/mob/species/unathi/helmet.dmi', "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', @@ -51,7 +51,7 @@ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd) - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") + species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox","Wryn") sprite_sheets = list( "Unathi" = 'icons/mob/species/unathi/suit.dmi', "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 54fbe20c87b..f3da90cfe17 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -3,7 +3,7 @@ /obj/item/clothing/under/color/random/New() ..() - var/list/excluded = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/color, /obj/item/clothing/under/color/blackf, /obj/item/clothing/under/color/blue/dodgeball, /obj/item/clothing/under/color/orange/prison, /obj/item/clothing/under/color/red/dodgeball) + var/list/excluded = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/color, /obj/item/clothing/under/color/blackf, /obj/item/clothing/under/color/blue/dodgeball, /obj/item/clothing/under/color/orange/prison, /obj/item/clothing/under/color/red/dodgeball, /obj/item/clothing/under/color/red/jersey, /obj/item/clothing/under/color/blue/jersey) var/obj/item/clothing/under/color/C = pick(typesof(/obj/item/clothing/under/color) - excluded) name = initial(C.name) icon_state = initial(C.icon_state) @@ -173,3 +173,19 @@ icon_state = "darkred" _color = "darkred" flags = ONESIZEFITSALL + +/obj/item/clothing/under/color/red/jersey + name = "red team jersey" + desc = "The jersey of the Nanotrasen Phi-ghters!" + icon_state = "redjersey" + item_state = "r_suit" + _color = "redjersey" + flags = ONESIZEFITSALL + +/obj/item/clothing/under/color/blue/jersey + name = "blue team jersey" + desc = "The jersey of the Nanotrasen Pi-rates!" + icon_state = "bluejersey" + item_state = "b_suit" + _color = "bluejersey" + flags = ONESIZEFITSALL diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 88f07a00368..26074bc3804 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -52,446 +52,22 @@ icon_state = "bookSpaceLawblack" title = "Space Law - Limited Edition" -////////////////////////////////// -////////// Fluff Items /////////// -////////////////////////////////// - -/obj/item/weapon/paper/fluff/sue_donem // aikasan: Sue Donem - name = "cyborgification waiver" - desc = "It's some kind of official-looking contract." - -/obj/item/weapon/paper/fluff/sue_donem/New() - ..() - - info = "Organic Carrier AIA and Standard Cyborgification Agreement
    \n
    \nUnder the authority of Nanotrasen Synthetic Intelligence Division, this document hereby authorizes an accredited Roboticist of the NSS Exodus or a deputized authority to perform a regulation lobotomisation upon the person of one 'Sue Donem' (hereafter referred to as the Subject) with intent to enact a live Artificial Intelligence Assimilation (AIA) or live Cyborgification proceedure.
    \n
    \nNo further station authorization is required, and the Subject waives all rights as a human under Nanotrasen internal and external legal protocol. This document is subject to amendment under Nanotrasen internal protocol \[REDACTED\].
    \n
    \nSigned: Sue Donem
    \n" - - stamps = (stamps=="" ? "
    " : "
    ") + "This paper has been stamped with the Nanotrasen Synthetic Intelligence Division rubber stamp." - - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.pixel_x = rand(-2, 2) - stampoverlay.pixel_y = rand(-3, 2) - stampoverlay.icon_state = "paper_stamp-rd" - overlays += stampoverlay - - update_icon() - -/obj/item/fluff/wes_solari_1 //tzefa: Wes Solari - name = "family photograph" - desc = "A family photograph of a couple and a young child, Written on the back it says \"See you soon Dad -Roy\"." - icon_state = "wes_solari_1" - -/obj/item/fluff/sarah_calvera_1 //fniff: Sarah Calvera - name = "old photo" - desc = "Looks like it was made on a really old, cheap camera. Low quality. The camera shows a young hispanic looking girl with red hair wearing a white dress is standing in front of\ - an old looking wall. On the back there is a note in black marker that reads \"Sara, Siempre pensé que eras tan linda con ese vestido. Tu hermano, Carlos.\"" - icon_state = "sarah_calvera_1" - -/obj/item/fluff/angelo_wilkerson_1 //fniff: Angleo Wilkerson - name = "fancy watch" - desc = "An old and expensive pocket watch. Engraved on the bottom is \"Odium est Source De Dolor\". On the back, there is an engraving that does not match the bottom and looks more recent.\ - \"Angelo, If you find this, you shall never see me again. Please, for your sake, go anywhere and do anything but stay. I'm proud of you and I will always love you. Your father, Jacob Wilkerson.\"\ - Jacob Wilkerson... Wasn't he that serial killer?" - icon_state = "angelo_wilkerson_1" - -/obj/item/fluff/sarah_carbrokes_1 //gvazdas: Sarah Carbrokes - name = "locket" - desc = "A grey locket with a picture of a black haired man in it. The text above it reads: \"Edwin Carbrokes\"." - icon_state = "sarah_carbrokes_1" - -/obj/item/fluff/ethan_way_1 //whitellama: Ethan Way - name = "old ID" - desc = "A scratched and worn identification card; it appears too damaged to inferface with any technology. You can almost make out \"Tom Cabinet\" in the smeared ink." - icon_state = "ethan_way_1" - -/obj/item/fluff/val_mcneil_1 //silentthunder: Val McNeil - name = "rosary pendant" - desc = "A cross on a ring of beads, has McNeil etched onto the back." - icon_state = "val_mcneil_1" - -/obj/item/fluff/steve_johnson_1 //thebreadbocks: Steve Johnson - name = "bottle of hair dye" - desc = "A bottle of pink hair dye. So that's how he gets his beard so pink..." - icon_state = "steve_johnson_1" - item_state = "steve_johnson_1" - -/obj/item/fluff/david_fanning_1 //sicktrigger: David Fanning - name = "golden scalpel" - desc = "A fine surgical cutting tool covered in thin gold leaf. Does not seem able to cut anything." - icon_state = "david_fanning_1" - item_state = "david_fanning_1" - -/obj/item/fluff/john_mckeever_1 //kirbyelder: John McKeever - name = "Suspicious Paper" - desc = "A piece of paper reading: Smash = 1/3 Leaf Juice, 1/3 Tricker, 1/3 Aajkli Extract" - icon_state = "paper" - item_state = "paper" - -/obj/item/fluff/maurice_bedford_1 - name = "Monogrammed Handkerchief" - desc = "A neatly folded handkerchief embroidered with a 'M'." - icon_state = "maurice_bedford_1" - -/obj/item/weapon/book/fluff/johnathan_falcian_1 - name = "sketchbook" - desc = "A small, well-used sketchbook." - icon = 'icons/obj/custom_items.dmi' - icon_state = "johnathan_notebook" - dat = "In the notebook there are numerous drawings of various crew-mates, locations, and scenes on the ship. They are of fairly good quality." - author = "Johnathan Falcian" - title = "Falcian's sketchbook" - ////////////////////////////////// ////////// Usable Items ////////// ////////////////////////////////// -/obj/item/weapon/folder/blue/fluff/matthew_riebhardt //Matthew Riebhardt - ZekeSulastin - name = "academic journal" - desc = "An academic journal, seemingly pertaining to medical genetics. This issue is for the second quarter of 2557. Paper flags demarcate some articles the owner finds interesting." - icon = 'icons/obj/custom_items.dmi' - icon_state = "matthewriebhardt" - -/obj/item/weapon/pen/fluff/multi //spaceman96: Trenna Seber - name = "multicolor pen" - desc = "It's a cool looking pen. Lots of colors!" - -/obj/item/weapon/pen/fluff/fancypen //orangebottle: Lillian Levett, Lilliana Reade - name = "fancy pen" - desc = "A fancy metal pen. It uses blue ink. An inscription on one side reads,\"L.L. - L.R.\"" - icon = 'icons/obj/custom_items.dmi' - icon_state = "fancypen" - -/obj/item/weapon/pen/fluff/eugene_bissegger_1 //metamorp: eugene bisseger - name = "Gilded Pen" - desc = "A golden pen that is gilded with a meager amount of gold material. The word 'Nanotrasen' is etched on the clip of the pen." - icon = 'icons/obj/custom_items.dmi' - icon_state = "eugene_pen" - /obj/item/weapon/pen/fluff/fountainpen //paththegreat: Eli Stevens name = "Engraved Fountain Pen" desc = "An expensive looking pen with the initials E.S. engraved into the side." icon = 'icons/obj/custom_items.dmi' icon_state = "fountainpen" -/obj/item/fluff/victor_kaminsky_1 //chinsky: Victor Kaminski - name = "golden detective's badge" - desc = "Nanotrasen Security Department detective's badge, made from gold. Badge number is 564." - icon_state = "victor_kaminsky_1" - -/obj/item/fluff/victor_kaminsky_1/attack_self(mob/user as mob) - for(var/mob/O in viewers(user, null)) - O.show_message(text("[] shows you: \icon[] [].", user, src, src.name), 1) - src.add_fingerprint(user) - -/obj/item/fluff/ana_issek_2 //suethecake: Ana Issek - name = "Faded Badge" - desc = "A faded badge, backed with leather, that reads 'NT Security Force' across the front. It bears the emblem of the Forensic division." - icon_state = "ana_badge" - item_state = "ana_badge" - _color = "ana_badge" - -/obj/item/fluff/ana_issek_2/attack_self(mob/user as mob) - if(isliving(user)) - user.visible_message("\red [user] flashes their golden security badge.\nIt reads: Ana Issek, NT Security.","\red You display the faded bage.\nIt reads: Ana Issek, NT Security.") - -/obj/item/fluff/ana_issek_2/attack(mob/living/carbon/human/M, mob/living/user) - if(isliving(user)) - user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.") - -/obj/item/weapon/soap/fluff/azare_siraj_1 //mister fox: Azare Siraj - name = "S'randarr's Tongue Leaf" - desc = "A waxy, scentless leaf." - icon = 'icons/obj/custom_items.dmi' - icon_state = "siraj_tongueleaf" - item_state = "siraj_tongueleaf" - -/obj/item/weapon/clipboard/fluff/smallnote //lexusjjss: Lexus Langg, Zachary Tomlinson - name = "small notebook" - desc = "A generic small spiral notebook that flips upwards." - icon = 'icons/obj/custom_items.dmi' - icon_state = "smallnotetext" - item_state = "smallnotetext" - -/obj/item/weapon/storage/fluff/maye_daye_1 //morrinn: Maye Day - name = "pristine lunchbox" - desc = "A pristine stainless steel lunch box. The initials M.D. are engraved on the inside of the lid." - icon = 'icons/obj/custom_items.dmi' - icon_state = "maye_daye_1" - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/william_hackett - name = "handmade flask" - desc = "A wooden flask with a silver lid and bottom. It has a matte, dark blue paint on it with the initials \"W.H.\" etched in black." - icon = 'icons/obj/custom_items.dmi' - icon_state = "williamhackett" - -/obj/item/weapon/storage/firstaid/fluff/asus_rose //Kerbal22 - Asus Rose - name = "rugged medkit" - desc = "A dinged up medkit, it seems to have seen quite a bit of use." - icon = 'icons/obj/custom_items.dmi' - icon_state = "asusrose" - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/johann_erzatz_1 //leonheart11: Johann Erzatz - name = "vintage thermos" - desc = "An older thermos with a faint shine." - icon = 'icons/obj/custom_items.dmi' - icon_state = "johann_erzatz_1" - volume = 50 - -/obj/item/weapon/lighter/zippo/fluff/li_matsuda_1 //mangled: Li Matsuda - name = "blue zippo lighter" - desc = "A zippo lighter made of some blue metal." - icon = 'icons/obj/custom_items.dmi' - icon_state = "bluezippo" - icon_on = "bluezippoon" - icon_off = "bluezippo" - -/obj/item/weapon/lighter/zippo/fluff/michael_guess_1 //Dragor23: Michael Guess - name = "engraved lighter" - desc = "A golden lighter, engraved with some ornaments and a G." - icon = 'icons/obj/custom_items.dmi' - icon_state = "guessip" - icon_on = "guessipon" - icon_off = "guessip" - -/obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1 //rawrtaicho: Riley Rohtin - name = "Riley's black zippo" - desc = "A black zippo lighter, which holds some form of sentimental value." - icon = 'icons/obj/custom_items.dmi' - icon_state = "blackzippo" - icon_on = "blackzippoon" - icon_off = "blackzippo" - -/obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1 //furohman: Fay Sullivan - name = "Graduation Lighter" - desc = "A silver engraved lighter with 41 on one side and Tharsis University on the other. The lid reads Fay Sullivan, Cybernetic Engineering, 2541" - icon = 'icons/obj/custom_items.dmi' - icon_state = "gradzippo" - icon_on = "gradzippoon" - icon_off = "gradzippo" - -/obj/item/weapon/lighter/zippo/fluff/executivekill_1 //executivekill: Hunter Duke - name = "Gonzo Fist zippo" - desc = "A Zippo lighter with the iconic Gonzo Fist on a matte black finish." - icon = 'icons/obj/custom_items.dmi' - icon_state = "gonzozippo" - icon_on = "gonzozippoon" - icon_off = "gonzozippo" - -/obj/item/weapon/lighter/zippo/fluff/naples_1 //naples: Russell Vierson - name = "Engraved zippo" - desc = "A intricately engraved Zippo lighter." - icon = 'icons/obj/custom_items.dmi' - icon_state = "engravedzippo" - icon_on = "engravedzippoon" - icon_off = "engravedzippo" - -/obj/item/weapon/lighter/zippo/fluff/nt_rep - name = "gold engraved zippo" - desc = "An engraved golden Zippo lighter with the letters NT on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "zippo_nt_off" - icon_on = "zippo_nt_on" - icon_off = "zippo_nt_off" - -/obj/item/weapon/lighter/zippo/fluff/purple - name = "purple engraved zippo" - desc = "All craftsspacemanship is of the highest quality. It is encrusted with refined plasma sheets. On the item is an image of a dwarf and the words 'Strike the Earth!' etched onto the side." - icon = 'icons/obj/custom_items.dmi' - icon_state = "purple_zippo_off" - icon_on = "purple_zippo_on" - icon_off = "purple_zippo_off" - - -/obj/item/weapon/fluff/cado_keppel_1 //sparklysheep: Cado Keppel - name = "purple comb" - desc = "A pristine purple comb made from flexible plastic. It has a small K etched into its side." - w_class = 1.0 - icon = 'icons/obj/custom_items.dmi' - icon_state = "purplecomb" - item_state = "purplecomb" - - attack_self(mob/user) - if(user.r_hand == src || user.l_hand == src) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy"), 1) - return - -/obj/item/weapon/fluff/hugo_cinderbacth_1 //thatoneguy: Hugo Cinderbatch - name = "Old Cane" - desc = "An old brown cane made from wood. It has a a large, itallicized H on it's handle." - icon = 'icons/obj/custom_items.dmi' - icon_state = "special_cane" - -/obj/item/device/camera/fluff/orange //chinsky: Summer Springfield - name = "orange camera" - icon = 'icons/obj/custom_items.dmi' - desc = "A modified detective's camera, painted in bright orange. On the back you see \"Have fun\" written in small accurate letters with something black." - icon_state = "orangecamera" - icon_on = "orangecamera" - icon_off = "camera_off" - pictures_left = 30 - -/obj/item/device/camera/fluff/oldcamera //magmaram: Maria Crash - name = "Old Camera" - icon = 'icons/obj/custom_items.dmi' - desc = "An old, slightly beat-up digital camera, with a cheap photo printer taped on. It's a nice shade of blue." - icon_state = "oldcamera" - icon_on = "oldcamera" - icon_off = "oldcamera_off" - pictures_left = 30 - -/obj/item/weapon/id_wallet/fluff/reese_mackenzie //Reese MacKenzie - ThoseDernSquirrels - - name = "ID wallet" - desc = "A wallet made of black leather, holding an ID and a gold badge that reads 'NT.' The ID has a small picture of a man, with the caption Reese James MacKenzie, with other pieces of information to the right of the picture." - icon = 'icons/obj/custom_items.dmi' - icon_state = "reesemackenzie" - /obj/item/weapon/card/id/fluff/lifetime //fastler: Fastler Greay; it seemed like something multiple people would have name = "Lifetime ID Card" desc = "A modified ID card given only to those people who have devoted their lives to the better interests of Nanotrasen. It sparkles blue." icon = 'icons/obj/custom_items.dmi' icon_state = "lifetimeid" -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask //lexusjjss: Lexus Langg & Zachary Tomlinson - name = "shiny flask" - desc = "A shiny metal flask. It appears to have a Greek symbol inscribed on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "shinyflask" - volume = 50 - -/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/lithiumflask //mcgulliver: Wox Derax - name = "Lithium Flask" - desc = "A flask with a Lithium Atom symbol on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lithiumflask" - volume = 50 - -/obj/item/weapon/reagent_containers/glass/beaker/large/fluff/nashida_bishara_1 //rukral:Nashida Bisha'ra - name = "Nashida's Etched Beaker" - desc = "The message: 'Please do not be removing this beaker from the chemistry lab. If lost, return to Nashida Bisha'ra' can be seen etched into the side of this 100 unit beaker." - icon = 'icons/obj/chemical.dmi' - icon_state = "beakerlarge" - g_amt = 5000 - volume = 100 - -/obj/item/weapon/reagent_containers/glass/beaker/fluff/eleanor_stone //Rkf45: Eleanor Stone - name = "teapot" - desc = "An elegant teapot. The engraving on the bottom reads 'ENS'" - icon = 'icons/obj/custom_items.dmi' - icon_state = "eleanorstone" - item_state = "eleanorstone" - - volume = 150 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,25,30,50,150) - -/obj/item/weapon/storage/pill_bottle/fluff/listermedbottle //compactninja: Lister Black - name = "Pill bottle (anti-depressants)" - desc = "Contains pills used to deal with depression. They appear to be prescribed to Lister Black" - New() - ..() - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - new /obj/item/weapon/reagent_containers/pill/fluff/listermed( src ) - -/obj/item/weapon/reagent_containers/pill/fluff/listermed - name = "anti-depressant pill" - desc = "Used to deal with depression." - icon_state = "pill9" - New() - ..() - reagents.add_reagent("morphine", 5) - reagents.add_reagent("sugar", 10) - reagents.add_reagent("ethanol", 5) - -/obj/item/clothing/mask/fluff/electriccig //CubeJackal: Barry Sharke - name = "Electronic cigarette" - desc = "An electronic cigarette. Most of the relief of a real cigarette with none of the side effects. Often used by smokers who are trying to quit the habit." - icon = 'icons/obj/custom_items.dmi' - icon_state = "cigon" - throw_speed = 0.5 - item_state = "ciglit" - w_class = 1 - body_parts_covered = null - -//Strange penlight, Nerezza: Asher Spock - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1 - name = "strange penlight" - desc = "Besides the coloring, this penlight looks rather normal and innocent. However, you get a nagging feeling whenever you see it..." - icon = 'icons/obj/custom_items.dmi' - icon_state = "asher_spock_1" - amount_per_transfer_from_this = 5 - volume = 15 - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/New() - ..() - reagents.add_reagent("hydrocodone", 15) - update_icon() - return - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/attack_self(mob/user as mob) - user << "\blue You click \the [src] but get no reaction. Must be dead." - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/attack(mob/M as mob, mob/user as mob) - if (user.ckey != "nerezza") //Because this can end up in the wrong hands, let's make it useless for them! - user << "\blue You click \the [src] but get no reaction. Must be dead." - return - if(!reagents.total_volume) - user << "\red \The [src] is empty." - return - if (!( istype(M, /mob) )) - return - if (reagents.total_volume) - if (M == user && user.ckey == "nerezza") //Make sure this is being used by the right person, for the right reason (self injection) - visible_message("\blue [user] presses their \ - penlight against their skin, quickly clicking the button once.", \ - "\blue You press the disguised autoinjector against your skin and click the button. There's a sharp pain at the injection site that rapidly fades.", \ - "You hear a rustle as someone moves nearby, then a sharp click.") - if (M != user && user.ckey == "nerezza") //Woah now, you better be careful partner - user << "\blue You don't want to contaminate the autoinjector." - return - src.reagents.reaction(M, INGEST) - if(M.reagents) - var/trans = reagents.trans_to(M, amount_per_transfer_from_this) - user << "\blue [trans] units injected. [reagents.total_volume] units remaining in \the [src]." - return - -/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1/examine(mob/user as mob) - ..() - if(user.ckey != "nerezza") return //Only the owner knows how to examine the contents. - if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - usr << "\blue You examine the penlight closely and see that it has [R.volume] units of [R.name] stored." - else - usr << "\blue You examine the penlight closely and see that it is currently empty." - -//End strange penlight - -/obj/item/weapon/card/id/fluff/asher_spock_2 //Nerezza: Asher Spock - name = "Odysses Specialist ID card" - desc = "A special identification card with a red cross signifying an emergency physician has specialised in Odysseus operations and maintenance.\nIt grants the owner recharge bay access." - icon = 'icons/obj/custom_items.dmi' - icon_state = "odysseus_spec_id" - -/obj/item/weapon/clipboard/fluff/mcreary_journal //sirribbot: James McReary - name = "McReary's journal" - desc = "A journal with a warning sticker on the front cover. The initials \"J.M.\" are written on the back." - icon = 'icons/obj/custom_items.dmi' - icon_state = "mcreary_journal" - item_state = "mcreary_journal" - -/obj/item/device/flashlight/fluff/thejesster14_1 //thejesster14: Rosa Wolff - name = "old red flashlight" - desc = "A very old, childlike flashlight." - icon = 'icons/obj/custom_items.dmi' - icon_state = "wolfflight" - item_state = "wolfflight" - /obj/item/weapon/crowbar/fluff/zelda_creedy_1 //daaneesh: Zelda Creedy name = "Zelda's Crowbar" desc = "A pink crow bar that has an engraving that reads, 'To Zelda. Love always, Dawn'" @@ -499,67 +75,11 @@ icon_state = "zeldacrowbar" item_state = "crowbar" -////// Ripley customisation kit - Butchery Royce - MayeDay - -/obj/item/weapon/paintkit/fluff/butcher_royce_1 - name = "Ripley customisation kit" - desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech." - icon = 'icons/obj/custom_items.dmi' - icon_state = "royce_kit" - - new_name = "APLU \"Titan's Fist\"" - new_desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist." - new_icon = "titan" - allowed_types = list("ripley","firefighter") - -////// Ripley customisation kit - Sven Fjeltson - Mordeth221 - -/obj/item/weapon/paintkit/fluff/sven_fjeltson_1 - name = "Mercenary APLU kit" - desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU." - icon = 'icons/obj/custom_items.dmi' - icon_state = "sven_kit" - - new_name = "APLU \"Strike the Earth!\"" - new_desc = "Looks like an over worked, under maintained Ripley with some horrific damage." - new_icon = "earth" - allowed_types = list("ripley","firefighter") - ////////////////////////////////// //////////// Clothing //////////// ////////////////////////////////// //////////// Gloves //////////// - -/obj/item/clothing/gloves/fluff/murad_hassim_1 - name = "Tajaran Surgical Gloves" - desc = "Reinforced sterile gloves custom tailored to comfortably accommodate Tajaran claws." - icon_state = "latex" - item_state = "lgloves" - siemens_coefficient = 0.30 - permeability_coefficient = 0.01 - _color="white" - -/obj/item/clothing/gloves/fluff/walter_brooks_1 //botanistpower: Walter Brooks - name = "mittens" - desc = "A pair of well worn, blue mittens." - icon = 'icons/obj/custom_items.dmi' - icon_state = "walter_brooks_1" - item_state = "bluegloves" - _color="blue" - -/obj/item/clothing/gloves/fluff/chal_appara_1 //furlucis: Chal Appara - name = "Left Black Glove" - desc = "The left one of a pair of black gloves. Wonder where the other one went..." - icon = 'icons/obj/custom_items.dmi' - icon_state = "chal_appara_1" - -/obj/item/clothing/gloves/fluff/ashley_rifler_1 //Vinceluk: Ashley Rifler - name = "Purple Glove" - desc = "A single, purple glove. Initials A.R. are written on the inside of it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "ashley_rifler_1" - //////////// Eye Wear //////////// /obj/item/clothing/glasses/meson/fluff/book_berner_1 //asanadas: Book Berner @@ -568,33 +88,7 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "book_berner_1" -/obj/item/clothing/glasses/fluff/uzenwa_sissra_1 //sparklysheep: Uzenwa Sissra - name = "Scanning Goggles" - desc = "A very oddly shaped pair of goggles with bits of wire poking out the sides. A soft humming sound emanates from it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "uzenwa_sissra_1" - -////// Medical eyepatch - Thysse Ezinwa - Jadepython -/obj/item/clothing/glasses/eyepatch/fluff/thysse_1 - name = "medical eyepatch" - desc = "On the strap, EZINWA is written in white block letters." - -////// Safety Goggles - Arjun Chopra - MindPhyre - APPROVED -/obj/item/clothing/glasses/fluff/arjun_chopra_1 - name = "safety goggles" - desc = "A used pair of leather safety goggles." - icon = 'icons/obj/custom_items.dmi' - icon_state = "arjun_chopra" - item_state = "arjun_chopra" - //////////// Hats //////////// - -/obj/item/clothing/head/secsoft/fluff/swatcap //deusdactyl: James Girard - name = "\improper SWAT hat" - desc = "A black hat. The inside has the words, \"Lieutenant James Girard, LPD SWAT Team Four.\"" - icon = 'icons/obj/custom_items.dmi' - icon_state = "swatcap" - /obj/item/clothing/head/welding/fluff/alice_mccrea_1 //madmalicemccrea: Alice McCrea name = "flame decal welding helmet" desc = "A welding helmet adorned with flame decals, and several cryptic slogans of varying degrees of legibility. \"Fly the Friendly Skies\" is clearly visible, written above the visor, for some reason." @@ -613,30 +107,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "norah_briggs_1" -/obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1 //themij: Taryn Kifer - name = "orange bandana" - desc = "Hey, I think we're missing a hazard vest..." - icon = 'icons/obj/custom_items.dmi' - icon_state = "taryn_kifer_1" - -/obj/item/clothing/head/fluff/edvin_telephosphor_1 //foolamancer: Edvin Telephosphor - name = "Edvin's Hat" - desc = "A hat specially tailored for Skrellian anatomy. It has a yellow badge on the front, with a large red 'T' inscribed on it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "edvin_telephosphor_1" - -/obj/item/clothing/head/fluff/krinnhat //Shirotyrant: Krinn Seeskale - name = "saucepan hat" - desc = "This hat is the shiniest shiny Krinn has ever owned." - icon = 'icons/obj/custom_items.dmi' - icon_state = "krinn_hat" - -/obj/item/clothing/head/fluff/bruce_hachert //Stup1dg33kz: Bruce Hachert - name = "worn hat" - desc = "A worn-looking hat. It is slightly faded in color." - icon = 'icons/obj/custom_items.dmi' - icon_state = "brucehachert" - //////////// Suits //////////// /obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Robotics Labcoat - Aeneas Rinil [APPR] @@ -645,28 +115,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "aeneasrinil_open" -/obj/item/clothing/suit/storage/labcoat/fluff/pink //spaceman96: Trenna Seber - name = "pink labcoat" - desc = "A suit that protects against minor chemical spills. Has a pink stripe down from the shoulders." - icon = 'icons/obj/custom_items.dmi' - icon_state = "labcoat_pink_open" - -/obj/item/clothing/suit/storage/det_suit/fluff/graycoat //vinceluk: Seth Sealis - name = "gray coat" - desc = "Old, worn out coat. It's seen better days." - icon = 'icons/obj/custom_items.dmi' - icon_state = "graycoat" - item_state = "graycoat" - _color = "graycoat" - -/obj/item/clothing/suit/storage/det_suit/fluff/leatherjack //atomicdog92: Seth Sealis - name = "leather jacket" - desc = "A black leather coat, popular amongst punks, greasers, and other galactic scum." - icon = 'icons/obj/custom_items.dmi' - icon_state = "leatherjack" - item_state = "leatherjack" - _color = "leatherjack" - /obj/item/clothing/suit/armor/vest/fluff/deus_blueshield //deusdactyl name = "blueshield security armor" desc = "An armored vest with the badge of a Blueshield Lieutenant." @@ -674,95 +122,7 @@ icon_state = "deus_blueshield" item_state = "deus_blueshield" -/obj/item/clothing/suit/fluff/oldscarf //Writerer2: Javaria Zara - name = "old scarf" - desc = "An old looking scarf, it seems to be fairly worn." - icon = 'icons/obj/clothing/suits.dmi' - icon_state = "mantle-unathi" - item_state = "mantle-unathi" - body_parts_covered = UPPER_TORSO - //////////// Uniforms //////////// - -/obj/item/clothing/under/fluff/milo_hachert //Field Dress Uniform - Milo Hachert - Commissar_Drew - name = "customs uniform" - desc = "A uniform jacket, its buttons polished to a shine, coupled with a dark pair of trousers. 'Customs' is embroidered upon the jacket’s shoulder bar." - icon = 'icons/obj/custom_items.dmi' - icon_state = "milohachert" - item_state = "milohachert" - _color = "milohachert" - -/obj/item/clothing/under/fluff/jumpsuitdown //searif: Yuki Matsuda - name = "rolled down jumpsuit" - desc = "A rolled down jumpsuit. Great for mechanics." - icon = 'icons/obj/custom_items.dmi' - icon_state = "jumpsuitdown" - item_state = "jumpsuitdown" - _color = "jumpsuitdown" - -/obj/item/clothing/under/fluff/lilith_vinous_1 //slyhidden: Lilith Vinous - name = "casual security uniform" - desc = "A less formal version of the traditional dark red Security uniform. It has the top button undone, rolled up sleeves and different belt." - icon = 'icons/obj/custom_items.dmi' - icon_state = "lilith_uniform" - item_state = "lilith_uniform" - _color = "lilith_uniform" - -/obj/item/clothing/under/fluff/ana_issek_1 //suethecake: Ana Issek - name = "retired uniform" - desc = "A silken blouse paired with dark-colored slacks. It has the words 'Chief Investigator' embroidered into the shoulder bar." - icon = 'icons/obj/custom_items.dmi' - icon_state = "ana_uniform" - item_state = "ana_uniform" - _color = "ana_uniform" - -/obj/item/clothing/under/fluff/olddressuniform //desiderium: Momiji Inubashiri - name = "retired dress uniform" - desc = "A retired Station Head of Staff uniform, phased out twenty years ago for the newer jumpsuit design, but still acceptable dress. Lovingly maintained." - icon = 'icons/obj/custom_items.dmi' - icon_state = "olddressuniform" - item_state = "olddressuniform" - _color = "olddressuniform" - -/obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1 //whitewolf41: Jeremy Wolf - name = "worn officer's uniform" - desc = "An old red security jumpsuit. Seems to have some slight modifications." - icon = 'icons/obj/custom_items.dmi' - icon_state = "jeremy_wolf_1" - _color = "jeremy_wolf_1" - -/obj/item/clothing/under/fluff/tian_dress //phaux: Tian Yinhu - name = "purple dress" - desc = "A nicely tailored purple dress made for the taller woman." - icon = 'icons/obj/custom_items.dmi' - icon_state = "tian_dress" - item_state = "tian_dress" - _color = "tian_dress" - -/obj/item/clothing/under/rank/bartender/fluff/classy //searif: Ara Al-Jazari - name = "classy bartender uniform" - desc = "A prim and proper uniform that looks very similar to a bartender's, the only differences being a red accessory, waistcoat and a rag hanging out of the back pocket." - icon = 'icons/obj/custom_items.dmi' - icon_state = "ara_bar_uniform" - item_state = "ara_bar_uniform" - _color = "ara_bar_uniform" - -/obj/item/clothing/under/fluff/callum_suit //roaper: Callum Leamus - name = "knockoff suit" - desc = "A knockoff of a suit commonly worn by the upper class." - icon = 'icons/obj/custom_items.dmi' - icon_state = "callum_suit" - item_state = "callum_suit" - _color = "callum_suit" - -/obj/item/clothing/under/fluff/solara_light_1 //bluefishie: Solara Born-In-Light - name = "Elaborate Purple Dress" - desc = "An expertly tailored dress, made out of fine fabrics. The interwoven necklace appears to be made out of gold, with three complicated symbols engraved in the front." - icon = 'icons/obj/custom_items.dmi' - icon_state = "solara_dress" - item_state = "solara_dress" - _color = "solara_dress" - /obj/item/clothing/under/psysuit/fluff/isaca_sirius_1 // Xilia: Isaca Sirius name = "Isaca's suit" desc = "Black, comfortable and nicely fitting suit. Made not to hinder the wearer in any way. Made of some exotic fabric. And some strange glowing jewel at the waist. Name labels says; Property of Isaca Sirius; The Seeder." @@ -801,129 +161,10 @@ src.item_state = "[_color]" usr.update_inv_w_uniform() -////// Wyatt's Ex-Commander Jumpsuit - RawrTaicho -/obj/item/clothing/under/fluff/wyatt_1 - - name = "ex-commander jumpsuit" - desc = "A standard Central Command Engineering Commander jumpsuit tailored to fight the wearer tightly. It has a Medal of Service pinned onto the left side of it." - icon = 'icons/obj/custom_items.dmi' - icon_state = "wyatt_uniform" - item_state = "wyatt_uniform" - _color = "wyatt_uniform" - //////////// Masks //////////// - -/* -/obj/item/clothing/mask/fluff/flagmask //searif: Tsiokeriio Tarbell - name = "\improper First Nations facemask" - desc = "A simple cloth rag that bears the flag of the first nations." - icon = 'icons/obj/custom_items.dmi' - icon_state = "flagmask" - item_state = "flagmask" - flags = MASKCOVERSMOUTH - w_class = 2 - gas_transfer_coefficient = 0.90 -*/ - -/obj/item/clothing/mask/mara_kilpatrick_1 //staghorn: Mara Kilpatrick - name = "shamrock pendant" - desc = "A silver and emerald shamrock pendant. It has the initials \"M.K.\" engraved on the back." - icon = 'icons/obj/custom_items.dmi' - icon_state = "mara_kilpatrick_1" - w_class = 1 - -////// Small locket - Altair An-Nasaqan - Serithi - -/obj/item/clothing/accessory/fluff/altair_locket - name = "small locket" - desc = "A small golden locket attached to an Ii'rka-reed string. Inside the locket is a holo-picture of a female Tajaran, and an inscription writtin in Siik'mas." - icon = 'icons/obj/custom_items.dmi' - icon_state = "altair_locket" - item_state = "altair_locket" - _color = "altair_locket" - slot_flags = 0 - w_class = 1 - slot_flags = SLOT_MASK - -////// Silver locket - Konaa Hirano - Konaa_Hirano - -/obj/item/clothing/accessory/fluff/konaa_hirano - name = "silver locket" - desc = "This oval shaped, argentium sterling silver locket hangs on an incredibly fine, refractive string, almost thin as hair and microweaved from links to a deceptive strength, of similar material. The edges are engraved very delicately with an elegant curving design, but overall the main is unmarked and smooth to the touch, leaving room for either remaining as a stolid piece or future alterations. There is an obvious internal place for a picture or lock of some sort, but even behind that is a very thin compartment unhinged with the pinch of a thumb and forefinger." - icon = 'icons/obj/custom_items.dmi' - icon_state = "konaahirano" - item_state = "konaahirano" - _color = "konaahirano" - slot_flags = 0 - w_class = 1 - slot_flags = SLOT_MASK - var/obj/item/held //Item inside locket. - -/obj/item/clothing/accessory/fluff/konaa_hirano/attack_self(mob/user as mob) - if(held) - user << "You open [src] and [held] falls out." - held.loc = get_turf(user) - src.held = null - -/obj/item/clothing/accessory/fluff/konaa_hirano/attackby(var/obj/item/O as obj, mob/user as mob, params) - if(istype(O,/obj/item/weapon/paper)) - if(held) - usr << "[src] already has something inside it." - else - usr << "You slip [O] into [src]." - user.drop_item() - O.loc = src - src.held = O - return - ..() - -////// Medallion - Nasir Khayyam - Jamini - -/obj/item/clothing/accessory/fluff/nasir_khayyam_1 - name = "medallion" - desc = "This silvered medallion bears the symbol of the Hadii Clan of the Tajaran." - icon = 'icons/obj/custom_items.dmi' - icon_state = "nasir_khayyam_1" - w_class = 1 - slot_flags = SLOT_MASK - - -////// Medallion - Lin Chang - Roland410 - -/obj/item/clothing/accessory/fluff/lin_chang_1 - name = "shining black medallion" - desc = "A shiny black medallion made of something that looks like the Earth's obsidian, but it is harder than anything ever seen yet. On the front there seems to be a standing unathi chiseled in it, on the back the name of Lin Chang with the title of the Assassin Archmage." - icon = 'icons/obj/custom_items.dmi' - icon_state = "nasir_khayyam_1" - w_class = 1 - slot_flags = SLOT_MASK - -////// Emerald necklace - Ty Foster - Nega - -/obj/item/clothing/mask/mara_kilpatrick_1 - name = "emerald necklace" - desc = "A brass necklace with a green emerald placed at the end. It has a small inscription on the top of the chain, saying \'Foster\'" - icon = 'icons/obj/custom_items.dmi' - icon_state = "ty_foster" - w_class = 1 - //////////// Shoes //////////// - -/obj/item/clothing/shoes/magboots/fluff/susan_harris_1 //sniperyeti: Susan Harris - name = "Susan's Magboots" - desc = "A colorful pair of magboots with the name Susan Harris clearly written on the back." - icon = 'icons/obj/custom_items.dmi' - icon_state = "atmosmagboots0" - //////////// Sets //////////// -/* -/obj/item/clothing/suit/storage/labcoat/fluff/cdc_labcoat - name = "\improper CDC labcoat" - desc = "A standard-issue CDC labcoat that protects against minor chemical spills. It has the name \"Wiles\" sewn on to the breast pocket." - icon = 'icons/obj/custom_items.dmi' - icon_state = "labcoat_cdc_open" -*/ ////// Short Sleeve Medical Outfit //erthilo: Farah Lants /obj/item/clothing/under/rank/medical/fluff/short @@ -939,29 +180,6 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "labcoat_red_open" -////// Retired Patrol Outfit //desiderium: Rook Maudlin - -/obj/item/clothing/suit/storage/det_suit/fluff/retpolcoat - name = "retired colony patrolman's coat" - desc = "A clean, black nylon windbreaker with the words \"OUTER LIGHT POLICE\" embroidered in gold-dyed thread on the back. \"RETIRED\" is tastefully embroidered below in a smaller font." - icon = 'icons/obj/custom_items.dmi' - icon_state = "retpolcoat" - item_state = "retpolcoat" - _color = "retpolcoat" - -/obj/item/clothing/head/det_hat/fluff/retpolcap - name = "retired colony patrolman's cap" - desc = "A clean and properly creased colony police cap. The badge is shined and polished, the word \"RETIRED\" engraved professionally under the words \"OUTER LIGHT POLICE.\"" - icon = 'icons/obj/custom_items.dmi' - icon_state = "retpolcap" - -/obj/item/clothing/under/det/fluff/retpoluniform - name = "retired colony patrolman's uniform" - desc = "A meticulously clean police uniform belonging to Precinct 31, Outer Light Colony. The word \"RETIRED\" is engraved tastefully and professionally in the badge below the number, 501." - icon = 'icons/obj/custom_items.dmi' - icon_state = "retpoluniform" - _color = "retpoluniform" - ////// Blue and Bloody Set //deimosvezzati: Hiro Mezu /obj/item/clothing/under/fluff/customblue // Personal jumpsuit (blue tie / belt buckle) @@ -1019,27 +237,4 @@ _color = "noble_boot" item_state = "noble_boot" - -//////////// Weapons //////////// - -///// Well-used baton - Oen'g Issek - Donofnyc3 - -/obj/item/weapon/melee/baton/fluff/oeng_baton - name = "well-used stun baton" - desc = "A stun baton used for incapacitating targets; there seems to be a bunch of tally marks set into the handle." - - - - - - - - - - - - - - - - +//////////// Weapons //////////// \ No newline at end of file diff --git a/code/modules/food/candy_maker.dm b/code/modules/food/candy_maker.dm index 269c2fcc33b..7e12fc327bf 100644 --- a/code/modules/food/candy_maker.dm +++ b/code/modules/food/candy_maker.dm @@ -33,7 +33,11 @@ if (!available_recipes) available_recipes = new for (var/type in (typesof(/datum/recipe/candy)-/datum/recipe/candy)) - available_recipes+= new type + var/datum/recipe/recipe = new type + if(recipe.result) // Ignore recipe subtypes that lack a result + available_recipes += recipe + else + del(recipe) acceptable_items = new acceptable_reagents = new for (var/datum/recipe/candy/recipe in available_recipes) diff --git a/code/modules/food/grill_new.dm b/code/modules/food/grill_new.dm index 6fcd5e3a31a..ee8bd4bf460 100644 --- a/code/modules/food/grill_new.dm +++ b/code/modules/food/grill_new.dm @@ -34,7 +34,11 @@ if (!available_recipes) available_recipes = new for (var/type in (typesof(/datum/recipe/grill)-/datum/recipe/grill)) - available_recipes+= new type + var/datum/recipe/recipe = new type + if(recipe.result) // Ignore recipe subtypes that lack a result + available_recipes += recipe + else + del(recipe) acceptable_items = new acceptable_reagents = new for (var/datum/recipe/grill/recipe in available_recipes) diff --git a/code/modules/food/oven_new.dm b/code/modules/food/oven_new.dm index 1b0c3559cf0..7d6022ae9ae 100644 --- a/code/modules/food/oven_new.dm +++ b/code/modules/food/oven_new.dm @@ -34,7 +34,11 @@ if (!available_recipes) available_recipes = new for (var/type in (typesof(/datum/recipe/oven)-/datum/recipe/oven)) - available_recipes+= new type + var/datum/recipe/recipe = new type + if(recipe.result) // Ignore recipe subtypes that lack a result + available_recipes += recipe + else + del(recipe) acceptable_items = new acceptable_reagents = new for (var/datum/recipe/oven/recipe in available_recipes) diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm index 5b7d706d3da..22a734b436a 100644 --- a/code/modules/lighting/light_source.dm +++ b/code/modules/lighting/light_source.dm @@ -51,7 +51,7 @@ destroyed = 1 force_update() if(source_atom && source_atom.light_sources) source_atom.light_sources -= src - if(top_atom) top_atom.light_sources -= src + if(top_atom && top_atom.light_sources) top_atom.light_sources -= src /datum/light_source/proc/update(atom/new_top_atom) if(new_top_atom && new_top_atom != top_atom) diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 9110619a4fa..efc19265e43 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -3,7 +3,7 @@ mouse_opacity = 0 simulated = 0 anchored = 1 - + flags = NOREACT icon = LIGHTING_ICON layer = LIGHTING_LAYER invisibility = INVISIBILITY_LIGHTING diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index d3e955d13c4..65e63b387de 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -422,7 +422,7 @@ playsound(src,'sound/weapons/resonator_blast.ogg',50,1) if(creator) for(var/mob/living/L in src.loc) - add_logs(creator, L, "used a resonator field on", object="resonator") + add_logs(L, creator, "used a resonator field on", object="resonator") L << "The [src.name] ruptured with you in it!" L.adjustBruteLoss(resonance_damage) else diff --git a/code/modules/mining/surprises/tg.dm b/code/modules/mining/surprises/tg.dm index 0fc8eb9dd65..7926e957240 100644 --- a/code/modules/mining/surprises/tg.dm +++ b/code/modules/mining/surprises/tg.dm @@ -82,7 +82,7 @@ /obj/item/weapon/storage/belt/soulstone=1, /obj/item/trash/candle=3, /obj/item/weapon/dice=3, - /obj/item/weapon/staff=2, + /obj/item/weapon/twohanded/staff=2, /obj/effect/decal/cleanable/dirt=3, ) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 3b9c98c4846..60b2c20636a 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -326,6 +326,26 @@ key = "0" syllables = list ("honk","squeak","bonk","toot","narf","zub","wee","wub","norf") +/datum/language/wryn + name = "Wryn Hivemind" + desc = "Wryn have the strange ability to commune over a psychic hivemind." + speech_verb = "chitters" + ask_verb = "chitters" + exclaim_verb = "chitters" + colour = "alien" + key = "y" + flags = RESTRICTED | HIVEMIND + +/datum/language/wryn/check_special_condition(var/mob/other) + + var/mob/living/carbon/M = other + if(!istype(M)) + return 1 + if(locate(/obj/item/organ/wryn/hivenode) in M.internal_organs) + return 1 + + return 0 + /datum/language/xenocommon name = "Xenomorph" colour = "alien" diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index ba9f1a30c7c..30ca1668054 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -151,7 +151,7 @@ "[M] [M.attacktext] [src]!") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) - add_logs(M, src, "attacked", admin=0) + add_logs(src, M, "attacked", admin=0) updatehealth() diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index e66554ba79a..8b2060cf554 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -22,6 +22,9 @@ var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm. attackby(var/obj/item/O as obj, var/mob/user as mob, params) + if(istype(O, /obj/item/organ/brain/crystal )) + user << " This brain is too malformed to be able to use with the [src]." + return if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO if(!O:brainmob) user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 49b448a9c6f..16028dde831 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -110,6 +110,14 @@ h_style = "Bald" ..(new_loc, "Golem") +/mob/living/carbon/human/wryn/New(var/new_loc) + h_style = "Antennae" + ..(new_loc, "Wryn") + +/mob/living/carbon/human/nucleation/New(var/new_loc) + h_style = "Nucleation Crystals" + ..(new_loc, "Nucleation") + /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) if ((!( yes ) || now_pushing)) return @@ -659,13 +667,16 @@ /mob/living/carbon/human/Topic(href, href_list) var/pickpocket = 0 + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + var/obj/item/clothing/gloves/G = H.gloves + if(G) + pickpocket = G.pickpocket + if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) // if looting pockets with gloves, do it quietly if(href_list["pockets"]) - if(usr:gloves) - var/obj/item/clothing/gloves/G = usr:gloves - pickpocket = G.pickpocket var/pocket_side = href_list["pockets"] var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store) var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store) @@ -704,9 +715,6 @@ if(href_list["item"]) var/itemTarget = href_list["item"] if(itemTarget == "id") - if(usr:gloves) - var/obj/item/clothing/gloves/G = usr:gloves - pickpocket = G.pickpocket if(pickpocket) var/obj/item/worn_id = src.wear_id var/obj/item/place_item = usr.get_active_hand() // Item to place in the pocket, if it's empty @@ -751,9 +759,6 @@ if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( ) - if(ishuman(usr) && usr:gloves) - var/obj/item/clothing/gloves/G = usr:gloves - pickpocket = G.pickpocket if(!pickpocket || href_list["item"] != "id") // Stop the non-stealthy verbose strip if pickpocketing id. O.source = usr O.target = src diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 39c02d350ca..159ab81ad44 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -55,6 +55,8 @@ var/datum/martial_art/attacker_style = M.martial_art + species.handle_attack_hand(src,M) + switch(M.a_intent) if("help") if(health >= config.health_threshold_crit) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index b7f1bea99a8..aeb0cd160c1 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -10,6 +10,8 @@ if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything + if(flying) return -1 + if(embedded_flag) handle_embedded_objects() //Moving with objects stuck in you can cause bad times. @@ -77,6 +79,11 @@ //Can we act if(restrained()) return 0 + //Are we flying? + if(flying) + inertia_dir = 0 + return 1 + //Do we have a working jetpack if(istype(back, /obj/item/weapon/tank/jetpack)) var/obj/item/weapon/tank/jetpack/J = back diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index dfc38cdd389..d8bcb331813 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -264,6 +264,16 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc gene.OnMobLife(src) if (radiation) + + if((locate(src.internal_organs_by_name["resonant crystal"]) in src.internal_organs)) + var/rads = radiation/25 + radiation -= rads + radiation -= 0.1 + reagents.add_reagent("radium", rads/10) + if( prob(10) ) + src << "\blue You feel relaxed." + return + if (radiation > 100) radiation = 100 if(!(species.flags & RAD_ABSORB)) @@ -276,7 +286,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc radiation = 0 else - if(species.flags & RAD_ABSORB) var/rads = radiation/25 radiation -= rads @@ -1034,6 +1043,14 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(jitteriness) do_jitter_animation(jitteriness) + //Flying + if(flying) + spawn() + animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING) + spawn(10) + if(flying) + animate(src, pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING) + //Other handle_statuses() diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm new file mode 100644 index 00000000000..a1beed27be9 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -0,0 +1,110 @@ +/datum/species/wryn + name = "Wryn" + icobase = 'icons/mob/human_races/r_wryn.dmi' + deform = 'icons/mob/human_races/r_wryn.dmi' + language = "Wryn Hivemind" + tail = "wryntail" + unarmed_type = /datum/unarmed_attack/punch/weak + primitive = /mob/living/carbon/monkey/wryn + darksight = 3 + slowdown = 1 + warning_low_pressure = -300 + hazard_low_pressure = 1 + blurb = "The wryn (r-in, singular r-in) are a humanoid race that possess many bee-like features. Originating from Alveare they \ + have adapted extremely well to cold environments though have lost most of their muscles over generations.\ + In order to communicate and work with multi-species crew Wryn were forced to take on names. Wryn have tended towards using only \ + first names, these names are generally simplistic and easy to pronounce. Wryn have rarely had to communicate using their mouths, \ + so in order to integrate with the multi-species crew they have been taught broken sol?." + + cold_level_1 = 200 //Default 260 - Lower is better + cold_level_2 = 150 //Default 200 + cold_level_3 = 115 //Default 120 + + heat_level_1 = 300 //Default 360 - Higher is better + heat_level_2 = 310 //Default 400 + heat_level_3 = 317 //Default 1000 + + body_temperature = 286 + + has_organ = list( + "heart" = /obj/item/organ/heart, + "brain" = /obj/item/organ/brain, + "eyes" = /obj/item/organ/eyes, + "appendix" = /obj/item/organ/appendix, + "antennae" = /obj/item/organ/wryn/hivenode + ) + + flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND + + + base_color = "#704300" + flesh_color = "#704300" + blood_color = "#FFFF99" + + +/datum/species/wryn/handle_death(var/mob/living/carbon/human/H) + for(var/mob/living/carbon/C in living_mob_list) + if(locate(/obj/item/organ/wryn/hivenode) in C.internal_organs) + C << "Your antennae tingle as you are overcome with pain..." + 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(H.handcuffed) + if(!(locate(H.internal_organs_by_name["antennae"]) in H.internal_organs)) return + var/turf/p_loc = M.loc + var/turf/p_loc_m = H.loc + + M.visible_message("[M] begins to violently pull off [H]'s antennae.") + H << "[M] grips your antennae and starts violently pulling!" + do_after(H, 250) + if(p_loc == M.loc && p_loc_m == H.loc) + del(H.internal_organs_by_name["antennae"]) + H.remove_language("Wryn Hivemind") + new /obj/item/organ/wryn/hivenode(M.loc) + M << "You hear a loud crunch as you mercilessly pull off [H]'s antennae." + H << "You hear a loud crunch as your antennae is ripped off your head by [M]." + H << "It's so quiet..." + H.h_style = "Bald" + H.update_hair() + + M.attack_log += text("\[[time_stamp()]\] removed antennae [H.name] ([H.ckey])") + H.attack_log += text("\[[time_stamp()]\] Has had their antennae removed by [M.name] ([M.ckey])") + msg_admin_attack("[key_name(M)] removed [key_name(H)]'s antennae") + return 0 + +/datum/species/nucleation + name = "Nucleation" + icobase = 'icons/mob/human_races/r_nucleation.dmi' + unarmed_type = /datum/unarmed_attack/punch + blurb = "A sub-race of unforunates who have been exposed to too much supermatter radiation. As a result, \ + supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \ + has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \ + negating the need for the individual to breath. Their massive change in biology, however, renders most medicines \ + obselete. Ionizing radiation seems to cause resonance in some of their crystals, which seems to encourage regeneration \ + and produces a calming effect on the individual. Nucleations are highly stigmatized, and are treated much in the same \ + way as lepers were back on Earth." + language = "Sol Common" + burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores + brute_mod = 2 // damn, double wham, double dam + flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN + + has_organ = list( + "heart" = /obj/item/organ/heart, + "crystalized brain" = /obj/item/organ/brain/crystal, + "eyes" = /obj/item/organ/eyes/luminescent_crystal, + "strange crystal" = /obj/item/organ/nucleation/strange_crystal, + "resonant crystal" = /obj/item/organ/nucleation/resonant_crystal + ) + +/datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H) + H.light_color = "#1C1C00" + H.set_light(2) + return ..() + +/datum/species/nucleation/handle_death(var/mob/living/carbon/human/H) + var/turf/T = get_turf(H) + H.visible_message("\red[H]'s body explodes, leaving behind a pile of microscopic crystals!") + supermatter_delamination(T, 2, 0, 0) // Create a small supermatter burst upon death + new /obj/item/weapon/shard/supermatter( T ) + del(H) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index b07e9e0c5a2..4375800af54 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -38,6 +38,13 @@ icon_state = "stokkey1" uni_append = list(0x044,0xC5D) // 044C5D +/mob/living/carbon/monkey/wryn + name = "lajavi" + voice_name = "lajavi" + speak_emote = list("hisses") + icon_state = "wrynkey1" + uni_append = list(0x022,0xF5D) // 022F5D + /mob/living/carbon/monkey/New() var/datum/reagents/R = new/datum/reagents(330) reagents = R diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 69c7979e62c..a230ad2f7e5 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -301,6 +301,8 @@ /datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). return +/datum/species/proc/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) //Handles any species-specific attackhand events. + return /datum/species/proc/say_filter(mob/M, message, datum/language/speaking) return message @@ -745,6 +747,10 @@ /datum/unarmed_attack/punch attack_verb = list("punch") +/datum/unarmed_attack/punch/weak + attack_verb = list("flail") + damage = 1 + /datum/unarmed_attack/diona attack_verb = list("lash", "bludgeon") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index dc13dd161bf..216ac7c9a2c 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -362,7 +362,7 @@ user << "You already grabbed [src]." return - add_logs(user, src, "grabbed", addition="passively") + add_logs(src, user, "grabbed", addition="passively") var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src) if(buckled) diff --git a/code/modules/mob/living/silicon/ai/nano.dm b/code/modules/mob/living/silicon/ai/nano.dm index f9bb7a25d79..588849116ce 100644 --- a/code/modules/mob/living/silicon/ai/nano.dm +++ b/code/modules/mob/living/silicon/ai/nano.dm @@ -1,4 +1,5 @@ -var/obj/nano_module/crew_monitor/crew_monitor +/mob/living/silicon/ai + var/obj/nano_module/crew_monitor/crew_monitor /mob/living/silicon/ai/proc/init_subsystems() crew_monitor = new(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index fdef89d6865..ae26734975f 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -457,8 +457,9 @@ if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.") src.stop_pulling() - src.client.perspective = EYE_PERSPECTIVE - src.client.eye = card + if(src.client) + src.client.perspective = EYE_PERSPECTIVE + src.client.eye = card //This seems redundant but not including the forced loc setting messes the behavior up. src.loc = card diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6c8d2762690..583075472e0 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -102,6 +102,7 @@ var/drowsyness = 0.0//Carbon var/dizziness = 0//Carbon var/jitteriness = 0//Carbon + var/flying = 0 var/charges = 0.0 var/nutrition = 400.0//Carbon diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7f2ba03f150..ee033e91935 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -429,13 +429,14 @@ var/list/intents = list("help","disarm","grab","harm") src << "\blue You are now [resting ? "resting" : "getting up"]" /proc/get_multitool(mob/user as mob) - // Check distance for those that need it. - if(!isAI(user)) - if(!in_range(user, src)) - return null - // Get tool - var/obj/item/device/multitool/P = user.get_multitool() + var/obj/item/device/multitool/P + if(isrobot(user) || ishuman(user)) + P = user.get_active_hand() + else if(isAI(user)) + var/mob/living/silicon/ai/AI=user + P = AI.aiMulti + if(!istype(P)) return null return P diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 45627bc7d9b..6ba963c5f1b 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -689,6 +689,51 @@ icon_state = "vox_keetquills" species_allowed = list("Vox") +// Apollo-specific + + //Wryn antennae + + wry_antennae_default + name = "Antennae" + icon_state = "wryn_antennae" + species_allowed = list("Wryn") + + //Nucleation "hairstyles" + + nuc_crystals + name = "Nucleation Crystals" + icon_state = "nuc_crystal" + species_allowed = list("Nucleation") + + nuc_betaburns + name = "Nucleation Beta Burns" + icon_state = "nuc_betaburns" + species_allowed = list("Nucleation") + + nuc_fallout + name = "Nucleation Fallout" + icon_state = "nuc_fallout" + species_allowed = list("Nucleation") + + nuc_frission + name = "Nucleation Frission" + icon_state = "nuc_frission" + species_allowed = list("Nucleation") + + nuc_radical + name = "Nucleation Free Radical" + icon_state = "nuc_radical" + species_allowed = list("Nucleation") + + nuc_gammaray + name = "Nucleation Gamma Ray" + icon_state = "nuc_gammaray" + species_allowed = list("Nucleation") + + nuc_neutron + name = "Nucleation Neutron Bomb" + icon_state = "nuc_neutron" + species_allowed = list("Nucleation") /datum/sprite_accessory/facial_hair diff --git a/code/modules/nano/JSON Reader.dm b/code/modules/nano/JSON Reader.dm index a908eadd7c5..41d218cb43d 100644 --- a/code/modules/nano/JSON Reader.dm +++ b/code/modules/nano/JSON Reader.dm @@ -26,7 +26,7 @@ json_reader src.json = json . = new/list() src.i = 1 - while(src.i <= lentext(json)) + while(src.i <= length(json)) var/char = get_char() if(is_whitespace(char)) i++ @@ -44,7 +44,7 @@ json_reader read_word() var/val = "" - while(i <= lentext(json)) + while(i <= length(json)) var/char = get_char() if(is_whitespace(char) || symbols.Find(char)) i-- // let scanner handle this character @@ -56,7 +56,7 @@ json_reader var escape = FALSE val = "" - while(++i <= lentext(json)) + while(++i <= length(json)) var/char = get_char() if(escape) escape=FALSE // WHICH STUPID ASSHOLE FORGOT THIS - N3X @@ -101,6 +101,13 @@ json_reader return 48 <= c && c <= 57 || char == "+" || char == "-" + // parser + ReadArray(list/tokens) + src.tokens = tokens + i = 1 + return read_array() + + // parser ReadObject(list/tokens) src.tokens = tokens diff --git a/code/modules/nano/_JSON.dm b/code/modules/nano/_JSON.dm index 4f70e6e664a..554b21dafa3 100644 --- a/code/modules/nano/_JSON.dm +++ b/code/modules/nano/_JSON.dm @@ -5,8 +5,19 @@ n_Json v11.3.21 proc json2list(json) var/static/json_reader/_jsonr = new() - return _jsonr.ReadObject(_jsonr.ScanJson(json)) + // N3X: Array support. + if(dd_hasprefix(json,"\[")) + return _jsonr.ReadArray(_jsonr.ScanJson(json)) + else + return _jsonr.ReadObject(_jsonr.ScanJson(json)) list2json(list/L, var/cached_data = null) var/static/json_writer/_jsonw = new() - return _jsonw.WriteObject(L, cached_data) + // Detect if it's just a list of things, or an associative list + // (Used to just assume associative, which broke things.) + if(_jsonw.is_associative(L)) + return _jsonw.WriteObject(L, cached_data) + else + return _jsonw.write_array(L) + + diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 6b0a26b2520..064211d30b5 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -77,10 +77,11 @@ var/list/organ_cache = list() owner = null if(!owner) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list - if(B && prob(40)) - reagents.remove_reagent("blood",0.1) - blood_splatter(src,B,1) + if(reagents) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list + if(B && prob(40)) + reagents.remove_reagent("blood",0.1) + blood_splatter(src,B,1) if(prob(5)) //How about we not have organs become completely useless less than a minute after removal? damage += 1 diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 89d17f6ced4..28d5dd2fb98 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -336,3 +336,51 @@ name = "vox cortical stack" /obj/item/organ/stack/vox/stack + + +//WRYN ORGAN + +/obj/item/organ/wryn/hivenode + name = "antennae" + parent_organ = "head" + +/obj/item/organ/wryn/hivenode + name = "antennae" + organ_tag = "antennae" + icon = 'icons/mob/human_races/r_wryn.dmi' + icon_state = "antennae" + + +//NUCLEATION ORGAN + +/obj/item/organ/nucleation + name = "nucleation organ" + icon = 'icons/obj/surgery.dmi' + desc = "A crystalized human organ. /red It has a strangely iridescent glow." + +/obj/item/organ/nucleation/resonant_crystal + name = "resonant crystal" + icon_state = "resonant-crystal" + organ_tag = "resonant crystal" + parent_organ = "head" + +/obj/item/organ/nucleation/strange_crystal + name = "strange crystal" + icon_state = "strange-crystal" + organ_tag = "strange crystal" + parent_organ = "chest" + +/obj/item/organ/eyes/luminescent_crystal + name = "luminescent eyes" + icon_state = "crystal-eyes" + organ_tag = "luminescent eyes" + light_color = "#1C1C00" + parent_organ = "head" + + New() + set_light(2) + +/obj/item/organ/brain/crystal + name = "crystalized brain" + icon_state = "crystal-brain" + organ_tag = "crystalized brain" \ No newline at end of file diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 709fc2f9b07..3b20fcc2cb5 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -47,6 +47,21 @@ icon_state = "pen" colour = "white" +/obj/item/weapon/pen/multi //spaceman96: Trenna Seber + name = "multicolor pen" + desc = "It's a cool looking pen. Lots of colors!" + +/obj/item/weapon/pen/fancy + name = "fancy pen" + desc = "A fancy metal pen. It uses blue ink. An inscription on one side reads,\"L.L. - L.R.\"" + icon = 'icons/obj/custom_items.dmi' + icon_state = "fancypen" + +/obj/item/weapon/pen/gold + name = "Gilded Pen" + desc = "A golden pen that is gilded with a meager amount of gold material. The word 'Nanotrasen' is etched on the clip of the pen." + icon = 'icons/obj/custom_items.dmi' + icon_state = "eugene_pen" /obj/item/weapon/pen/attack(mob/living/M, mob/user) if(!istype(M)) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 8d652c24100..8c93a7c223f 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -21,6 +21,17 @@ var/state = 0 var/locked = 0 + var/frequency = 0 + var/id_tag = null + var/datum/radio_frequency/radio_connection + + //Radio remote control +/obj/machinery/power/emitter/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + /obj/machinery/power/emitter/verb/rotate() set name = "Rotate" @@ -38,6 +49,41 @@ if(state == 2 && anchored) connect_to_network() src.directwired = 1 + if(frequency) + set_frequency(frequency) +/obj/machinery/power/emitter/multitool_menu(var/mob/user,var/obj/item/device/multitool/P) + return {" + + "} + +/obj/machinery/power/emitter/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id_tag)) + return 0 + + var/on=0 + switch(signal.data["command"]) + if("on") + on=1 + + if("off") + on=0 + + if("set") + on = signal.data["state"] > 0 + + if("toggle") + on = !active + + if(anchored && state == 2 && on != active) + active=on + var/statestr=on?"on":"off" + // Spammy message_admins("Emitter turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) in [formatJumpTo(src)]",0,1) + log_game("Emitter turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) in ([x],[y],[z]) AAC prints: [list2text(signal.data["hiddenprints"])]") + investigate_log("turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) AAC prints: [list2text(signal.data["hiddenprints"])]","singulo") + update_icon() /obj/machinery/power/emitter/Destroy() msg_admin_attack("Emitter deleted at ([x],[y],[z] - JMP)",0,1) @@ -145,6 +191,9 @@ /obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 if(istype(W, /obj/item/weapon/wrench)) if(active) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index e0064fec12e..594116bb805 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -488,7 +488,7 @@ datum R.holder = src R.volume = amount // SetViruses(R, data) // Includes setting data - R.data = data + if(data) R.data = data //debug //world << "Adding data" //for(var/D in R.data) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index bac4521f8ed..a4f712ba524 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -106,7 +106,7 @@ datum/reagent/charcoal id = "charcoal" description = "Activated charcoal helps to absorb toxins." reagent_state = LIQUID - color = "#C8A5DC" + color = "#000000" datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 8034ef5a956..22b2afbe0ca 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -372,3 +372,30 @@ desc = "A cup with the british flag emblazoned on it." icon_state = "britcup" volume = 30 + +/obj/item/weapon/reagent_containers/food/drinks/flask/hand_made + name = "handmade flask" + desc = "A wooden flask with a silver lid and bottom. It has a matte, dark blue paint on it with the initials \"W.H.\" etched in black." + icon = 'icons/obj/custom_items.dmi' + icon_state = "williamhackett" + +/obj/item/weapon/reagent_containers/food/drinks/flask/thermos + name = "vintage thermos" + desc = "An older thermos with a faint shine." + icon = 'icons/obj/custom_items.dmi' + icon_state = "johann_erzatz_1" + volume = 50 + +/obj/item/weapon/reagent_containers/food/drinks/flask/shiny + name = "shiny flask" + desc = "A shiny metal flask. It appears to have a Greek symbol inscribed on it." + icon = 'icons/obj/custom_items.dmi' + icon_state = "shinyflask" + volume = 50 + +/obj/item/weapon/reagent_containers/food/drinks/flask/lithium + name = "Lithium Flask" + desc = "A flask with a Lithium Atom symbol on it." + icon = 'icons/obj/custom_items.dmi' + icon_state = "lithiumflask" + volume = 50 \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 96b6797000d..87e413565a7 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -60,4 +60,3 @@ other types of metals and chemistry for reagents). new_reliability = Clamp(new_reliability, reliability, 100) reliability = new_reliability return - \ No newline at end of file diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index cfbb5c8002f..cb1f976ea13 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -340,4 +340,31 @@ build_type = IMPRINTER materials = list("$glass" = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/teleporter - category = list("Computer Boards") \ No newline at end of file + category = list("Computer Boards") + +datum/design/GAC + name = "Circuit Design (General Air Control)" + desc = "Allows for the construction of circuit boards used to build a General Air Control Computer." + id = "GAC" + req_tech = list("programming" = 3, "magnets" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = "/obj/item/weapon/circtuiboard/air_management" + +datum/design/tank_control + name = "Circuit Design (Large Tank Control)" + desc = "Allows for the construction of circuit boards used to build a Large Tank Control Computer." + id = "tankcontrol" + req_tech = list("programming" = 3, "magnets" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = "/obj/item/weapon/circtuiboard/general_air_control/large_tank_control" + +datum/design/AAC + name = "Circuit Design (Atmospheric Automations Console)" + desc = "Allows for the construction of circuit boards used to build an Atmospheric Autmations Console." + id = "AAC" + req_tech = list("programming" = 4, "magnets" = 2) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = "/obj/item/weapon/circtuiboard/general_air_control/atmos_automation" diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 02fc7f371f5..f9cb57a852d 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -34,7 +34,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole name = "R&D Console" icon_state = "rdcomp" - light_color = "#a97faa" + light_color = LIGHT_COLOR_FADEDPURPLE circuit = /obj/item/weapon/circuitboard/rdconsole var/datum/research/files //Stores all the collected research data. var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk. diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index ac693cf293d..b8ef753c4ac 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -181,7 +181,7 @@ /obj/machinery/computer/rdservercontrol name = "R&D Server Controller" icon_state = "rdcomp" - light_color = "#a96faa" + light_color = LIGHT_COLOR_FADEDPURPLE circuit = /obj/item/weapon/circuitboard/rdservercontrol var/screen = 0 var/obj/machinery/r_n_d/server/temp_server diff --git a/code/modules/shuttles/whiteship.dm b/code/modules/shuttles/whiteship.dm index 2a27c2d2c90..938f2926869 100644 --- a/code/modules/shuttles/whiteship.dm +++ b/code/modules/shuttles/whiteship.dm @@ -3,7 +3,7 @@ req_access = list() shuttle_tag = "White Ship" circuit = "/obj/item/weapon/circuitboard/white_ship" - light_color = "#CC0000" + light_color = LIGHT_COLOR_DARKRED /obj/machinery/computer/shuttle_control/multi/whiteship/attack_ai(user as mob) user << "\red Access Denied." diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index a1844d19760..7d8a81ad3ef 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -1,23 +1,35 @@ -#define NITROGEN_RETARDATION_FACTOR 4 //Higher == N2 slows reaction more -#define THERMAL_RELEASE_MODIFIER 750 //Higher == more heat released during reaction -#define PLASMA_RELEASE_MODIFIER 1500 //Higher == less plasma released by reaction -#define OXYGEN_RELEASE_MODIFIER 1500 //Higher == less oxygen released at high temperature/power -#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power +#define NITROGEN_RETARDATION_FACTOR 0.15 //Higher == N2 slows reaction more +#define THERMAL_RELEASE_MODIFIER 750 //Higher == more heat released during reaction +#define PLASMA_RELEASE_MODIFIER 1500 //Higher == less plasma released by reaction +#define OXYGEN_RELEASE_MODIFIER 1500 //Higher == less oxygen released at high temperature/power +#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power + +/* + How to tweak the SM + + POWER_FACTOR directly controls how much power the SM puts out at a given level of excitation (power var). Making this lower means you have to work the SM harder to get the same amount of power. + CRITICAL_TEMPERATURE The temperature at which the SM starts taking damage. + + CHARGING_FACTOR Controls how much emitter shots excite the SM. + DAMAGE_RATE_LIMIT Controls the maximum rate at which the SM will take damage due to high temperatures. +*/ //Controls how much power is produced by each collector in range - this is the main parameter for tweaking SM balance, as it basically controls how the power variable relates to the rest of the game. -#define POWER_FACTOR 0.35 //Obtained from testing. Aiming to make the ideal running output (600 kW) run the SM to ~85% of the safety level. - -#define CHARGING_FACTOR 0.55 -#define DAMAGE_RATE_LIMIT 5 //damage rate cap at power = 900, scales linearly with power +#define POWER_FACTOR 1.0 +#define DECAY_FACTOR 700 //Affects how fast the supermatter power decays +#define CRITICAL_TEMPERATURE 800 //K +#define CHARGING_FACTOR 0.05 +#define DAMAGE_RATE_LIMIT 3 //damage rate cap at power = 300, scales linearly with power //These would be what you would get at point blank, decreases with distance #define DETONATION_RADS 200 #define DETONATION_HALLUCINATION 600 +#define TRANSFORM_DISTANCE_MOD 2 // Size/this is maximum distance from SM during burst for transformation to Nucleation -#define WARNING_DELAY 30 //seconds between warnings. +#define WARNING_DELAY 30 //seconds between warnings. /obj/machinery/power/supermatter name = "Supermatter" @@ -35,6 +47,7 @@ var/damage = 0 var/damage_archived = 0 var/safe_alert = "Crystaline hyperstructure returning to safe operating levels." + var/safe_warned = 0 var/warning_point = 100 var/warning_alert = "Danger! Crystal hyperstructure instability!" var/emergency_point = 700 @@ -47,15 +60,20 @@ var/grav_pulling = 0 var/pull_radius = 14 + // Time in ticks between delamination ('exploding') and exploding (as in the actual boom) + var/pull_time = 100 + var/explosion_power = 8 var/emergency_issued = 0 - var/explosion_power = 8 + // Time in 1/10th of seconds since the last sent warning + var/lastwarning = 0 + + // This stops spawning redundand explosions. Also incidentally makes supermatter unexplodable if set to 1. + var/exploded = 0 - var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning var/power = 0 - - var/oxygen = 0 // Moving this up here for easier debugging. + var/oxygen = 0 //Temporary values so that we can optimize this //How much the bullets damage should be multiplied by when it is added to the internal variables @@ -67,21 +85,7 @@ var/obj/item/device/radio/radio - shard //Small subtype, less efficient and more sensitive, but less boom. - name = "Supermatter Shard" - desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. \red You get headaches just from looking at it." - icon_state = "darkmatter_shard" - base_icon_state = "darkmatter_shard" - - warning_point = 50 - emergency_point = 500 - explosion_point = 900 - - gasefficency = 0.125 - - pull_radius = 5 - explosion_power = 3 //3,6,9,12? Or is that too small? - + var/debug = 0 /obj/machinery/power/supermatter/New() . = ..() @@ -93,17 +97,46 @@ . = ..() /obj/machinery/power/supermatter/proc/explode() + message_admins("Supermatter exploded at ([x],[y],[z] - JMP)",0,1) + log_game("Supermatter exploded at ([x],[y],[z])") anchored = 1 grav_pulling = 1 - spawn(100) - explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) + exploded = 1 + spawn(pull_time) + var/turf/epicenter = get_turf(src) + explosion(epicenter, explosion_power, explosion_power*2, explosion_power*3, explosion_power*4, 1) + supermatter_delamination( epicenter, explosion_power*4, 1 ) del src return -//Changes color and luminosity of the light to these values if they were not already set +//Changes color and light_range of the light to these values if they were not already set /obj/machinery/power/supermatter/proc/shift_light(var/lum, var/clr) - if(lum != light_range || clr != light_color) - set_light(lum, l_color = clr) + if(light_color != clr) + light_color = clr + if(light_range != lum) + set_light(lum) + +/obj/machinery/power/supermatter/proc/announce_warning() + var/integrity = damage / explosion_point + integrity = round(100 - integrity * 100) + integrity = integrity < 0 ? 0 : integrity + var/alert_msg = " Integrity at [integrity]%" + + if(damage > emergency_point) + alert_msg = emergency_alert + alert_msg + lastwarning = world.timeofday - WARNING_DELAY * 4 + else if(damage >= damage_archived) // The damage is still going up + safe_warned = 0 + alert_msg = warning_alert + alert_msg + lastwarning = world.timeofday + else if(!safe_warned) + safe_warned = 1 // We are safe, warn only once + alert_msg = safe_alert + lastwarning = world.timeofday + else + alert_msg = null + if(alert_msg) + radio.autosay(alert_msg, "Supermatter Monitor") /obj/machinery/power/supermatter/process() @@ -115,105 +148,85 @@ if(!istype(L)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now. return //Yeah just stop. - if(istype(L, /turf/space)) // Stop processing this stuff if we've been ejected. - return - - if(damage > warning_point) // while the core is still damaged and it's still worth noting its status - - shift_light(5, warning_color) - if((world.timeofday - lastwarning) / 10 >= WARNING_DELAY) - var/stability = num2text(round((damage / explosion_point) * 100)) - - if(damage > emergency_point) - shift_light(7, emergency_color) - radio.autosay(addtext(emergency_alert, " Instability: ",stability,"%"), "Supermatter Monitor") - lastwarning = world.timeofday - - else if(damage >= damage_archived) // The damage is still going up - radio.autosay(addtext(warning_alert," Instability: ",stability,"%"), "Supermatter Monitor") - lastwarning = world.timeofday - 150 - - else // Phew, we're safe - radio.autosay(safe_alert, "Supermatter Monitor") - lastwarning = world.timeofday - - if(damage > explosion_point) - for(var/mob/living/mob in living_mob_list) - if(loc.z == mob.loc.z) - if(istype(mob, /mob/living/carbon/human)) - //Hilariously enough, running into a closet should make you get hit the hardest. - var/mob/living/carbon/human/H = mob - H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) - var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) - + if(damage > explosion_point) + if(!exploded) + if(!istype(L, /turf/space)) + announce_warning() explode() + else if(damage > warning_point) // while the core is still damaged and it's still worth noting its status + shift_light(5, warning_color) + if(damage > emergency_point) + shift_light(7, emergency_color) + if(!istype(L, /turf/space) && (world.timeofday - lastwarning) >= WARNING_DELAY * 10) + announce_warning() else shift_light(4,initial(light_color)) if(grav_pulling) supermatter_pull() - //Ok, get the air from the turf - var/datum/gas_mixture/env = L.return_air() + //Ok, get the air from the turf + var/datum/gas_mixture/removed = null + var/datum/gas_mixture/env = null - //Remove gas from surrounding area - var/datum/gas_mixture/removed = env.remove(gasefficency * env.total_moles()) + //ensure that damage doesn't increase too quickly due to super high temperatures resulting from no coolant, for example. We dont want the SM exploding before anyone can react. + //We want the cap to scale linearly with power (and explosion_point). Let's aim for a cap of 5 at power = 300 (based on testing, equals roughly 5% per SM alert announcement). + var/damage_inc_limit = (power/300)*(explosion_point/1000)*DAMAGE_RATE_LIMIT - if(!removed || !removed.total_moles()) - damage += max((power-1600)/10, 0) - power = min(power, 1600) - return 1 + if(!istype(L, /turf/space)) + env = L.return_air() + removed = env.remove(gasefficency * env.total_moles()) //Remove gas from surrounding area - damage_archived = damage - damage = max( damage + ( (removed.temperature - 800) / 150 ) , 0 ) - //Ok, 100% oxygen atmosphere = best reaction - //Maxes out at 100% oxygen pressure - oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0) - - var/temp_factor = 50 - - if(oxygen > 0.8) - // with a perfect gas mix, make the power less based on heat - icon_state = "[base_icon_state]_glow" + if(!env || !removed || !removed.total_moles()) + damage += max((power - 15*POWER_FACTOR)/10, 0) + else if (grav_pulling) //If supermatter is detonating, remove all air from the zone + env.remove(env.total_moles()) else - // in normal mode, base the produced energy around the heat - temp_factor = 30 - icon_state = base_icon_state + damage_archived = damage - power = max( (removed.temperature * temp_factor / T0C) * oxygen + power, 0) //Total laser power plus an overload + damage = max( damage + min( ( (removed.temperature - CRITICAL_TEMPERATURE) / 150 ), damage_inc_limit ) , 0 ) + //Ok, 100% oxygen atmosphere = best reaction + //Maxes out at 100% oxygen pressure + oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / removed.total_moles(), 1), 0) - //We've generated power, now let's transfer it to the collectors for storing/usage - transfer_energy() + //calculate power gain for oxygen reaction + var/temp_factor + var/equilibrium_power + if (oxygen > 0.8) + //If chain reacting at oxygen == 1, we want the power at 800 K to stabilize at a power level of 400 + equilibrium_power = 400 + icon_state = "[base_icon_state]_glow" + else + //If chain reacting at oxygen == 1, we want the power at 800 K to stabilize at a power level of 250 + equilibrium_power = 250 + icon_state = base_icon_state - var/device_energy = power * REACTION_POWER_MODIFIER + temp_factor = ( (equilibrium_power/DECAY_FACTOR)**3 )/800 + power = max( (removed.temperature * temp_factor) * oxygen + power, 0) - //To figure out how much temperature to add each tick, consider that at one atmosphere's worth - //of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature - //that the device energy is around 2140. At that stage, we don't want too much heat to be put out - //Since the core is effectively "cold" + //We've generated power, now let's transfer it to the collectors for storing/usage + transfer_energy() - //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock - //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. - removed.temperature += (device_energy / THERMAL_RELEASE_MODIFIER) + var/device_energy = power * REACTION_POWER_MODIFIER - removed.temperature = max(0, min(removed.temperature, 2500)) - //Calculate how much gas to release - removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0) + //Calculate how much gas to release + removed.toxins += max(device_energy / PLASMA_RELEASE_MODIFIER, 0) - removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0) + removed.oxygen += max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0) - env.merge(removed) + env.merge(removed) - for(var/mob/living/carbon/human/l in view(src, min(7, round(power ** 0.25)))) // If they can see it without mesons on. Bad on them. + + for(var/mob/living/carbon/human/l in view(src, min(7, round(sqrt(power/6))))) // If they can see it without mesons on. Bad on them. if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) - l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1, get_dist(l, src)) ) ) ) + l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) - for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) - var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) ) - l.apply_effect(irradiate=rads) + //adjusted range so that a power of 300 (pretty high) results in 8 tiles, roughly the distance from the core to the engine monitoring room. + for(var/mob/living/l in range(src, round(sqrt(power / 5)))) + var/rads = (power / 10) * sqrt( 1 / get_dist(l, src) ) + l.apply_effect(rads, IRRADIATE) - power -= (power/500)**3 + power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation return 1 @@ -225,17 +238,12 @@ // Then bring it inside to explode instantly upon landing on a valid turf. - if(Proj.flag != "bullet") - power += Proj.damage * config_bullet_energy * CHARGING_FACTOR + if(istype(Proj, /obj/item/projectile/beam)) + power += Proj.damage * config_bullet_energy * CHARGING_FACTOR / POWER_FACTOR else damage += Proj.damage * config_bullet_energy return 0 - -/obj/machinery/power/supermatter/attack_paw(mob/user as mob) - return attack_hand(user) - - /obj/machinery/power/supermatter/attack_robot(mob/user as mob) if(Adjacent(user)) return attack_hand(user) @@ -247,6 +255,9 @@ user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update." /obj/machinery/power/supermatter/attack_hand(mob/user as mob) + if(istype(user,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this + return + user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\ "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") @@ -255,11 +266,13 @@ /obj/machinery/power/supermatter/proc/transfer_energy() for(var/obj/machinery/power/rad_collector/R in rad_collectors) - if(get_dist(R, src) <= 15) // Better than using orange() every process - R.receive_pulse(power * POWER_FACTOR) + var/distance = get_dist(R, src) + if(distance <= 15) + //for collectors using standard plasma tanks at 1013 kPa, the actual power generated will be this power*POWER_FACTOR*20*29 = power*POWER_FACTOR*580 + R.receive_pulse(power * POWER_FACTOR * (min(3/distance, 1))**2) return -/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params) +/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/carbon/user as mob) user.visible_message("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\ "You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ "Everything suddenly goes silent.") @@ -272,6 +285,8 @@ /obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj) if(istype(AM, /mob/living)) + if(istype(AM,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this + return AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") @@ -283,6 +298,9 @@ /obj/machinery/power/supermatter/proc/Consume(var/mob/living/user) + if(istype(user,/mob/living/carbon/human/nucleation)) // Nucleation's biology doesn't react to this + return + if(istype(user)) user.dust() power += 200 @@ -299,11 +317,10 @@ else l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) ) - l.apply_effect(rads, IRRADIATE, 0) // Permit blocking + l.apply_effect(rads, IRRADIATE) /obj/machinery/power/supermatter/proc/supermatter_pull() - //following is adapted from singulo code if(defer_powernet_rebuild != 2) defer_powernet_rebuild = 1 @@ -335,4 +352,110 @@ if(defer_powernet_rebuild != 2) defer_powernet_rebuild = 0 - return \ No newline at end of file + return + + +proc/supermatter_delamination(var/turf/epicenter, var/size, var/transform_mobs = 0, var/adminlog = 1) + spawn(0) + var/start = world.timeofday + epicenter = get_turf(epicenter) + if(!epicenter) return + + if(adminlog) + message_admins("Supermatter delamination with size ([size]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z] - JMP)") + log_game("Supermatter delamination with size ([size]) in area [epicenter.loc.name] ") + + playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(size*2,1) ) + playsound(epicenter, "explosion", 100, 1, round(size,1) ) + + if(defer_powernet_rebuild != 2) + defer_powernet_rebuild = 1 + + var/x = epicenter.x + var/y = epicenter.y + var/z = epicenter.z + + epicenter.ChangeTurf( /turf/simulated/floor/plating/smatter ) + + for(var/mob/living/mob in orange( epicenter, size*2 )) // Irradiate area twice the size of the main blast + if(epicenter.z == mob.loc.z) + if( ishuman(mob) ) + //Hilariously enough, running into a closet should make you get hit the hardest. + var/mob/living/carbon/human/H = mob + H.hallucination += max(50, min(size*10, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, epicenter) + 1)) ) ) + var/rads = size*10 * sqrt( 1 / (get_dist(mob, epicenter) + 1) ) + mob.apply_effect(rads, IRRADIATE) + + for(var/i=0, i