diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index d6bc561771b..02ea1f45638 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -3373,7 +3373,7 @@ "bmS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bmT" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge) "bmU" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -4},/obj/item/device/camera{pixel_y = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (Captain)"; pixel_x = -28},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) -"bmV" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) +"bmV" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/reagent_containers/food/drinks/flask/gold,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bmW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bmX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bmY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 5a371c50a06..500720c279f 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -341,6 +341,7 @@ "gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) "gD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft) "gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/shotgun/toy/tommygun,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) +"gF" = (/obj/structure/window/reinforced,/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/academy/academyaft) "gG" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms) "gH" = (/obj/structure/window/reinforced,/obj/item/ammo_casing,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms) "gI" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) @@ -482,7 +483,6 @@ "jo" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/academy/academyaft) "jp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel/airless{tag = "icon-white (EAST)"; icon_state = "white"; dir = 4},/area/awaymission/academy/academyaft) "jq" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/awaymission/academy/academyaft) -"jr" = (/obj/structure/window/reinforced,/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/golden_cup,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/academy/academyaft) "js" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/awaymission/academy/academyaft) "jt" = (/obj/structure/cult/pylon,/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 10},/area/awaymission/academy/academyaft) "ju" = (/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/academy/academyaft) @@ -633,7 +633,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaSaSaaaaaaaaaaaaaaaaaagZiViWiWiXgZaaaaaaiYhDiZjafLfCfDfDfDfDfDfDfDfDfDfLjbjcjdjeaaaaaagZiViWiWiXgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZjfjgjafLjhfBfBjifBfBjifBfBjjfLjbjkjlgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYhDjmjafLfCfDjnhlkxhlhljofDfDfLjbjpjdjqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZjrjsjafLfCfDjtjujujujujvfDfDfLjbjwjxgZjyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgFjsjafLfCfDjtjujujujujvfDfDfLjbjwjxgZjyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjzjafLfCjAfDfDfDfDfDfDjAfDfLjbjzgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjBfLjCetjDfDfDfDfDjEetjDfLjBgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZfLjFjGgCgDfDfDfDfDjHfDfLgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -672,3 +672,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index 9def97f64f2..2cc70f5d3ee 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -145,6 +145,7 @@ "cO" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar) "cP" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar) "cQ" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar) +"cR" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general) "cS" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar) "cT" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/awaymission/centcomAway/hangar) "cU" = (/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar) @@ -250,6 +251,7 @@ "eQ" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general) "eR" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general) "eS" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general) +"eT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/drinks/ice,/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome) "eU" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general) "eV" = (/obj/structure/table/reinforced,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general) "eW" = (/obj/machinery/implantchair,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general) @@ -594,7 +596,6 @@ "lx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general) "ly" = (/obj/structure/table/woodentable,/obj/item/clothing/accessory/medal,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general) "lz" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general) -"lA" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/golden_cup,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general) "lB" = (/obj/structure/table/woodentable,/obj/item/clothing/accessory/medal/gold,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general) "lC" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general) "lD" = (/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/thunderdome) @@ -622,7 +623,6 @@ "lZ" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome) "ma" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome) "mb" = (/obj/structure/table,/obj/item/weapon/lipstick,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome) -"mc" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/ice,/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome) "md" = (/obj/machinery/icecream_vat,/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome) "me" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome) "mf" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome) @@ -791,8 +791,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmeFjyjthgjsjsiElrlslsltksivgogojOiEjGjGjslueFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFeFeFeFeFeFeFeFeFlviclweFeFeFeFeFeFeFeFeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmlxlyhkeGeGeGhklzlxbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmhylAhyeGeGeGhylAhybmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmkslAhyeGeGeGhylBksbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmhycRhyeGeGeGhycRhybmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmkscRhyeGeGeGhylBksbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFhylClxlChyeFeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlElFlGlDaaaaaaaaksfDksfDksaaaaaaaalDlElFlGlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlHlIlIlDlDlDlDlDlDlDlDlDlDlJlDlJlDlDlDlDlDlDlDlDlDlDlKlLlMlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -801,7 +801,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlPlDlDlDlDlDlDlDlDlDlDlDlQlRlSlDlDlDlDlDlDlDlNlTlTlTlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlUlUlUlUlUlVlWlWlWlWlXlWlWlWlWlWlXlYlXlZmalDlNlLlLlLlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlUlUlUlUlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmblLlLlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDmcmcmdmdlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmememelNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDeTeTmdmdlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmememelNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlNlNlDlDlDlDlDlDlDmfmfmfmfmfmfmfmfmfmfmfmfmfmfmflDlDlDlDlDlDlNlNlNlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDmglNlNlDlDmhmhmhmhlDmimjmjmjmjmjmjmjmjmjmjmjmjmjmklDmhmhmhmhlDlNlNlNmllDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlDmglNlDlDlDmmmmmmmmlDmnmompmompmomqmrmsmtmumtmumtmvlDmmmmmmmmlDlDlDlNmllDlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 57218ff1ad2..a2ac44e94d5 100644 --- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm +++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm @@ -637,7 +637,7 @@ "mm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mn" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mo" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) -"mp" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) +"mp" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mq" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "mr" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) "ms" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"}) diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 04d8818ad02..bf249399535 100644 --- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm @@ -452,7 +452,7 @@ "iJ" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "iK" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "iL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) -"iM" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) +"iM" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"}) "iN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"}) "iO" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"}) "iP" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"}) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 2e1ecc58633..c4b556ae056 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -10,108 +10,108 @@ "aaj" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate) "aak" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate) "aal" = (/turf/simulated/wall/r_wall,/area/security/permabrig) -"aam" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig) +"aam" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/wall/r_wall,/area/security/permabrig) "aan" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig) "aao" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig) -"aap" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/security/permabrig) +"aap" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig) "aaq" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aar" = (/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aas" = (/obj/machinery/camera{c_tag = "Prison Bedroom"; dir = 2; network = list("Prison","SS13")},/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel,/area/security/permabrig) +"aar" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aas" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/appleseed,/obj/item/seeds/appleseed,/obj/item/seeds/appleseed,/turf/simulated/floor/grass,/area/security/permabrig) "aat" = (/turf/simulated/wall,/area/security/permabrig) -"aau" = (/obj/item/clothing/suit/ianshirt,/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel,/area/security/permabrig) +"aau" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/turf/simulated/floor/grass,/area/security/permabrig) "aav" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aax" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaw" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/turf/simulated/floor/grass,/area/security/permabrig) +"aax" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aay" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaz" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig) -"aaA" = (/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig) -"aaB" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig) -"aaC" = (/obj/structure/stool/bed,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/security/permabrig) +"aaz" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/turf/simulated/floor/grass,/area/security/permabrig) +"aaA" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/security/permabrig) +"aaB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/permabrig) +"aaC" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaD" = (/turf/simulated/floor/plasteel,/area/security/permabrig) -"aaE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaF" = (/obj/machinery/door/airlock/glass{name = "Bedroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/security/permabrig) +"aaE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig) +"aaF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaG" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaI" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig) +"aaH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaI" = (/obj/machinery/biogenerator,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "aaJ" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate) -"aaK" = (/obj/machinery/newscaster{pixel_y = -28},/obj/structure/table,/obj/item/weapon/pen{layer = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/permabrig) -"aaM" = (/obj/structure/table,/obj/item/weapon/dice,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/item/device/radio/intercom/locked/prison{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/security/permabrig) -"aaN" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaO" = (/obj/structure/table,/obj/item/weapon/dice/d20,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaP" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/permabrig) -"aaR" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen{layer = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/security/permabrig) -"aaS" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaT" = (/obj/machinery/light/small{dir = 1},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) -"aaU" = (/obj/item/weapon/soap/nanotrasen,/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) -"aaV" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; tag = "icon-shower (WEST)"},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) -"aaW" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/security/permabrig) -"aaX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/vending/sustenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aaZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"aba" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abd" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abe" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/permabrig) +"aaL" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/camera{c_tag = "Prison Garden"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaN" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaO" = (/obj/machinery/seed_extractor,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaP" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaQ" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaR" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaS" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaT" = (/obj/structure/table/glass,/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/table/glass,/obj/item/weapon/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aaW" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaX" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaY" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aaZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall/r_wall,/area/security/permabrig) +"aba" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abb" = (/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig) +"abd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/security/permabrig) +"abe" = (/obj/machinery/door/airlock{name = "Bathroom"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abg" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Washroom"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"abg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abh" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) -"abi" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig) -"abj" = (/obj/machinery/vending/sustenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abi" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abj" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abl" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abm" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abl" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abm" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abo" = (/obj/machinery/camera{c_tag = "Prison Recreation Room"; dir = 1; network = list("Prison","SS13"); pixel_x = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abp" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abr" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/power/treadmill,/obj/machinery/treadmill_monitor{on = 1; pixel_x = 32; redeem_immediately = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abs" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/security/permabrig) +"abo" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abp" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abq" = (/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig) +"abr" = (/obj/machinery/computer/library/public,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abs" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig) "abt" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) "abu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig) "abv" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) -"abw" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"abw" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig) "abx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/security/permabrig) -"aby" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig) -"abz" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) +"aby" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/security/permabrig) +"abz" = (/obj/structure/holohoop,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig) "abA" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/vox) -"abB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig) -"abC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) -"abD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/flasher{id = "permaflash"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) -"abE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/security/permabrig) -"abF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/security/permabrig) -"abG" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) -"abH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) -"abI" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) -"abJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"abB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool,/obj/item/device/radio/intercom/locked/prison{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abC" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abD" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abF" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abG" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abI" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abJ" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abK" = (/obj/structure/lattice{layer = 2.4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) "abL" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) -"abM" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{filled = 0.2},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/security/permabrig) -"abN" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig) -"abO" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/security/permabrig) -"abP" = (/obj/machinery/computer/area_atmos/area,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig) -"abQ" = (/obj/machinery/camera{c_tag = "Prison Air Control"; dir = 6; network = list("Prison","SS13")},/obj/machinery/flasher_button{id = "permaflash"; pixel_x = 0; pixel_y = 27},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/security/permabrig) -"abR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig) -"abS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig) -"abT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/permabrig) -"abU" = (/obj/machinery/camera{c_tag = "Prison Solitary Confinement"; dir = 6; network = list("Prison","SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig) -"abV" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/security/permabrig) +"abM" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig) +"abN" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig) +"abO" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig) +"abP" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/security/permabrig) +"abQ" = (/turf/simulated/floor/holofloor,/area/security/permabrig) +"abR" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/gameboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abW" = (/obj/structure/grille,/obj/structure/sign/securearea,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) -"abX" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/machinery/light/small{dir = 8},/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plating,/area/security/permabrig) -"abY" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plating,/area/security/permabrig) -"abZ" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/security/permabrig) -"aca" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plating,/area/security/permabrig) -"acb" = (/turf/simulated/floor/plating,/area/security/permabrig) -"acc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) +"abX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"aca" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"acb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"acc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "acd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) -"ace" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/permabrig) -"acf" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/permabrig) +"ace" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"acf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "acg" = (/turf/simulated/wall/r_wall,/area/security/execution{name = "\improper Prisoner Transfer Center"}) "ach" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) "aci" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) -"acj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/security/permabrig) +"acj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig) "ack" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/security/permabrig) "acl" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/permabrig) "acm" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior North"; dir = 4; network = list("SS13")},/turf/space,/area/security/permabrig) @@ -133,7 +133,7 @@ "acC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) "acD" = (/obj/item/clothing/mask/muzzle/gag,/turf/simulated/floor/plating,/area/security/permabrig) "acE" = (/turf/simulated/wall/r_wall,/area/security/securearmoury) -"acF" = (/obj/structure/grille,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/space,/area/space) +"acF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/security/permabrig) "acG" = (/obj/structure/grille,/turf/space,/area/space) "acH" = (/obj/structure/closet/secure_closet/hos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "acI" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) @@ -364,9 +364,9 @@ "agZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage) "aha" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonlockers) "ahb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) -"ahc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig) -"ahd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig) -"ahe" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Prison Wing APC"; pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) +"ahc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig) +"ahd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig) +"ahe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig) "ahf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig) "ahg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage) "ahh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) @@ -3411,8 +3411,8 @@ "bnE" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bnF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bnG" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bnH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"bnI" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/gameboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"bnH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig) +"bnI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/security/permabrig) "bnJ" = (/obj/machinery/light,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bnK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) "bnL" = (/obj/machinery/icemachine,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen) @@ -4020,7 +4020,7 @@ "bzp" = (/obj/machinery/optable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue) "bzq" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/medical/morgue) "bzr" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue) -"bzs" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"bzs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "bzt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bzu" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bzv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) @@ -4359,7 +4359,7 @@ "bFQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/space,/area/space) "bFR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/captains,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bFS" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) -"bFT" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/item/weapon/storage/box/matches,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) +"bFT" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/item/weapon/storage/box/matches,/obj/item/weapon/reagent_containers/food/drinks/flask/gold,/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom) "bFU" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom) "bFV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain) "bFW" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se) @@ -6006,18 +6006,18 @@ "clz" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "clA" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "clB" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) -"clC" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clE" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clF" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clC" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clG" = (/obj/machinery/power/apc{dir = 1; name = "Recovery Ward APC"; pixel_y = 26},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/camera{c_tag = "Medbay Recovery Ward West"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clI" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clJ" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clK" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clL" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"clN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"clN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "clO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/ward) "clP" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) "clQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2) @@ -6078,7 +6078,7 @@ "cmT" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel,/area/engine/controlroom) "cmU" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/engine/controlroom) "cmV" = (/obj/machinery/camera{c_tag = "Engineering Construction Area"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) -"cmW" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"cmW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cmX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cmY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cmZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) @@ -6089,7 +6089,7 @@ "cne" = (/obj/machinery/camera{c_tag = "Research Shuttle Dock"; dir = 2; network = list("SS13","Research")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock) "cnf" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/genetics) "cng" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Science Maintenance APC"; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cnh" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"cnh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cni" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2) "cnj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/nosmoking_2,/turf/simulated/wall/r_wall,/area/medical/biostorage) "cnk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/virology) @@ -6143,14 +6143,14 @@ "cog" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "coh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "coi" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"coj" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"coj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cok" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "col" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "com" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"con" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"coo" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"con" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"coo" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cop" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) -"coq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"coq" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cor" = (/turf/simulated/wall/r_wall,/area/medical/ward) "cos" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cot" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/medbay2) @@ -6272,7 +6272,7 @@ "cqF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cqG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "cqH" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery1"; pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cqI" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cqI" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) "cqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cqK" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cqL" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) @@ -6317,11 +6317,11 @@ "cry" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "crz" = (/obj/structure/table,/obj/item/weapon/wirecutters,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) "crA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction) -"crB" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"crC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"crD" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"crE" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"crF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"crB" = (/obj/machinery/light,/obj/structure/table,/obj/item/toy/cards/deck,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"crC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward) +"crD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery) +"crE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery) +"crF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "crG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "crH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "crI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6383,16 +6383,16 @@ "csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall/r_wall,/area/atmos/control) "csN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/atmos/control) "csO" = (/turf/simulated/wall/r_wall,/area/atmos/control) -"csP" = (/obj/machinery/iv_drip,/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"csP" = (/obj/machinery/body_scanconsole,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "csQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "csR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "csS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "csT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csV" = (/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"csU" = (/obj/machinery/bodyscanner,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"csV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "csW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "csX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"csY" = (/obj/machinery/iv_drip,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"csY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "csZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation A"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_a) "cta" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "ctb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_a) @@ -6454,8 +6454,8 @@ "cuf" = (/obj/machinery/computer/operating,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cug" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cuh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cui" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cuj" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cui" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cuj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cuk" = (/obj/machinery/computer/operating,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cul" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cum" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -6512,8 +6512,8 @@ "cvl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cvm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/medical/surgery) "cvn" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cvo" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cvp" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cvo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cvp" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cvq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cvr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cvs" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -6558,11 +6558,11 @@ "cwf" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cwg" = (/obj/machinery/power/apc{dir = 2; name = "Surgery APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cwh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwi" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwj" = (/obj/structure/table,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwk" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwl" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cwm" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cwi" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cwj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cwk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cwl" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cwm" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cwn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cwo" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cwp" = (/turf/space,/area/maintenance/asmaint) @@ -8325,7 +8325,7 @@ "dee" = (/obj/structure/stool/bed/roller,/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "def" = (/obj/machinery/status_display{pixel_x = -30; pixel_y = 0},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape) "deg" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor4,/area/shuttle/escape) -"deh" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"deh" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "dei" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "dej" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "dek" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape) @@ -8490,6 +8490,7 @@ "dhn" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "dho" = (/obj/structure/rack,/obj/item/weapon/gun/dartgun/vox/raider,/obj/item/weapon/gun/dartgun/vox/medical,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "dhp" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/bodyscanner,/obj/item/weapon/circuitboard/bodyscanner_console,/obj/item/weapon/circuitboard/sleeper{pixel_x = 3},/turf/simulated/floor/plating,/area/storage/tech) +"dhq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/security/permabrig) "dhr" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "dhs" = (/obj/machinery/bodyscanner,/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox) "dht" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/vox) @@ -8554,9 +8555,12 @@ "diA" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diB" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diC" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/docking_port/mobile{dir = 2; dwidth = 2; height = 18; id = "skipjack"; name = "Vox Skipjack"; roundstart_move = "skipjack_away"; width = 19},/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_ne"; name = "northeast of SS13"; width = 19},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox) +"diD" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"diE" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "diF" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diG" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diH" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) +"diI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "diJ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diK" = (/obj/structure/table,/obj/item/weapon/gun/syringe,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) "diL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate) @@ -8661,6 +8665,8 @@ "dkG" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration) "dkH" = (/obj/structure/window/plasmareinforced{color = "#FF0000"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) "dkI" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) +"dkJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dkK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "dkL" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration) "dkM" = (/obj/machinery/chem_dispenser,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration) "dkN" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Holding Cell"; opacity = 1; req_access_txt = "104"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration) @@ -8898,6 +8904,101 @@ "dpl" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "dpm" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock) "dpn" = (/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock) +"dpo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpp" = (/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpr" = (/obj/machinery/camera{c_tag = "Prison East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dps" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpu" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpv" = (/obj/machinery/door/airlock/glass{name = "Prison Basketball Court"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpw" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/holofloor,/area/security/permabrig) +"dpx" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig) +"dpy" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/holofloor,/area/security/permabrig) +"dpz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig) +"dpA" = (/obj/machinery/vending/sustenance,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig) +"dpC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 1"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 2"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpH" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 2"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpI" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 3"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpJ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 3"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpK" = (/obj/machinery/camera{c_tag = "Prison Basketball Court"; dir = 4; network = list("SS13")},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig) +"dpL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/permabrig) +"dpM" = (/obj/machinery/vending/sustenance,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig) +"dpP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash1"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig) +"dpS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash2"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpT" = (/obj/machinery/flasher{id = "permaflash3"; pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dpU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plating,/area/space) +"dpV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/space) +"dpW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) +"dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/security/permabrig) +"dpY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) +"dpZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig) +"dqa" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/security/permabrig) +"dqb" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqc" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dqd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig) +"dqe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig) +"dqf" = (/obj/machinery/door/airlock/glass_security{name = "Prison 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dqg" = (/obj/machinery/door/airlock/glass_security{name = "Prison 2"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dqh" = (/obj/machinery/door/airlock/glass_security{name = "Prison 3"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dqi" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"dqj" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqk" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{filled = 0.2},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig) +"dql" = (/obj/machinery/computer/area_atmos/area,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqm" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqn" = (/obj/machinery/camera{c_tag = "Prison Air Control"; dir = 6; network = list("Prison","SS13")},/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light_switch{pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dqq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqr" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/machinery/door_control{id = "Prison Lockdown 1"; name = "Cell 1 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqt" = (/obj/machinery/door_control{id = "Prison Lockdown 2"; name = "Cell 2 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig) +"dqu" = (/obj/machinery/door_control{id = "Prison Lockdown 3"; name = "Cell 3 Lockdown"; pixel_x = 24; pixel_y = 3; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig) +"dqv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqw" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig) +"dqx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqy" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dqA" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqB" = (/obj/machinery/power/apc{name = "Prison Wing APC"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"dqD" = (/obj/machinery/flasher_button{id = "permaflash1"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqE" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqF" = (/obj/machinery/camera{c_tag = "Prison South"; dir = 1; network = list("SS13")},/obj/machinery/flasher_button{id = "permaflash2"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig) +"dqG" = (/obj/machinery/flasher_button{id = "permaflash3"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/permabrig) +"dqH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) +"dqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) +"dqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig) +"dqK" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/permabrig) +"dqL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) +"dqM" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig) +"dqN" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "Prison Solitary Confinement"; dir = 6; network = list("Prison","SS13")},/turf/simulated/floor/plating,/area/security/permabrig) +"dqO" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/security/permabrig) +"dqP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/permabrig) +"dqQ" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/security/permabrig) +"dqR" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = -32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space) +"dqS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig) +"dqT" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) +"dqU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/permabrig) +"dqV" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dqW" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dqX" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dqY" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dqZ" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dra" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"drb" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"drc" = (/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"drd" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"dre" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8932,37 +9033,37 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfFdfEardardarddfrardarddfhardardarddfhardarddfGardardardardarddfHdfIdfHardardardardardardardardarddfJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfidfiardardarddfzardarddfhdfKdfwarddfhardarddfCardardardarddfscUKaaecUKdeWardardardardardarddfLdfsasRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvardardardardarddfhardardargaaeaaedfrareardarddfhdfxardarddfscUKaNhbikaNnasOaaeaaeaaeaaeaaeaaeaaeasOaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfOardardardarddfPdeYdeWardardardardardardardarddfharddfsarbasOaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfhdfRdfQdfSarddfscUKasOaaeaaearbdeWardardardarddeYaaecUKaNhdfobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeYdeWdfadfTdfscUKaredfVdfUdfWargasRardarddfkdfXdfldeZdfYaaeasPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaedfZasOareardardardardarddfhardarddfsarbasRdffdgadeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgbardardardardardardarddgcdfKdfscUKaNhaNndgedgddeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgfarddggardardardardarddeYarbcUKaNhbikbikaNndgedeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaagaafaajaaiaaiaaiaakaafaaJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnaaearbdeWarddghdgidfscUKasOaNhbikbikbikbikaNnarbdfnbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlbmOcaVbZycaXcaWccwccwbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaeaaeaaeasOaNhbikbikbikbikbikbikbikaNnaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlccxcaVcaVccycaVcaVcczbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcyacSKcaVcaVcTOcaVcTWbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGaafaafaafddwaafaafaafdelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldeqcaVdgkbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafbFldhNcaVdhOdhQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikaalaalaalaalaalaalaalaamaanaaoaapaalaalaalaalbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaqaaraasaataauaaybnHbnIaavaayaazaaAaaBaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVayLdhTbFldhNcaVdhObFlaafdhWdhVdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaCaaDaaEaaFaayaayaawaaGaaHaayaazaazaaIaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhYcaVcaVdhZbFldiacaVcczdicdibdibdibbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaqaayaaKaaLaaMaayaaNaaOaavaaPaataataalaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaataataataaQaaRaaSaawaaGaaHaaxaaTaaUaaVaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdijcaVcaVcaVaVUdikdikdimbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaWaaXaaYaaZabaabbabcabdabeabfabgabhabhaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabiabjabkablabmabnaboabpabqabraatabsabtaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikaalabuaalabvabwabxabxaalaalabyaaoaalaalabzaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBaatabCabDabEabFbikbikbikbikbikaalabGaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajbcaVcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBaatabCabHaalbikbikbikbikbikbikaalaalaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikaalaalaalaalabuaatabIabJaalaalaalaalbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabMabNabOabPabQabRabSabTabUabVaalbikbikbikbikabKabLabWabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabXabYabZacaacbaccacdaceacfacfaalbikbikbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachaciacjackaclaalacmbikbikbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalbikbikbikbikbikbikbikabKabLabLabKactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikabKacFacGactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEacEbikbikbikbikabKacGactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgadcaddacEacEadeadgadfadiadhacEacEbikbikbikbikbikabKactadjadkadladmadnadoactadpadqadradsadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhjdhidhldhkdhmdgmdhndgydgydgydhodgmarWdgydhsdhrdhjdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfOardardardarddfPdeYdeWardardardardardardardarddfharddfsarbasOaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfhdfRdfQdfSarddfscUKasOaaeaaearbdeWardardardarddeYaaecUKaNhdfobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeYdeWdfadfTdfscUKaredfVdfUdfWargasRardarddfkdfXdfldeZdfYaaeasPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaedfZasOareardardardardarddfhardarddfsarbasRdffdgadeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikdgbardardardardardardarddgcdfKdfscUKaNhaNndgedgddeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgfarddggardardardardarddeYarbcUKaNhbikbikaNndgedeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaagaafaajaaiaaiaaiaakaafaaJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaapaamaaoaalaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnaaearbdeWarddghdgidfscUKasOaNhbikbikbikbikaNnarbdfnbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlbmOcaVbZycaXcaWccwccwbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaasaaraauaalaalaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaeaaeaaeasOaNhbikbikbikbikbikbikbikaNnaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlccxcaVcaVccycaVcaVcczbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaawaayaaxaayaazaalbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcyacSKcaVcaVcTOcaVcTWbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaBaaAaayaaxaayaaAaaBbikbikbikaabaabaabbikbikaabbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGaafaafaafddwaafaafaafdelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaEaaCaaHaaFaaHaaIaaKbikbikbikaalaalaalaalaalaabaabbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldeqcaVdgkbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaabaalaaLaaNaaMaayaaOaalbikbikaabaalaaPaaRaaQaalaalaalbikbikaabaabaabaacbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikaalaaSaaTaaMaaVaaUaalbikaabaabaalaaWabhaaXabtaaYaalbikaabaabaacaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafbFldhNcaVdhOdhQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaalaaBaalaaZaalabaabbaalaalabcaanaaoaalabdabeabxaalaalaalaalaalaalaalaalaalaalaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaalabgabiaaSabiaaMabfabjablaaxaavaayaboabmaaDabpabrabqabsaalabwabwabzabyabyaalaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVayLdhTbFldhNcaVdhObFlaafdhWdhVdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBabDabCaaDaaMabEaayaayabFabGaavabIabHabJaaGaavabMabNaalabOabOabQabPabPaaBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhYcaVcaVdhZbFldiacaVcczdicdibdibdibbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikaalabRaaHabSaaHabTabVabUabYabXacaabZaccacbacfaceabZacjacjacFahdahcbnHahedhqbnIbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaavdiEdiDdkJdiIdpodkKdkJdkJdpqdppdpsdprdkJdptdpudkJdkJdpvdpxdpwdpydpwabPdpzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdijcaVcaVcaVaVUdikdikdimbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaldpBdpAdpDdpCdpEaaldpFdpFaaldpGdpHaaldpJdpIaalaalaalaaldpKagtaaDagtabPdpLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaaldpMaaydpNabndpOdpDdpPdpOdpQdpSdpRdpDdpTdpOdpUdpVdpOdpXdpWdpZdpYdqaaalbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabuaalabvdqbaaldqcaaqaaldqcaaqabxdqcaaqaalbikaEQaalaalaalaalaalaalaalaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaalaalaalaalabuaaldqddqeaaldqfdqfaaldqgdqgabxdqhdqhaalbikaEQabKabKabKdqiaEQaEQaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajbcaVcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaaldqkdqjdqmdqldqnabkdqpdqodqqdqqdqsdqrdqrdqtdqrdquaalbikbikbikaEQabKabKaEQaabbikbikaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwdqvdqydqxdqAdqzdqCdqBdqAdqDdqAdqEdqFdqAdqAdqGaalbikbikbikbikaEQabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaalaalaalaaldqHdqIaalaalaalaalaalaalaalaalaalaalbikbikbikbikaEQabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaldqJdqLdqKdqNdqMdqOaalaabaabaabbikbikbikbikbikbikbikabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackacldqQaalacmbikbikbikbikbikbikbikbikbikdqRabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalaalbikbikbikbikbikbikbikbikbikbikactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikbikbikbikactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEacEbikbikbikbikbikbikactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgadcaddacEacEadeadgadfadiadhacEacEbikbikbikbikbikbikactadjadkadladmadnadoactadpadqadradsadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhjdhidhldhkdhmdgmdhndgydgydgydhodgmarWdgydhsdhrdhjdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaaladBadCacEadEadDadGadFadIadHadJacEbikbikbikbikbikbikactadKadLadMadNacXadOactadPadtadtadtadtaduadvbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhtdhtdgwdgwdgwdgmdhudgydgydgydhvdgmdgwdgwdgwdhtdhtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikaabaalachacdacEadWadVadYadFaeaadZaebacEbikbikbikbikbikaesactaecaedadAaeeacXaefactaeiadtaejadtadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdhwdhwdgFbikbikdgmdhxdgydgydgydhydgmbikbikdgLdhwdhwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikaabbikbikbikaabaaladRacdacEaetadVadYadFaeaadZaevacEbikbikbikbikbikbikactaeIadLaewadNacXaexactaeyadtadtadtadtaezadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhzdgydgydgydhydgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8970,7 +9071,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeWaeXaeYaeAaeZaeXafaaeAaabbikbikaabadwadwadwadwadwadwaalaffafgadSacEafiadXafjaeuaflacEafmafmaepaeDahZafmafmactafnafoafpafqafractactafsaftafuafuafwadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxafxafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhDdhCdgydhEdhFdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAaeAafyafzafAaeAbikbikbikaabadwadxaekadUaemaelaenafKafLaeoacEacEafPafOafQacEacEafmafDafcafRagaafIafEafWafXafYaegagaagaagbafVagdagcagfaggaghadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAagjafAagkaeAaglafAagmaeAaabbikbikbikadwadyaeraeqaeBagqagragsagtaeCagvagwagzagyaeFaehafeafMahlafSageafSafSafTahpafbafGafCafSafSaikagoagLagxagMagNagOagPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabagRaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdhKdhMdhLdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAaeAafAafyafAaeAbikbikaabaabadwadzaeraeGaeHahaahbahcahdaheagvagnahiahhahmahjafJagvagpagYahgaguaguagAagDagCafUagEagHagGahUafZahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAaeAafAafyafAaeAbikbikaabaabadwadzaeraeGaeHahaahbdqSdqUdqTagvagnahiahhahmahjafJagvagpagYahgaguaguagAagDagCafUagEagHagGahUafZahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyaeAafyafAafyaeAbikaabbikbikadwadxafBagBagFahJahfagWahnagIagKagJahRahQairahSahqagVagZahFahGahrahkahUahoahsahuahtahKahKahMahLahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAaeAafyafyafAaeAaabaabbikbikadwadwaiOafFailailadTaatahTahNagvaiqaisahhamuaitaiuahOahVahPahXahWahYaifaibaiaamyamzamzaicaiCaidahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJaeAafAafyaiKaeAamcaabaabaabaabadwagTaiOaigaiwaeEaatagXaiSagvaimaiUaiVaiWaiXaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -9056,16 +9157,16 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaaccjMcqscqscqscqsdoadnxcqscqscuRdnpdnpdowdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpcsubUTchocfQchpbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchucWpchwchxchychychzchAcglbGybGychBchCchDbGybGybGycqOchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcjncjlcjlcjlcjlckacgIbSqclPchPchQchRchSchTchUclQcbPchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbEXbFeciicijcikbwobxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwciycixcizbikbikbikbikaahbikbikbikbikbikbikbikbikciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaaccjMdnrdnqdnscqscqsdoxcqscqsdnobUTbUTbUTbUTbUTbUTcekbUTbUTbUTbUTdntdntdntdntdntdntdntdntdntbUTcfScejbikbikbikbikciEbaTciGciHciIciJciKciLciMciNcmPciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcjlcfdcnicjpcjpcjpcjpckNclSckUcnjcjqcjrcjscjtcbAcwncjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikbWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbUTcjKcjKcjKcjKcjKcjKcjLcjKdnodnubUTcqsdoydnwdnycqsdnydnvdnzdnwdntdnAdnAdntdnBdntdnDdnCdntcqscelcjMbikcjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnEclbclbclbclbclbclbclccldcleclfclgclhclicjLdnocnRbUTcqsdozdnwcqscqscqsdnvcwNdnwdntdnAdnFdnCdnCdnGdnCdnHdntcljcelcjMbikclkcllclmclnclocjSclpdhpclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOcotcfhcpwcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKdnocqscekcqscqscqscqscqscqscqscqscqsdntdntdnCdnIdnCdntdnCdnIdntcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRbHtchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbbzsbvWbulbxBclHcnhcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKdnobUTbUTdnJcjMcjMcjMcjMcjMcjMcjMdnKdntdnCdnCdnCdnCdnLdnCdnCdntcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopclHcoqcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkdnMchobUTcqscjMbikbikbikbikbikcjMcqsdnldnAdnOdnCdnCdnCdnCdnPdnNcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqchqcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcpIcyFcpJcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKdoAcwNbUTcfQcejbikbikbikbikbikcejdnRdntdnSdnSdnAdnUdnTdnCdnVdntcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcqIcqJcqKcqLcqMcpFcqLcqMcqKcqNdehcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcjKcjKcjKcjKcjKcjKdnWcrjcrjcrjcrjcrjdnQcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkdnYdnYdnYdnYdnYdnYdnYcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqKcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXdlFcsYcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKcvocpFcvpcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcrjcrjcrjcrjdnXcrjcvFcvGcvGcvHctBdlXcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhcwicwjcwkcpFcwlcwjcwmcqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnEclbclbclbclbclbclbclccldcleclfclgclhclicjLdnocnRbUTcqsdozdnwcqscqscqsdnvcwNdnwdntdnAdnFdnCdnCdnGdnCdnHdntcljcelcjMbikclkcllclmclnclocjSclpdhpclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCbzsclEclDclGclHclIclFclJclKclMclLclNclOcotcfhcpwcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKdnocqscekcqscqscqscqscqscqscqscqscqsdntdntdnCdnIdnCdntdnCdnIdntcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRbHtchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcojcnhbvWbulbxBclHconcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKdnobUTbUTdnJcjMcjMcjMcjMcjMcjMcjMdnKdntdnCdnCdnCdnCdnLdnCdnCdntcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcoocokcolcomcomcoqcrBcqIcomcomcopclHcrCcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkdnMchobUTcqscjMbikbikbikbikbikcjMcqsdnldnAdnOdnCdnCdnCdnCdnPdnNcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqchqcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcrDcyFcrEcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKdoAcwNbUTcfQcejbikbikbikbikbikcejdnRdntdnSdnSdnAdnUdnTdnCdnVdntcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcrFcqJcqKcqLcsPcpFcsUcqMcqKcqNcsVcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcjKcjKcjKcjKcjKcjKdnWcrjcrjcrjcrjcrjdnQcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkdnYdnYdnYdnYdnYdnYdnYcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcuicsYcvocujcujcvpcpFcwicujcujcwjcujcwkcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcwlcsQcsRcsScsTcwmcpFdehcsTcsWcsXdlFdqVcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhdqWcpFdqXcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKdqYcpFdqZcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcrjcrjcrjcrjdnXcrjcvFcvGcvGcvHctBdlXcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhdradrcdrbcpFdrddrcdrecqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxaabagiaabaqZbikaqZaqZdoidoCdojdojdojdoldokcrjcwOcwPcwQcwRcwScwTcwUcwVcwWcvOcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrcwecpMcpMcxBcpMcpMcxCcxDcxEcxEcxEcxFcxEcyUcpMbikbikbikdbFdbFdbFdbFdbFdbydcedcgdcfdbybGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTckPcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikaabaabbikaabaabbikbikaabaabaabaabaabdoidoidohdoidoidoncEBcrjcrjcrjcrjcrjcrjcrjcrjcybcwWcvOcyccydcyecyfcyfcyfcyfcygcyhcyicxjcyjcxjcxjcykcxjcylcymcyncyocxocbkcypcyqcmScxscyscytcyucxscyvcywcyxcyycyzcyAcyBcyCcyDcyEcyEcAaczUcAdcAccAeczTcALceJcAhbGycAMcoAcoAcoAcoAcoAbikbikbikbikdcidchdckdcjdbydclbVibVicuscoAcoAcoAcoAcoAbikbikckPcxOcxOcxOcyZczaczbczcczdcAicAOcAvckPcAVcAYcAWckPbikbikcwGczkcwJczlcwJczmcwGbxXbxXcvzczMbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdoDbikacGbikczoczpczqbikczoczpczqbikczoczpczqbikbikdoidoocfRdopdoidoqcGKdojdojdojdojdojdojdojdojdojcEycvOcztcxjcykczucxjcxjcxjczvcxjcztcztcxjcxjcxjcxjczwczxcymczyctEczzcoacyqcyqczAcxsczBczCczDcxsczEctWczFczGczHczIczJczKbGyczLcdcczLbGycBacAZcBccBccBccBccBPcBNcBNcBNcBNcBNcBQcoAbikbikbikbikdcidchdckdcmcTabGyckObVicusbGybGybGycgmcoAbikbikckPcwAcwAcwAcwAczWcqUczXczYczZcCfcAbckPcCGcCYcCIckPbikbikcwGcAfcAgcDLcwJcDNcwGcEdbxXcvzbwoaabaabaabaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index b980f8a7098..c8ef280d538 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -237,7 +237,7 @@ "eC" = (/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plasteel,/area/engiestation) "eD" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation) "eE" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation) -"eF" = (/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/box/drinkingglasses,/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/milk,/turf/simulated/floor/plasteel,/area/engiestation) +"eF" = (/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/box/drinkingglasses,/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/milk,/turf/simulated/floor/plasteel,/area/engiestation) "eG" = (/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel,/area/engiestation) "eH" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/engiestation) "eI" = (/obj/docking_port/stationary{dir = 8; dwidth = 10; height = 35; id = "whiteship_z4"; name = "east of engistation"; width = 21},/turf/space,/area/space) @@ -245,6 +245,8 @@ "eK" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/engiestation) "eL" = (/obj/docking_port/stationary{dir = 2; dwidth = 3; height = 5; id = "engineering_away"; name = "engineering outpost dock"; width = 7},/turf/space,/area/space) "eM" = (/obj/machinery/field/generator,/turf/simulated/floor/plating/airless,/area/space) +"eN" = (/obj/item/weapon/grenade/chem_grenade/drugs,/turf/simulated/floor/plating,/area/exploration/methlab) +"eO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/turf/simulated/floor/plating,/area/exploration/methlab) "fe" = (/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/constructionsite/medical) "ff" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/medical) "fg" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/constructionsite/medical) @@ -301,13 +303,11 @@ "gk" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plating,/area/exploration/methlab) "gl" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/exploration/methlab) "gm" = (/obj/machinery/door/airlock/external{name = "Crackden Airlock"},/turf/simulated/floor/plating,/area/exploration/methlab) -"gn" = (/obj/item/weapon/reagent_containers/drugs/baggie,/turf/simulated/floor/plating,/area/exploration/methlab) "go" = (/turf/simulated/floor/plating,/area/exploration/methlab) "gp" = (/obj/machinery/door/airlock/external{name = "Plain Airlock"},/turf/simulated/floor/plating,/area/exploration/methlab) "gq" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/plating,/area/exploration/methlab) "gr" = (/obj/item/ammo_casing{pixel_y = 3},/turf/simulated/floor/plating,/area/exploration/methlab) "gs" = (/obj/effect/decal/cleanable/blood/oil,/obj/item/ammo_casing{pixel_x = -4; pixel_y = -6},/turf/simulated/floor/plating,/area/exploration/methlab) -"gt" = (/obj/structure/table,/obj/item/weapon/reagent_containers/drugs/baggie/meth,/obj/item/weapon/reagent_containers/drugs/baggie/meth,/obj/item/weapon/reagent_containers/drugs/baggie/meth,/turf/simulated/floor/plating,/area/exploration/methlab) "gu" = (/obj/machinery/power/apc/noalarm{pixel_x = 26},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/exploration/methlab) "gv" = (/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/exploration/methlab) "gw" = (/obj/machinery/chem_master,/turf/simulated/floor/plating,/area/exploration/methlab) @@ -510,10 +510,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggaaaaggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagefZgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbfZgeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggggggggggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZfZgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbfZfZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggggggggggggggggggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggghgigjgkgkglgmgngogpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggqgngogogrgsgnggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggtgogogugggogogvggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggwgogxgygggngoggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggghgigjgkgkglgmeNgogpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggqeNgogogrgseNggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggeOgogogugggogogvggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggwgogxgyggeNgoggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggzgAgogggggogoggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZfZgbgbgbgbgbfZfZfZgafZfZfZgbgbgbgbgbfZfZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggBgogogggggCgCggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagefZfZfZgDfZfZfZgbgbgbgbgbfZfZfZgafZfZfZgeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggEggggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagegegfgbgbgbgfgbgbgbgbgbgbgbgfgbgbgbgfgegeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 355b75460a6..ae5425c4ad5 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -1333,6 +1333,7 @@ "zG" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/mine/living_quarters) "zH" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/mine/living_quarters) "zI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Mining Outpost Sleeper Room"; dir = 1; network = list("Mining Outpost")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters) +"zJ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Mining Station Port Wing APC"; pixel_x = 1; pixel_y = 25},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "zK" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/mine/living_quarters) "zL" = (/turf/simulated/floor/plating,/area/mine/living_quarters) "zM" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) @@ -1397,7 +1398,6 @@ "AT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "AU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) "AV" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) -"AW" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/mine/living_quarters) "AX" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/lobby) "AY" = (/obj/machinery/door/firedoor,/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/mine/lobby) "AZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"}) @@ -1627,7 +1627,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaevkvSvTvUvyvTvVvTvTvWvXvYvGvZwaaeaeaeaeaeafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjacacafafnlaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacuEwbvIwcwdwewfuEuEuEuEuKuEvMwgwgwgwhuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeqdxwzgxFwXwiwjwjwkvQaewlaeaeaenWnlafafafoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyqraeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaeuWaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRAAAzwXwGwHwIwJvQvQvQvQaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrTquaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerTquaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwTwRwSuEuEuEuEuEwUuEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaewFwFwVAMABwYwZxaxaxbxcxdxexcquaeaeaenmafafafoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxrtTtUrsrsrsrsrsqLaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRrsrsrsrsrsrsrsrstTtUrsrsrsrsqLaeaeaeaeaeafacacacacacwQxsxtxuwgwDxvwhwDwwAWxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDwFwFwFxEwWBQxGxHxIxaxaxJxKxLxMxNxOaeaeaenmafafafoVoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxrtTtUrsrsrsrsrsqLaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRrsrsrsrsrsrsrsrstTtUrsrsrsrsqLaeaeaeaeaeafacacacacacwQxsxtxuwgwDxvwhwDwwzJxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDwFwFwFxEwWBQxGxHxIxaxaxJxKxLxMxNxOaeaeaenmafafafoVoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQxRvkvkxSvkvkvkvkqpqraeaeaeaeaeqCaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqCaeaeaeaeaeaeaeaeqpqraeaeaeaeqCaeaeaeaeaeafafnlafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyaybxXybycycycycycycycycydydydydydydydyeyfyeygyfyhyiyjykylymynxcyoypxcqraeaeaeaeafafafafoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaevkyqyrysytvkyuyvoeaeaeaeaeaeqEaeaeaeqKrsrsqLaeaeaeaeafacacacacacacacacacacafaeaetRrstSaeaeaeaeafaeaeqEaeaeaeaeaeaeqCaeaeaeaeaeaeaeuWaeafafafafafuEwgywyxyyyyyxyzyAyByyyyyCyxyDyEyEyEyFyFyFyFyFyFyFyFyGyGyGyGyGyGyHyIyIyIyJyKyLyMyNyOyPyOyOyOyOyOyOyQaeaeaeaenmafafafoVoVoVoVafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnlafaeaeaeaeaeqCaeaeaeaeaeafacacacacacafafafafafaetRtSaeaeaeafafafafafafnlaeaeaeaeaeaeqCaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRyVwRuEuEyWyXyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaawFwFwWzazbzczdzezfBRzhziyOvbzjaeaeaeaeaeafafafoVoVoVoVafafafoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/__DEFINES/bots.dm b/code/__DEFINES/bots.dm index 339d272b57e..1fad6d6cd4b 100644 --- a/code/__DEFINES/bots.dm +++ b/code/__DEFINES/bots.dm @@ -36,4 +36,5 @@ #define SENTIENCE_ORGANIC 1 #define SENTIENCE_ARTIFICIAL 2 #define SENTIENCE_OTHER 3 -#define SENTIENCE_MINEBOT 4 \ No newline at end of file +#define SENTIENCE_MINEBOT 4 +#define SENTIENCE_BOSS 5 \ No newline at end of file diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm index ec9ad2f2128..bc067253ff1 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -30,9 +30,8 @@ #define slot_in_backpack 18 #define slot_legcuffed 19 #define slot_r_ear 20 -#define slot_wear_pda 21 -#define slot_tie 22 -#define slots_amt 22 +#define slot_tie 21 +#define slots_amt 21 //Cant seem to find a mob bitflags area other than the powers one diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm new file mode 100644 index 00000000000..8218d392640 --- /dev/null +++ b/code/__DEFINES/crafting.dm @@ -0,0 +1,7 @@ +#define CAT_NONE "" +#define CAT_WEAPON "Weaponry" +#define CAT_AMMO "Ammunition" +#define CAT_ROBOT "Robots" +#define CAT_FOOD "Food" +#define CAT_MISC "Misc" +#define CAT_PRIMAL "Tribal" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 5f77bb2fe6f..f6e10ca2e06 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -105,10 +105,9 @@ #define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets. #define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets. #define SLOT_TWOEARS 8192 -#define SLOT_PDA 16384 -#define SLOT_TIE 32768 +#define SLOT_TIE 16384 //ORGAN TYPE FLAGS #define AFFECT_ROBOTIC_ORGAN 1 #define AFFECT_ORGANIC_ORGAN 2 -#define AFFECT_ALL_ORGANS 3 \ No newline at end of file +#define AFFECT_ALL_ORGANS 3 diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 8cc7145ccd5..97f797b2718 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -18,8 +18,8 @@ /////////////////////////////////////// // Generic mutations: -#define TK 1 -#define RESIST_COLD 2 +#define TK 1 +#define RESIST_COLD 2 #define XRAY 3 #define HULK 4 #define CLUMSY 5 @@ -30,78 +30,52 @@ // Extra powers: #define LASER 9 // harm intent - click anywhere to shoot lasers from eyes -//#define HEAL 10 // (Not implemented) healing people with hands -//#define SHADOW 11 // (Not implemented) shadow teleportation (create in/out portals anywhere) (25%) -//#define SCREAM 12 // (Not implemented) supersonic screaming (25%) -//#define EXPLOSIVE 13 // (Not implemented) exploding on-demand (15%) -//#define REGENERATION 14 // (Not implemented) superhuman regeneration (30%) -//#define REPROCESSOR 15 // (Not implemented) eat anything (50%) -//#define SHAPESHIFTING 16 // (Not implemented) take on the appearance of anything (40%) -//#define PHASING 17 // (Not implemented) ability to phase through walls (40%) -//#define SHIELD 18 // (Not implemented) shielding from all projectile attacks (30%) -//#define SHOCKWAVE 19 // (Not implemented) attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) -//#define ELECTRICITY 20 // (Not implemented) ability to shoot electric attacks (15%) -//bitflags for mutations - // Extra powers: -#define SHADOW (1<<10) // shadow teleportation (create in/out portals anywhere) (25%) -#define SCREAM (1<<11) // supersonic screaming (25%) -#define EXPLOSIVE (1<<12) // exploding on-demand (15%) -#define REGENERATION (1<<13) // superhuman regeneration (30%) -#define REPROCESSOR (1<<14) // eat anything (50%) -#define SHAPESHIFTING (1<<15) // take on the appearance of anything (40%) -#define PHASING (1<<16) // ability to phase through walls (40%) -#define SHIELD (1<<17) // shielding from all projectile attacks (30%) -#define SHOCKWAVE (1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%) -#define ELECTRICITY (1<<19) // ability to shoot electric attacks (15%) - - - //2spooky +//2spooky #define SKELETON 29 #define PLANT 30 // Other Mutations: #define NO_BREATH 100 // no need to breathe -#define REMOTE_VIEW 101 // remote viewing +#define REMOTE_VIEW 101 // remote viewing #define REGEN 102 // health regen -#define RUN 103 // no slowdown -#define REMOTE_TALK 104 // remote talking +#define RUN 103 // no slowdown +#define REMOTE_TALK 104 // remote talking #define MORPH 105 // changing appearance -#define RESIST_HEAT 106 // heat resistance -#define HALLUCINATE 107 // hallucinations +#define RESIST_HEAT 106 // heat resistance +#define HALLUCINATE 107 // hallucinations #define FINGERPRINTS 108 // no fingerprints #define NO_SHOCK 109 // insulated hands #define DWARF 110 // table climbing // Goon muts -#define OBESITY 200 // Decreased metabolism -#define TOXIC_FARTS 201 // Duh -#define STRONG 202 // (Nothing) -#define SOBER 203 // Increased alcohol metabolism -#define PSY_RESIST 204 // Block remoteview -#define SUPER_FART 205 // Duh -#define EMPATH 206 //Read minds +#define OBESITY 200 // Decreased metabolism +#define TOXIC_FARTS 201 // Duh +#define STRONG 202 // (Nothing) +#define SOBER 203 // Increased alcohol metabolism +#define PSY_RESIST 204 // Block remoteview +#define SUPER_FART 205 // Duh +#define EMPATH 206 //Read minds #define COMIC 207 //Comic Sans // /vg/ muts -#define LOUD 208 // CAUSES INTENSE YELLING -//#define WHISPER 209 // causes quiet whispering -#define DIZZY 210 // Trippy. +#define LOUD 208 // CAUSES INTENSE YELLING +#define DIZZY 210 // Trippy. -#define LISP 300 -#define RADIOACTIVE 301 -#define CHAV 302 -#define SWEDISH 303 -#define SCRAMBLED 304 -#define HORNS 305 -#define IMMOLATE 306 -#define CLOAK 307 -#define CHAMELEON 308 -#define CRYO 309 -#define EATER 310 +#define LISP 300 +#define RADIOACTIVE 301 +#define CHAV 302 +#define SWEDISH 303 +#define SCRAMBLED 304 +#define HORNS 305 +#define IMMOLATE 306 +#define CLOAK 307 +#define CHAMELEON 308 +#define CRYO 309 +#define EATER 310 -#define JUMPY 400 -#define POLYMORPH 401 +#define JUMPY 400 +#define POLYMORPH 401 //disabilities #define NEARSIGHTED 1 @@ -109,11 +83,9 @@ #define COUGHING 4 #define TOURETTES 8 #define NERVOUS 16 - -//sdisabilities -#define BLIND 1 -#define MUTE 2 -#define DEAF 4 +#define BLIND 32 +#define MUTE 64 +#define DEAF 128 //Nutrition levels for humans. No idea where else to put it #define NUTRITION_LEVEL_FAT 600 diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 7c2e3163fff..1d89eea87a1 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -15,18 +15,16 @@ #define DIAG_BATT_HUD "10"// Borg/Mech power meter #define DIAG_MECH_HUD "11"// Mech health bar #define STATUS_HUD_OOC "12"// STATUS_HUD without virus db check for someone being ill. -#define DIAG_BOT_HUD "13"// Bot HUDS -#define PLANT_NUTRIENT_HUD "15"// Plant nutrient level -#define PLANT_WATER_HUD "16"// Plant water level -#define PLANT_STATUS_HUD "17"// Plant harvest/dead -#define PLANT_HEALTH_HUD "18"// Plant health -#define PLANT_TOXIN_HUD "19"// Toxin level -#define PLANT_PEST_HUD "20"// Pest level -#define PLANT_WEED_HUD "21"// Weed level - -//for antag huds. these are used at the /mob level -#define SPECIALROLE_HUD "13" +#define SPECIALROLE_HUD "13" //for antag huds. these are used at the /mob level #define NATIONS_HUD "14" //Show nations icons during nations gamemode +#define DIAG_BOT_HUD "15"// Bot HUDS +#define PLANT_NUTRIENT_HUD "16"// Plant nutrient level +#define PLANT_WATER_HUD "17"// Plant water level +#define PLANT_STATUS_HUD "18"// Plant harvest/dead +#define PLANT_HEALTH_HUD "19"// Plant health +#define PLANT_TOXIN_HUD "20"// Toxin level +#define PLANT_PEST_HUD "21"// Pest level +#define PLANT_WEED_HUD "22"// Weed level //data HUD (medhud, sechud) defines //Don't forget to update human/New() if you change these! diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 1937ac3be85..8e27f9315c3 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,3 +1,5 @@ #define isatom(A) istype(A, /atom) #define ismovableatom(A) istype(A, /atom/movable) -#define isclient(A) istype(A, /client) \ No newline at end of file +#define isclient(A) istype(A, /client) + +#define isradio(A) istype(A, /obj/item/device/radio) \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index d7f2a69f190..dadb2a7a4f6 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -269,3 +269,7 @@ // Macro to get the current elapsed round time, rather than total world runtime #define ROUND_TIME (round_start_time ? (world.time - round_start_time) : 0) + +// Used by radios to indicate that they have sent a message via something other than subspace +#define RADIO_CONNECTION_FAIL 0 +#define RADIO_CONNECTION_NON_SUBSPACE 1 diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index d78bbed46bb..5d9aba0e3df 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -106,10 +106,7 @@ #define CHEM_MOB_SPAWN_HOSTILE 1 #define CHEM_MOB_SPAWN_FRIENDLY 2 -#define isobserver(A) (istype((A), /mob/dead/observer)) #define isliving(A) (istype((A), /mob/living)) -#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer)) - #define iscarbon(A) (istype((A), /mob/living/carbon)) #define ishuman(A) (istype((A), /mob/living/carbon/human)) #define isbrain(A) (istype((A), /mob/living/carbon/brain)) @@ -130,12 +127,18 @@ #define isrobot(A) (istype((A), /mob/living/silicon/robot)) #define ispAI(A) (istype((A), /mob/living/silicon/pai)) +#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer)) + #define isAIEye(A) (istype((A), /mob/camera/aiEye)) #define isovermind(A) (istype((A), /mob/camera/blob)) #define isSpirit(A) (istype((A), /mob/spirit)) #define ismask(A) (istype((A), /mob/spirit/mask)) +#define isobserver(A) (istype((A), /mob/dead/observer)) + +#define isnewplayer(A) (istype((A), /mob/new_player)) + #define isorgan(A) (istype((A), /obj/item/organ/external)) #define hasorgans(A) (ishuman(A)) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index f1498862540..0852622f2c6 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -42,7 +42,6 @@ // Like view but bypasses luminosity check /proc/hear(var/range, var/atom/source) - var/lum = source.luminosity source.luminosity = 6 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ea8411ef30b..ed0b7887e5a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -48,7 +48,7 @@ if(S.flags & IS_WHITELISTED) whitelisted_species += S.name - init_subtypes(/datum/table_recipe, table_recipes) + init_subtypes(/datum/crafting_recipe, crafting_recipes) return 1 /* // Uncomment to debug chemical reaction list. diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 0375b7aacea..6b90ace2489 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -175,7 +175,7 @@ var/syndicate_code_response//Code response for traitors. var/safety[] = list(1,2,3)//Tells the proc which options to remove later on. var/nouns[] = list("love","hate","anger","peace","pride","sympathy","bravery","loyalty","honesty","integrity","compassion","charity","success","courage","deceit","skill","beauty","brilliance","pain","misery","beliefs","dreams","justice","truth","faith","liberty","knowledge","thought","information","culture","trust","dedication","progress","education","hospitality","leisure","trouble","friendships", "relaxation") - var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine") + var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequila sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine") var/locations[] = teleportlocs.len ? teleportlocs : drinks//if null, defaults to drinks instead. var/names[] = list() @@ -269,7 +269,7 @@ var/syndicate_code_response//Code response for traitors. else syndicate_code_phrase += pick("One") syndicate_code_phrase += " " - syndicate_code_phrase += pick("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine") + syndicate_code_phrase += pick("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequila sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine") syndicate_code_phrase += "." if(4) syndicate_code_phrase += pick("I wish I was","My dad was","His mom was","Where do I find","The hero this station needs is","I'd fuck","I wouldn't trust","Someone caught","HoS caught","Someone found","I'd wrestle","I wanna kill") diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm index b642b034921..73b2b7304f6 100644 --- a/code/_globalvars/genetics.dm +++ b/code/_globalvars/genetics.dm @@ -53,7 +53,6 @@ var/CHAMELEONBLOCK = 0 var/CRYOBLOCK = 0 var/EATBLOCK = 0 var/JUMPBLOCK = 0 -//var/MELTBLOCK = 0 var/EMPATHBLOCK = 0 var/SUPERFARTBLOCK = 0 var/IMMOLATEBLOCK = 0 @@ -63,7 +62,6 @@ var/POLYMORPHBLOCK = 0 // /vg/ Mutations /////////////////////////////// var/LOUDBLOCK = 0 -//var/WHISPERBLOCK = 0 var/DIZZYBLOCK = 0 var/list/reg_dna = list( ) //this appears to be a list of UE == real_name correlations diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index d230dc529ef..4cdc0bef33d 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -7,12 +7,6 @@ var/global/list/binary = list("0","1") var/global/list/day_names = list("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") var/global/list/month_names = list("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December") -//Reagent stuff -var/list/tachycardics = list("coffee", "methamphetamine", "nitroglycerin", "thirteenloko", "nicotine") //increase heart rate -var/list/bradycardics = list("neurotoxin", "cryoxadone", "space_drugs") //decrease heart rate -var/list/heartstopper = list("capulettium", "capulettium_plus") //this stops the heart -var/list/cheartstopper = list() //this stops the heart when overdose is met -- c = conditional - var/list/restricted_camera_networks = list( //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them. "CentComm", "ERT", diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index ec3be384bad..9204d5ec524 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -11,7 +11,7 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI var/global/list/airlocks = list() //list of all airlocks var/global/list/singularities = list() //list of all singularities var/global/list/janitorial_equipment = list() //list of janitorial equipment -var/global/list/table_recipes = list() //list of all table craft recipes +var/global/list/crafting_recipes = list() //list of all crafting recipes var/global/list/all_areas = list() var/global/list/machines = list() @@ -30,4 +30,4 @@ var/global/list/beacons = list() var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none. var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented... var/global/list/abductor_equipment = list() //list of all abductor equipment -var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels \ No newline at end of file +var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 23d310be857..4b9786a86df 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -34,10 +34,10 @@ var/list/drinks = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice "nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee", "icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb", "space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater", - "tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater", + "tequila","vermouth","wine","tonic","kahlua","cognac","ale","sodawater", "ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic", "cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail", - "booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial", + "booger","bloodymary","gargleblaster","bravebull","tequilasunrise","toxinsspecial", "beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea", "moonshine","b52","irishcoffee","margarita","blackrussian","manhattan", "manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood", diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index d04022cc3e8..3fb4ff12d38 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -35,8 +35,7 @@ #define ui_swaphand2 "CENTER: 16,SOUTH+1:5" #define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5" - -#define ui_pda "CENTER+3:22,SOUTH:5" +#define ui_crafting "12:-10,1:5" #define ui_alien_head "4:12,1:5" //aliens #define ui_alien_oclothing "5:14,1:5" //aliens @@ -154,4 +153,4 @@ #define HUD_VERSIONS 3 //used in show_hud() //1 = standard hud //2 = reduced hud (just hands and intent switcher) -//3 = no hud (for screenshots) \ No newline at end of file +//3 = no hud (for screenshots) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm deleted file mode 100644 index 4744b789712..00000000000 --- a/code/_onclick/hud/action.dm +++ /dev/null @@ -1,315 +0,0 @@ -#define AB_ITEM 1 -#define AB_SPELL 2 -#define AB_INNATE 3 -#define AB_GENERIC 4 - -#define AB_CHECK_RESTRAINED 1 -#define AB_CHECK_STUNNED 2 -#define AB_CHECK_LYING 4 -#define AB_CHECK_ALIVE 8 -#define AB_CHECK_INSIDE 16 - - -/datum/action - var/name = "Generic Action" - var/action_type = AB_ITEM - var/procname = null - var/atom/movable/target = null - var/check_flags = 0 - var/processing = 0 - var/active = 0 - var/obj/screen/movable/action_button/button = null - var/button_icon = 'icons/mob/actions.dmi' - var/button_icon_state = "default" - var/background_icon_state = "bg_default" - var/mob/living/owner - -/datum/action/New(var/Target) - target = Target - -/datum/action/Destroy() - if(owner) - Remove(owner) - if(target) - target = null - return ..() - -/datum/action/proc/Grant(mob/living/T) - if(owner) - if(owner == T) - return - Remove(owner) - owner = T - owner.actions.Add(src) - owner.update_action_buttons() - return - -/datum/action/proc/Remove(mob/living/T) - if(button) - if(T.client) - T.client.screen -= button - qdel(button) - button = null - if(T.actions) - T.actions.Remove(src) - T.update_action_buttons() - owner = null - return - -/datum/action/proc/Trigger() - if(!Checks()) - return - switch(action_type) - if(AB_ITEM) - if(target) - var/obj/item/item = target - item.ui_action_click() - if(AB_SPELL) - if(target) - var/obj/effect/proc_holder/spell = target - spell.Click() - if(AB_INNATE) - if(!active) - Activate() - else - Deactivate() - if(AB_GENERIC) - if(target && procname) - call(target,procname)(usr) - return - -/datum/action/proc/Activate() - return - -/datum/action/proc/Deactivate() - return - -/datum/action/proc/Process() - return - -/datum/action/proc/CheckRemoval(mob/living/user) // 1 if action is no longer valid for this mob and should be removed - return 0 - -/datum/action/proc/IsAvailable() - return Checks() - -/datum/action/proc/Checks()// returns 1 if all checks pass - if(!owner) - return 0 - if(check_flags & AB_CHECK_RESTRAINED) - if(owner.restrained()) - return 0 - if(check_flags & AB_CHECK_STUNNED) - if(owner.stunned) - return 0 - if(check_flags & AB_CHECK_LYING) - if(owner.lying) - return 0 - if(check_flags & AB_CHECK_ALIVE) - if(owner.stat) - return 0 - if(check_flags & AB_CHECK_INSIDE) - if(!(target in owner)) - return 0 - return 1 - -/datum/action/proc/UpdateName() - return name - -/obj/screen/movable/action_button - var/datum/action/owner - screen_loc = "WEST,NORTH" - -/obj/screen/movable/action_button/Click(location,control,params) - var/list/modifiers = params2list(params) - if(modifiers["shift"]) - moved = 0 - return 1 - if(usr.next_move >= world.time) // Is this needed ? - return - owner.Trigger() - return 1 - -/obj/screen/movable/action_button/proc/UpdateIcon() - if(!owner) - return - icon = owner.button_icon - icon_state = owner.background_icon_state - - overlays.Cut() - var/image/img - if(owner.action_type == AB_ITEM && owner.target) - var/obj/item/I = owner.target - img = image(I.icon, src , I.icon_state) - else if(owner.button_icon && owner.button_icon_state) - img = image(owner.button_icon,src,owner.button_icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - overlays += img - - if(!owner.IsAvailable()) - color = rgb(128,0,0,128) - else - color = rgb(255,255,255,255) - -//Hide/Show Action Buttons ... Button -/obj/screen/movable/action_button/hide_toggle - name = "Hide Buttons" - icon = 'icons/mob/actions.dmi' - icon_state = "bg_default" - var/hidden = 0 - -/obj/screen/movable/action_button/hide_toggle/Click() - usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden - - hidden = usr.hud_used.action_buttons_hidden - if(hidden) - name = "Show Buttons" - else - name = "Hide Buttons" - UpdateIcon() - usr.update_action_buttons() - - -/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user) - if(isalien(user)) - icon_state = "bg_alien" - else - icon_state = "bg_default" - UpdateIcon() - return - -/obj/screen/movable/action_button/hide_toggle/UpdateIcon() - overlays.Cut() - var/image/img = image(icon,src,hidden?"show":"hide") - overlays += img - return - -//This is the proc used to update all the action buttons. Properly defined in /mob/living/ -/mob/proc/update_action_buttons() - return - -#define AB_WEST_OFFSET 4 -#define AB_NORTH_OFFSET 26 -#define AB_MAX_COLUMNS 10 - -/datum/hud/proc/ButtonNumberToScreenCoords(var/number) // TODO : Make this zero-indexed for readabilty - var/row = round((number-1)/AB_MAX_COLUMNS) - var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 - var/coord_col = "+[col-1]" - var/coord_col_offset = 4+2*col - var/coord_row = "[-1 - row]" - var/coord_row_offset = 26 - return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:[coord_row_offset]" - -/datum/hud/proc/SetButtonCoords(var/obj/screen/button,var/number) - var/row = round((number-1)/AB_MAX_COLUMNS) - var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 - var/x_offset = 32*(col-1) + 4 + 2*col - var/y_offset = -32*(row+1) + 26 - - var/matrix/M = matrix() - M.Translate(x_offset,y_offset) - button.transform = M - -//Presets for item actions -/datum/action/item_action - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE - -/datum/action/item_action/CheckRemoval(mob/living/user) - return get(target, /mob/living) != user - -/datum/action/item_action/hands_free - check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE - -// for clothing accessories like holsters -/datum/action/item_action/accessory - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE - -/datum/action/item_action/accessory/Checks() - . = ..() - if(!.) - return 0 - if(target.loc == owner) - return 1 - if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner) - return 1 - return 0 - -///prset for organ actions -/datum/action/item_action/organ_action - check_flags = AB_CHECK_ALIVE - -/datum/action/item_action/organ_action/CheckRemoval(mob/living/carbon/user) - if(!iscarbon(user)) - return 1 - if(target in user.internal_organs) - return 0 - return 1 - -/datum/action/item_action/organ_action/IsAvailable() - var/obj/item/organ/internal/I = target - if(!I.owner) - return 0 - return ..() - -//Preset for spells -/datum/action/spell_action - action_type = AB_SPELL - check_flags = 0 - background_icon_state = "bg_spell" - -/datum/action/spell_action/UpdateName() - var/obj/effect/proc_holder/spell/spell = target - if(!spell) - return 0 - return spell.name - -/datum/action/spell_action/IsAvailable() - if(!target) - return 0 - var/obj/effect/proc_holder/spell/spell = target - - if(usr) - return spell.can_cast(usr) - else - if(owner) - return spell.can_cast(owner) - return 1 - -/datum/action/spell_action/CheckRemoval() - if(owner.mind) - if(target in owner.mind.spell_list) - return 0 - return !(target in owner.spell_list) - - //Action button controlling a mob's research examine ability. -/datum/action/scan_mode - name = "Toggle Research Scanner" - button_icon_state = "scan_mode" - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_ALIVE - action_type = AB_INNATE - var/devices = 0 //How may enabled scanners the mob has - -/datum/action/scan_mode/Activate() - active = 1 - owner.research_scanner = 1 - to_chat(owner, " Research analyzer is now active.") - -/datum/action/scan_mode/Deactivate() - active = 0 - owner.research_scanner = 0 - to_chat(owner, " Research analyzer deactivated.") - -/datum/action/scan_mode/Grant(mob/living/T) - devices += 1 - ..(T) - -/datum/action/scan_mode/CheckRemoval(mob/living/user) - if(devices) - return 0 - return 1 - -/datum/action/scan_mode/Remove(mob/living/T) - owner.research_scanner = 0 - ..(T) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm new file mode 100644 index 00000000000..16cb8baa044 --- /dev/null +++ b/code/_onclick/hud/action_button.dm @@ -0,0 +1,127 @@ + +/obj/screen/movable/action_button + var/datum/action/linked_action + screen_loc = null + +/obj/screen/movable/action_button/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + usr.update_action_buttons() //redraw buttons that are no longer considered "moved" + return 1 + if(usr.next_move >= world.time) // Is this needed ? + return + linked_action.Trigger() + return 1 + +//Hide/Show Action Buttons ... Button +/obj/screen/movable/action_button/hide_toggle + name = "Hide Buttons" + icon = 'icons/mob/actions.dmi' + icon_state = "bg_default" + var/hidden = 0 + +/obj/screen/movable/action_button/hide_toggle/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + return 1 + usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden + + hidden = usr.hud_used.action_buttons_hidden + if(hidden) + name = "Show Buttons" + else + name = "Hide Buttons" + UpdateIcon() + usr.update_action_buttons() + + +/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) + if(isalien(user)) + icon_state = "bg_alien" + else + icon_state = "bg_default" + UpdateIcon() + +/obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon() + overlays.Cut() + var/image/img = image(icon, src, hidden ? "show" : "hide") + overlays += img + + +/obj/screen/movable/action_button/MouseEntered(location,control,params) + openToolTip(usr,src,params,title = name,content = desc) + + +/obj/screen/movable/action_button/MouseExited() + closeToolTip(usr) + + +/mob/proc/update_action_buttons_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +//This is the proc used to update all the action buttons. +/mob/proc/update_action_buttons(reload_screen) + if(!hud_used || !client) + return + + if(hud_used.hud_shown != HUD_STYLE_STANDARD) + return + + var/button_number = 0 + + if(hud_used.action_buttons_hidden) + for(var/datum/action/A in actions) + A.button.screen_loc = null + if(reload_screen) + client.screen += A.button + else + for(var/datum/action/A in actions) + button_number++ + A.UpdateButtonIcon() + var/obj/screen/movable/action_button/B = A.button + if(!B.moved) + B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + else + B.screen_loc = B.moved + if(reload_screen) + client.screen += B + + if(!button_number) + hud_used.hide_actions_toggle.screen_loc = null + return + + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) + else + hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved + if(reload_screen) + client.screen += hud_used.hide_actions_toggle + + + +#define AB_MAX_COLUMNS 10 + +/datum/hud/proc/ButtonNumberToScreenCoords(number) // TODO : Make this zero-indexed for readabilty + var/row = round((number - 1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + + var/coord_col = "+[col-1]" + var/coord_col_offset = 4 + 2 * col + + var/coord_row = "[row ? -row : "+0"]" + + return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" + +/datum/hud/proc/SetButtonCoords(obj/screen/button,number) + var/row = round((number-1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + var/x_offset = 32*(col-1) + 4 + 2*col + var/y_offset = -32*(row+1) + 26 + + var/matrix/M = matrix() + M.Translate(x_offset,y_offset) + button.transform = M diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index e49e99ad6b7..29e7c676ac4 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -36,12 +36,16 @@ var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = 0 + var/obj/screen/internals + /mob/proc/create_mob_hud() if(client && !hud_used) hud_used = new /datum/hud(src) /datum/hud/New(mob/owner) mymob = owner + hide_actions_toggle = new + hide_actions_toggle.InitialiseIcon(mymob) /datum/hud/Destroy() if(mymob.hud_used == src) @@ -79,7 +83,6 @@ //clear mob refs to screen objects mymob.throw_icon = null - mymob.internals = null mymob.healths = null mymob.healthdoll = null mymob.pullin = null @@ -92,6 +95,7 @@ alien_plasma_display = null vampire_blood_display = null nightvisionicon = null + internals = null mymob = null return ..() @@ -122,6 +126,8 @@ if(infodisplay.len) mymob.client.screen += infodisplay + mymob.client.screen += hide_actions_toggle + if(action_intent) action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position @@ -158,7 +164,7 @@ hud_version = display_hud_version persistant_inventory_update() - mymob.update_action_buttons() + mymob.update_action_buttons(1) reorganize_alerts() reload_fullscreen() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 3a6e9df5dae..5227a25cde7 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -60,6 +60,12 @@ var/obj/screen/using var/obj/screen/inventory/inv_box + using = new /obj/screen/inventory/craft + using.icon = ui_style + using.color = ui_color + using.alpha = ui_alpha + static_inventory += using + using = new /obj/screen/act_intent() using.icon_state = mymob.a_intent using.color = ui_color @@ -151,16 +157,6 @@ inv_box.alpha = ui_alpha static_inventory += inv_box - inv_box = new /obj/screen/inventory() - inv_box.name = "pda" - inv_box.icon = ui_style - inv_box.icon_state = "pda" - inv_box.screen_loc = ui_pda - inv_box.slot_id = slot_wear_pda - inv_box.color = ui_color - inv_box.alpha = ui_alpha - static_inventory += inv_box - inv_box = new /obj/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style @@ -309,8 +305,8 @@ mymob.throw_icon.alpha = ui_alpha hotkeybuttons += mymob.throw_icon - mymob.internals = new /obj/screen/internals() - infodisplay += mymob.internals + internals = new /obj/screen/internals() + infodisplay += internals mymob.healths = new /obj/screen/healths() infodisplay += mymob.healths @@ -397,9 +393,6 @@ if(H.wear_id) H.wear_id.screen_loc = ui_id H.client.screen += H.wear_id - if(H.wear_pda) - H.wear_pda.screen_loc = ui_pda - H.client.screen += H.wear_pda if(H.belt) H.belt.screen_loc = ui_belt H.client.screen += H.belt @@ -417,8 +410,6 @@ H.s_store.screen_loc = null if(H.wear_id) H.wear_id.screen_loc = null - if(H.wear_pda) - H.wear_pda.screen_loc = null if(H.belt) H.belt.screen_loc = null if(H.back) @@ -452,4 +443,4 @@ hud_used.hotkey_ui_hidden = 0 else client.screen -= hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = 1 \ No newline at end of file + hud_used.hotkey_ui_hidden = 1 diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index ef87435c79f..c6bbbd27ae2 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -96,8 +96,8 @@ mymob.throw_icon.alpha = ui_alpha hotkeybuttons += mymob.throw_icon - mymob.internals = new /obj/screen/internals() - infodisplay += mymob.internals + internals = new /obj/screen/internals() + infodisplay += internals mymob.healths = new /obj/screen/healths() infodisplay += mymob.healths diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index e8d4e4b3d73..315fce5bf65 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -43,7 +43,7 @@ var/pix_Y = text2num(screen_loc_Y[2]) - 16 screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" - moved = TRUE + moved = screen_loc //Debug procs diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 1b32a9201a3..dc59cf16097 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -96,114 +96,99 @@ screen_loc = ui_internal /obj/screen/internals/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) - if(C.internal) - C.internal = null - to_chat(C, "No longer running on internals.") - if(C.internals) - C.internals.icon_state = "internal0" - else + if(!iscarbon(usr)) + return + var/mob/living/carbon/C = usr + if(C.incapacitated()) + return - var/no_mask - if(!(C.wear_mask && C.wear_mask.flags & AIRTIGHT)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!(H.head && H.head.flags & AIRTIGHT)) - no_mask = 1 + if(C.internal) + C.internal = null + to_chat(C, "No longer running on internals.") + icon_state = "internal0" + else + var/no_mask = FALSE + if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(!H.head || !(H.head.flags & AIRTIGHT)) + no_mask = TRUE - if(no_mask) - to_chat(C, "You are not wearing a suitable mask or helmet.") - return 1 - else - var/list/nicename = null - var/list/tankcheck = null - var/breathes = "oxygen" //default, we'll check later - var/list/contents = list() - var/from = "on" + if(no_mask) + to_chat(C, "You are not wearing a suitable mask or helmet.") + return - if(ishuman(C)) - var/mob/living/carbon/human/H = C - breathes = H.species.breath_type - nicename = list ("suit", "back", "belt", "right hand", "left hand", "left pocket", "right pocket") - tankcheck = list (H.s_store, C.back, H.belt, C.r_hand, C.l_hand, H.l_store, H.r_store) - else - nicename = list("right hand", "left hand", "back") - tankcheck = list(C.r_hand, C.l_hand, C.back) + var/list/nicename = null + var/list/tankcheck = null + var/breathes = "oxygen" + var/list/contents = list() + var/from = "on" - // Rigs are a fucking pain since they keep an air tank in nullspace. - if(istype(C.back,/obj/item/weapon/rig)) - var/obj/item/weapon/rig/rig = C.back - if(rig.air_supply) - from = "in" - nicename |= "hardsuit" - tankcheck |= rig.air_supply - - for(var/i=1, i bestcontents) + best = i + bestcontents = contents[i] + //We've determined the best container now we set it as our internals + if(best) + to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].") + C.internal = tankcheck[best] - var/best = 0 - var/bestcontents = 0 - for(var/i=1, i < contents.len + 1 , ++i) - if(!contents[i]) - continue - if(contents[i] > bestcontents) - best = i - bestcontents = contents[i] + if(C.internal) + icon_state = "internal1" + else + to_chat(C, "You don't have a[breathes == "oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.") - - //We've determined the best container now we set it as our internals - - if(best) - to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].") - C.internal = tankcheck[best] - - - if(C.internal) - if(C.internals) - C.internals.icon_state = "internal1" - else - to_chat(C, "You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.") + C.update_action_buttons_icon() /obj/screen/mov_intent name = "run/walk toggle" @@ -361,6 +346,16 @@ /obj/screen/zone_sel/robot icon = 'icons/mob/screen_robot.dmi' +/obj/screen/inventory/craft + name = "crafting menu" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "craft" + screen_loc = ui_crafting + +/obj/screen/inventory/craft/Click() + var/mob/living/M = usr + M.OpenCraftingMenu() + /obj/screen/inventory var/slot_id //The indentifier for the slot. It has nothing to do with ID cards. layer = 19 @@ -473,4 +468,3 @@ name = "health doll" icon_state = "healthdoll_DEAD" screen_loc = ui_healthdoll - diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 3ccc03acaff..6c363e6770a 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -15,13 +15,8 @@ /mob/living/attackby(obj/item/I, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) - if(stat == DEAD && !isnull(butcher_results)) //can we butcher it? - if(istype(I, /obj/item/weapon/kitchen/knife)) - to_chat(user, "You begin to butcher [src]...") - playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) - if(do_mob(user, src, 80)) - harvest(user) - return + if(attempt_harvest(I, user)) + return I.attack(src, user) diff --git a/code/datums/action.dm b/code/datums/action.dm new file mode 100644 index 00000000000..2f7e6296f80 --- /dev/null +++ b/code/datums/action.dm @@ -0,0 +1,410 @@ +#define AB_CHECK_RESTRAINED 1 +#define AB_CHECK_STUNNED 2 +#define AB_CHECK_LYING 4 +#define AB_CHECK_CONSCIOUS 8 + + +/datum/action + var/name = "Generic Action" + var/desc = null + var/obj/target = null + var/check_flags = 0 + var/processing = 0 + var/obj/screen/movable/action_button/button = null + var/button_icon = 'icons/mob/actions.dmi' + var/background_icon_state = "bg_default" + + var/icon_icon = 'icons/mob/actions.dmi' + var/button_icon_state = "default" + var/mob/owner + +/datum/action/New(var/Target) + target = Target + button = new + button.linked_action = src + button.name = name + +/datum/action/Destroy() + if(owner) + Remove(owner) + if(target) + target = null + qdel(button) + button = null + return ..() + +/datum/action/proc/Grant(mob/M) + if(owner) + if(owner == M) + return + Remove(owner) + owner = M + M.actions += src + if(M.client) + M.client.screen += button + M.update_action_buttons() + +/datum/action/proc/Remove(mob/M) + if(M.client) + M.client.screen -= button + button.moved = FALSE //so the button appears in its normal position when given to another owner. + M.actions -= src + M.update_action_buttons() + owner = null + +/datum/action/proc/Trigger() + if(!IsAvailable()) + return 0 + return 1 + +/datum/action/proc/Process() + return + +/datum/action/proc/IsAvailable()// returns 1 if all checks pass + if(!owner) + return 0 + if(check_flags & AB_CHECK_RESTRAINED) + if(owner.restrained()) + return 0 + if(check_flags & AB_CHECK_STUNNED) + if(owner.stunned || owner.weakened) + return 0 + if(check_flags & AB_CHECK_LYING) + if(owner.lying) + return 0 + if(check_flags & AB_CHECK_CONSCIOUS) + if(owner.stat) + return 0 + return 1 + +/datum/action/proc/UpdateButtonIcon() + if(button) + button.icon = button_icon + button.icon_state = background_icon_state + + ApplyIcon(button) + + if(!IsAvailable()) + button.color = rgb(128,0,0,128) + else + button.color = rgb(255,255,255,255) + return 1 + +/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.overlays.Cut() + if(icon_icon && button_icon_state) + var/image/img + img = image(icon_icon, current_button, button_icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + current_button.overlays += img + +//Presets for item actions +/datum/action/item_action + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + +/datum/action/item_action/New(Target) + ..() + var/obj/item/I = target + I.actions += src + +/datum/action/item_action/Destroy() + var/obj/item/I = target + I.actions -= src + return ..() + +/datum/action/item_action/Trigger() + if(!..()) + return 0 + if(target) + var/obj/item/I = target + I.ui_action_click(owner, type) + return 1 + +/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.overlays.Cut() + if(target) + var/obj/item/I = target + var/old_layer = I.layer + var/old_plane = I.plane + I.layer = 21 + I.plane = HUD_PLANE + current_button.overlays += I + I.layer = old_layer + I.plane = old_plane + +/datum/action/item_action/toggle_light + name = "Toggle Light" + +/datum/action/item_action/toggle_hood + name = "Toggle Hood" + +/datum/action/item_action/toggle_firemode + name = "Toggle Firemode" + +/datum/action/item_action/startchainsaw + name = "Pull The Starting Cord" + +/datum/action/item_action/toggle_gunlight + name = "Toggle Gunlight" + +/datum/action/item_action/toggle_mode + name = "Toggle Mode" + +/datum/action/item_action/toggle_barrier_spread + name = "Toggle Barrier Spread" + +/datum/action/item_action/equip_unequip_TED_Gun + name = "Equip/Unequip TED Gun" + +/datum/action/item_action/toggle_paddles + name = "Toggle Paddles" + +/datum/action/item_action/set_internals + name = "Set Internals" + +/datum/action/item_action/set_internals/UpdateButtonIcon() + if(..()) //button available + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + if(target == C.internal) + button.icon_state = "bg_default_on" + +/datum/action/item_action/toggle_mister + name = "Toggle Mister" + +/datum/action/item_action/toggle_helmet_light + name = "Toggle Helmet Light" + +/datum/action/item_action/toggle_helmet_mode + name = "Toggle Helmet Mode" + +/datum/action/item_action/toggle_hardsuit_mode + name = "Toggle Hardsuit Mode" + +/datum/action/item_action/toggle + +/datum/action/item_action/toggle/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + +/datum/action/item_action/openclose + +/datum/action/item_action/openclose/New(Target) + ..() + name = "Open/Close [target.name]" + button.name = name + +/datum/action/item_action/button + +/datum/action/item_action/button/New(Target) + ..() + name = "Button/Unbutton [target.name]" + button.name = name + +/datum/action/item_action/zipper + +/datum/action/item_action/zipper/New(Target) + ..() + name = "Zip/Unzip [target.name]" + button.name = name + +/datum/action/item_action/halt + name = "HALT!" + +/datum/action/item_action/hoot + name = "Hoot" + +/datum/action/item_action/caw + name = "Caw" + +/datum/action/item_action/toggle_voice_box + name = "Toggle Voice Box" + +/datum/action/item_action/change + name = "Change" + +/datum/action/item_action/noir + name = "Noir" + +/datum/action/item_action/YEEEAAAAAHHHHHHHHHHHHH + name = "YEAH!" + +/datum/action/item_action/adjust + +/datum/action/item_action/adjust/New(Target) + ..() + name = "Adjust [target.name]" + button.name = name + +/datum/action/item_action/switch_hud + name = "Switch HUD" + +/datum/action/item_action/toggle_wings + name = "Toggle Wings" + +/datum/action/item_action/toggle_helmet + name = "Toggle Helmet" + +/datum/action/item_action/toggle_jetpack + name = "Toggle Jetpack" + +/datum/action/item_action/jetpack_stabilization + name = "Toggle Jetpack Stabilization" + +/datum/action/item_action/jetpack_stabilization/IsAvailable() + var/obj/item/weapon/tank/jetpack/J = target + if(!istype(J) || !J.on) + return 0 + return ..() + +/datum/action/item_action/hands_free + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/hands_free/activate + name = "Activate" + +/datum/action/item_action/toggle_research_scanner + name = "Toggle Research Scanner" + button_icon_state = "scan_mode" + +/datum/action/item_action/toggle_research_scanner/Trigger() + if(IsAvailable()) + owner.research_scanner = !owner.research_scanner + to_chat(owner, "Research analyzer is now [owner.research_scanner ? "active" : "deactivated"].") + return 1 + +/datum/action/item_action/toggle_research_scanner/Remove(mob/living/L) + if(owner) + owner.research_scanner = 0 + ..() + +/datum/action/item_action/toggle_research_scanner/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.overlays.Cut() + if(button_icon && button_icon_state) + var/image/img = image(button_icon, current_button, "scan_mode") + current_button.overlays += img + +/datum/action/item_action/remove_badge + name = "Remove Holobadge" + +///prset for organ actions +/datum/action/item_action/organ_action + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/organ_action/IsAvailable() + var/obj/item/organ/internal/I = target + if(!I.owner) + return 0 + return ..() + +/datum/action/item_action/organ_action/toggle + +/datum/action/item_action/organ_action/toggle/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + +// for clothing accessories like holsters +/datum/action/item_action/accessory + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + +/datum/action/item_action/accessory/IsAvailable() + . = ..() + if(!.) + return 0 + if(target.loc == owner) + return 1 + if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner) + return 1 + return 0 + +/datum/action/item_action/accessory/holster + name = "Holster" + +/datum/action/item_action/accessory/storage + name = "View Storage" + + +//Preset for spells +/datum/action/spell_action + check_flags = 0 + background_icon_state = "bg_spell" + +/datum/action/spell_action/New(Target) + ..() + var/obj/effect/proc_holder/spell/S = target + S.action = src + name = S.name + button_icon = S.action_icon + button_icon_state = S.action_icon_state + background_icon_state = S.action_background_icon_state + button.name = name + +/datum/action/spell_action/Destroy() + var/obj/effect/proc_holder/spell/S = target + S.action = null + return ..() + +/datum/action/spell_action/Trigger() + if(!..()) + return 0 + if(target) + var/obj/effect/proc_holder/spell = target + spell.Click() + return 1 + +/datum/action/spell_action/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/spell/spell = target + + if(owner) + return spell.can_cast(owner) + return 0 + +/* +/datum/action/spell_action/alien + +/datum/action/spell_action/alien/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/alien/ab = target + + if(owner) + return ab.cost_check(ab.check_turf, owner, 1) + return 0 +*/ + +//Preset for general and toggled actions +/datum/action/innate + check_flags = 0 + var/active = 0 + +/datum/action/innate/Trigger() + if(!..()) + return 0 + if(!active) + Activate() + else + Deactivate() + return 1 + +/datum/action/innate/proc/Activate() + return + +/datum/action/innate/proc/Deactivate() + return + +//Preset for action that call specific procs (consider innate) +/datum/action/generic + check_flags = 0 + var/procname + +/datum/action/generic/Trigger() + if(!..()) + return 0 + if(target && procname) + call(target,procname)(usr) + return 1 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 750c0f2f5df..2863e8a595c 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -990,7 +990,6 @@ qdel(H.head) qdel(H.shoes) qdel(H.wear_id) - qdel(H.wear_pda) qdel(H.wear_suit) qdel(H.w_uniform) @@ -1056,18 +1055,13 @@ switch(href_list["shadowling"]) if("clear") ticker.mode.update_shadow_icons_removed(src) - current.spell_list.Cut() if(src in ticker.mode.shadows) ticker.mode.shadows -= src special_role = null to_chat(current, "Your powers have been quenched! You are no longer a shadowling!") - current.spell_list.Cut() - if(current.mind) - current.mind.spell_list.Cut() message_admins("[key_name_admin(usr)] has de-shadowlinged [current].") log_admin("[key_name(usr)] has de-shadowlinged [current].") - remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch) - remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_ascend) + current.spellremove(current) current.remove_language("Shadowling Hivemind") else if(src in ticker.mode.shadowling_thralls) ticker.mode.remove_thrall(src,0) @@ -1322,7 +1316,6 @@ qdel(H.head) qdel(H.shoes) qdel(H.wear_id) - qdel(H.wear_pda) qdel(H.wear_suit) qdel(H.w_uniform) @@ -1490,17 +1483,17 @@ return (duration <= world.time - brigged_since) -/datum/mind/proc/AddSpell(var/obj/effect/proc_holder/spell/spell) - spell_list += spell - if(!spell.action) - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - spell.action.Grant(current) - return +/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) + spell_list += S + S.action.Grant(current) + +/datum/mind/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind + if(!spell) + return + for(var/obj/effect/proc_holder/spell/S in spell_list) + if(istype(S, spell)) + qdel(S) + spell_list -= S /datum/mind/proc/transfer_actions(var/mob/living/new_character) if(current && current.actions) @@ -1509,16 +1502,9 @@ transfer_mindbound_actions(new_character) /datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) - for(var/obj/effect/proc_holder/spell/spell in spell_list) - if(!spell.action) // Unlikely but whatever - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - spell.action.Grant(new_character) - return + for(var/X in spell_list) + var/obj/effect/proc_holder/spell/S = X + S.action.Grant(new_character) /datum/mind/proc/get_ghost(even_if_they_cant_reenter) for(var/mob/dead/observer/G in dead_mob_list) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 978eb6e77a2..c7aa3dfd9a0 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -57,7 +57,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.spell_list)) + if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) to_chat(user, "You shouldn't have this spell! Something's wrong.") return 0 if(istype(user, /mob/living/carbon/human)) @@ -91,7 +91,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled()) to_chat(user, "Mmmf mrrfff!") return 0 - var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.spell_list | (user.mind ? user.mind.spell_list : list())) + var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list())) if(clothes_req && !(spell && istype(spell)))//clothes check if(!istype(user, /mob/living/carbon/human)) to_chat(user, "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans.") @@ -134,6 +134,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/New() ..() + action = new(src) still_recharging_msg = "[name] is still recharging." charge_counter = charge_max @@ -152,9 +153,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin return /obj/effect/proc_holder/spell/proc/start_recharge() + if(action) + action.UpdateButtonIcon() while(charge_counter < charge_max) sleep(1) charge_counter++ + if(action) + action.UpdateButtonIcon() /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells before_cast(targets) @@ -355,7 +360,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin return 1 /obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr) - if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.spell_list)) + if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) return 0 if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel @@ -381,7 +386,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled()) return 0 - var/obj/effect/proc_holder/spell/noclothes/clothcheck = locate() in user.spell_list + var/obj/effect/proc_holder/spell/noclothes/clothcheck = locate() in user.mob_spell_list var/obj/effect/proc_holder/spell/noclothes/clothcheck2 = locate() in user.mind.spell_list if(clothes_req && !(clothcheck && istype(clothcheck)) && !(clothcheck2 && istype(clothcheck2)))//clothes check if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard)) diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index b46472c35b9..1551dbc3b68 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -20,8 +20,8 @@ if(L.pulling && (istype(L.pulling, /mob/living))) var/mob/living/M = L.pulling - if(M.spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0)) - for(var/obj/effect/proc_holder/spell/S in M.spell_list) + if(M.mob_spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0)) + for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list) S.charge_counter = S.charge_max if(M.mind) for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm index 036e2158989..e61819dc183 100644 --- a/code/datums/spells/genetic.dm +++ b/code/datums/spells/genetic.dm @@ -2,7 +2,7 @@ name = "Genetic" desc = "This spell inflicts a set of mutations and disabilities upon the target." - var/sdisabilities = 0 //bits + var/disabilities = 0 //bits var/list/mutations = list() //mutation strings var/duration = 100 //deciseconds /* @@ -22,14 +22,14 @@ target.mutations.Add(x) /* if(x == HULK && ishuman(target)) target:hulk_time=world.time + duration */ - target.sdisabilities |= sdisabilities + target.disabilities |= disabilities target.update_mutations() //update target's mutation overlays var/mob/living/carbon/human/H = target if(ishuman(target)) H.update_body() spawn(duration) target.mutations.Remove(mutations) - target.sdisabilities &= ~sdisabilities + target.disabilities &= ~disabilities target.update_mutations() if(ishuman(target)) H.update_body() diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index 514cb95dce4..4195052fdda 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -19,19 +19,18 @@ Urist: I don't feel like figuring out how you store object spells so I'm leaving Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering. Also, you never added distance checking after target is selected. I've went ahead and did that. */ -/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr) +/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets, mob/user = usr, distanceoverride) if(!targets.len) to_chat(user, "No mind found.") return if(targets.len > 1) to_chat(user, "Too many minds! You're not a hive damnit!")//Whaa...aat? - return var/mob/living/target = targets[1] - if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. + if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. to_chat(user, "They are too far away!") return @@ -64,18 +63,16 @@ Also, you never added distance checking after target is selected. I've went ahea victim.verbs -= V var/mob/dead/observer/ghost = victim.ghostize(0) - ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob. - caster.mind.transfer_to(victim) - victim.spell_list = caster.spell_list//Now they are inside the victim's body. if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. for(var/V in caster.mind.special_verbs)//Not too important but could come into play. caster.verbs += V ghost.mind.transfer_to(caster) - caster.key = ghost.key //have to transfer the key since the mind was not active - caster.spell_list = ghost.spell_list + if(ghost.key) + caster.key = ghost.key //have to transfer the key since the mind was not active + qdel(ghost) if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. for(var/V in caster.mind.special_verbs) diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 8a056245b16..33cc6b8d574 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -231,7 +231,7 @@ amt_eye_blurry = 20 /obj/effect/proc_holder/spell/targeted/genetic/blind - sdisabilities = BLIND + disabilities = BLIND duration = 300 /obj/effect/proc_holder/spell/dumbfire/fireball diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 4b468d81ccc..8deb2dc1a68 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -861,8 +861,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Food Crate" contains = list(/obj/item/weapon/reagent_containers/food/condiment/flour, /obj/item/weapon/reagent_containers/food/condiment/rice, - /obj/item/weapon/reagent_containers/food/drinks/milk, - /obj/item/weapon/reagent_containers/food/drinks/soymilk, + /obj/item/weapon/reagent_containers/food/condiment/milk, + /obj/item/weapon/reagent_containers/food/condiment/soymilk, /obj/item/weapon/reagent_containers/food/condiment/saltshaker, /obj/item/weapon/reagent_containers/food/condiment/peppermill, /obj/item/weapon/storage/fancy/egg_box, diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 4ca4c38f68a..cafbb579f34 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -412,6 +412,16 @@ var/list/uplink_items = list() item = /obj/item/weapon/melee/energy/sword/saber cost = 8 +/datum/uplink_item/dangerous/powerfist + name = "Power Fist" + desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\ + Upon hitting a target, the piston-ram will extend foward to make contact for some serious damage. \ + Using a wrench on the piston valve will allow you to tweak the amount of gas used per punch to \ + deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks." + reference = "PF" + item = /obj/item/weapon/melee/powerfist + cost = 8 + /datum/uplink_item/dangerous/chainsaw name = "Chainsaw" desc = "A high powered chainsaw for cutting up ...you know...." @@ -752,6 +762,13 @@ var/list/uplink_items = list() item = /obj/item/toy/carpplushie/dehy_carp cost = 3 +/datum/uplink_item/stealthy_weapons/chamsechud + name = "Chameleon Security HUD" + desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn." + reference = "CHHUD" + item = /obj/item/clothing/glasses/hud/security/chameleon + cost = 2 + // STEALTHY TOOLS /datum/uplink_item/stealthy_tools @@ -885,33 +902,49 @@ var/list/uplink_items = list() cost = 9 gamemodes = list(/datum/game_mode/nuclear) -/datum/uplink_item/device_tools/space_suit - name = "Space Suit" - desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings." +//Space Suits and Hardsuits +/datum/uplink_item/suits + category = "Space Suits and Hardsuits" + surplus = 40 + +/datum/uplink_item/suits/space_suit + name = "Syndicate Space Suit" + desc = "This red and black syndicate space suit is less encumbering than Nanotrasen variants, \ + fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit \ + sightings, however." reference = "SS" item = /obj/item/weapon/storage/box/syndie_kit/space cost = 4 -/datum/uplink_item/device_tools/hardsuit - name = "Blood-red Hardsuit" - desc = "The feared suit of a syndicate nuclear agent. Features slightly better armor. When the helmet is deployed your identity will be protected. Toggling the suit into combat mode \ - will allow you all the mobility of a loose fitting uniform without sacrificing armor. Additionally the suit is collapsible, small enough to fit within a backpack. \ - Nanotrasen crewmembers are trained to report red space suit sightings, these suits in particular are known to drive employees into a panic." +/datum/uplink_item/suits/hardsuit + name = "Syndicate Hardsuit" + desc = "The feared suit of a syndicate nuclear agent. Features slightly better armoring and a built in jetpack \ + that runs off standard atmospheric tanks. When the built in helmet is deployed your identity will be \ + protected, even in death, as the suit cannot be removed by outside forces. Toggling the suit in and out of \ + combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \ + Additionally the suit is collapsible, making it small enough to fit within a backpack. \ + Nanotrasen crew who spot these suits are known to panic." reference = "BRHS" item = /obj/item/weapon/storage/box/syndie_kit/hardsuit cost = 8 -/datum/uplink_item/device_tools/elite_hardsuit +/datum/uplink_item/suits/hardsuit/elite name = "Elite Syndicate Hardsuit" - desc = "The elite Syndicate hardsuit is worn by only the best nuclear agents. Features much better armoring and complete fireproofing. \ - When the built in helmet is deployed your identity will be protected. Toggling the suit into combat mode will allow you all the mobility \ - of a loose fitting uniform without sacrificing armoring. Additionally the suit is collapsible, small enough to fit within a backpack. \ - Nanotrasen crewmembers are trained to report red space suit sightings; these suits in particular are known to drive employees into a panic." - reference = "ESHS" + desc = "An advanced hardsuit with superior armor and mobility to the standard Syndicate Hardsuit." item = /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit cost = 8 + reference = "ESHS" gamemodes = list(/datum/game_mode/nuclear) +/datum/uplink_item/suits/hardsuit/shielded + name = "Shielded Hardsuit" + desc = "An advanced hardsuit with built in energy shielding. The shields will rapidly recharge when not under fire." + item = /obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit + cost = 30 + reference = "SHS" + gamemodes = list(/datum/game_mode/nuclear) + + /datum/uplink_item/device_tools/thermal name = "Thermal Imaging Glasses" desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a4840393f54..c8ba2b49c40 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -79,8 +79,19 @@ invisibility = 101 return ..() -/atom/proc/CheckParts() - return +/atom/proc/CheckParts(list/parts_list) + for(var/A in parts_list) + if(istype(A, /datum/reagent)) + if(!reagents) + reagents = new() + reagents.reagent_list.Add(A) + reagents.conditional_update() + else if(istype(A, /atom/movable)) + var/atom/movable/M = A + if(istype(M.loc, /mob/living)) + var/mob/living/L = M.loc + L.unEquip(M) + M.loc = src /atom/proc/assume_air(datum/gas_mixture/giver) qdel(giver) @@ -442,4 +453,4 @@ O.show_message("[src] [atom_say_verb], \"[message]\"",2) /atom/proc/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) - return \ No newline at end of file + return diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index bbad4a7912f..a30d160fd92 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -1,7 +1,7 @@ ///////////////////// // DISABILITY GENES // -// These activate either a mutation, disability, or sdisability. +// These activate either a mutation, disability // // Gene is always activated. ///////////////////// @@ -15,9 +15,6 @@ // Disability to give (or 0) var/disability=0 - // SDisability to give (or 0) - var/sdisability=0 - // Activation message var/activation_message="" @@ -33,8 +30,6 @@ M.mutations.Add(mutation) if(disability) M.disabilities|=disability - if(sdisability) - M.sdisabilities|=sdisability if(activation_message) to_chat(M, "[activation_message]") else @@ -46,8 +41,6 @@ M.mutations.Remove(mutation) if(disability) M.disabilities &= ~disability - if(sdisability) - M.sdisabilities &= ~sdisability if(deactivation_message) to_chat(M, "[deactivation_message]") else @@ -117,7 +110,7 @@ activation_message="You can't seem to see anything." deactivation_message ="You can see now, in case you didn't notice..." instability = -GENE_INSTABILITY_MAJOR - sdisability=BLIND + disability=BLIND /datum/dna/gene/disability/blindness/New() block=BLINDBLOCK @@ -127,7 +120,7 @@ activation_message="It's kinda quiet." deactivation_message ="You can hear again!" instability = -GENE_INSTABILITY_MAJOR - sdisability=DEAF + disability=DEAF /datum/dna/gene/disability/deaf/New() block=DEAFBLOCK diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 2afb9b7bd83..cac55d7d317 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -13,7 +13,7 @@ activation_message = "You feel unable to express yourself at all." deactivation_message = "You feel able to speak freely again." instability = -GENE_INSTABILITY_MODERATE - sdisability = MUTE + disability = MUTE /datum/dna/gene/disability/mute/New() ..() diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 3d9b045da13..394540c7762 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -92,14 +92,14 @@ var/obj/effect/proc_holder/spell/spelltype /datum/dna/gene/basic/grant_spell/activate(var/mob/M, var/connected, var/flags) - M.AddSpell(new spelltype(M)) + M.AddSpell(new spelltype(null)) ..() return 1 /datum/dna/gene/basic/grant_spell/deactivate(var/mob/M, var/connected, var/flags) - for(var/obj/effect/proc_holder/spell/S in M.spell_list) - if(istype(S,spelltype)) - M.spell_list.Remove(S) + for(var/obj/effect/proc_holder/spell/S in M.mob_spell_list) + if(istype(S, spelltype)) + M.RemoveSpell(S) ..() return 1 diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index d60748f8dae..e2f4fc50c12 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -36,6 +36,7 @@ melee_damage_upper = 4 attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' + del_on_death = 1 speak_emote = list("pulses") var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() @@ -90,9 +91,7 @@ H.loc = src loc.visible_message("The corpse of [H.name] suddenly rises!") -/mob/living/simple_animal/hostile/blob/blobspore/death() - ..() - +/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) // On death, create a small smoke of harmful gas (s-Acid) var/datum/effect/system/chem_smoke_spread/S = new var/turf/location = get_turf(src) @@ -103,14 +102,13 @@ if(overmind && overmind.blob_reagent_datum) reagents.add_reagent(overmind.blob_reagent_datum.id, 8) else - reagents.add_reagent("spores", 8) + reagents.add_reagent("spore", 8) // Attach the smoke spreader and setup/start it. S.attach(location) S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud S.start() - - qdel(src) + ..() /mob/living/simple_animal/hostile/blob/blobspore/Destroy() if(factory) @@ -169,6 +167,6 @@ /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() return -/mob/living/simple_animal/hostile/blob/blobbernaut/death() +/mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed) ..() flick("blobbernaut_death", src) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index c7a858d7be7..83c29ed9109 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -47,7 +47,7 @@ /obj/item/organ/internal/cyberimp/eyes/shield/ling/on_life() ..() var/obj/item/organ/internal/eyes/E = owner.get_int_organ(/obj/item/organ/internal/eyes) - if(owner.eye_blind || owner.eye_blurry || (owner.sdisabilities & BLIND) || (owner.disabilities & NEARSIGHTED) || (E.damage > 0)) + if(owner.eye_blind || owner.eye_blurry || (owner.disabilities & BLIND) || (owner.disabilities & NEARSIGHTED) || (E.damage > 0)) owner.reagents.add_reagent("oculine", 1) /obj/item/organ/internal/cyberimp/eyes/shield/ling/prepare_eat() diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 6150da027ca..1bb19749ac1 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -19,8 +19,7 @@ user.radiation = 0 user.eye_blind = 0 user.eye_blurry = 0 - user.ear_deaf = 0 - user.ear_damage = 0 + user.setEarDamage(0,0) user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss()) user.reagents.clear_reagents() user.germ_level = 0 diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 745d84507d7..7babc2a5a62 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -11,8 +11,7 @@ for(var/mob/living/M in get_mobs_in_view(4, user)) if(iscarbon(M)) if(!M.mind || !M.mind.changeling) - M.ear_deaf = max(0, M.ear_deaf + 30) - M.ear_damage = max(0, M.ear_damage) + M.adjustEarDamage(0, 30) M.confused += 20 M.Jitter(50) else diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 0dc3910da1e..91147183ba1 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -23,6 +23,7 @@ return /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) + ..() if(!iscultist(user)) to_chat(user, "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.") user.Dizzy(120) @@ -58,7 +59,7 @@ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEJUMPSUIT - + /obj/item/clothing/head/magus name = "magus helm" icon_state = "magus" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 28511c9c6f5..7ad1e33b747 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -840,11 +840,11 @@ var/list/sacrificed = list() var/obj/item/weapon/nullrod/N = locate() in C if(N) continue - C.ear_deaf += 50 + C.adjustEarDamage(0,50) C.show_message("\red The world around you suddenly becomes quiet.", 3) affected++ if(prob(1)) - C.sdisabilities |= DEAF + C.disabilities |= DEAF if(affected) usr.say("Sti[pick("'","`")] kaliedir!") to_chat(usr, "\red The world becomes quiet as the deafening rune dissipates into fine dust.") @@ -859,7 +859,7 @@ var/list/sacrificed = list() var/obj/item/weapon/nullrod/N = locate() in C if(N) continue - C.ear_deaf += 30 + C.adjustEarDamage(0,30) //talismans is weaker. C.show_message("\red The world around you suddenly becomes quiet.", 3) affected++ @@ -885,7 +885,7 @@ var/list/sacrificed = list() if(prob(5)) C.disabilities |= NEARSIGHTED if(prob(10)) - C.sdisabilities |= BLIND + C.disabilities |= BLIND C.show_message("\red Suddenly you see red flash that blinds you.", 3) affected++ if(affected) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 2982cc3543d..3e03b81ebeb 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -13,8 +13,7 @@ blood_overlay_type = "armor" origin_tech = "materials=5;biotech=4;powerstorage=5;abductor=3" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) - action_button_name = "Activate" - action_button_custom_type = /datum/action/item_action/hands_free + actions_types = list(/datum/action/item_action/hands_free/activate) var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -31,18 +30,21 @@ DeactivateStealth() armor = combat_armor icon_state = "vest_combat" - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - return if(VEST_COMBAT)// TO STEALTH mode = VEST_STEALTH armor = stealth_armor icon_state = "vest_stealth" - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - return + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) + if(slot == slot_wear_suit) //we only give the mob the ability to activate the vest if he's actually wearing it. + return 1 /obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) disguise = entry @@ -355,7 +357,7 @@ Congratulations! You are now trained for xenobiology research!"} origin_tech = "materials=6;combat=5;biotech=7;abductor=4" force = 7 w_class = 3 - action_button_name = "Toggle Mode" + actions_types = list(/datum/action/item_action/toggle_mode) /obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr) mode = (mode+1)%BATON_MODES @@ -372,6 +374,9 @@ Congratulations! You are now trained for xenobiology research!"} to_chat(usr, "You switch the baton to [txt] mode.") update_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/abductor_baton/update_icon() switch(mode) diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 037de3221f8..8a8dea25cf5 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -240,7 +240,7 @@ //There's no define for this / get all items ? var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\ - slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id,slot_wear_pda) + slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id) for(var/slot in slots) var/obj/item/I = H.get_item_by_slot(slot) @@ -277,4 +277,4 @@ if(istype(T)) T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,300) owner.gib() - return \ No newline at end of file + return diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index 7d5028f4875..8d6a3e08c2e 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -2,18 +2,22 @@ name = "Human Observation Console" var/team = 0 networks = list("SS13","Abductor") - off_action = new/datum/action/camera_off/abductor //specific datum - var/datum/action/teleport_in/tele_in_action = new - var/datum/action/teleport_out/tele_out_action = new - var/datum/action/teleport_self/tele_self_action = new - var/datum/action/vest_mode_swap/vest_mode_action = new - var/datum/action/vest_disguise_swap/vest_disguise_action = new - var/datum/action/set_droppoint/set_droppoint_action = new + off_action = new /datum/action/innate/camera_off/abductor //specific datum + var/datum/action/innate/teleport_in/tele_in_action = new + var/datum/action/innate/teleport_out/tele_out_action = new + var/datum/action/innate/teleport_self/tele_self_action = new + var/datum/action/innate/vest_mode_swap/vest_mode_action = new + var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new + var/datum/action/innate/set_droppoint/set_droppoint_action = new var/obj/machinery/abductor/console/console icon = 'icons/obj/abductor.dmi' icon_state = "camera" +/obj/machinery/computer/camera_advanced/abductor/New() + abductor_equipment.Add(src) + ..() + /obj/machinery/computer/camera_advanced/abductor/CreateEye() ..() eyeobj.visible_icon = 1 @@ -57,7 +61,7 @@ return return ..() -/datum/action/camera_off/abductor/Activate() +/datum/action/innate/camera_off/abductor/Activate() if(!target || !iscarbon(target)) return var/mob/living/carbon/C = target @@ -84,12 +88,11 @@ src.Remove(C) -/datum/action/teleport_in +/datum/action/innate/teleport_in name = "Send To" button_icon_state = "beam_down" - action_type = AB_INNATE -/datum/action/teleport_in/Activate() +/datum/action/innate/teleport_in/Activate() if(!target || !iscarbon(owner)) return var/mob/living/carbon/human/C = owner @@ -99,24 +102,22 @@ if(cameranet.checkTurfVis(remote_eye.loc)) P.PadToLoc(remote_eye.loc) -/datum/action/teleport_out +/datum/action/innate/teleport_out name = "Retrieve" button_icon_state = "beam_up" - action_type = AB_INNATE -/datum/action/teleport_out/Activate() +/datum/action/innate/teleport_out/Activate() if(!target || !iscarbon(owner)) return var/obj/machinery/abductor/console/console = target console.TeleporterRetrieve() -/datum/action/teleport_self +/datum/action/innate/teleport_self name = "Send Self" button_icon_state = "beam_down" - action_type = AB_INNATE -/datum/action/teleport_self/Activate() +/datum/action/innate/teleport_self/Activate() if(!target || !iscarbon(owner)) return var/mob/living/carbon/human/C = owner @@ -126,35 +127,32 @@ if(cameranet.checkTurfVis(remote_eye.loc)) P.MobToLoc(remote_eye.loc,C) -/datum/action/vest_mode_swap +/datum/action/innate/vest_mode_swap name = "Switch Vest Mode" button_icon_state = "vest_mode" - action_type = AB_INNATE -/datum/action/vest_mode_swap/Activate() +/datum/action/innate/vest_mode_swap/Activate() if(!target || !iscarbon(owner)) return var/obj/machinery/abductor/console/console = target console.FlipVest() -/datum/action/vest_disguise_swap +/datum/action/innate/vest_disguise_swap name = "Switch Vest Disguise" button_icon_state = "vest_disguise" - action_type = AB_INNATE -/datum/action/vest_disguise_swap/Activate() +/datum/action/innate/vest_disguise_swap/Activate() if(!target || !iscarbon(owner)) return var/obj/machinery/abductor/console/console = target console.SelectDisguise(remote=1) -/datum/action/set_droppoint +/datum/action/innate/set_droppoint name = "Set Experiment Release Point" button_icon_state = "set_drop" - action_type = AB_INNATE -/datum/action/set_droppoint/Activate() +/datum/action/innate/set_droppoint/Activate() if(!target || !iscarbon(owner)) return @@ -162,4 +160,4 @@ var/mob/camera/aiEye/remote/remote_eye = C.remote_control var/obj/machinery/abductor/console/console = target - console.SetDroppoint(remote_eye.loc,owner) \ No newline at end of file + console.SetDroppoint(remote_eye.loc,owner) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 1f7bc6552cb..cce429c3635 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -167,17 +167,17 @@ /obj/machinery/abductor/console/proc/Link_Abduction_Equipment() // these must all be explicitly `in machines` or they will not properly link. - for(var/obj/machinery/abductor/pad/p in machines) + for(var/obj/machinery/abductor/pad/p in abductor_equipment) if(p.team == team) pad = p break - for(var/obj/machinery/abductor/experiment/e in machines) + for(var/obj/machinery/abductor/experiment/e in abductor_equipment) if(e.team == team) experiment = e e.console = src - for(var/obj/machinery/computer/camera_advanced/abductor/c in machines) + for(var/obj/machinery/computer/camera_advanced/abductor/c in abductor_equipment) if(c.team == team) camera = c c.console = src @@ -220,4 +220,4 @@ new item(src.loc) else atom_say("Insufficent data!") - return \ No newline at end of file + return diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 5cfe1324849..d5541f70e0d 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -69,6 +69,7 @@ AIStatus = AI_OFF var/resources = 0 //Resource points, generated by consuming metal/glass loot = list(/obj/effect/decal/cleanable/blood/gibs/robot, /obj/item/weapon/ore/bluespace_crystal/artificial) + del_on_death = 1 /mob/living/simple_animal/hostile/swarmer/Login() ..() @@ -90,11 +91,6 @@ if(statpanel("Status")) stat("Resources:",resources) -/mob/living/simple_animal/hostile/swarmer/death() - ..() - ghostize() - qdel(src) - /mob/living/simple_animal/hostile/swarmer/emp_act() if(health > 1) adjustHealth(health-1) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 0db9c5309ad..6de3308f75e 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -70,7 +70,7 @@ visible_message("The [src] jumps back to its user.") Recall() -/mob/living/simple_animal/hostile/guardian/death() +/mob/living/simple_animal/hostile/guardian/death(gibbed) ..() to_chat(summoner, "Your [name] died somehow!") summoner.death() diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 780abb8854f..ac3bfdf7c1e 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -172,5 +172,3 @@ return target.attack_animal(src) -/mob/living/simple_animal/hostile/morph/update_action_buttons() //So all eaten objects are not counted every life - return diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index f0e0dc1a883..26fb00b42a8 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -183,7 +183,8 @@ name = "[initial(name)] ([cast_amount]E)" user.reveal(reveal) user.stun(stun) - user.update_action_buttons() + if(action) + action.UpdateButtonIcon() return 1 //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index ac32105229a..6269d2e65d6 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -19,7 +19,7 @@ status_flags = CANPUSH attack_sound = 'sound/misc/demon_attack1.ogg' var/feast_sound = 'sound/misc/Demon_consume.ogg' - var/death_sound = 'sound/misc/demon_dies.ogg' + death_sound = 'sound/misc/demon_dies.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY @@ -49,7 +49,8 @@ You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \ Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \ You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " - var/deathmessage = "screams in anger as it collapses into a puddle of viscera!" + del_on_death = 1 + deathmessage = "screams in anger as it collapses into a puddle of viscera!" /mob/living/simple_animal/slaughter/New() @@ -89,15 +90,10 @@ name = "pile of viscera" desc = "A repulsive pile of guts and gore." -/mob/living/simple_animal/slaughter/death() - ..() - playsound(get_turf(src), death_sound, 200, 1) - visible_message("[src] [deathmessage].") +/mob/living/simple_animal/slaughter/death(gibbed) for(var/mob/living/M in consumed_mobs) M.forceMove(get_turf(src)) - ghostize() - qdel(src) - + ..() /mob/living/simple_animal/slaughter/phasein() @@ -179,7 +175,7 @@ ..() if(M.mind) M.bloodcrawl = 0 - M.mind.remove_spell(/obj/effect/proc_holder/spell/bloodcrawl) + M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl) /obj/item/organ/internal/heart/demon/Stop() return 0 // Always beating. @@ -205,7 +201,7 @@ deathmessage = "fades out, as all of its friends are released from its prison of hugs." loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) -/mob/living/simple_animal/slaughter/laughter/death() +/mob/living/simple_animal/slaughter/laughter/death(gibbed) for(var/mob/living/M in consumed_mobs) if(M.revive()) M.grab_ghost(force = TRUE) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 2b82afb3639..a26f941188b 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -268,8 +268,7 @@ proc/issyndicate(mob/living/M as mob) synd_mob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(synd_mob), slot_wear_mask) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(synd_mob), slot_l_hand) synd_mob.internal = synd_mob.l_hand - if(synd_mob.internals) - synd_mob.internals.icon_state = "internal1" + synd_mob.update_internals_hud_icon(1) var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob) E.implant(synd_mob) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 804111a7ff6..fb287135dc7 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -174,7 +174,7 @@ /obj/item/weapon/pinpointer/nukeop var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle var/obj/docking_port/mobile/home = null - slot_flags = SLOT_PDA | SLOT_BELT + slot_flags = SLOT_BELT /obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob) if(!active) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index c54ab8a97c2..ae687d70116 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -845,4 +845,10 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ target = /obj/item/device/flash target_amount = 6 itemname = "six flashes" - explanation_text = "We are running low on spare parts. Trade for [itemname]." \ No newline at end of file + explanation_text = "We are running low on spare parts. Trade for [itemname]." + +//wizard + +/datum/objective/wizchaos + explanation_text = "Wreak havoc upon the station as much you can. Send those wandless Nanotrasen scum a message!" + completed = 1 \ No newline at end of file diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 9c07064bca5..5c509c2d26d 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -86,7 +86,6 @@ CRYOBLOCK = getAssignedBlock("CRYO", numsToAssign, DNA_HARD_BOUNDS, good=1) EATBLOCK = getAssignedBlock("EAT", numsToAssign, DNA_HARD_BOUNDS, good=1) JUMPBLOCK = getAssignedBlock("JUMP", numsToAssign, DNA_HARD_BOUNDS, good=1) -// MELTBLOCK = getAssignedBlock("MELT", numsToAssign, good=1) IMMOLATEBLOCK = getAssignedBlock("IMMOLATE", numsToAssign) EMPATHBLOCK = getAssignedBlock("EMPATH", numsToAssign, DNA_HARD_BOUNDS, good=1) SUPERFARTBLOCK = getAssignedBlock("SUPERFART", numsToAssign, DNA_HARDER_BOUNDS, good=1) @@ -98,7 +97,6 @@ // Disabilities LOUDBLOCK = getAssignedBlock("LOUD", numsToAssign) - //WHISPERBLOCK = getAssignedBlock("WHISPER", numsToAssign) BROKEN WITH NEW SAYCODE DIZZYBLOCK = getAssignedBlock("DIZZY", numsToAssign) @@ -166,7 +164,6 @@ M.real_name = "Corpse" M.death() M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/device/pda/engineering(M), slot_wear_pda) M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(M), slot_shoes) // M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 3b67e7bb4f3..2cc099cc115 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -132,7 +132,7 @@ Made by Xhuis /datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind) var/mob/living/carbon/human/S = shadow_mind.current - shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_hatch) + shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_hatch(null)) spawn(0) shadow_mind.current.add_language("Shadowling Hivemind") update_shadow_icons_added(shadow_mind) @@ -149,9 +149,9 @@ Made by Xhuis update_shadow_icons_added(new_thrall_mind) new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall" new_thrall_mind.current.add_language("Shadowling Hivemind") - new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_glare) - new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) - new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall) + new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_glare(null)) + new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk(null)) + new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall(null)) to_chat(new_thrall_mind.current, "You see the truth. Reality has been torn away and you realize what a fool you've been.") to_chat(new_thrall_mind.current, "The shadowlings are your masters. Serve them above all else and ensure they complete their goals.") to_chat(new_thrall_mind.current, "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.") @@ -171,7 +171,7 @@ Made by Xhuis thrall_mind.special_role = null update_shadow_icons_removed(thrall_mind) for(var/obj/effect/proc_holder/spell/S in thrall_mind.spell_list) - thrall_mind.remove_spell(S) + thrall_mind.RemoveSpell(S) thrall_mind.current.remove_language("Shadowling Hivemind") if(kill && ishuman(thrall_mind.current)) //If dethrallization surgery fails, kill the mob as well as dethralling them var/mob/living/carbon/human/H = thrall_mind.current @@ -215,7 +215,7 @@ Made by Xhuis ling_mind.current.attack_log += "\[[time_stamp()]\] Deshadowlinged" ling_mind.special_role = null for(var/obj/effect/proc_holder/spell/S in ling_mind.spell_list) - ling_mind.remove_spell(S) + ling_mind.RemoveSpell(S) var/mob/living/M = ling_mind.current if(issilicon(M)) M.audible_message("[M] lets out a short blip.", \ diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 6106bb04ec4..c4e88ea12b8 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -438,24 +438,24 @@ if(thralls >= 3 && !screech_acquired) screech_acquired = 1 to_chat(user, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech) + user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) if(thralls >= 5 && !blind_smoke_acquired) blind_smoke_acquired = 1 to_chat(user, "The power of your thralls has granted you the Blinding Smoke ability. \ It will create a choking cloud that will blind any non-thralls who enter.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke) + user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) if(thralls >= 7 && !drainLifeAcquired) drainLifeAcquired = 1 to_chat(user, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife) + user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null)) if(thralls >= 9 && !reviveThrallAcquired) reviveThrallAcquired = 1 to_chat(user, "The power of your thralls has granted you the Black Recuperation ability. \ This will, after a short time, bring a dead thrall completely back to life with no bodily defects.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall) + user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall(null)) if(thralls < victory_threshold) to_chat(user, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.") @@ -469,8 +469,8 @@ if(CM in M.mind.spell_list) M.mind.spell_list -= CM qdel(CM) - M.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_ascend) + M.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_ascend(null)) if(M == usr) to_chat(M, "You project this power to the rest of the shadowlings.") else @@ -557,7 +557,7 @@ var/mob/living/carbon/M = target to_chat(M, "A spike of pain drives into your head and scrambles your thoughts!") M.confused += 10 - M.ear_damage += 3 + M.setEarDamage(M.ear_damage + 3) else if(issilicon(target)) var/mob/living/silicon/S = target to_chat(S, "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#") @@ -674,10 +674,10 @@ "You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \ darkness but wither slowly in light. In addition, Lesser Glare and Guise have been upgraded into their true forms.") thrallToRevive.set_species("Lesser Shadowling") - thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare) - thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) - thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare) - thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk) + thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_glare) + thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) + thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null)) + thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null)) if("Revive") if(!is_thrall(thrallToRevive)) to_chat(usr, "[thrallToRevive] is not a thrall.") diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 98f81f1d128..2c06168499e 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -92,19 +92,19 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(usr), slot_glasses) H.set_species("Shadowling") //can't be a shadowling without being a shadowling - H.mind.remove_spell(src) + H.mind.RemoveSpell(src) sleep(10) to_chat(H, "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.") - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/enthrall) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/veil) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/collective_mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/enthrall(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/veil(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/collective_mind(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle(null)) /obj/effect/proc_holder/spell/targeted/shadowling_ascend name = "Ascend" @@ -162,15 +162,15 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc) for(var/obj/effect/proc_holder/spell/S in H.mind.spell_list) if(S == src) continue - H.mind.remove_spell(S) + H.mind.RemoveSpell(S) H.mind.transfer_to(A) A.name = H.real_name A.languages = H.languages - A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/annihilate) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/hypnosis) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_phase_shift) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/ascendant_storm) - A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit) + A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/annihilate(null)) + A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/hypnosis(null)) + A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_phase_shift(null)) + A.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/ascendant_storm(null)) + A.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit(null)) if(A.real_name) A.real_name = H.real_name H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly @@ -179,5 +179,5 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N if(!ticker.mode.shadowling_ascended) shuttle_master.emergency.request(null, 0.3) ticker.mode.shadowling_ascended = 1 - A.mind.remove_spell(src) + A.mind.RemoveSpell(src) qdel(H) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 64309ef8f5e..f33bda2ed3a 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -259,7 +259,7 @@ continue to_chat(C, "You hear a ear piercing shriek and your senses dull!") C.Weaken(4) - C.ear_deaf = 20 + C.adjustEarDamage(0,20) C.stuttering = 20 C.Stun(4) C.Jitter(150) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 5b3bd199373..3f33d84b978 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -59,21 +59,21 @@ to_chat(M, "You are the [H.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.") switch(href_list["school"]) if("destruction") - M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(M)) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(M)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null)) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.") if("bluespace") - M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(M)) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(M)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.") if("healing") - M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(M)) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(M)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null)) M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.") if("robeless") - M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(M)) - M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(M)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null)) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) @@ -409,10 +409,6 @@ var/global/list/multiverse = list() if(belt) M.equip_to_slot_or_del(new belt.type(M), slot_belt) - var/obj/pda = H.get_item_by_slot(slot_wear_pda) - if(pda) - M.equip_to_slot_or_del(new pda.type(M), slot_wear_pda) - var/obj/back = H.get_item_by_slot(slot_back) if(back) M.equip_to_slot_or_del(new back.type(M), slot_back) @@ -782,7 +778,7 @@ var/global/list/multiverse = list() else if(istype(I,/obj/item/weapon/bikehorn)) to_chat(target, "HONK") target << 'sound/items/AirHorn.ogg' - target.ear_damage += rand(0,3) + target.adjustEarDamage(0,3) GiveHint(target) cooldown = world.time +cooldown_time return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 2daf3ab7e42..0dbcd3103fe 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -684,9 +684,9 @@ /obj/item/weapon/spellbook/oneuse/Initialize() //No need to init return -/obj/item/weapon/spellbook/oneuse/attack_self(mob/user as mob) +/obj/item/weapon/spellbook/oneuse/attack_self(mob/user) var/obj/effect/proc_holder/spell/S = new spell - for(var/obj/effect/proc_holder/spell/knownspell in user.spell_list) + for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) if(knownspell.type == S.type) if(user.mind) if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard") @@ -703,10 +703,10 @@ onlearned(user) -/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob) +/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user) user.visible_message("[src] glows in a black light!") -/obj/item/weapon/spellbook/oneuse/proc/onlearned(mob/user as mob) +/obj/item/weapon/spellbook/oneuse/proc/onlearned(mob/user) used = 1 user.visible_message("[src] glows dark for a second!") @@ -762,7 +762,7 @@ name = "spellbook of [spellname]" //Note, desc doesn't change by design ..() -/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user as mob) +/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user) ..() if(stored_swap in dead_mob_list) stored_swap = null @@ -774,31 +774,8 @@ to_chat(user, "You stare at the book some more, but there doesn't seem to be anything else to learn...") return - if(user.mind.special_verbs.len) - for(var/V in user.mind.special_verbs) - user.verbs -= V - - if(stored_swap.mind.special_verbs.len) - for(var/V in stored_swap.mind.special_verbs) - stored_swap.verbs -= V - - var/mob/dead/observer/ghost = stored_swap.ghostize(0) - ghost.spell_list = stored_swap.spell_list - - user.mind.transfer_to(stored_swap) - stored_swap.spell_list = user.spell_list - - if(stored_swap.mind.special_verbs.len) - for(var/V in user.mind.special_verbs) - user.verbs += V - - ghost.mind.transfer_to(user) - user.key = ghost.key - user.spell_list = ghost.spell_list - - if(user.mind.special_verbs.len) - for(var/V in user.mind.special_verbs) - user.verbs += V + var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new + swapper.cast(user, stored_swap, 1) to_chat(stored_swap, "You're suddenly somewhere else... and someone else?!") to_chat(user, "Suddenly you're staring at [src] again... where are you, who are you?!") diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b648a40a55a..338d088d6f1 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -67,59 +67,9 @@ set_antag_hud(wiz_mind.current, null) /datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard) - switch(rand(1,100)) - if(1 to 30) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives += kill_objective - - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives += steal_objective - - if(!(locate(/datum/objective/escape) in wizard.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = wizard - wizard.objectives += escape_objective - if(31 to 60) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives += kill_objective - - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives += steal_objective - - if(!(locate(/datum/objective/survive) in wizard.objectives)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = wizard - wizard.objectives += survive_objective - - if(61 to 85) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives += kill_objective - - if(!(locate(/datum/objective/hijack) in wizard.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = wizard - wizard.objectives += hijack_objective - - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives += steal_objective - - if(!(locate(/datum/objective/hijack) in wizard.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = wizard - wizard.objectives += hijack_objective + var/datum/objective/wizchaos/wiz_objective = new + wiz_objective.owner = wizard + wizard.objectives += wiz_objective return @@ -180,18 +130,24 @@ wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wizard_mob), slot_shoes) wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit) wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head) - if(wizard_mob.backbag == 2) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back) - if(wizard_mob.backbag == 3) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(wizard_mob), slot_back) + if(wizard_mob.backbag == 2) + wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back) + if(wizard_mob.backbag == 3) + wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(wizard_mob), slot_back) + if(wizard_mob.backbag == 4) + wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(wizard_mob), slot_back) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(wizard_mob), slot_in_backpack) -// wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/scrying_gem(wizard_mob), slot_l_store) For scrying gem. wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store) - wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand) + var/obj/item/weapon/spellbook/spellbook = new /obj/item/weapon/spellbook(wizard_mob) + spellbook.owner = wizard_mob + wizard_mob.equip_to_slot_or_del(spellbook, slot_r_hand) wizard_mob.faction = list("wizard") wizard_mob.species.equip(wizard_mob) to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") + to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.") to_chat(wizard_mob, "In your pockets you will find a teleport scroll. Use it as needed.") wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.") wizard_mob.update_icons() @@ -284,20 +240,19 @@ //OTHER PROCS -//To batch-remove wizard spells. Linked to mind.dm. +//To batch-remove wizard spells. Linked to mind.dm /mob/proc/spellremove(mob/M) if(!mind) return - for(var/obj/effect/proc_holder/spell/spell_to_remove in src.mind.spell_list) + for(var/obj/effect/proc_holder/spell/spell_to_remove in mind.spell_list) qdel(spell_to_remove) mind.spell_list -= spell_to_remove -/datum/mind/proc/remove_spell(var/obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind - if(!spell) return - for(var/obj/effect/proc_holder/spell/S in spell_list) - if(istype(S, spell)) - qdel(S) - spell_list -= S +//To batch-remove mob spells. +/mob/proc/mobspellremove(mob/M) + for(var/obj/effect/proc_holder/spell/spell_to_remove in mob_spell_list) + qdel(spell_to_remove) + mob_spell_list -= spell_to_remove /*Checks if the wizard can cast spells. Made a proc so this is not repeated 14 (or more) times.*/ diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm index 8fdc85d2e53..5bdb217ddc1 100644 --- a/code/game/jobs/job/central.dm +++ b/code/game/jobs/job/central.dm @@ -20,11 +20,11 @@ H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves) H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) - H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/implanter/dust(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(H), slot_in_backpack) @@ -61,13 +61,13 @@ H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves) H.equip_or_collect(new /obj/item/device/radio/headset/centcom(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer/navy(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/centcom(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) - H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/suit/space/deathsquad/officer(H), slot_wear_suit) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/implanter/dust(H), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(H), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) @@ -77,4 +77,4 @@ return 1 /datum/job/ntspecops/get_access() - return get_centcom_access(title) \ No newline at end of file + return get_centcom_access(title) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 1c736d89609..4b924204aef 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -27,16 +27,16 @@ if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_eng(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/clothing/under/rank/chief_engineer(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/heads/ce(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/heads/ce(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/hardhat/white(H), slot_head) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/gloves/color/black/ce(H), slot_gloves) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) return 1 @@ -64,14 +64,14 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head) H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store) - H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) return 1 @@ -99,12 +99,12 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/atmos(H), slot_wear_pda) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/atmos(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_in_backpack) return 1 /datum/job/mechanic @@ -129,12 +129,12 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/mechanic(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/head/hardhat(H), slot_head) H.equip_or_collect(new /obj/item/device/t_scanner(H), slot_r_store) - H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/engineering(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) return 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index a064f0247f5..59682dc6336 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -25,7 +25,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/heads/cmo(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/heads/cmo(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/cmo(H), slot_wear_suit) H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) @@ -89,7 +89,7 @@ H.equip_or_collect(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) @@ -127,7 +127,7 @@ H.equip_or_collect(new /obj/item/clothing/glasses/science(H), slot_glasses) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_wear_pda) + H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/chemist(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -157,7 +157,7 @@ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_wear_pda) + H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/genetics(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) @@ -185,7 +185,7 @@ if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_vir(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/clothing/under/rank/virologist(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/viro(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/viro(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/mask/surgical(H), slot_wear_mask) H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat/virologist(H), slot_wear_suit) @@ -228,7 +228,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_wear_pda) + H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) @@ -257,7 +257,7 @@ if(H.backbag == 3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/medical/paramedic(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/medical(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/mask/cigarette(H), slot_wear_mask) H.equip_or_collect(new /obj/item/clothing/head/soft/blue(H), slot_head) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index c52a783b3ba..b4cea5d2b21 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -33,7 +33,7 @@ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_wear_pda) + H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) @@ -71,7 +71,7 @@ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_wear_pda) + H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -106,11 +106,11 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) 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) + H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) - H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - return 1 \ No newline at end of file + H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_in_backpack) + return 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index b3d1ab1e67f..4fb9201fe07 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -28,7 +28,7 @@ H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit) - H.equip_or_collect(new /obj/item/device/pda/heads/hos(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/heads/hos(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/gloves/color/black/hos(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/head/HoS(H), slot_head) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) @@ -72,7 +72,7 @@ H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/warden(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/head/warden(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/warden(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/warden(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) // H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk @@ -115,7 +115,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/det(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/detective(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/detective(H), slot_belt) H.equip_or_collect(new /obj/item/toy/crayon/white(H), slot_l_store) /* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H) CIG.light("") @@ -173,7 +173,7 @@ H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/security(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/security(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store) @@ -212,7 +212,7 @@ H.equip_or_collect(new /obj/item/clothing/suit/storage/fr_jacket(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses) H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) @@ -247,7 +247,7 @@ H.equip_or_collect(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/jacket/pilot(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/security(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store) @@ -261,4 +261,4 @@ L.imp_in = H L.implanted = 1 H.sec_hud_set_implants() - return 1 \ No newline at end of file + return 1 diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 7768cf11870..b2a91688daa 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -25,7 +25,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) U.accessories += M M.on_attached(U) H.equip_or_collect(U, slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/captain(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/captain(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/caphat(H), slot_head) @@ -84,7 +84,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/head/hopcap(H), slot_head) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/heads/hop(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/heads/hop(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/ids(H), slot_r_hand) else @@ -130,7 +130,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/under/rank/ntrep(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/storage/ntrep(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_belt) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) L.imp_in = H L.implanted = 1 @@ -170,7 +170,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/glasses/hud/health/health_advanced, slot_glasses) H.equip_or_collect(new /obj/item/clothing/under/rank/blueshield(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/blueshield(H), slot_wear_suit) - H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/deathimp(H), slot_r_hand) @@ -216,7 +216,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/shoes/centcom(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/powdered_wig(H), slot_head) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) - H.equip_or_collect(new /obj/item/device/pda/heads/magistrate(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/heads/magistrate(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(H.back), slot_in_backpack) H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) @@ -251,7 +251,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_or_collect(new /obj/item/clothing/suit/storage/internalaffairs(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses) - H.equip_or_collect(new /obj/item/device/pda/lawyer(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/lawyer(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store) H.equip_or_collect(new /obj/item/device/flash(H), slot_r_store) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index f84dbd81c04..cbd7e896fdd 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -22,8 +22,7 @@ H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/bar(H), slot_wear_pda) - H.equip_or_collect(new /obj/item/weapon/storage/belt/bandolier/full(H), slot_belt) + H.equip_or_collect(new /obj/item/device/pda/bar(H), slot_belt) if(H.backbag == 1) var/obj/item/weapon/storage/box/survival/Barpack = new /obj/item/weapon/storage/box/survival(H) @@ -31,6 +30,7 @@ else H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack) H.equip_or_collect(new /obj/item/toy/russian_revolver(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/storage/belt/bandolier/full(H), slot_in_backpack) H.dna.SetSEState(SOBERBLOCK,1) H.mutations += SOBER @@ -64,7 +64,7 @@ H.equip_or_collect(new /obj/item/clothing/suit/chef(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/head/chefhat(H), slot_head) - H.equip_or_collect(new /obj/item/device/pda/chef(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/chef(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else @@ -99,7 +99,7 @@ H.equip_or_collect(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/suit/apron(H), slot_wear_suit) H.equip_or_collect(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store) - H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_belt) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -128,7 +128,7 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/quartermaster(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/quartermaster(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) H.equip_or_collect(new /obj/item/weapon/clipboard(H), slot_l_hand) if(H.backbag == 1) @@ -161,7 +161,7 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/cargotech(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/cargo(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/cargo(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else @@ -196,7 +196,7 @@ H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/gloves/fingerless(H), slot_gloves) - H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/shoes/workboots(H), slot_shoes) H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/patch/styptic(H), slot_l_store) H.equip_or_collect(new /obj/item/device/flashlight/seclite(H), slot_r_store) @@ -234,7 +234,7 @@ H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/clown(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/clown(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask) H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/bikehorn(H), slot_in_backpack) @@ -277,7 +277,7 @@ H.equip_or_collect(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/device/pda/mime(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/mime(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/gloves/color/white(H), slot_gloves) H.equip_or_collect(new /obj/item/clothing/head/beret(H), slot_head) H.equip_or_collect(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit) @@ -315,7 +315,7 @@ H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/janitor(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/janitor(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/janitor(H), slot_belt) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else @@ -346,7 +346,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_l_hand) H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index cec48fd834b..2a1f7d5dae2 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -21,7 +21,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform) - H.equip_or_collect(new /obj/item/device/pda/chaplain(H), slot_wear_pda) + H.equip_or_collect(new /obj/item/device/pda/chaplain(H), slot_belt) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) if(H.backbag == 1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 2409bda62ba..cf158648c9a 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -594,7 +594,7 @@ var/global/datum/controller/occupations/job_master H.equip_to_slot_or_del(C, slot_wear_id) - H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_wear_pda) + H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt) if(locate(/obj/item/device/pda,H)) var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H) pda.owner = H.real_name diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index decb7fc5922..8ea98b53c8b 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -444,7 +444,7 @@ occupantData["intOrgan"] = intOrganData - occupantData["blind"] = (H.sdisabilities & BLIND) + occupantData["blind"] = (H.disabilities & BLIND) occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED) data["occupant"] = occupantData @@ -636,7 +636,7 @@ dat += "[i.name]N/A[i.damage][infection]:[mech]" dat += "" dat += "" - if(occupant.sdisabilities & BLIND) + if(occupant.disabilities & BLIND) dat += "Cataracts detected.
" if(occupant.disabilities & NEARSIGHTED) dat += "Retinal misalignment detected.
" diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 090ea7bb5cc..560ad7642b7 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -144,6 +144,7 @@ /obj/machinery/meter/turf/initialize() if(!target) target = loc + ..() /obj/machinery/meter/turf/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) return diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 9d71df87efa..bcf8ee75b00 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -42,6 +42,7 @@ cameranet.addCamera(src) /obj/machinery/camera/initialize() + ..() if(z == ZLEVEL_STATION && prob(3) && !start_active) toggle_cam() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 0fccf7b77a8..81b2c6b86a4 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -49,11 +49,9 @@ return 1 // Network configuration -/obj/machinery/computer/security/attackby(I as obj, user as mob, params) - access = list() - if(istype(I,/obj/item/weapon/card/id)) // If hit by a regular ID card. - var/obj/item/weapon/card/id/E = I - access = E.access +/obj/machinery/computer/security/attackby(obj/item/I, user as mob, params) + access = I.GetAccess() + if(access.len) // If hit by something with access. ui_interact(user) else ..() @@ -172,10 +170,7 @@ user.set_machine(src) if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.wear_id) - var/obj/item/weapon/card/id/gold/C = H.wear_id - access = C.access + access = user.get_access() ui_interact(user) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 07443a9041c..0a84ee81821 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -6,8 +6,8 @@ var/mob/camera/aiEye/remote/eyeobj var/mob/living/carbon/human/current_user = null var/list/networks = list("SS13") - var/datum/action/camera_off/off_action = new - var/datum/action/camera_jump/jump_action = new + var/datum/action/innate/camera_off/off_action = new + var/datum/action/innate/camera_jump/jump_action = new /obj/machinery/computer/camera_advanced/proc/CreateEye() eyeobj = new() @@ -115,12 +115,11 @@ else sprint = initial -/datum/action/camera_off +/datum/action/innate/camera_off name = "End Camera View" - action_type = AB_INNATE button_icon_state = "camera_off" -/datum/action/camera_off/Activate() +/datum/action/innate/camera_off/Activate() if(!target || !iscarbon(target)) return var/mob/living/carbon/C = target @@ -139,12 +138,11 @@ C.unset_machine() src.Remove(C) -/datum/action/camera_jump +/datum/action/innate/camera_jump name = "Jump To Camera" - action_type = AB_INNATE button_icon_state = "camera_jump" -/datum/action/camera_jump/Activate() +/datum/action/innate/camera_jump/Activate() if(!target || !iscarbon(target)) return var/mob/living/carbon/C = target diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 537d3772366..1cb4ba64b02 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -21,6 +21,7 @@ ..() /obj/machinery/computer/initialize() + ..() power_change() update_icon() diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index e5c93d13a00..9c4d881f378 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -214,6 +214,7 @@ obj/machinery/airlock_sensor/proc/set_frequency(new_frequency) radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) obj/machinery/airlock_sensor/initialize() + ..() set_frequency(frequency) obj/machinery/airlock_sensor/New() @@ -280,6 +281,7 @@ obj/machinery/access_button/proc/set_frequency(new_frequency) obj/machinery/access_button/initialize() + ..() set_frequency(frequency) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index e29ec8997ba..b0be899942d 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -31,15 +31,15 @@ maptext_height = 26 maptext_width = 32 -/obj/machinery/door_timer/New() +/obj/machinery/door_timer/initialize() ..() Radio = new /obj/item/device/radio(src) Radio.listening = 0 Radio.config(list("Security" = 0)) - pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32)) - pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0)) + pixel_x = ((dir & 3)? (0) : (dir == 4 ? 32 : -32)) + pixel_y = ((dir & 3)? (dir ==1 ? 24 : -32) : (0)) spawn(20) for(var/obj/machinery/door/window/brigdoor/M in airlocks) @@ -53,7 +53,7 @@ for(var/obj/structure/closet/secure_closet/brig/C in world) if(C.id == id) targets += C - + for(var/obj/machinery/treadmill_monitor/T in machines) if(T.id == id) targets += T @@ -61,15 +61,14 @@ if(targets.len==0) stat |= BROKEN update_icon() - return - return //Main door timer loop, if it's timing and time is >0 reduce time by 1. // if it's less than 0, open door, reset timer // update the door_timer window and the icon /obj/machinery/door_timer/process() - if(stat & (NOPOWER|BROKEN)) return + if(stat & (NOPOWER|BROKEN)) + return if(timing) if(timeleft() <= 0) Radio.autosay("Timer has expired. Releasing prisoner.", name, "Security", list(z)) @@ -77,8 +76,8 @@ timing = 0 . = PROCESS_KILL - src.updateUsrDialog() - src.update_icon() + updateUsrDialog() + update_icon() else timer_end() return PROCESS_KILL @@ -87,7 +86,6 @@ /obj/machinery/door_timer/power_change() ..() update_icon() - return // open/closedoor checks if door_timer has power, if so it checks if the @@ -95,7 +93,8 @@ // Closes and locks doors, power check /obj/machinery/door_timer/proc/timer_start() - if(stat & (NOPOWER|BROKEN)) return 0 + if(stat & (NOPOWER|BROKEN)) + return 0 // Set releasetime releasetime = world.timeofday + timetoset @@ -103,16 +102,19 @@ addAtProcessing() for(var/obj/machinery/door/window/brigdoor/door in targets) - if(door.density) continue + if(door.density) + continue spawn(0) door.close() for(var/obj/structure/closet/secure_closet/brig/C in targets) - if(C.broken) continue - if(C.opened && !C.close()) continue + if(C.broken) + continue + if(C.opened && !C.close()) + continue C.locked = 1 C.icon_state = C.icon_locked - + for(var/obj/machinery/treadmill_monitor/T in targets) T.total_joules = 0 T.on = 1 @@ -122,19 +124,23 @@ // Opens and unlocks doors, power check /obj/machinery/door_timer/proc/timer_end() - if(stat & (NOPOWER|BROKEN)) return 0 + if(stat & (NOPOWER|BROKEN)) + return 0 // Reset releasetime releasetime = 0 for(var/obj/machinery/door/window/brigdoor/door in targets) - if(!door.density) continue + if(!door.density) + continue spawn(0) door.open() for(var/obj/structure/closet/secure_closet/brig/C in targets) - if(C.broken) continue - if(C.opened) continue + if(C.broken) + continue + if(C.opened) + continue C.locked = 0 C.icon_state = C.icon_closed @@ -156,7 +162,7 @@ return time / 10 // Set timetoset -/obj/machinery/door_timer/proc/timeset(var/seconds) +/obj/machinery/door_timer/proc/timeset(seconds) timetoset = seconds * 10 if(timetoset <= 0) @@ -165,15 +171,15 @@ return //Allows AIs to use door_timer, see human attack_hand function below -/obj/machinery/door_timer/attack_ai(var/mob/user as mob) - return src.attack_hand(user) +/obj/machinery/door_timer/attack_ai(mob/user) + return attack_hand(user) //Allows humans to use door_timer //Opens dialog window when someone clicks on door timer // Allows altering timer and the timing boolean. // Flasher activation limited to 150 seconds -/obj/machinery/door_timer/attack_hand(var/mob/user as mob) +/obj/machinery/door_timer/attack_hand(mob/user) if(..()) return @@ -189,10 +195,10 @@ // dat var/dat = "
Timer System:" - dat += " Door [src.id] controls
" + dat += " Door [id] controls
" // Start/Stop timer - if(src.timing) + if(timing) dat += "Stop Timer and open door
" else dat += "Activate Timer and close door
" @@ -202,7 +208,7 @@ dat += "
" // Set Timer display (uses timetoset) - if(src.timing) + if(timing) dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] Set
" else dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond]
" @@ -221,9 +227,7 @@ var/datum/browser/popup = new(user, "door_timer", name, 400, 500) popup.set_content(dat) - popup.open(0) - onclose(user, "computer") - return + popup.open() //Function for using door_timer dialog input, checks if user has permission @@ -236,18 +240,18 @@ /obj/machinery/door_timer/Topic(href, href_list) if(..()) return - if(!src.allowed(usr)) + if(!allowed(usr)) return usr.set_machine(src) if(href_list["timing"]) - src.timing = text2num(href_list["timing"]) + timing = text2num(href_list["timing"]) - if(src.timing) - src.timer_start() + if(timing) + timer_start() else - src.timer_end() + timer_end() else if(href_list["tp"]) //adjust timer, close door if not already closed @@ -263,19 +267,11 @@ F.flash() if(href_list["change"]) - src.timer_start() + timer_start() - src.add_fingerprint(usr) - src.updateUsrDialog() - src.update_icon() - - /* if(src.timing) - src.timer_start() - - else - src.timer_end() */ - - return + add_fingerprint(usr) + updateUsrDialog() + update_icon() //icon update function @@ -289,7 +285,7 @@ if(stat & (BROKEN)) set_picture("ai_bsod") return - if(src.timing) + if(timing) var/disp1 = id var/timeleft = timeleft() var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]" @@ -298,11 +294,10 @@ update_display(disp1, disp2) else if(maptext) maptext = "" - return // Adds an icon in case the screen is broken/off, stolen from status_display.dm -/obj/machinery/door_timer/proc/set_picture(var/state) +/obj/machinery/door_timer/proc/set_picture(state) picture_state = state overlays.Cut() overlays += image('icons/obj/status_display.dmi', icon_state=picture_state) @@ -310,7 +305,7 @@ //Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display // Stolen from status_display -/obj/machinery/door_timer/proc/update_display(var/line1, var/line2) +/obj/machinery/door_timer/proc/update_display(line1, line2) var/new_text = {"
[line1]
[line2]
"} if(maptext != new_text) maptext = new_text @@ -318,7 +313,7 @@ //Actual string input to icon display for loop, with 5 pixel x offsets for each letter. //Stolen from status_display -/obj/machinery/door_timer/proc/texticon(var/tn, var/px = 0, var/py = 0) +/obj/machinery/door_timer/proc/texticon(tn, px = 0, py = 0) var/image/I = image('icons/obj/status_display.dmi', "blank") var/len = lentext(tn) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index ae02bcd40c8..ae299d78a90 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -362,6 +362,7 @@ Class Procs: return ..() /obj/machinery/CheckParts() + ..() RefreshParts() return diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 6f1376ceec3..3a6ef2dbd81 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -12,6 +12,7 @@ var/is_admin_message = 0 var/icon/img = null var/icon/backup_img + var/view_count = 0 /datum/feed_channel var/channel_name="" @@ -22,6 +23,7 @@ var/backup_author="" var/censored=0 var/is_admin_channel=0 + var/total_view_count = 0 //var/page = null //For newspapers /datum/feed_message/proc/clear() @@ -31,6 +33,7 @@ src.backup_author = "" src.img = null src.backup_img = null + view_count = 0 /datum/feed_channel/proc/clear() src.channel_name = "" @@ -40,6 +43,7 @@ src.backup_author = "" src.censored = 0 src.is_admin_channel = 0 + total_view_count = 0 /datum/feed_channel/proc/announce_news() return "Breaking news from [channel_name]!" @@ -224,7 +228,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) if(CHANNEL.is_admin_channel) - dat+="[CHANNEL.channel_name]
" + dat+="[CHANNEL.channel_name]
" else dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" /*for(var/datum/feed_channel/CHANNEL in src.channel_list) @@ -304,7 +308,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="

Print Paper" dat+="
Cancel" if(9) - dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author]\]
" + dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author]\]
" + dat+="Feed view count: [viewing_channel.total_view_count]
" + viewing_channel.total_view_count++ if(src.viewing_channel.censored) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
" dat+="No further feed story additions are allowed while the D-Notice is in effect.

" @@ -320,6 +326,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") dat+="

" dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]
" + dat+="Message view count: [MESSAGE.view_count]
" + MESSAGE.view_count++ dat+="

Refresh" dat+="
Back" if(10) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 78f7eb4efb5..b6fc160a6f6 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -703,7 +703,7 @@ icon_deny = "boozeomat-deny" products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5, - /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/tequila = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5, diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 22850e63f48..6660692ce62 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -166,7 +166,7 @@ to_chat(M, "HONK") M.sleeping = 0 M.stuttering = 20 - M.ear_deaf = 30 + M.adjustEarDamage(0,30) M.Weaken(3) if(prob(30)) M.Stun(10) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 0e27b27909c..1ab2b6c4ec2 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -515,7 +515,7 @@ steam.start() -- spawns the effect chemholder.reagents.reaction(A) if(iscarbon(A)) var/mob/living/carbon/C = A - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + if(C.can_breathe_gas()) chemholder.reagents.copy_to(C, chemholder.reagents.total_volume) if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/tray = A diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d74d831deb5..017583b7336 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -29,10 +29,8 @@ var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - //If this is set, The item will make an action button on the player's HUD when picked up. - var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. - var/action_button_custom_type = null - var/datum/action/item_action/action = null + var/list/actions = list() //list of /datum/action's that this item has. + var/list/actions_types = list() //list of paths of action datums to give to the item on New(). var/list/materials = list() //Since any item can now be a piece of clothing, this has to be put here so all items share it. @@ -72,10 +70,17 @@ var/sprite_sheets_obj = null //Used to override hardcoded clothing inventory object dmis in human clothing proc. var/list/species_fit = null //This object has a different appearance when worn by these species +/obj/item/New() + ..() + for(var/path in actions_types) + new path(src) + /obj/item/Destroy() if(ismob(loc)) var/mob/m = loc m.unEquip(src, 1) + for(var/X in actions) + qdel(X) return ..() /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) @@ -293,14 +298,16 @@ return 1 return 0 -/obj/item/proc/talk_into(mob/M as mob, var/text, var/channel=null) +/obj/item/proc/talk_into(mob/M, var/text, var/channel=null) return -/obj/item/proc/moved(mob/user as mob, old_loc as turf) +/obj/item/proc/moved(mob/user, old_loc) return -/obj/item/proc/dropped(mob/user as mob) - ..() +/obj/item/proc/dropped(mob/user) + for(var/X in actions) + var/datum/action/A = X + A.Remove(user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -324,7 +331,13 @@ // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(var/mob/user, var/slot) - return + for(var/X in actions) + var/datum/action/A = X + if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. + A.Grant(user) + +/obj/item/proc/item_action_slot_check(slot, mob/user) + return 1 //returns 1 if the item is equipped by a mob, 0 otherwise. //This might need some error trapping, not sure if get_equipped_items() is safe for non-human mobs. @@ -379,11 +392,11 @@ return -//This proc is executed when someone clicks the on-screen UI button. To make the UI button show, set the 'icon_action_button' to the icon_state of the image of the button in screen1_action.dmi +//This proc is executed when someone clicks the on-screen UI button. //The default action is attack_self(). //Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob. -/obj/item/proc/ui_action_click() - attack_self(usr) +/obj/item/proc/ui_action_click(mob/user, actiontype) + attack_self(user) /obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit return 0 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index db2519eca43..ea96938ca95 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -8,7 +8,7 @@ flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=50, MAT_GLASS=20) - action_button_name = "Flashlight" + actions_types = list(/datum/action/item_action/toggle_light) var/on = 0 var/brightness_on = 4 //luminosity when on @@ -36,6 +36,9 @@ return 0 on = !on update_brightness(user) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() return 1 @@ -68,7 +71,7 @@ "You direct [src] to [M]'s eyes.") if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected - if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind + if(M.stat == DEAD || M.disabilities & BLIND) //mob is dead or fully blind to_chat(user, "[M] pupils does not react to the light!") else if(XRAY in M.mutations) //mob has X-RAY vision to_chat(user, "[M] pupils give an eerie glow!") diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm index 9a3b4dd6901..dc9067c34e4 100644 --- a/code/game/objects/items/devices/guitar.dm +++ b/code/game/objects/items/devices/guitar.dm @@ -34,7 +34,7 @@ /obj/item/device/guitar/Topic(href, href_list) song.Topic(href, href_list) -/datum/table_recipe/guitar +/datum/crafting_recipe/guitar name = "Guitar" result = /obj/item/device/guitar reqs = list(/obj/item/stack/sheet/wood = 5, diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 40fe1937ec9..6042a007eda 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -55,10 +55,12 @@ if(translate_binary) var/datum/language/binary = all_languages["Robot Talk"] binary.broadcast(M, message) + return RADIO_CONNECTION_NON_SUBSPACE if(translate_hive) var/datum/language/hivemind = all_languages["Hivemind"] hivemind.broadcast(M, message) - return null + return RADIO_CONNECTION_NON_SUBSPACE + return RADIO_CONNECTION_FAIL return ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index d1e9bb2cdef..b1fd67a43de 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -295,12 +295,14 @@ var/global/list/default_medbay_channels = list( return secure_radio_connections[message_mode] // If we were to send to a channel we don't have, drop it. - return null + return RADIO_CONNECTION_FAIL /obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null) - if(!on) return 0 // the device has to be on + if(!on) + return 0 // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. - if(!M || !message) return 0 + if(!M || !message) + return 0 // Uncommenting this. To the above comment: // The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom @@ -322,12 +324,17 @@ var/global/list/default_medbay_channels = list( */ //#### Grab the connection datum ####// - var/datum/radio_frequency/connection = handle_message_mode(M, message, channel) - if(!istype(connection)) - return 0 - if(!connection) + var/message_mode = handle_message_mode(M, message, channel) + switch(message_mode) //special cases + if(RADIO_CONNECTION_FAIL) + return 0 + if(RADIO_CONNECTION_NON_SUBSPACE) + return 1 + + if(!istype(message_mode, /datum/radio_frequency)) //if not a special case, it should be returning a radio connection return 0 + var/datum/radio_frequency/connection = message_mode var/turf/position = get_turf(src) //#### Tagging the signal with all appropriate identity values ####// diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 3836b8eca80..ffb1d31faa8 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -254,7 +254,8 @@ cyborg = R icon_state = "selfrepair_off" - action_button_name = "Toggle Self-Repair" + var/datum/action/A = new /datum/action/item_action/toggle(src) + A.Grant(R) return 1 /obj/item/borg/upgrade/selfrepair/Destroy() @@ -276,6 +277,9 @@ /obj/item/borg/upgrade/selfrepair/update_icon() if(cyborg) icon_state = "selfrepair_[on ? "on" : "off"]" + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else icon_state = "cyborg_upgrade5" diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index d99e1a6cf07..71e09a3cf0d 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -9,7 +9,7 @@ w_class = 4 slot_flags = SLOT_BACK slowdown = 1 - action_button_name = "Equip/Unequip TED Gun" + actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun) var/obj/item/weapon/gun/energy/chrono_gun/PA = null var/list/erased_minds = list() //a collection of minds from the dead @@ -17,6 +17,7 @@ erased_minds += M /obj/item/weapon/chrono_eraser/dropped() + ..() if(PA) qdel(PA) @@ -24,15 +25,19 @@ dropped() return ..() -/obj/item/weapon/chrono_eraser/ui_action_click() - var/mob/living/carbon/user = src.loc - if(iscarbon(user) && (user.back == src)) - if(PA) - qdel(PA) - else - PA = new(src) - user.put_in_hands(PA) +/obj/item/weapon/chrono_eraser/ui_action_click(mob/user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.back == src) + if(PA) + qdel(PA) + else + PA = new(src) + user.put_in_hands(PA) +/obj/item/weapon/chrono_eraser/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 /obj/item/weapon/gun/energy/chrono_gun diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index f0311a8ae24..9ccff568b87 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -11,7 +11,7 @@ throwforce = 6 w_class = 4 origin_tech = "biotech=4" - action_button_name = "Toggle Paddles" + actions_types = list(/datum/action/item_action/toggle_paddles) species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/back.dmi' @@ -70,15 +70,12 @@ overlays += "[icon_state]-charge[ratio]" /obj/item/weapon/defibrillator/CheckParts() + ..() bcell = locate(/obj/item/weapon/stock_parts/cell) in contents update_icon() /obj/item/weapon/defibrillator/ui_action_click() - if(usr.get_item_by_slot(slot_back) == src) - toggle_paddles() - else - to_chat(usr, "Put the defibrillator on your back first!") - return + toggle_paddles() /obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) @@ -147,16 +144,23 @@ remove_paddles(user) update_icon() - return + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/defibrillator/proc/make_paddles() return new /obj/item/weapon/twohanded/shockpaddles(src) /obj/item/weapon/defibrillator/equipped(mob/user, slot) + ..() if(slot != slot_back) remove_paddles(user) update_icon() +/obj/item/weapon/defibrillator/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 + /obj/item/weapon/defibrillator/proc/remove_paddles(mob/user) var/mob/living/carbon/human/M = user if(paddles in get_both_hands(M)) @@ -210,12 +214,9 @@ slot_flags = SLOT_BELT origin_tech = "biotech=4" -/obj/item/weapon/defibrillator/compact/ui_action_click() - if(usr.get_item_by_slot(slot_belt) == src) - toggle_paddles() - else - to_chat(usr, "Strap the defibrillator's belt on first!") - return +/obj/item/weapon/defibrillator/compact/item_action_slot_check(slot, mob/user) + if(slot == slot_belt) + return 1 /obj/item/weapon/defibrillator/compact/loaded/New() ..() @@ -284,7 +285,7 @@ /obj/item/weapon/twohanded/shockpaddles/dropped(mob/user as mob) if(user) - var/obj/item/weapon/twohanded/O = user.get_inactive_hand() + var/obj/item/weapon/twohanded/offhand/O = user.get_inactive_hand() if(istype(O)) O.unwield() to_chat(user, "The paddles snap back into the main unit.") @@ -561,4 +562,4 @@ update_icon() else to_chat(user, "You need to target your patient's chest with [src].") - return \ No newline at end of file + return diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 1c819f4c77a..c3a23b2ba7d 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -165,6 +165,7 @@ 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() @@ -226,4 +227,4 @@ var/target_turf = get_turf(owner) ignite_turf(target_turf, 100) qdel(ptank) - return 1 //It hit the flamethrower, not them \ No newline at end of file + return 1 //It hit the flamethrower, not them diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index cf060b7d02a..9562f9442c7 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -51,8 +51,7 @@ if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) + M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15)) if(M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") if(prob(M.ear_damage - 10 + 5)) diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index b7bbb4ed805..cad1b7630e3 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -94,6 +94,7 @@ range = pick(2,2,2,3,3,3,4) /obj/item/weapon/grenade/iedcasing/CheckParts() + ..() var/obj/item/weapon/reagent_containers/food/drinks/cans/can = locate() in contents if(can) underlays += can diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 4bac1168518..42b74b0e45d 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -2,9 +2,9 @@ name = "implant" icon = 'icons/obj/implants.dmi' icon_state = "generic" //Shows up as the action button icon - action_button_custom_type = /datum/action/item_action/hands_free origin_tech = "materials=2;biotech=3;programming=2" + actions_types = list(/datum/action/item_action/hands_free/activate) var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants var/implanted = null var/mob/living/imp_in = null @@ -41,11 +41,13 @@ return 0 - if(activated) - action_button_name = "Activate [src.name]" src.loc = source imp_in = source implanted = 1 + if(activated) + for(var/X in actions) + var/datum/action/A = X + A.Grant(source) if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() @@ -60,6 +62,10 @@ imp_in = null implanted = 0 + for(var/X in actions) + var/datum/action/A = X + A.Grant(source) + if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() @@ -76,6 +82,6 @@ return "No information available" /obj/item/weapon/implant/dropped(mob/user) + ..() . = 1 qdel(src) - return . diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm index f94772787e2..3e269622e61 100644 --- a/code/game/objects/items/weapons/implants/implant_freedom.dm +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -8,12 +8,13 @@ /obj/item/weapon/implant/freedom/activate() - if(uses == 0) return 0 - if(uses != -1) uses-- + uses-- to_chat(imp_in, "You feel a faint click.") if(iscarbon(imp_in)) var/mob/living/carbon/C_imp_in = imp_in C_imp_in.uncuff() + if(!uses) + qdel(src) /obj/item/weapon/implant/freedom/get_data() diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm index af83960356b..c949d7e561e 100644 --- a/code/game/objects/items/weapons/implants/implant_misc.dm +++ b/code/game/objects/items/weapons/implants/implant_misc.dm @@ -33,7 +33,6 @@ return dat /obj/item/weapon/implant/adrenalin/activate() - if(uses < 1) return 0 uses-- to_chat(imp_in, "You feel a sudden surge of energy!") imp_in.SetStunned(0) @@ -46,6 +45,8 @@ imp_in.reagents.add_reagent("synaptizine", 10) imp_in.reagents.add_reagent("omnizine", 10) imp_in.reagents.add_reagent("stimulative_agent", 10) + if(!uses) + qdel(src) /obj/item/weapon/implant/emp @@ -56,9 +57,10 @@ uses = 2 /obj/item/weapon/implant/emp/activate() - if(src.uses < 1) return 0 - src.uses-- + uses-- empulse(imp_in, 3, 5) + if(!uses) + qdel(src) /obj/item/weapon/implant/cortical name = "cortical stack" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 5687a9b90da..5e262ce4afa 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -217,6 +217,7 @@ spark_system.attach(src) /obj/item/weapon/melee/energy/blade/dropped() + ..() qdel(src) /obj/item/weapon/melee/energy/blade/attack_self(mob/user) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 1130ab3808b..88d3f202ac6 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -132,7 +132,7 @@ maxWeightClass = 7 gasPerThrow = 5 -/datum/table_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but +/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but name = "Pneumatic Cannon" result = /obj/item/weapon/pneumatic_cannon/ghetto tools = list(/obj/item/weapon/weldingtool, diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm new file mode 100644 index 00000000000..8feab4632d7 --- /dev/null +++ b/code/game/objects/items/weapons/powerfist.dm @@ -0,0 +1,100 @@ +/obj/item/weapon/melee/powerfist + name = "power-fist" + desc = "A metal gauntlet with a piston-powered ram ontop for that extra 'ompfh' in your punch." + icon_state = "powerfist" + item_state = "powerfist" + flags = CONDUCT + attack_verb = list("whacked", "fisted", "power-punched") + force = 12 + throwforce = 10 + throw_range = 7 + w_class = 3 + origin_tech = "combat=5;powerstorage=3;syndicate=3" + var/click_delay = 1.5 + var/fisto_setting = 1 + var/gasperfist = 3 + var/obj/item/weapon/tank/tank = null //Tank used for the gauntlet's piston-ram. + + +/obj/item/weapon/melee/powerfist/Destroy() + if(tank) + qdel(tank) + tank = null + return ..() + +/obj/item/weapon/melee/powerfist/examine(mob/user) + ..() + if(!in_range(user, src)) + to_chat(user, "You'll need to get closer to see any more.") + return + if(tank) + to_chat(user, "\icon [tank] It has \the [tank] mounted onto it.") + +/obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/tank)) + if(!tank) + var/obj/item/weapon/tank/IT = W + if(IT.volume <= 3) + to_chat(user, "\The [IT] is too small for \the [src].") + return + updateTank(W, 0, user) + else if(istype(W, /obj/item/weapon/wrench)) + switch(fisto_setting) + if(1) + fisto_setting = 2 + if(2) + fisto_setting = 3 + if(3) + fisto_setting = 1 + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting].") + else if(istype(W, /obj/item/weapon/screwdriver)) + if(tank) + updateTank(tank, 1, user) + + +/obj/item/weapon/melee/powerfist/proc/updateTank(obj/item/weapon/tank/thetank, removing = 0, mob/living/carbon/human/user) + if(removing) + if(!tank) + to_chat(user, "\The [src] currently has no tank attached to it.") + return + to_chat(user, "You detach \the [thetank] from \the [src].") + tank.forceMove(get_turf(user)) + user.put_in_hands(tank) + tank = null + if(!removing) + if(tank) + to_chat(user, "\The [src] already has a tank.") + return + if(!user.unEquip(thetank)) + return + to_chat(user, "You hook \the [thetank] up to \the [src].") + tank = thetank + thetank.forceMove(src) + + +/obj/item/weapon/melee/powerfist/attack(mob/living/target, mob/living/user) + if(!tank) + to_chat(user, "\The [src] can't operate without a source of gas!") + return + if(tank && !tank.air_contents.remove(gasperfist * fisto_setting)) + to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") + playsound(loc, 'sound/effects/refill.ogg', 50, 1) + return + + user.do_attack_animation(target) + + target.apply_damage(force * fisto_setting, BRUTE) + target.visible_message("[user]'s powerfist lets out a loud hiss as they punch [target.name]!", \ + "You cry out in pain as [user]'s punch flings you backwards!") + new/obj/effect/kinetic_blast(target.loc) + playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1) + playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) + + var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) + spawn(0) + target.throw_at(throw_target, 5 * fisto_setting, 0.2) + + add_logs(target, user, "power fisted", src) + + user.changeNext_move(CLICK_CD_MELEE * click_delay) \ No newline at end of file diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm index 0eba3b837d2..2155aeb69c6 100644 --- a/code/game/objects/items/weapons/signs.dm +++ b/code/game/objects/items/weapons/signs.dm @@ -35,7 +35,7 @@ sleep(8) delayed = 0 -/datum/table_recipe/picket_sign +/datum/crafting_recipe/picket_sign name = "Picket Sign" result = /obj/item/weapon/picket_sign reqs = list(/obj/item/stack/rods = 1, diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 2a3a602258e..e2324fcb434 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -373,9 +373,6 @@ handle_item_insertion(W) return 1 -/obj/item/weapon/storage/dropped(mob/user as mob) - return - /obj/item/weapon/storage/attack_hand(mob/user as mob) playsound(src.loc, "rustle", 50, 1, -5) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 096879d267e..71d488672aa 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -118,7 +118,16 @@ ..() new /obj/item/clothing/suit/space/rig/syndi/elite(src) new /obj/item/clothing/head/helmet/space/rig/syndi/elite(src) - return + +/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit + name = "Boxed Shielded Syndicate Hardsuit and Helmet" + can_hold = list("/obj/item/clothing/suit/space/rig/shielded/syndi", "/obj/item/clothing/head/helmet/space/rig/shielded/syndi") + max_w_class = 4 + +/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit/New() + ..() + new /obj/item/clothing/suit/space/rig/shielded/syndi(src) + new /obj/item/clothing/head/helmet/space/rig/shielded/syndi(src) /obj/item/weapon/storage/box/syndie_kit/conversion name = "box (CK)" diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index df131be786c..305befe2ecb 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -24,6 +24,7 @@ return /obj/item/weapon/melee/baton/CheckParts() + ..() bcell = locate(/obj/item/weapon/stock_parts/cell) in contents update_icon() @@ -205,4 +206,4 @@ else if(!bcell) icon_state = "stunprod_nocell" else - icon_state = "stunprod" \ No newline at end of file + icon_state = "stunprod" diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index ccde1d215e2..af2c59c4759 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -8,72 +8,86 @@ item_state = "jetpack" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD var/datum/effect/system/ion_trail_follow/ion_trail - var/on = 0.0 - var/stabilization_on = 0 + actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) + var/on = 0 + var/stabilizers = 0 var/volume_rate = 500 //Needed for borg jetpack transfer - action_button_name = "Toggle Jetpack" /obj/item/weapon/tank/jetpack/New() ..() - src.ion_trail = new /datum/effect/system/ion_trail_follow() - src.ion_trail.set_up(src) - return + ion_trail = new /datum/effect/system/ion_trail_follow() + ion_trail.set_up(src) /obj/item/weapon/tank/jetpack/Destroy() qdel(ion_trail) ion_trail = null return ..() +/obj/item/weapon/tank/jetpack/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/toggle_jetpack) + cycle(user) + else if(actiontype == /datum/action/item_action/jetpack_stabilization) + toggle_stabilization(user) + else + toggle_internals(user) + +/obj/item/weapon/tank/jetpack/proc/toggle_stabilization(mob/user) + if(on) + stabilizers = !stabilizers + to_chat(user, "You turn [src]'s stabilization [stabilizers ? "on" : "off"].") + + /obj/item/weapon/tank/jetpack/examine(mob/user) if(!..(user, 0)) return if(air_contents.oxygen < 10) - to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + to_chat(user, "The meter on [src] indicates you are almost out of air!") playsound(user, 'sound/effects/alert.ogg', 50, 1) -/obj/item/weapon/tank/jetpack/verb/toggle_rockets() - set name = "Toggle Jetpack Stabilization" - set category = "Object" - src.stabilization_on = !( src.stabilization_on ) - to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") - return +/obj/item/weapon/tank/jetpack/proc/cycle(mob/user) + if(user.incapacitated()) + return - -/obj/item/weapon/tank/jetpack/verb/toggle() - set name = "Toggle Jetpack" - set category = "Object" - on = !on - if(on) - icon_state = "[icon_state]-on" -// item_state = "[item_state]-on" - ion_trail.start() + if(!on) + turn_on() + to_chat(user, "You turn the jetpack on.") else - icon_state = initial(icon_state) -// item_state = initial(item_state) - ion_trail.stop() - return + turn_off() + to_chat(user, "You turn the jetpack off.") + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + + +/obj/item/weapon/tank/jetpack/proc/turn_on() + on = TRUE + icon_state = "[initial(icon_state)]-on" + ion_trail.start() + +/obj/item/weapon/tank/jetpack/proc/turn_off() + on = FALSE + stabilizers = FALSE + icon_state = initial(icon_state) + ion_trail.stop() /obj/item/weapon/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob) - if(!(src.on)) + if(!on) return 0 - if((num < 0.005 || src.air_contents.total_moles() < num)) - src.ion_trail.stop() + if((num < 0.005 || air_contents.total_moles() < num)) + turn_off() return 0 - var/datum/gas_mixture/G = src.air_contents.remove(num) - - var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins //fuck trace gases -Pete - if(allgases >= 0.005) - . = 1 - - qdel(G) - -/obj/item/weapon/tank/jetpack/ui_action_click() - toggle() + var/datum/gas_mixture/removed = air_contents.remove(num) + if(removed.total_moles() < 0.005) + turn_off() + return 0 + var/turf/T = get_turf(user) + T.assume_air(removed) + return 1 /obj/item/weapon/tank/jetpack/void name = "Void Jetpack (Oxygen)" @@ -124,8 +138,8 @@ /obj/item/weapon/tank/jetpack/carbondioxide/New() ..() - src.ion_trail = new /datum/effect/system/ion_trail_follow() - src.ion_trail.set_up(src) + ion_trail = new /datum/effect/system/ion_trail_follow() + ion_trail.set_up(src) air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) /obj/item/weapon/tank/jetpack/carbondioxide/examine(mob/user) @@ -133,35 +147,32 @@ return if(air_contents.carbon_dioxide < 10) - to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + to_chat(user, "The meter on [src] indicates you are almost out of air!") playsound(user, 'sound/effects/alert.ogg', 50, 1) /obj/item/weapon/tank/jetpack/rig name = "jetpack" var/obj/item/weapon/rig/holder + actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) /obj/item/weapon/tank/jetpack/rig/examine() to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.") return 0 /obj/item/weapon/tank/jetpack/rig/allow_thrust(num, mob/living/user as mob) - - if(!(src.on)) + if(!on) return 0 if(!istype(holder) || !holder.air_supply) return 0 - var/obj/item/weapon/tank/pressure_vessel = holder.air_supply - - if((num < 0.005 || pressure_vessel.air_contents.total_moles() < num)) - src.ion_trail.stop() + var/datum/gas_mixture/removed = holder.air_supply.air_contents.remove(num) + if(removed.total_moles() < 0.005) + turn_off() return 0 - var/datum/gas_mixture/G = pressure_vessel.air_contents.remove(num) + var/turf/T = get_turf(user) + T.assume_air(removed) - var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins - if(allgases >= 0.005) - . = 1 - qdel(G) + return 1 \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 98c6340d927..9415e49d3cd 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -16,6 +16,7 @@ throw_speed = 1 throw_range = 4 + actions_types = list(/datum/action/item_action/set_internals) var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 @@ -24,9 +25,9 @@ /obj/item/weapon/tank/New() ..() - src.air_contents = new /datum/gas_mixture() - src.air_contents.volume = volume //liters - src.air_contents.temperature = T20C + air_contents = new /datum/gas_mixture() + air_contents.volume = volume //liters + air_contents.temperature = T20C processing_objects.Add(src) return @@ -39,16 +40,52 @@ return ..() + +/obj/item/weapon/tank/ui_action_click(mob/user) + toggle_internals(user) + +/obj/item/weapon/tank/proc/toggle_internals(mob/user) + var/mob/living/carbon/C = user + if(!istype(C)) + return 0 + + if(C.internal == src) + to_chat(C, "You close \the [src] valve.") + C.internal = null + C.update_internals_hud_icon(0) + else + var/can_open_valve = 0 + if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) + can_open_valve = 1 + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(H.head && H.head.flags & AIRTIGHT) + can_open_valve = 1 + + if(can_open_valve) + if(C.internal) + to_chat(C, "You switch your internals to [src].") + else + to_chat(C, "You open \the [src] valve.") + C.internal = src + C.update_internals_hud_icon(1) + else + to_chat(C, "You are not wearing a suitable mask or helmet.") + return 0 + + C.update_action_buttons_icon() + + /obj/item/weapon/tank/examine(mob/user) var/obj/icon = src - if(istype(src.loc, /obj/item/assembly)) - icon = src.loc + if(istype(loc, /obj/item/assembly)) + icon = loc if(!in_range(src, user)) if(icon == src) to_chat(user, "\blue It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.") return - var/celsius_temperature = src.air_contents.temperature-T0C + var/celsius_temperature = air_contents.temperature-T0C var/descriptive if(celsius_temperature < 20) @@ -70,11 +107,11 @@ /obj/item/weapon/tank/blob_act() if(prob(50)) - var/turf/location = src.loc + var/turf/location = loc if(!( istype(location, /turf) )) qdel(src) - if(src.air_contents) + if(air_contents) location.assume_air(air_contents) qdel(src) @@ -82,9 +119,9 @@ /obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob, params) ..() - src.add_fingerprint(user) - if(istype(src.loc, /obj/item/assembly)) - icon = src.loc + add_fingerprint(user) + if(istype(loc, /obj/item/assembly)) + icon = loc if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) atmosanalyzer_scan(air_contents, user) @@ -93,7 +130,7 @@ bomb_assemble(W,user) /obj/item/weapon/tank/attack_self(mob/user as mob) - if(!(src.air_contents)) + if(!(air_contents)) return ui_interact(user) @@ -142,49 +179,23 @@ ui.set_auto_update(1) /obj/item/weapon/tank/Topic(href, href_list) - ..() - if(usr.stat|| usr.restrained()) - return 0 - if(src.loc != usr) - return 0 + if(..()) + return 1 if(href_list["dist_p"]) if(href_list["dist_p"] == "reset") - src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE else if(href_list["dist_p"] == "max") - src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE + distribute_pressure = TANK_MAX_RELEASE_PRESSURE else var/cp = text2num(href_list["dist_p"]) - src.distribute_pressure += cp - src.distribute_pressure = min(max(round(src.distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) + distribute_pressure += cp + distribute_pressure = min(max(round(distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) + if(href_list["stat"]) - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc - if(location.internal == src) - location.internal = null - location.internals.icon_state = "internal0" - to_chat(usr, "\blue You close the tank release valve.") - if(location.internals) - location.internals.icon_state = "internal0" - else + toggle_internals(usr) - var/can_open_valve - if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) - can_open_valve = 1 - else if(istype(location,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = location - if(H.head && (H.head.flags & AIRTIGHT)) - can_open_valve = 1 - - if(can_open_valve) - location.internal = src - to_chat(usr, "\blue You open \the [src] valve.") - if(location.internals) - location.internals.icon_state = "internal1" - else - to_chat(usr, "\blue You need something to connect to \the [src].") - - src.add_fingerprint(usr) + add_fingerprint(usr) return 1 @@ -226,9 +237,9 @@ var/pressure = air_contents.return_pressure() if(pressure > TANK_FRAGMENT_PRESSURE) - if(!istype(src.loc,/obj/item/device/transfer_valve)) - message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] (JMP)") - log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] at [x], [y], [z]") + if(!istype(loc,/obj/item/device/transfer_valve)) + message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast] (JMP)") + log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast] at [x], [y], [z]") // to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa") //Give the gas a chance to build up more pressure through reacting air_contents.react() @@ -241,8 +252,8 @@ // to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]") explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) - if(istype(src.loc,/obj/item/device/transfer_valve)) - qdel(src.loc) + if(istype(loc,/obj/item/device/transfer_valve)) + qdel(loc) else qdel(src) @@ -253,7 +264,7 @@ if(!T) return T.assume_air(air_contents) - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) + playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3) qdel(src) else integrity-- diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 468ac6bf3bf..e6e88563d4b 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -8,7 +8,7 @@ w_class = 4 slot_flags = SLOT_BACK slowdown = 1 - action_button_name = "Toggle Mister" + actions_types = list(/datum/action/item_action/toggle_mister) var/obj/item/weapon/noz var/on = 0 @@ -22,6 +22,10 @@ /obj/item/weapon/watertank/ui_action_click() toggle_mister() +/obj/item/weapon/watertank/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 + /obj/item/weapon/watertank/verb/toggle_mister() set name = "Toggle Mister" set category = "Object" @@ -52,6 +56,7 @@ return new /obj/item/weapon/reagent_containers/spray/mister(src) /obj/item/weapon/watertank/equipped(mob/user, slot) + ..() if(slot != slot_back) remove_noz() @@ -75,8 +80,8 @@ ..() /obj/item/weapon/watertank/MouseDrop(obj/over_object) - if(ishuman(src.loc)) - var/mob/living/carbon/human/H = src.loc + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc switch(over_object.name) if("r_hand") if(H.r_hand) @@ -125,6 +130,7 @@ return /obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob) + ..() to_chat(user, "The mister snaps back onto the watertank.") tank.on = 0 loc = tank @@ -198,6 +204,7 @@ return new /obj/item/weapon/extinguisher/mini/nozzle(src) /obj/item/weapon/watertank/atmos/dropped(mob/user as mob) + ..() icon_state = "waterbackpackatmos" if(istype(noz, /obj/item/weapon/extinguisher/mini/nozzle)) var/obj/item/weapon/extinguisher/mini/nozzle/N = noz @@ -255,6 +262,7 @@ return /obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob) + ..() to_chat(user, "The nozzle snaps back onto the tank!") tank.on = 0 loc = tank diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 586eaab9672..7ecbef740cd 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -90,12 +90,13 @@ return ..() /obj/item/weapon/twohanded/dropped(mob/user) + ..() //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand if(user) var/obj/item/weapon/twohanded/O = user.get_inactive_hand() if(istype(O)) O.unwield(user) - return unwield(user) + return unwield(user) /obj/item/weapon/twohanded/update_icon() return diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 48d90fe11e7..4e318d26fed 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -19,10 +19,6 @@ var/being_shocked = 0 - // What reagents should be logged when transferred TO this object? - // Reagent ID => friendly name - var/list/reagents_to_log=list() - var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart? var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created. diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 896ab5e1dd1..a008e3843e9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -70,8 +70,8 @@ New() ..() for(var/i in 1 to 5) - new /obj/item/weapon/reagent_containers/food/drinks/milk(src) - new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src) + new /obj/item/weapon/reagent_containers/food/condiment/milk(src) + new /obj/item/weapon/reagent_containers/food/condiment/soymilk(src) for(var/i in 1 to 2) new /obj/item/weapon/storage/fancy/egg_box(src) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 005caf3256d..3f49d3e3bde 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -22,7 +22,7 @@ L.client.perspective = EYE_PERSPECTIVE L.client.eye = src L.loc = src - L.sdisabilities += MUTE + L.disabilities += MUTE health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues intialTox = L.getToxLoss() intialFire = L.getFireLoss() @@ -77,7 +77,7 @@ for(var/mob/living/M in src) M.loc = src.loc - M.sdisabilities -= MUTE + M.disabilities -= MUTE M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob if(M.client) M.client.eye = M.client.mob diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 2aef3f958e5..93c0368f268 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -241,7 +241,7 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/engineer(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_in_backpack) var/obj/item/weapon/card/id/W = new(src) W.assignment = "Emergency Response Team Member" @@ -256,7 +256,7 @@ var/ert_request_answered = 0 pda.ownjob = "Emergency Response Team Member" pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-engineer" - M.equip_to_slot_or_del(pda, slot_wear_pda) + M.equip_to_slot_or_del(pda, slot_belt) if("Security") @@ -265,7 +265,7 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/security(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_in_backpack) var/obj/item/weapon/card/id/W = new(src) W.assignment = "Emergency Response Team Member" @@ -280,7 +280,7 @@ var/ert_request_answered = 0 pda.ownjob = "Emergency Response Team Member" pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-security" - M.equip_to_slot_or_del(pda, slot_wear_pda) + M.equip_to_slot_or_del(pda, slot_belt) if("Medic") @@ -302,7 +302,7 @@ var/ert_request_answered = 0 pda.ownjob = "Emergency Response Team Member" pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.icon_state = "pda-medical" - M.equip_to_slot_or_del(pda, slot_wear_pda) + M.equip_to_slot_or_del(pda, slot_belt) if("Commander") @@ -329,7 +329,7 @@ var/ert_request_answered = 0 pda.owner = M.real_name pda.ownjob = "Emergency Response Team Leader" pda.name = "PDA-[M.real_name] ([pda.ownjob])" - M.equip_to_slot_or_del(pda, slot_wear_pda) + M.equip_to_slot_or_del(pda, slot_belt) /datum/response_team/proc/cannot_send_team() command_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable") @@ -382,13 +382,12 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/medical(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/response_team(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/medical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/brute(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/response_team(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -399,12 +398,11 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/command(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/command(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -464,7 +462,6 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack) @@ -473,6 +470,7 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -483,12 +481,12 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -546,12 +544,12 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) @@ -564,13 +562,13 @@ var/ert_request_answered = 0 M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 7f1674dd4ae..c04940a3cfa 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -602,7 +602,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that "assassin", "spy", "death commando", - "syndicate commando", + "syndicate agent", + "syndicate operative", + "syndicate strike team", + "syndicate officer", "chrono legionnaire", "blue wizard", "red wizard", @@ -655,7 +658,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/device/radio/headset(M), slot_l_ear) var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) M.equip_to_slot_or_del(J, slot_back) - J.toggle() + J.turn_on() M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) J.Topic(null, list("stat" = 1)) equip_special_id(M,get_all_accesses(), "Space Explorer", /obj/item/weapon/card/id) @@ -684,7 +687,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/helmet/space/rig/atmos(M), slot_head) var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) M.equip_to_slot_or_del(J, slot_back) - J.toggle() + J.turn_on() M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) equip_special_id(M,get_all_accesses(), "RIG Tester", /obj/item/weapon/card/id) J.Topic(null, list("stat" = 1)) @@ -806,7 +809,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/weapon/kitchen/knife(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) - equip_special_id(M,get_all_accesses(), "Masked Killer", /obj/item/weapon/card/id/syndicate) + equip_special_id(M,get_all_accesses(), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie") var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) M.equip_to_slot_or_del(fire_axe, slot_r_hand) for(var/obj/item/carried_item in M.contents) @@ -827,7 +830,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/clothing/suit/chaplain_hoodie/robe = new(M) robe.name = "dark lord robes" M.equip_to_slot_or_del(robe, slot_wear_suit) - equip_special_id(M,get_all_accesses(), "Dark Lord", /obj/item/weapon/card/id/syndicate) + equip_special_id(M,get_all_accesses(), "Dark Lord", /obj/item/weapon/card/id/syndicate, "syndie") if("assassin") M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform) @@ -856,8 +859,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that pda.owner = M.real_name pda.ownjob = "Reaper" pda.name = "PDA-[M.real_name] ([pda.ownjob])" - M.equip_to_slot_or_del(pda, slot_wear_pda) - equip_special_id(M,get_all_accesses(), "Reaper", /obj/item/weapon/card/id/syndicate) + M.equip_to_slot_or_del(pda, slot_belt) + equip_special_id(M,get_all_accesses(), "Reaper", /obj/item/weapon/card/id/syndicate, "syndie") if("spy") M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform) @@ -884,14 +887,88 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that pda.ownjob = "Spy" pda.name = "PDA-[M.real_name] ([pda.ownjob])" M.equip_to_slot_or_del(pda, slot_belt) - equip_special_id(M,get_all_accesses(), "Spy", /obj/item/weapon/card/id/syndicate) + equip_special_id(M,get_all_accesses(), "Spy", /obj/item/weapon/card/id/syndicate, "syndie") - if("death commando")//Was looking to add this for a while. + if("death commando") M.equip_death_commando() - if("syndicate commando") + if("syndicate agent") + M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) + equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Agent", /obj/item/weapon/card/id/syndicate, "syndie") + var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M) + U.hidden_uplink.uplink_owner="[M.key]" + U.hidden_uplink.uses = 20 + M.equip_to_slot_or_del(U, slot_r_store) + + if("syndicate operative") + M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses) + M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt) + M.equip_or_collect(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head) + var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M) + R.set_frequency(SYND_FREQ) + M.equip_to_slot_or_del(R, slot_l_ear) + var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M) + U.hidden_uplink.uplink_owner="[M.key]" + U.hidden_uplink.uses = 20 + M.equip_to_slot_or_del(U, slot_r_store) + M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack) + equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Operative", /obj/item/weapon/card/id/syndicate, "syndie") + var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(M) + E.implant(M) + + if("syndicate strike team") M.equip_syndicate_commando() + if("syndicate officer") + M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses) + M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt) + M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(M), slot_head) + var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M) + R.set_frequency(SYND_FREQ) + M.equip_to_slot_or_del(R, slot_l_ear) + var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M) + U.hidden_uplink.uplink_owner="[M.key]" + U.hidden_uplink.uses = 50 + M.equip_to_slot_or_del(U, slot_r_store) + M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack) + equip_special_id(M,get_all_accesses() + get_syndicate_access("Syndicate Commando"), "Syndicate Officer", /obj/item/weapon/card/id/syndicate, "commander") + var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M) + DUST.implant(M) + if("nt vip guest") M.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform) M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes) @@ -899,7 +976,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head) M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear) - M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda) + M.equip_or_collect(new /obj/item/device/pda/(M), slot_belt) equip_special_id(M,get_centcom_access("VIP Guest"), "VIP Guest", /obj/item/weapon/card/id/centcom) if("nt navy officer") @@ -908,10 +985,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear) M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) - M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda) + M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_belt) M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) - M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M) @@ -926,10 +1003,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear) M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head) - M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_wear_pda) + M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_belt) M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) - M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M) @@ -970,7 +1047,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/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) // job has /obj/item/clothing/head/beret/centcom/officer/navy - M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_wear_pda) + M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back) @@ -998,18 +1075,20 @@ 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/device/radio/headset/centcom(src), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // special - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store) M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack) + var/obj/item/device/pda/centcom/pda = new(M) pda.owner = M.real_name pda.ownjob = "Special Operations Officer" pda.icon_state = "pda-syndi" pda.name = "PDA-[M.real_name] ([pda.ownjob])" pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work." - M.equip_or_collect(pda, slot_wear_pda) + + M.equip_or_collect(pda, slot_belt) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom) @@ -1077,7 +1156,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/weapon/storage/backpack/satchel(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Admiral", /obj/item/weapon/card/id) + equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Admiral", /obj/item/weapon/card/id, "commander") //W.icon_state = "commander" if("chrono legionnaire") @@ -1090,7 +1169,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/weapon/chrono_eraser(M), slot_back) M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store) - equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Chrono Legionnaire", /obj/item/weapon/card/id/syndicate) + equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Chrono Legionnaire", /obj/item/weapon/card/id/syndicate, "syndie") M.regenerate_icons() @@ -1098,13 +1177,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1) return -/client/proc/equip_special_id(var/mob/living/carbon/human/H, var/list/theaccess = null, var/jobtext, var/obj/item/weapon/card/id/id_type = /obj/item/weapon/card/id) +/client/proc/equip_special_id(var/mob/living/carbon/human/H, var/list/theaccess = null, var/jobtext, var/obj/item/weapon/card/id/id_type = /obj/item/weapon/card/id, var/special_icon = null) if(!check_rights(R_EVENT)) return var/obj/item/weapon/card/id/W = new id_type(H) - if(istype(W, /obj/item/weapon/card/id/syndicate)) - W.icon_state = "syndie" + if(special_icon) + W.icon_state = special_icon W.name = "[H.real_name]'s ID Card ([jobtext])" W.access = theaccess W.assignment = "[jobtext]" diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index 0a52bdbdce0..0833ccdb669 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -59,7 +59,7 @@ var/global/sent_honksquad = 0 new_honksquad.key = pick(commandos) commandos -= new_honksquad.key new_honksquad.internal = new_honksquad.s_store - new_honksquad.internals.icon_state = "internal1" + new_honksquad.update_internals_hud_icon(1) //So they don't forget their code or mission. new_honksquad.mind.store_memory("Mission: \red [input].") @@ -111,7 +111,7 @@ var/global/sent_honksquad = 0 equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform) equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask) equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes) - equip_to_slot_or_del(new /obj/item/device/pda/clown(src), slot_wear_pda) + equip_to_slot_or_del(new /obj/item/device/pda/clown(src), slot_belt) equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask) equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/bikehorn(src), slot_in_backpack) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index daedb7ae5e0..5506b3b9076 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -375,7 +375,7 @@ client/proc/one_click_antag() new_syndicate_commando.key = theghost.key new_syndicate_commando.internal = new_syndicate_commando.s_store - new_syndicate_commando.internals.icon_state = "internal1" + new_syndicate_commando.update_internals_hud_icon(1) //So they don't forget their code or mission. diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index f41a900aed7..c44ff5c1af6 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -407,7 +407,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Death Commando")//Leaves them at late-join spawn. new_character.equip_death_commando() new_character.internal = new_character.s_store - new_character.internals.icon_state = "internal1" + new_character.update_internals_hud_icon(1) else//They may also be a cyborg or AI. switch(new_character.mind.assigned_role) if("Cyborg")//More rigging to make em' work and check if they're traitor. diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 1aeb425b8be..e76545f4748 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -64,7 +64,7 @@ var/global/sent_strike_team = 0 new_commando.key = pick(commandos) commandos -= new_commando.key new_commando.internal = new_commando.s_store - new_commando.internals.icon_state = "internal1" + new_commando.update_internals_hud_icon(1) //So they don't forget their code or mission. if(nuke_code) diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 2fdd388d0ca..3669ba2ba13 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -71,7 +71,7 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.key = pick(commandos) commandos -= new_syndicate_commando.key new_syndicate_commando.internal = new_syndicate_commando.s_store - new_syndicate_commando.internals.icon_state = "internal1" + new_syndicate_commando.update_internals_hud_icon(1) //So they don't forget their code or mission. if(nuke_code) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 954d19cab18..267d1600523 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -68,6 +68,7 @@ dropped() + ..() spawn(0) sense() return diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 74f63e9111c..5580d76f1e5 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -6,17 +6,17 @@ /datum/gear/hat/hhat_yellow display_name = "hardhat, yellow" path = /obj/item/clothing/head/hardhat - allowed_roles = list("Chief Engineer", "Engineer", "Mechanic", "Life Support Specialist") + allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist") /datum/gear/hat/hhat_orange display_name = "hardhat, orange" path = /obj/item/clothing/head/hardhat/orange - allowed_roles = list("Chief Engineer", "Engineer", "Mechanic", "Life Support Specialist") + allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist") /datum/gear/hat/hhat_blue display_name = "hardhat, blue" path = /obj/item/clothing/head/hardhat/dblue - allowed_roles = list("Chief Engineer", "Engineer", "Mechanic", "Life Support Specialist") + allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist") /datum/gear/hat/that display_name = "top hat" diff --git a/code/modules/client/preference/loadout/loadout_shoes.dm b/code/modules/client/preference/loadout/loadout_shoes.dm new file mode 100644 index 00000000000..97e64e74f83 --- /dev/null +++ b/code/modules/client/preference/loadout/loadout_shoes.dm @@ -0,0 +1,8 @@ +/datum/gear/shoes + subtype_path = /datum/gear/shoes + slot = slot_shoes + sort_category = "Shoes" + +/datum/gear/shoes/sandals + display_name = "sandals" + path = /obj/item/clothing/shoes/sandal \ No newline at end of file diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm index e98d01e0b39..29f0c15c71c 100644 --- a/code/modules/client/preference/loadout/loadout_suit.dm +++ b/code/modules/client/preference/loadout/loadout_suit.dm @@ -39,7 +39,7 @@ /datum/gear/suit/coat/job/engi display_name = "winter coat, engineering" path = /obj/item/clothing/suit/hooded/wintercoat/engineering - allowed_roles = list("Chief Engineer", "Engineer", "Mechanic") + allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic") /datum/gear/suit/coat/job/atmos display_name = "winter coat, atmospherics" diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 618d7658796..058dc23afc2 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -2109,15 +2109,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(disabilities & DISABILITY_FLAG_DEAF) character.dna.SetSEState(DEAFBLOCK,1,1) - character.sdisabilities|=DEAF + character.disabilities|=DEAF if(disabilities & DISABILITY_FLAG_BLIND) character.dna.SetSEState(BLINDBLOCK,1,1) - character.sdisabilities|=BLIND + character.disabilities|=BLIND if(disabilities & DISABILITY_FLAG_MUTE) character.dna.SetSEState(MUTEBLOCK,1,1) - character.sdisabilities |= MUTE + character.disabilities |= MUTE S.handle_dna(character) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b7eb89bfe60..afc11b0acf8 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -179,34 +179,14 @@ BLIND // can't see anything attack_verb = list("challenged") var/transfer_prints = FALSE var/pickpocket = 0 //Master pickpocket? - var/clipped = 0 strip_delay = 20 put_on_delay = 40 - species_restricted = list("exclude","Unathi","Tajaran","Wryn") species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/gloves.dmi', "Drask" = 'icons/mob/species/drask/gloves.dmi' ) -/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/wirecutters)) - if(!clipped) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user.visible_message("[user] snips the fingertips off [src].","You snip the fingertips off [src].") - clipped = 1 - name = "mangled [name]" - desc = "[desc] They have had the fingertips cut off of them." - if("exclude" in species_restricted) - species_restricted -= "Unathi" - species_restricted -= "Tajaran" - update_icon() - else - to_chat(user, "[src] have already been clipped!") - return - else - ..() - /obj/item/clothing/gloves/proc/Touch() return @@ -289,7 +269,6 @@ BLIND // can't see anything body_parts_covered = HEAD slot_flags = SLOT_MASK var/mask_adjusted = 0 - var/ignore_maskadjust = 1 var/adjusted_flags = null strip_delay = 40 put_on_delay = 40 @@ -297,60 +276,61 @@ BLIND // can't see anything //Proc that moves gas/breath masks out of the way /obj/item/clothing/mask/proc/adjustmask(var/mob/user) var/mob/living/carbon/human/H = usr //Used to check if the mask is on the head, to check if the hands are full, and to turn off internals if they were on when the mask was pushed out of the way. - if(!ignore_maskadjust) - if(user.incapacitated()) //This check allows you to adjust your masks while you're buckled into chairs or beds. - return - if(mask_adjusted) - icon_state = copytext(icon_state, 1, findtext(icon_state, "_up")) /*Trims the '_up' off the end of the icon state, thus reverting to the most recent previous state. - Had to use this instead of initial() because initial reverted to the wrong state.*/ - gas_transfer_coefficient = initial(gas_transfer_coefficient) - permeability_coefficient = initial(permeability_coefficient) - to_chat(user, "You push \the [src] back into place.") - mask_adjusted = 0 - slot_flags = initial(slot_flags) - if(flags_inv != initial(flags_inv)) - if(initial(flags_inv) & HIDEFACE) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again. - flags_inv |= HIDEFACE - if(flags != initial(flags)) - if(initial(flags) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again. - flags |= MASKCOVERSMOUTH - if(initial(flags) & AIRTIGHT) //If the mask is airtight and thus, one that you'd be able to run internals from yet can't because it was adjusted, make it airtight again. - flags |= AIRTIGHT - if(H.head == src && flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. - if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. - user.unEquip(src) - else //Otherwise, put it in an available hand, the active one preferentially. - src.loc = user - H.head = null - user.put_in_hands(src) - else - icon_state += "_up" - to_chat(user, "You push \the [src] out of the way.") - gas_transfer_coefficient = null - permeability_coefficient = null - mask_adjusted = 1 - if(adjusted_flags) - slot_flags = adjusted_flags - if(ishuman(user) && H.internal && user.wear_mask == src && H.internals) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. - Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/ - H.internals.icon_state = "internal0" - H.internal = null - if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. - flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE). - This reveals the user's face since the bandana will now be going on their head.*/ - if(flags & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks. - flags &= ~MASKCOVERSMOUTH - if(flags & AIRTIGHT) //If the mask was airtight, it won't be anymore since you just pushed it off your face. - flags &= ~AIRTIGHT - if(user.wear_mask == src && initial(flags_inv) == HIDEFACE) //Means that you won't have to take off and put back on simple things like breath masks which, realistically, can just be pulled down off your face. - if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. - user.unEquip(src) - else //Otherwise, put it in an available hand, the active one preferentially. - src.loc = user - user.wear_mask = null - user.put_in_hands(src) - usr.update_inv_wear_mask() - usr.update_inv_head() + if(user.incapacitated()) //This check allows you to adjust your masks while you're buckled into chairs or beds. + return + if(mask_adjusted) + icon_state = initial(icon_state) + gas_transfer_coefficient = initial(gas_transfer_coefficient) + permeability_coefficient = initial(permeability_coefficient) + to_chat(user, "You push \the [src] back into place.") + mask_adjusted = 0 + slot_flags = initial(slot_flags) + if(flags_inv != initial(flags_inv)) + if(initial(flags_inv) & HIDEFACE) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again. + flags_inv |= HIDEFACE + if(flags != initial(flags)) + if(initial(flags) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again. + flags |= MASKCOVERSMOUTH + if(initial(flags) & AIRTIGHT) //If the mask is airtight and thus, one that you'd be able to run internals from yet can't because it was adjusted, make it airtight again. + flags |= AIRTIGHT + if(H.head == src && flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. + if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. + user.unEquip(src) + else //Otherwise, put it in an available hand, the active one preferentially. + src.loc = user + H.head = null + user.put_in_hands(src) + else + icon_state += "_up" + to_chat(user, "You push \the [src] out of the way.") + gas_transfer_coefficient = null + permeability_coefficient = null + mask_adjusted = 1 + if(adjusted_flags) + slot_flags = adjusted_flags + if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. + Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/ + H.update_internals_hud_icon(0) + H.internal = null + if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. + flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE). + This reveals the user's face since the bandana will now be going on their head.*/ + if(flags & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks. + flags &= ~MASKCOVERSMOUTH + if(flags & AIRTIGHT) //If the mask was airtight, it won't be anymore since you just pushed it off your face. + flags &= ~AIRTIGHT + if(user.wear_mask == src && initial(flags_inv) == HIDEFACE) //Means that you won't have to take off and put back on simple things like breath masks which, realistically, can just be pulled down off your face. + if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. + user.unEquip(src) + else //Otherwise, put it in an available hand, the active one preferentially. + src.loc = user + user.wear_mask = null + user.put_in_hands(src) + usr.update_inv_wear_mask() + usr.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() //Shoes /obj/item/clothing/shoes @@ -370,7 +350,6 @@ BLIND // can't see anything permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN - species_restricted = list("exclude","Unathi","Tajaran","Wryn") species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/shoes.dmi' @@ -403,9 +382,6 @@ BLIND // can't see anything item_state = "[item_state]_opentoe" name = "mangled [name]" desc = "[desc] They have had their toes opened up." - if("exclude" in species_restricted) - species_restricted -= "Unathi" - species_restricted -= "Tajaran" update_icon() else to_chat(user, "[src] have already had their toes cut open!") @@ -463,6 +439,9 @@ BLIND // can't see anything flavour = "[copytext(adjust_flavour, 3, lentext(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button. to_chat(user, "You [flavour] \the [src].") suit_adjusted = 0 //Suit is no longer adjusted. + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else var/flavour = "open" icon_state += "_open" @@ -471,6 +450,9 @@ BLIND // can't see anything flavour = "[adjust_flavour]" to_chat(user, "You [flavour] \the [src].") suit_adjusted = 1 //Suit's adjusted. + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else if(user.canUnEquip(src)) //Checks to see if the item can be unequipped. If so, lets shred. Otherwise, struggle and fail. if(contents) //If the suit's got any storage capability... @@ -493,6 +475,7 @@ BLIND // can't see anything to_chat(user, "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.") /obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis. + ..() if(ishuman(user) && hide_tail_by_species && slot == slot_wear_suit) if(user.species.name in hide_tail_by_species) if(!(flags_inv & HIDETAIL)) //Hide the tail if the user's species is in the hide_tail_by_species list and the tail isn't already hidden. @@ -501,20 +484,11 @@ BLIND // can't see anything if(!(initial(flags_inv) & HIDETAIL) && (flags_inv & HIDETAIL)) //Otherwise, remove the HIDETAIL flag if it wasn't already in the flags_inv to start with. flags_inv &= ~HIDETAIL -/obj/item/clothing/suit/verb/openjacket(var/mob/user) //The verb you can use to adjust jackets. - set name = "Open/Close Jacket" - set category = "Object" - set src in usr - if(!isliving(usr)) - return - if(usr.stat) - return - adjustsuit(user) - -/obj/item/clothing/suit/ui_action_click() //This is what happens when you click the HUD action button to adjust your suit. +/obj/item/clothing/suit/ui_action_click(mob/user) //This is what happens when you click the HUD action button to adjust your suit. if(!ignore_suitadjust) - adjustsuit(usr) - else ..() //This is required in order to ensure that the UI buttons for items that have alternate functions tied to UI buttons still work. + adjustsuit(user) + else + ..() //This is required in order to ensure that the UI buttons for items that have alternate functions tied to UI buttons still work. //Spacesuit //Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together. diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 673685c4fc4..6a51086c7b3 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -101,15 +101,11 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) + actions_types = list(/datum/action/item_action/toggle_research_scanner) -/obj/item/clothing/glasses/science/equipped(mob/user, slot) +/obj/item/clothing/glasses/science/item_action_slot_check(slot) if(slot == slot_glasses) - user.scanner.Grant(user) - ..(user, slot) - -/obj/item/clothing/glasses/science/dropped(mob/user) - user.scanner.devices -= 1 - ..(user) + return 1 /obj/item/clothing/glasses/science/night name = "Night Vision Science Goggle" @@ -242,13 +238,16 @@ /obj/item/clothing/glasses/sunglasses/noir name = "noir sunglasses" desc = "Somehow these seem even more out-of-date than normal sunglasses." - action_button_name = "Noir Mode" + actions_types = list(/datum/action/item_action/noir) var/noir_mode = 0 color_view = MATRIX_GREYSCALE /obj/item/clothing/glasses/sunglasses/noir/attack_self() - if(is_equipped()) - toggle_noir() + toggle_noir() + +/obj/item/clothing/glasses/sunglasses/noir/item_action_slot_check(slot) + if(slot == slot_glasses) + return 1 /obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir() if(!noir_mode) @@ -277,16 +276,12 @@ name = "agreeable glasses" desc = "H.C Limited edition." var/punused = null - action_button_name = "YEAH!" + actions_types = list(/datum/action/item_action/YEEEAAAAAHHHHHHHHHHHHH) /obj/item/clothing/glasses/sunglasses/yeah/attack_self() pun() - -/obj/item/clothing/glasses/sunglasses/yeah/verb/pun() - set category = "Object" - set name = "YEAH!" - set src in usr +/obj/item/clothing/glasses/sunglasses/yeah/proc/pun() if(!punused)//one per round punused = 1 playsound(src.loc, 'sound/misc/yeah.ogg', 100, 0) @@ -330,7 +325,7 @@ desc = "Protects the eyes from welders, approved by the mad scientist association." icon_state = "welding-g" item_state = "welding-g" - action_button_name = "Flip welding goggles" + actions_types = list(/datum/action/item_action/toggle) flash_protect = 2 tint = 2 species_fit = list("Vox") @@ -342,31 +337,28 @@ /obj/item/clothing/glasses/welding/attack_self() toggle() +/obj/item/clothing/glasses/welding/proc/toggle() + if(up) + up = !up + flags |= GLASSESCOVERSEYES + flags_inv |= HIDEEYES + icon_state = initial(icon_state) + to_chat(usr, "You flip the [src] down to protect your eyes.") + flash_protect = 2 + tint = initial(tint) //better than istype + else + up = !up + flags &= ~GLASSESCOVERSEYES + flags_inv &= ~HIDEEYES + icon_state = "[initial(icon_state)]up" + to_chat(usr, "You push the [src] up out of your face.") + flash_protect = 0 + tint = 0 + usr.update_inv_glasses() -/obj/item/clothing/glasses/welding/verb/toggle() - set category = "Object" - set name = "Adjust welding goggles" - set src in usr - - if(usr.canmove && !usr.stat && !usr.restrained()) - if(src.up) - src.up = !src.up - src.flags |= GLASSESCOVERSEYES - flags_inv |= HIDEEYES - icon_state = initial(icon_state) - to_chat(usr, "You flip the [src] down to protect your eyes.") - flash_protect = 2 - tint = initial(tint) //better than istype - else - src.up = !src.up - src.flags &= ~HEADCOVERSEYES - flags_inv &= ~HIDEEYES - icon_state = "[initial(icon_state)]up" - to_chat(usr, "You push the [src] up out of your face.") - flash_protect = 0 - tint = 0 - - usr.update_inv_glasses() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/glasses/welding/superior name = "superior welding goggles" @@ -375,7 +367,6 @@ item_state = "rwelding-g" flash_protect = 2 tint = 0 - action_button_name = "Flip welding goggles" /obj/item/clothing/glasses/sunglasses/blindfold name = "blindfold" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 8e5d7c08397..e290ba5308d 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -14,6 +14,7 @@ H.add_hud_to(user) /obj/item/clothing/glasses/hud/dropped(mob/living/carbon/human/user) + ..() if(HUDType && istype(user) && user.glasses == src) var/datum/atom_hud/H = huds[HUDType] H.remove_hud_from(user) @@ -81,7 +82,7 @@ ) /obj/item/clothing/glasses/hud/security/chameleon - name = "Chamleon Security HUD" + name = "Chameleon Security HUD" desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection." flash_protect = 1 diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index fd54295c477..77a4076347d 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -4,7 +4,6 @@ icon_state = "boxing" item_state = "boxing" put_on_delay = 60 - species_restricted = null /obj/item/clothing/gloves/boxing/green icon_state = "boxinggreen" diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index a50e56382a1..76bfbdfd394 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -59,16 +59,28 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + var/can_be_cut = 1 - hos - item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. +/obj/item/clothing/gloves/color/black/hos + item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. - ce - item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. +/obj/item/clothing/gloves/color/black/ce + item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way. - thief - pickpocket = 1 +/obj/item/clothing/gloves/color/black/thief + pickpocket = 1 + +/obj/item/clothing/gloves/color/black/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/wirecutters)) + if(can_be_cut && icon_state == initial(icon_state))//only if not dyed + to_chat(user, "You snip the fingertips off of [src].") + playsound(user.loc,'sound/items/Wirecutter.ogg', rand(10,50), 1) + var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc) + if(pickpocket) + F.pickpocket = 1 + qdel(src) + ..() /obj/item/clothing/gloves/color/orange name = "orange gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index d98ee1d0154..feae32b9085 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -7,10 +7,8 @@ transfer_prints = TRUE cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - species_restricted = null strip_delay = 40 put_on_delay = 20 - clipped = 1 /obj/item/clothing/gloves/cyborg desc = "beep boop borp" diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm index 4a0af4392fa..590efa7cd91 100644 --- a/code/modules/clothing/gloves/rings.dm +++ b/code/modules/clothing/gloves/rings.dm @@ -8,22 +8,22 @@ icon = 'icons/obj/clothing/rings.dmi' var/material = "iron" var/stud = 0 - species_restricted = null - - New() - ..() - update_icon() +/obj/item/clothing/gloves/ring/New() + ..() update_icon() - if(stud) - icon_state = "d_[initial(icon_state)]" - else - icon_state = initial(icon_state) - examine(mob/user) - ..(user) - to_chat(user, "This one is made of [material].") - if(stud) - to_chat(user, "It is adorned with a single gem.") + +/obj/item/clothing/gloves/ring/update_icon() + if(stud) + icon_state = "d_[initial(icon_state)]" + else + icon_state = initial(icon_state) + +/obj/item/clothing/gloves/ring/examine(mob/user) + ..(user) + to_chat(user, "This one is made of [material].") + if(stud) + to_chat(user, "It is adorned with a single gem.") /obj/item/clothing/gloves/ring/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/stack/sheet/mineral/diamond)) @@ -69,10 +69,11 @@ icon_state = "redring" /obj/item/clothing/gloves/ring/plastic/random - New() - var/c = pick("white","blue","red") - name = "[c] plastic ring" - icon_state = "[c]ring" + +/obj/item/clothing/gloves/ring/plastic/random/New() + var/c = pick("white","blue","red") + name = "[c] plastic ring" + icon_state = "[c]ring" // weird /obj/item/clothing/gloves/ring/glass diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 48e2ccb7f95..5cc5af80abb 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -9,19 +9,21 @@ item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite) armor = list(melee = 15, bullet = 5, laser = 20, energy = 10, bomb = 20, bio = 10, rad = 20) flags_inv = 0 - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) - attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc]")//To prevent some lighting anomalities. +/obj/item/clothing/head/hardhat/attack_self(mob/user) + on = !on + icon_state = "hardhat[on]_[item_color]" + item_state = "hardhat[on]_[item_color]" - return - on = !on - icon_state = "hardhat[on]_[item_color]" - item_state = "hardhat[on]_[item_color]" + if(on) + set_light(brightness_on) + else + set_light(0) - if(on) set_light(brightness_on) - else set_light(0) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/head/hardhat/orange diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 17058cc23b5..b7b0cc71b81 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -100,7 +100,7 @@ icon_state = "justice" toggle_message = "You turn off the lights on" alt_toggle_message = "You turn on the lights on" - action_button_name = "Toggle JUSTICE" + actions_types = list(/datum/action/item_action/toggle_helmet_light) can_toggle = 1 toggle_cooldown = 20 active_sound = 'sound/items/WEEOO1.ogg' diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 6d300c724bd..f7253a82cdf 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -350,19 +350,12 @@ item_state = "griffinhat" flags = BLOCKHAIR|NODROP flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - action_button_name = "Caw" + actions_types = list(/datum/action/item_action/caw) /obj/item/clothing/head/griffin/attack_self() caw() -/obj/item/clothing/head/griffin/verb/caw() - - set category = "Object" - set name = "Caw" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - +/obj/item/clothing/head/griffin/proc/caw() if(cooldown < world.time - 20) // A cooldown, to stop people being jerks playsound(src.loc, "sound/misc/caw.ogg", 50, 1) cooldown = world.time diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 21c493bf66c..703f36cf1fd 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -22,7 +22,7 @@ tint = 2 armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) - action_button_name = "flip welding helmet" + actions_types = list(/datum/action/item_action/toggle) species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', @@ -50,26 +50,28 @@ toggle() /obj/item/clothing/head/welding/proc/toggle() - set src in usr + if(up) + up = !up + flags |= (HEADCOVERSEYES | HEADCOVERSMOUTH) + flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) + icon_state = initial(icon_state) + to_chat(usr, "You flip the [src] down to protect your eyes.") + flash_protect = 2 + tint = 2 + else + up = !up + flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH) + flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) + icon_state = "[initial(icon_state)]up" + to_chat(usr, "You push the [src] up out of your face.") + flash_protect = 0 + tint = 0 + usr.update_inv_head() //so our mob-overlays update + + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() - if(usr.canmove && !usr.stat && !usr.restrained()) - if(src.up) - src.up = !src.up - src.flags |= (HEADCOVERSEYES | HEADCOVERSMOUTH) - flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) - icon_state = initial(icon_state) - to_chat(usr, "You flip the [src] down to protect your eyes.") - flash_protect = 2 - tint = 2 - else - src.up = !src.up - src.flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH) - flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) - icon_state = "[initial(icon_state)]up" - to_chat(usr, "You push the [src] up out of your face.") - flash_protect = 0 - tint = 0 - usr.update_inv_head() //so our mob-overlays update /* @@ -148,7 +150,6 @@ flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - action_button_name = "Toggle Pumpkin Light" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 2 //luminosity when on @@ -160,7 +161,6 @@ item_state = "hardhat0_reindeer" item_color = "reindeer" flags_inv = 0 - action_button_name = "Toggle Nose Light" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 1 //luminosity when on diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 66e97d714d8..25cdc259f92 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -6,8 +6,7 @@ flags = BLOCKHAIR flags_inv = HIDEFACE w_class = 2 - action_button_name = "Adjust Balaclava" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) adjusted_flags = SLOT_HEAD species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 40811397187..5b3ab335cbe 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -7,8 +7,7 @@ w_class = 2 gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 - action_button_name = "Adjust Breath Mask" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', @@ -38,5 +37,4 @@ item_state = "voxmask" permeability_coefficient = 0.01 species_restricted = list("Vox") - action_button_name = null - ignore_maskadjust = 1 + actions_types = list() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index c1124386acc..72b4b6febb7 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -29,35 +29,33 @@ tint = 2 armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) origin_tech = "materials=2;engineering=2" - action_button_name = "Toggle Welding Helmet" + actions_types = list(/datum/action/item_action/toggle) /obj/item/clothing/mask/gas/welding/attack_self() toggle() +/obj/item/clothing/mask/gas/welding/proc/toggle() + if(up) + up = !src.up + flags |= (MASKCOVERSEYES) + flags_inv |= (HIDEEYES) + icon_state = initial(icon_state) + to_chat(usr, "You flip the [src] down to protect your eyes.") + flash_protect = 2 + tint = 2 + else + up = !up + flags &= ~(MASKCOVERSEYES) + flags_inv &= ~(HIDEEYES) + icon_state = "[initial(icon_state)]up" + to_chat(usr, "You push the [src] up out of your face.") + flash_protect = 0 + tint = 0 + usr.update_inv_wear_mask() //so our mob-overlays update -/obj/item/clothing/mask/gas/welding/verb/toggle() - set category = "Object" - set name = "Adjust welding mask" - set src in usr - - if(usr.canmove && !usr.stat && !usr.restrained()) - if(src.up) - src.up = !src.up - src.flags |= (MASKCOVERSEYES) - flags_inv |= (HIDEEYES) - icon_state = initial(icon_state) - to_chat(usr, "You flip the [src] down to protect your eyes.") - flash_protect = 2 - tint = 2 - else - src.up = !src.up - src.flags &= ~(MASKCOVERSEYES) - flags_inv &= ~(HIDEEYES) - icon_state = "[initial(icon_state)]up" - to_chat(usr, "You push the [src] up out of your face.") - flash_protect = 0 - tint = 0 - usr.update_inv_wear_mask() //so our mob-overlays update + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() //Bane gas mask /obj/item/clothing/mask/banemask @@ -166,19 +164,12 @@ desc = "Twoooo!" icon_state = "owl" flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP - action_button_name = "Hoot" + actions_types = list(/datum/action/item_action/hoot) /obj/item/clothing/mask/gas/owl_mask/attack_self() hoot() -/obj/item/clothing/mask/gas/owl_mask/verb/hoot() - - set category = "Object" - set name = "Hoot" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - +/obj/item/clothing/mask/gas/owl_mask/proc/hoot() if(cooldown < world.time - 35) // A cooldown, to stop people being jerks playsound(src.loc, "sound/misc/hoot.ogg", 50, 1) cooldown = world.time @@ -190,26 +181,24 @@ /obj/item/clothing/mask/gas/sechailer name = "security gas mask" desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device, plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device." - action_button_name = "HALT!" icon_state = "sechailer" var/aggressiveness = 2 var/safety = 1 - ignore_maskadjust = 0 - action_button_name = "HALT!" + actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust) /obj/item/clothing/mask/gas/sechailer/hos name = "\improper HOS SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." icon_state = "hosmask" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/warden name = "\improper Warden SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe." icon_state = "wardenmask" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/swat @@ -217,7 +206,7 @@ desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000." icon_state = "officermask" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/blue name = "\improper blue SWAT mask" @@ -225,7 +214,7 @@ icon_state = "blue_sechailer" item_state = "blue_sechailer" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/cyborg name = "security hailer" @@ -233,16 +222,13 @@ icon = 'icons/obj/device.dmi' icon_state = "taperecorder_idle" aggressiveness = 1 //Borgs are nicecurity! - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) -/obj/item/clothing/mask/gas/sechailer/cyborg/New() - ..() - verbs -= /obj/item/clothing/mask/gas/sechailer/verb/adjust - -/obj/item/clothing/mask/gas/sechailer/verb/adjust() - set category = "Object" - set name = "Adjust Mask" - adjustmask(usr) +/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/halt) + halt() + else + adjustmask(user) /obj/item/clothing/mask/gas/sechailer/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/screwdriver)) @@ -275,13 +261,7 @@ else return -/obj/item/clothing/mask/gas/sechailer/verb/halt() - set category = "Object" - set name = "HALT" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - +/obj/item/clothing/mask/gas/sechailer/proc/halt() var/phrase = 0 //selects which phrase to use var/phrase_text = null var/phrase_sound = null diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index ca5a267c6a4..184d4c14c40 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -64,8 +64,7 @@ gas_transfer_coefficient = 0.90 permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0) - action_button_name = "Adjust Sterile Mask" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', @@ -209,7 +208,6 @@ flags_inv = HIDEFACE w_class = 1 slot_flags = SLOT_MASK - ignore_maskadjust = 0 adjusted_flags = SLOT_HEAD icon_state = "bandbotany" species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") @@ -219,7 +217,7 @@ "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) - action_button_name = "Adjust Bandana" + actions_types = list(/datum/action/item_action/adjust) /obj/item/clothing/mask/bandana/attack_self(var/mob/user) adjustmask(user) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 48b9ffa7589..2c6bdeddf87 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -5,23 +5,25 @@ var/magboot_state = "magboots" var/magpulse = 0 var/slowdown_active = 2 - action_button_name = "Toggle Magboots" + actions_types = list(/datum/action/item_action/toggle) strip_delay = 70 put_on_delay = 70 - species_restricted = null /obj/item/clothing/shoes/magboots/attack_self(mob/user) - if(src.magpulse) - src.flags &= ~NOSLIP - src.slowdown = SHOES_SLOWDOWN + if(magpulse) + flags &= ~NOSLIP + slowdown = SHOES_SLOWDOWN else - src.flags |= NOSLIP - src.slowdown = slowdown_active + flags |= NOSLIP + slowdown = slowdown_active magpulse = !magpulse icon_state = "[magboot_state][magpulse]" to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") user.update_inv_shoes() //so our mob-overlays update user.update_gravity(user.mob_has_gravity()) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/shoes/magboots/negates_gravity() return flags & NOSLIP diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 9a2f3fcade3..229daee5c93 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -7,7 +7,6 @@ flags = NOSLIP origin_tech = "syndicate=3" var/list/clothing_choices = list() - species_restricted = null silence_steps = 1 /obj/item/clothing/shoes/mime @@ -22,7 +21,6 @@ icon_state = "jackboots" item_state = "jackboots" armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0) - species_restricted = null //Syndicate tech means even Tajarans can kick ass with these strip_delay = 70 /obj/item/clothing/shoes/combat/swat //overpowered boots for death squads @@ -38,7 +36,6 @@ icon_state = "wizard" strip_delay = 50 put_on_delay = 50 - species_restricted = null /obj/item/clothing/shoes/sandal/marisa desc = "A pair of magic, black shoes." @@ -54,7 +51,6 @@ slowdown = SHOES_SLOWDOWN+1 strip_delay = 50 put_on_delay = 50 - species_restricted = null /obj/item/clothing/shoes/galoshes/dry name = "absorbent galoshes" @@ -74,7 +70,6 @@ slowdown = SHOES_SLOWDOWN+1 item_color = "clown" var/footstep = 1 //used for squeeks whilst walking - species_restricted = null silence_steps = 1 shoe_sound = "clownstep" @@ -97,7 +92,6 @@ can_cut_open = 0 icon_state = "jacksandal" item_color = "jacksandal" - species_restricted = null /obj/item/clothing/shoes/workboots name = "work boots" @@ -116,7 +110,6 @@ min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT heat_protection = FEET max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT - species_restricted = null /obj/item/clothing/shoes/cyborg name = "cyborg boots" @@ -128,7 +121,6 @@ desc = "Fluffy!" icon_state = "slippers" item_state = "slippers" - species_restricted = null /obj/item/clothing/shoes/slippers_worn name = "worn bunny slippers" @@ -149,7 +141,6 @@ item_state = "roman" strip_delay = 100 put_on_delay = 100 - species_restricted = null /obj/item/clothing/shoes/centcom name = "dress shoes" @@ -184,7 +175,7 @@ desc = "Looks sneaky." icon_state = "sheet-cloth" -/datum/table_recipe/shoe_rags +/datum/crafting_recipe/shoe_rags name = "Shoe Rags" result = /obj/item/shoe_silencer @@ -198,14 +189,12 @@ desc = "Medical sandals that nerds wear." icon_state = "medsandal" item_color = "medsandal" - species_restricted = null /obj/item/clothing/shoes/sandal/fancy name = "Fancy Sandals" desc = "FANCY!!." icon_state = "fancysandal" item_color = "fancysandal" - species_restricted = null /obj/item/clothing/shoes/cursedclown name = "cursed clown shoes" diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index e231922de92..f8a18749644 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -182,10 +182,8 @@ "Vox Armalis" = 'icons/mob/species/armalis/feet.dmi' ) - action_button_name = "Toggle the magclaws" - /obj/item/clothing/shoes/magboots/vox/attack_self(mob/user) - if(src.magpulse) + if(magpulse) flags &= ~NOSLIP magpulse = 0 flags |= NODROP diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 96ae6519d5d..6348f32aa11 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -22,7 +22,7 @@ desc = "An advanced spacesuit equipped with teleportation and anti-compression technology" icon_state = "chronosuit" item_state = "chronosuit" - action_button_name = "Toggle Chronosuit" + actions_types = list(/datum/action/item_action/toggle) armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90) var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index b5498726203..de2cfc0eda5 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -46,13 +46,9 @@ var/base_state = "plasmaman_helmet" var/brightness_on = 4 //luminosity when on var/on = 0 - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) /obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - - return toggle_light(user) /obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user) @@ -68,6 +64,10 @@ var/mob/living/carbon/human/H = user H.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + // ENGINEERING /obj/item/clothing/suit/space/eva/plasmaman/assistant name = "plasmaman assistant suit" diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 415a5dcd12a..355b511c391 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -10,7 +10,7 @@ var/brightness_on = 4 //luminosity when on var/on = 0 item_color = "engineering" //Determines used sprites: rig[on]-[color] and rig[on]-[color]2 (lying down sprite) - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) //Species-specific stuff. species_restricted = list("exclude","Diona","Wryn") @@ -31,10 +31,6 @@ ) /obj/item/clothing/head/helmet/space/rig/attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - - return toggle_light(user) /obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user) @@ -50,6 +46,14 @@ var/mob/living/carbon/human/H = user H.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/rig/item_action_slot_check(slot) + if(slot == slot_head) + return 1 + /obj/item/clothing/suit/space/rig name = "hardsuit" desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit." @@ -298,17 +302,12 @@ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) on = 1 flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL - action_button_name = "Toggle Helmet Mode" + actions_types = list(/datum/action/item_action/toggle_helmet_mode) /obj/item/clothing/head/helmet/space/rig/syndi/update_icon() icon_state = "rig[on]-[item_color]" /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot toggle your helmet while in this [user.loc].")//To prevent some lighting anomalities. - - return - on = !on if(on) to_chat(user, "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.") @@ -331,6 +330,10 @@ playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) user.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + /obj/item/clothing/suit/space/rig/syndi name = "blood-red hardsuit" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." @@ -339,7 +342,7 @@ item_color = "syndi" w_class = 3 var/on = 1 - action_button_name = "Toggle Hardsuit Mode" + actions_types = list(/datum/action/item_action/toggle_hardsuit_mode) armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) @@ -370,6 +373,10 @@ user.update_inv_wear_suit() user.update_inv_w_uniform() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + //Elite Syndie suit /obj/item/clothing/head/helmet/space/rig/syndi/elite name = "elite syndicate hardsuit helmet" diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 087b34dd756..46471966aa7 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -337,7 +337,7 @@ /obj/item/rig_module/maneuvering_jets/engage() if(!..()) return 0 - jets.toggle_rockets() + jets.toggle_stabilization(usr) return 1 /obj/item/rig_module/maneuvering_jets/activate() @@ -354,15 +354,13 @@ suit_overlay = null holder.update_icon() - if(!jets.on) - jets.toggle() + jets.turn_on() return 1 /obj/item/rig_module/maneuvering_jets/deactivate() if(!..()) return 0 - if(jets.on) - jets.toggle() + jets.turn_off() return 1 /obj/item/rig_module/maneuvering_jets/New() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index e2b8e01fd54..8b5ea0d9af5 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -50,7 +50,8 @@ W.forceMove(src) attached_badge = W - action_button_name = "Remove Holobadge" + var/datum/action/A = new /datum/action/item_action/remove_badge(src) + A.Grant(user) icon_state = "armorsec" user.update_inv_wear_suit() desc = "An armored vest that protects against some damage. This one has [attached_badge] attached to it." @@ -63,8 +64,10 @@ add_fingerprint(user) user.put_in_hands(attached_badge) - action_button_name = null - action.Remove(user) + for(var/X in actions) + var/datum/action/A = X + A.Remove(user) + icon_state = "armor" user.update_inv_wear_suit() desc = "An armored vest that protects against some damage. This one has a clip for a holobadge." @@ -101,7 +104,7 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Open/Close Jacket" + actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unzip" /obj/item/clothing/suit/armor/hos @@ -124,7 +127,7 @@ flags_inv = 0 ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Open/Close Trenchcoat" + actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unbutton" /obj/item/clothing/suit/armor/hos/jensen @@ -243,11 +246,10 @@ item_state = "reactiveoff" blood_overlay_type = "armor" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - action_button_name = "Toggle Reactive Armor" + actions_types = list(/datum/action/item_action/toggle) unacidable = 1 hit_reaction_chance = 50 - /obj/item/clothing/suit/armor/reactive/attack_self(mob/user) active = !(active) if(active) @@ -260,6 +262,9 @@ item_state = "reactiveoff" add_fingerprint(user) user.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/armor/reactive/emp_act(severity) active = 0 diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm index e6d6c91508f..0683394ce9f 100644 --- a/code/modules/clothing/suits/hood.dm +++ b/code/modules/clothing/suits/hood.dm @@ -1,13 +1,12 @@ //Hoods for winter coats and chaplain hoodie etc /obj/item/clothing/suit/hooded - action_button_name = "Adjust hood" + actions_types = list(/datum/action/item_action/toggle) var/obj/item/clothing/head/hood var/hoodtype = /obj/item/clothing/head/winterhood //so the chaplain hoodie or other hoodies can override this /obj/item/clothing/suit/hooded/New() MakeHood() - verbs -= /obj/item/clothing/suit/verb/openjacket //you can't unbutton those, deal with it ..() /obj/item/clothing/suit/hooded/Destroy() @@ -22,6 +21,10 @@ /obj/item/clothing/suit/hooded/ui_action_click() ToggleHood() +/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user) + if(slot == slot_wear_suit) + return 1 + /obj/item/clothing/suit/hooded/equipped(mob/user, slot) if(slot != slot_wear_suit) RemoveHood() @@ -35,21 +38,14 @@ H.unEquip(hood, 1) H.update_inv_wear_suit() hood.loc = src + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/hooded/dropped() ..() RemoveHood() -/obj/item/clothing/suit/hooded/verb/Hooderize(var/mob/user) - set name = "Adjust the hood" - set category = "Object" - set src in usr - if(!isliving(usr)) - return - if(usr.stat) - return - ToggleHood() - /obj/item/clothing/suit/hooded/proc/ToggleHood() if(!suit_adjusted) if(ishuman(loc)) @@ -64,5 +60,8 @@ suit_adjusted = 1 icon_state = "[initial(icon_state)]_hood" H.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else RemoveHood() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index b94be6647bb..a8fd6ea4c49 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -210,7 +210,7 @@ body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" /obj/item/clothing/suit/storage/lawyer/bluejacket @@ -222,7 +222,7 @@ body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" /obj/item/clothing/suit/storage/lawyer/purpjacket @@ -243,7 +243,7 @@ body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -258,7 +258,7 @@ blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -276,7 +276,7 @@ /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser) ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 71bdd524b8f..8097162ba28 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -13,7 +13,7 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) - action_button_name = "Button/Unbutton Labcoat" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" /obj/item/clothing/suit/storage/labcoat/cmo diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b44227999cd..676800f8f48 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -404,7 +404,7 @@ //hoodies /obj/item/clothing/suit/hooded/hoodie - name = "hoodie" + name = "black hoodie" desc = "It's a hoodie. It has a hood. Most hoodies do." icon_state = "black_hoodie" item_state = "labcoat" @@ -416,7 +416,7 @@ ) /obj/item/clothing/head/hood - name = "hood" + name = "black hood" desc = "A hood attached to a hoodie." icon_state = "blackhood" body_parts_covered = HEAD @@ -558,7 +558,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Open/Close Jacket" + actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unzip" species_fit = list("Vox") sprite_sheets = list( @@ -623,7 +623,7 @@ icon_state = "militaryjacket" item_state = "militaryjacket" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective) @@ -717,7 +717,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter) body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS - action_button_name = "Zip/Unzip Jacket" + actions_types = list(/datum/action/item_action/zipper) adjust_flavour = "unzip" species_fit = list("Vox") sprite_sheets = list( @@ -746,7 +746,7 @@ desc = "Pompadour not included." icon_state = "leatherjacket" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null /obj/item/clothing/suit/officercoat @@ -755,7 +755,7 @@ icon_state = "officersuit" item_state = "officersuit" ignore_suitadjust = 0 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -768,7 +768,7 @@ icon_state = "soldiersuit" item_state = "soldiersuit" ignore_suitadjust = 0 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -783,7 +783,7 @@ body_parts_covered = ARMS armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite) - action_button_name = "Toggle Owl Wings" + actions_types = list(/datum/action/item_action/toggle_wings) flags = NODROP /obj/item/clothing/suit/toggle/owlwings/griffinwings @@ -800,6 +800,9 @@ icon_state = initial(icon_state) item_state = initial(item_state) usr.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/lordadmiral name = "Lord Admiral's Coat" @@ -823,7 +826,7 @@ desc = "An incredibly advanced and complex suit; it has so many buttons and dials as to be incomprehensible." icon_state = "bomb" item_state = "bomb" - action_button_name = "Toggle Advanced Protective Suit" + actions_types = list(/datum/action/item_action/toggle) gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index b285624ffe0..e417c899f7f 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -10,7 +10,6 @@ var/slot = "decor" var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. - action_button_custom_type = /datum/action/item_action/accessory /obj/item/clothing/accessory/New() ..() @@ -23,6 +22,13 @@ has_suit = S loc = has_suit has_suit.overlays += inv_overlay + has_suit.actions += actions + + for(var/X in actions) + var/datum/action/A = X + if(has_suit.is_equipped()) + var/mob/M = has_suit.loc + A.Grant(M) if(user) to_chat(user, "You attach [src] to [has_suit].") @@ -32,6 +38,14 @@ if(!has_suit) return has_suit.overlays -= inv_overlay + has_suit.actions -= actions + + for(var/X in actions) + var/datum/action/A = X + if(ismob(has_suit.loc)) + var/mob/M = has_suit.loc + A.Remove(M) + has_suit = null usr.put_in_hands(src) src.add_fingerprint(user) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index d792c5df7ac..a30522768ed 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -6,7 +6,7 @@ slot = "utility" var/holster_allow = /obj/item/weapon/gun var/obj/item/weapon/gun/holstered = null - action_button_name = "Holster" + actions_types = list(/datum/action/item_action/accessory/holster) w_class = 3 // so it doesn't fit in pockets //subtypes can override this to specify what can be holstered diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 1848d8fdfb7..aea6cf139f3 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -6,7 +6,7 @@ slot = "utility" var/slots = 3 var/obj/item/weapon/storage/internal/hold - action_button_name = "View Storage" + actions_types = list(/datum/action/item_action/accessory/storage) w_class = 3 // so it doesn't fit in pockets /obj/item/clothing/accessory/storage/New() diff --git a/code/modules/computer3/laptop.dm b/code/modules/computer3/laptop.dm index dd4f73914b6..e32375a457c 100644 --- a/code/modules/computer3/laptop.dm +++ b/code/modules/computer3/laptop.dm @@ -101,14 +101,15 @@ var/obj/item/weapon/card/id/card if(C.reader) card = C.reader + C.remove_reader(usr) else if(C.writer) card = C.writer + C.remove_writer(usr) else to_chat(usr, "There is nothing to remove from the laptop card port.") return to_chat(usr, "You remove [card] from the laptop.") - C.remove(card) /obj/machinery/computer3/laptop diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm new file mode 100644 index 00000000000..901de314edc --- /dev/null +++ b/code/modules/crafting/craft.dm @@ -0,0 +1,340 @@ +/datum/personal_crafting + var/busy + var/viewing_category = 1 //typical powergamer starting on the Weapons tab + var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL) + + + + + +/* This is what procs do: + get_environment - gets a list of things accessable for crafting by user + get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list + check_contents - takes a recipe and a key-type list and checks if said recipe can be done with available stuff + check_tools - takes recipe, a key-type list, and a user and checks if there are enough tools to do the stuff, checks bugs one level deep + construct_item - takes a recipe and a user, call all the checking procs, calls do_after, checks all the things again, calls del_reqs, creates result, calls CheckParts of said result with argument being list returned by deel_reqs + del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list +*/ + + + + +/datum/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents) + main_loop: + for(var/A in R.reqs) + var/needed_amount = R.reqs[A] + for(var/B in contents) + if(ispath(B, A)) + if(contents[B] >= R.reqs[A]) + continue main_loop + else + needed_amount -= contents[B] + if(needed_amount <= 0) + continue main_loop + else + continue + return 0 + for(var/A in R.chem_catalists) + if(contents[A] < R.chem_catalists[A]) + return 0 + return 1 + +/datum/personal_crafting/proc/get_environment(mob/user) + . = list() + . += user.r_hand + . += user.l_hand + if(!istype(user.loc, /turf)) + return + var/list/L = block(get_step(user, SOUTHWEST), get_step(user, NORTHEAST)) + for(var/A in L) + var/turf/T = A + if(T.Adjacent(user)) + . += T.contents + + +/datum/personal_crafting/proc/get_surroundings(mob/user) + . = list() + for(var/obj/item/I in get_environment(user)) + if(istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + .[I.type] += S.amount + else + if(istype(I, /obj/item/weapon/reagent_containers)) + var/obj/item/weapon/reagent_containers/RC = I + if(RC.flags & OPENCONTAINER) + for(var/datum/reagent/A in RC.reagents.reagent_list) + .[A.type] += A.volume + .[I.type] += 1 + +/datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents) + if(!R.tools.len) + return 1 + var/list/possible_tools = list() + for(var/obj/item/I in user.contents) + if(istype(I, /obj/item/weapon/storage)) + for(var/obj/item/SI in I.contents) + possible_tools += SI.type + possible_tools += I.type + possible_tools += contents + + main_loop: + for(var/A in R.tools) + for(var/I in possible_tools) + if(ispath(I,A)) + continue main_loop + return 0 + return 1 + +/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) + for(var/A in R.parts) + var/list/contents = get_surroundings(user) + var/send_feedback = 1 + if(check_contents(R, contents)) + if(check_tools(user, R, contents)) + if(do_after(user, R.time, target = user)) + contents = get_surroundings(user) + if(!check_contents(R, contents)) + return ", missing component." + if(!check_tools(user, R, contents)) + return ", missing tool." + var/list/parts = del_reqs(R, user) + var/atom/movable/I = new R.result (get_turf(user.loc)) + I.CheckParts(parts, R) + if(send_feedback) + feedback_add_details("object_crafted","[I.type]") + return 0 + return "." + return ", missing tool." + return ", missing component." + + +/*Del reqs works like this: + Loop over reqs var of the recipe + Set var amt to the value current cycle req is pointing to, its amount of type we need to delete + Get var/surroundings list of things accessable to crafting by get_environment() + Check the type of the current cycle req + If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isnt remove thing from surroundings + If there is enough reagent in the search result then delete the needed amount, create the same type of reagent with the same data var and put it into deletion list + If there isnt enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching + While doing above stuff check deletion list if it already has such reagnet, if yes merge instead of adding second one + If its stack check if it has enough amount + If yes create new stack with the needed amount and put in into deletion list, substract taken amount from the stack + If no put all of the stack in the deletion list, substract its amount from amt and keep searching + While doing above stuff check deletion list if it already has such stack type, if yes try to merge them instead of adding new one + If its anything else just locate() in in the list in a while loop, each find --s the amt var and puts the found stuff in deletion loop + Then do a loop over parts var of the recipe + Do similar stuff to what we have done above, but now in deletion list, until the parts conditions are satisfied keep taking from the deletion list and putting it into parts list for return + After its done loop over deletion list and delete all the shit that wasnt taken by parts loop + del_reqs return the list of parts resulting object will recieve as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already +*/ + +/datum/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user) + var/list/surroundings + var/list/Deletion = list() + . = list() + var/data + var/amt + main_loop: + for(var/A in R.reqs) + amt = R.reqs[A] + surroundings = get_environment(user) + surroundings -= Deletion + if(ispath(A, /datum/reagent)) + var/datum/reagent/RG = new A + var/datum/reagent/RGNT + while(amt > 0) + var/obj/item/weapon/reagent_containers/RC = locate() in surroundings + RG = RC.reagents.get_reagent(A) + if(RG) + if(!locate(RG.type) in Deletion) + Deletion += new RG.type() + if(RG.volume > amt) + RG.volume -= amt + data = RG.data + RC.reagents.conditional_update(RC) + RG = locate(RG.type) in Deletion + RG.volume = amt + RG.data += data + continue main_loop + else + surroundings -= RC + amt -= RG.volume + RC.reagents.reagent_list -= RG + RC.reagents.conditional_update(RC) + RGNT = locate(RG.type) in Deletion + RGNT.volume += RG.volume + RGNT.data += RG.data + qdel(RG) + else + surroundings -= RC + else if(ispath(A, /obj/item/stack)) + var/obj/item/stack/S + var/obj/item/stack/SD + while(amt > 0) + S = locate(A) in surroundings + if(S.amount >= amt) + if(!locate(S.type) in Deletion) + SD = new S.type() + Deletion += SD + S.use(amt) + SD = locate(S.type) in Deletion + SD.amount += amt + continue main_loop + else + amt -= S.amount + if(!locate(S.type) in Deletion) + Deletion += S + else + data = S.amount + S = locate(S.type) in Deletion + S.amount += data + surroundings -= S + else + var/atom/movable/I + while(amt > 0) + I = locate(A) in surroundings + Deletion += I + surroundings -= I + amt-- + var/list/partlist = list(R.parts.len) + for(var/M in R.parts) + partlist[M] = R.parts[M] + for(var/A in R.parts) + if(istype(A, /datum/reagent)) + var/datum/reagent/RG = locate(A) in Deletion + if(RG.volume > partlist[A]) + RG.volume = partlist[A] + . += RG + Deletion -= RG + continue + else if(istype(A, /obj/item/stack)) + var/obj/item/stack/ST = locate(A) in Deletion + if(ST.amount > partlist[A]) + ST.amount = partlist[A] + . += ST + Deletion -= ST + continue + else + while(partlist[A] > 0) + var/atom/movable/AM = locate(A) in Deletion + . += AM + Deletion -= AM + partlist[A] -= 1 + while(Deletion.len) + var/DL = Deletion[Deletion.len] + Deletion.Cut(Deletion.len) + qdel(DL) + +/datum/personal_crafting/proc/craft(mob/user) + if(user.incapacitated() || user.lying || istype(user.loc, /obj/mecha)) + return + var/list/surroundings = get_surroundings(user) + var/dat = "

Crafting menu

" + if(busy) + dat += "
" + dat += "Crafting in progress...
" + else + dat += "<--" + dat += " [categories[prev_cat()]] |" + dat += " [categories[viewing_category]] " + dat += "| [categories[next_cat()]] " + dat += "-->

" + + dat += "
" + + //Filter the recipes we can craft to the top + var/list/can_craft = list() + var/list/cant_craft = list() + for(var/datum/crafting_recipe/R in crafting_recipes) + if(R.category != categories[viewing_category]) + continue + if(check_contents(R, surroundings)) + can_craft += R + else + cant_craft += R + + for(var/datum/crafting_recipe/R in can_craft) + dat += build_recipe_text(R, surroundings) + for(var/datum/crafting_recipe/R in cant_craft) + dat += build_recipe_text(R, surroundings) + + + dat += "
" + + var/datum/browser/popup = new(user, "crafting", "Crafting", 500, 500) + popup.set_content(dat) + popup.open() + return + +/datum/personal_crafting/Topic(href, href_list) + if(usr.stat || usr.lying) + return + if(href_list["make"]) + var/datum/crafting_recipe/TR = locate(href_list["make"]) + busy = 1 + craft(usr) + var/fail_msg = construct_item(usr, TR) + if(!fail_msg) + usr << "[TR.name] constructed." + else + usr << "Construction failed[fail_msg]" + busy = 0 + craft(usr) + if(href_list["forwardCat"]) + viewing_category = next_cat() + usr << "Category is now [categories[viewing_category]]." + craft(usr) + if(href_list["backwardCat"]) + viewing_category = prev_cat() + usr << "Category is now [categories[viewing_category]]." + craft(usr) + +//Next works nicely with modular arithmetic +/datum/personal_crafting/proc/next_cat() + . = viewing_category % categories.len + 1 + +//Previous can go fuck itself +/datum/personal_crafting/proc/prev_cat() + if(viewing_category == categories.len) + . = viewing_category-1 + else + . = viewing_category % categories.len - 1 + if(. <= 0) + . = categories.len + +/datum/personal_crafting/proc/build_recipe_text(datum/crafting_recipe/R, list/contents) + . = "" + var/name_text = "" + var/req_text = "" + var/tool_text = "" + var/catalist_text = "" + if(check_contents(R, contents)) + name_text ="[R.name]" + + else + name_text = "[R.name]" + + if(name_text) + for(var/A in R.reqs) + if(ispath(A, /obj)) + var/obj/O = A + req_text += " [R.reqs[A]] [initial(O.name)]" + else if(ispath(A, /datum/reagent)) + var/datum/reagent/RE = A + req_text += " [R.reqs[A]] [initial(RE.name)]" + + if(R.chem_catalists.len) + catalist_text += ", Catalysts:" + for(var/C in R.chem_catalists) + if(ispath(C, /datum/reagent)) + var/datum/reagent/RE = C + catalist_text += " [R.chem_catalists[C]] [initial(RE.name)]" + + if(R.tools.len) + tool_text += ", Tools:" + for(var/O in R.tools) + if(ispath(O, /obj)) + var/obj/T = O + tool_text += " [R.tools[O]] [initial(T.name)]" + + . = "[name_text][req_text][tool_text][catalist_text]
" diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index d8586b6c0d8..60d830a1c89 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -1,4 +1,4 @@ -/datum/table_recipe +/datum/crafting_recipe var/name = "" //in-game display name var/reqs[] = list() //type paths of items consumed associated with how many are needed var/result //type path of item resulting from this craft @@ -7,14 +7,15 @@ var/parts[] = list() //type paths of items that will be placed in the result var/chem_catalists[] = list() //like tools but for reagents var/fruit[] = list() //grown products required by the recipe + var/category = CAT_MISC // Recipe category -/datum/table_recipe/proc/AdjustChems(var/obj/resultobj as obj) +/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj) //This proc is to replace the make_food proc of recipes from microwaves and such that are being converted to table crafting recipes. //Use it to handle the removal of reagents after the food has been created (like removing toxins from a salad made with ambrosia) //If a recipe does not require it's chems adjusted, don't bother declaring this for the recipe, as it will call this placeholder return -/datum/table_recipe/IED +/datum/crafting_recipe/IED name = "IED" result = /obj/item/weapon/grenade/iedcasing/filled reqs = list(/datum/reagent/fuel = 50, @@ -23,8 +24,9 @@ /obj/item/weapon/reagent_containers/food/drinks/cans = 1) parts = list(/obj/item/weapon/reagent_containers/food/drinks/cans = 1) time = 80 + category = CAT_WEAPON -/datum/table_recipe/stunprod +/datum/crafting_recipe/stunprod name = "Stunprod" result = /obj/item/weapon/melee/baton/cattleprod reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1, @@ -33,8 +35,9 @@ /obj/item/weapon/stock_parts/cell = 1) time = 80 parts = list(/obj/item/weapon/stock_parts/cell = 1) + category = CAT_WEAPON -/datum/table_recipe/ed209 +/datum/crafting_recipe/ed209 name = "ED209" result = /mob/living/simple_animal/bot/ed209 reqs = list(/obj/item/robot_parts/robot_suit = 1, @@ -50,8 +53,9 @@ /obj/item/robot_parts/r_arm = 1) tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver) time = 120 + category = CAT_ROBOT -/datum/table_recipe/secbot +/datum/crafting_recipe/secbot name = "Secbot" result = /mob/living/simple_animal/bot/secbot reqs = list(/obj/item/device/assembly/signaler = 1, @@ -61,16 +65,18 @@ /obj/item/robot_parts/r_arm = 1) tools = list(/obj/item/weapon/weldingtool) time = 120 + category = CAT_ROBOT -/datum/table_recipe/cleanbot +/datum/crafting_recipe/cleanbot name = "Cleanbot" result = /mob/living/simple_animal/bot/cleanbot reqs = list(/obj/item/weapon/reagent_containers/glass/bucket = 1, /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) time = 80 + category = CAT_ROBOT -/datum/table_recipe/floorbot +/datum/crafting_recipe/floorbot name = "Floorbot" result = /mob/living/simple_animal/bot/floorbot reqs = list(/obj/item/weapon/storage/toolbox/mechanical = 1, @@ -78,8 +84,9 @@ /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) time = 80 + category = CAT_ROBOT -/datum/table_recipe/medbot +/datum/crafting_recipe/medbot name = "Medbot" result = /mob/living/simple_animal/bot/medbot reqs = list(/obj/item/device/healthanalyzer = 1, @@ -87,8 +94,9 @@ /obj/item/device/assembly/prox_sensor = 1, /obj/item/robot_parts/r_arm = 1) time = 80 + category = CAT_ROBOT -/datum/table_recipe/flamethrower +/datum/crafting_recipe/flamethrower name = "Flamethrower" result = /obj/item/weapon/flamethrower reqs = list(/obj/item/weapon/weldingtool = 1, @@ -96,8 +104,9 @@ /obj/item/stack/rods = 2) tools = list(/obj/item/weapon/screwdriver) time = 20 + category = CAT_WEAPON -/datum/table_recipe/meteorshot +/datum/crafting_recipe/meteorshot name = "Meteorshot Shell" result = /obj/item/ammo_casing/shotgun/meteorshot reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, @@ -105,8 +114,9 @@ /obj/item/weapon/stock_parts/manipulator = 2) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/pulseslug +/datum/crafting_recipe/pulseslug name = "Pulse Slug Shell" result = /obj/item/ammo_casing/shotgun/pulseslug reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, @@ -114,16 +124,18 @@ /obj/item/weapon/stock_parts/micro_laser/ultra = 1) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/dragonsbreath +/datum/crafting_recipe/dragonsbreath name = "Dragonsbreath Shell" result = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5,) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/frag12 +/datum/crafting_recipe/frag12 name = "FRAG-12 Shell" result = /obj/item/ammo_casing/shotgun/frag12 reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, @@ -132,8 +144,9 @@ /datum/reagent/facid = 5,) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/ionslug +/datum/crafting_recipe/ionslug name = "Ion Scatter Shell" result = /obj/item/ammo_casing/shotgun/ion reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, @@ -141,8 +154,9 @@ /obj/item/weapon/stock_parts/subspace/crystal = 1) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/improvisedslug +/datum/crafting_recipe/improvisedslug name = "Improvised Shotgun Shell" result = /obj/item/ammo_casing/shotgun/improvised reqs = list(/obj/item/weapon/grenade/chem_grenade = 1, @@ -151,16 +165,18 @@ /datum/reagent/fuel = 10) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/improvisedslugoverload +/datum/crafting_recipe/improvisedslugoverload name = "Overload Improvised Shell" result = /obj/item/ammo_casing/shotgun/improvised/overload reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1, /datum/reagent/blackpowder = 5) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/laserslug +/datum/crafting_recipe/laserslug name = "Laser Slug Shell" result = /obj/item/ammo_casing/shotgun/laserslug reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, @@ -168,8 +184,9 @@ /obj/item/weapon/stock_parts/micro_laser/high = 1) tools = list(/obj/item/weapon/screwdriver) time = 5 + category = CAT_AMMO -/datum/table_recipe/ishotgun +/datum/crafting_recipe/ishotgun name = "Improvised Shotgun" result = /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised reqs = list(/obj/item/weaponcrafting/receiver = 1, @@ -178,8 +195,9 @@ /obj/item/stack/packageWrap = 5,) tools = list(/obj/item/weapon/screwdriver) time = 200 + category = CAT_WEAPON -/datum/table_recipe/spooky_camera +/datum/crafting_recipe/spooky_camera name = "Camera Obscura" result = /obj/item/device/camera/spooky time = 15 @@ -187,29 +205,31 @@ /datum/reagent/holywater = 10) parts = list(/obj/item/device/camera = 1) -/datum/table_recipe/notreallysoap +/datum/crafting_recipe/notreallysoap name = "Homemade Soap" result = /obj/item/weapon/soap/ducttape time = 100 reqs = list(/obj/item/stack/tape_roll = 1, /datum/reagent/liquidgibs = 10) -/datum/table_recipe/garrote +/datum/crafting_recipe/garrote name = "Makeshift Garrote" result = /obj/item/weapon/twohanded/garrote/improvised time = 15 reqs = list(/obj/item/stack/sheet/wood = 1, /obj/item/stack/cable_coil = 5) tools = list(/obj/item/weapon/kitchen/knife) // Gotta carve the wood into handles + category = CAT_WEAPON -/datum/table_recipe/makeshift_bolt +/datum/crafting_recipe/makeshift_bolt name = "Makeshift Bolt" result = /obj/item/weapon/arrow/rod time = 15 reqs = list(/obj/item/stack/rods = 1) tools = list(/obj/item/weapon/weldingtool) + category = CAT_AMMO -/datum/table_recipe/crossbow +/datum/crafting_recipe/crossbow name = "Powered Crossbow" result = /obj/item/weapon/gun/throw/crossbow time = 300 @@ -219,10 +239,11 @@ /obj/item/stack/sheet/wood = 5) tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver) + category = CAT_WEAPON -/datum/table_recipe/glove_balloon +/datum/crafting_recipe/glove_balloon name = "Latex Glove Balloon" result = /obj/item/latexballon time = 15 reqs = list(/obj/item/clothing/gloves/color/latex = 1, - /obj/item/stack/cable_coil = 5) \ No newline at end of file + /obj/item/stack/cable_coil = 5) diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm deleted file mode 100644 index 19ea37c3866..00000000000 --- a/code/modules/crafting/table.dm +++ /dev/null @@ -1,225 +0,0 @@ -#define TABLECRAFT_MAX_ITEMS 30 - -/obj/structure/table - var/list/table_contents = list() - -/obj/structure/table/MouseDrop(atom/over) - if(over != usr) - return - interact(usr) - -/obj/structure/table/proc/check_contents(datum/table_recipe/R) - check_table() - main_loop: - if(R.fruit) - for(var/A in R.fruit) - for(var/B in table_contents) - if(B == A) - if(table_contents[B] >= R.fruit[A]) - continue main_loop - return 0 - for(var/A in R.reqs) - for(var/B in table_contents) - if(ispath(B, A)) - if(table_contents[B] >= R.reqs[A]) - continue main_loop - return 0 - for(var/A in R.chem_catalists) - if(table_contents[A] < R.chem_catalists[A]) - return 0 - return 1 - -/obj/structure/table/proc/check_table() - table_contents = list() - for(var/obj/item/I in loc) - if(istype(I, /obj/item/stack)) - var/obj/item/stack/S = I - table_contents[I.type] += S.amount - else if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown)) - var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I - if(G.seed && G.seed.kitchen_tag) - table_contents[G.seed.kitchen_tag] += 1 - else - if(istype(I, /obj/item/weapon/reagent_containers)) - var/obj/item/weapon/reagent_containers/RC = I - if(RC.flags & OPENCONTAINER) - for(var/datum/reagent/A in RC.reagents.reagent_list) - table_contents[A.type] += A.volume - table_contents[I.type] += 1 - -/obj/structure/table/proc/check_tools(mob/user, datum/table_recipe/R) - if(!R.tools.len) - return 1 - var/list/possible_tools = list() - for(var/obj/item/I in user.contents) - if(istype(I, /obj/item/weapon/storage)) - for(var/obj/item/SI in I.contents) - possible_tools += SI.type - else - possible_tools += I.type - possible_tools += table_contents - var/i = R.tools.len - var/I - for(var/A in R.tools) - I = possible_tools.Find(A) - if(I) - possible_tools.Cut(I, I+1) - i-- - else - break - return !i - -/obj/structure/table/proc/construct_item(mob/user, datum/table_recipe/R) - check_table() - if(check_contents(R) && check_tools(user, R)) - if(do_after(user, R.time, target = src)) - if(!check_contents(R) || !check_tools(user, R)) - return 0 - var/atom/movable/I = new R.result (loc) - var/list/parts = del_reqs(R, I) - for(var/A in parts) - if(istype(A, /obj/item)) - var/atom/movable/B = A - B.loc = I - else - if(!I.reagents) - I.reagents = new /datum/reagents() - I.reagents.reagent_list.Add(A) - I.CheckParts() - R.AdjustChems(I) - return 1 - return 0 - -/obj/structure/table/proc/del_reqs(datum/table_recipe/R, atom/movable/resultobject) - var/list/Deletion = list() - var/amt - var/reagenttransfer = 0 - if(istype(resultobject,/obj/item/weapon/reagent_containers)) - reagenttransfer = 1 - if(R.fruit) - for(var/A in R.fruit) - amt = R.fruit[A] - fruit_loop: //ha - for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in loc) - if(G.seed && G.seed.kitchen_tag && (G.seed.kitchen_tag == A)) - amt-- - G.loc = null //remove it from the table loc so that we don't locate the same fruit every time - if(reagenttransfer) - G.reagents.trans_to(resultobject, G.reagents.total_volume) - qdel(G) - if(amt <= 0) - break fruit_loop - for(var/A in R.reqs) - amt = R.reqs[A] - if(ispath(A, /obj/item/stack)) - var/obj/item/stack/S - stack_loop: - for(var/B in table_contents) - if(ispath(B, A)) - while(amt > 0) - S = locate(B) in loc - if(S.amount >= amt) - S.use(amt) - break stack_loop - else - amt -= S.amount - qdel(S) - else if(ispath(A, /obj/item)) - var/obj/item/I - item_loop: - for(var/B in table_contents) - if(ispath(B, A)) - while(amt > 0) - I = locate(B) in loc - Deletion.Add(I) - I.loc = null //remove it from the table loc so that we don't locate the same item every time (will be relocated inside the crafted item in construct_item()) - amt-- - if(reagenttransfer && istype(I,/obj/item/weapon/reagent_containers)) - var/obj/item/weapon/reagent_containers/RC = I - RC.reagents.trans_to(resultobject, RC.reagents.total_volume) - break item_loop - else - var/datum/reagent/RG = new A - reagent_loop: - for(var/B in table_contents) - if(ispath(B, /obj/item/weapon/reagent_containers)) - var/obj/item/RC = locate(B) in loc - if(RC.reagents.has_reagent(RG.id, amt)) - if(reagenttransfer) - RC.reagents.trans_id_to(resultobject,RG.id, amt) - else - RC.reagents.remove_reagent(RG.id, amt) - RG.volume = amt - Deletion.Add(RG) - break reagent_loop - else if(RC.reagents.has_reagent(RG.id)) - Deletion.Add(RG) - RG.volume += RC.reagents.get_reagent_amount(RG.id) - amt -= RC.reagents.get_reagent_amount(RG.id) - if(reagenttransfer) - RC.reagents.trans_id_to(resultobject,RG.id, RG.volume) - else - RC.reagents.del_reagent(RG.id) - - var/list/partlist = list(R.parts.len) - for(var/M in R.parts) - partlist[M] = R.parts[M] - deletion_loop: - for(var/B in Deletion) - for(var/A in R.parts) - if(istype(B, A)) - if(partlist[A] > 0) //do we still need a part like that? - partlist[A] -= 1 - continue deletion_loop - Deletion.Remove(B) - qdel(B) - - return Deletion - -/obj/structure/table/interact(mob/user) - if(user.stat || user.lying || !Adjacent(user)) - return - check_table() - if(!table_contents.len) - return - user.face_atom(src) - var/dat = "

Crafting menu

" - dat += "
" - if(busy) - dat += "Crafting in progress...
" - else - for(var/datum/table_recipe/R in table_recipes) - if(check_contents(R)) - dat += "[R.name]
" - dat += "" - - var/datum/browser/popup = new(user, "table", "Table", 300, 300) - popup.set_content(dat) - popup.open() - return - -/obj/structure/table/Topic(href, href_list) - if(usr.stat || !Adjacent(usr) || usr.lying) - return - if(href_list["make"]) - if(!check_table_space()) - to_chat(usr, "The table is too crowded.") - return - var/datum/table_recipe/TR = locate(href_list["make"]) - busy = 1 - interact(usr) - if(construct_item(usr, TR)) - to_chat(usr, "[TR.name] constructed.") - else - to_chat(usr, "Construction failed.") - busy = 0 - interact(usr) - -/obj/structure/table/proc/check_table_space() - var/Item_amount = 0 - for(var/obj/item/I in loc) - Item_amount++ - if(Item_amount <= TABLECRAFT_MAX_ITEMS) //is the table crowded? - return 1 - - #undef TABLECRAFT_MAX_ITEMS \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index fbd3559e6a8..07f8d6b7931 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -10,6 +10,9 @@ ////////// Usable Items ////////// ////////////////////////////////// +/obj/item/device/fluff + var/used = 0 + /obj/item/device/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks name = "dispoable tattoo pen" desc = "A cheap plastic tattoo application pen." @@ -18,7 +21,6 @@ force = 0 throwforce = 0 w_class = 1 - var/used = 0 var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages var/tattoo_icon = "Tiger Body" // body_accessory.dmi, new icons defined in sprite_accessories.dm var/tattoo_r = 1 // RGB values for the body markings @@ -87,8 +89,28 @@ ..() update_icon() +/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat + desc = "A cheap plastic tattoo application pen.
This one seems heavily used." + tattoo_name = "circuitry tattoo" + tattoo_icon = "Elliot Circuit Tattoo" + tattoo_r = 48 + tattoo_g = 138 + tattoo_b = 176 +/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self(mob/user as mob) + if(!used) + var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null + if(ink_color && !(user.incapacitated() || used) ) + tattoo_r = hex2num(copytext(ink_color, 2, 4)) + tattoo_g = hex2num(copytext(ink_color, 4, 6)) + tattoo_b = hex2num(copytext(ink_color, 6, 8)) + to_chat(user, "You change the color setting on the [src].") + + update_icon() + + else + to_chat(user, "The [src] is out of ink!") /obj/item/weapon/claymore/fluff // MrBarrelrolll: Maximus Greenwood name = "Greenwood's Blade" @@ -200,6 +222,58 @@ to_chat(target, "You comb your tail with the [src].") used = 1 +#define USED_MOD_HELM 1 +#define USED_MOD_SUIT 2 + +/obj/item/device/fluff/shadey_plasman_modkit + name = "plasmaman suit modkit" + desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments." + icon_state = "modkit" + w_class = 2 + force = 0 + throwforce = 0 + +/obj/item/device/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity) + if(!proximity || !ishuman(user) || user.lying) + return + var/mob/living/carbon/human/H = user + + if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman)) + if(used & USED_MOD_HELM) + to_chat(H, "The kit's helmet modifier has already been used.") + return + to_chat(H, "You modify the appearance of [target].") + used |= USED_MOD_HELM + + var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target + P.name = "plasma containment helmet" + P.desc = "A purpose-built containment helmet designed to keep plasma in, and everything else out." + P.icon_state = "plasmaman_halo_helmet[P.on]" + P.base_state = "plasmaman_halo_helmet" + + if(P == H.head) + H.update_inv_head() + return + if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman)) + if(used & USED_MOD_SUIT) + to_chat(user, "The kit's suit modifier has already been used.") + return + to_chat(H, "You modify the appearance of [target].") + used |= USED_MOD_SUIT + + var/obj/item/clothing/suit/space/eva/plasmaman/P = target + P.name = "plasma containment suit" + P.desc = "A feminine containment suit designed to keep plasma in, and everything else out. It's even got an overskirt." + P.icon_state = "plasmaman_halo" + + if(P == H.wear_suit) + H.update_inv_wear_suit() + return + to_chat(user, "You can't modify [target]!") + +#undef USED_MOD_HELM +#undef USED_MOD_SUIT + ////////////////////////////////// //////////// Clothing //////////// ////////////////////////////////// @@ -251,7 +325,7 @@ icon_state = "kidosvest" item_state = "kidosvest" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null species_fit = null sprite_sheets = null @@ -366,7 +440,7 @@ icon_state = "fox_jacket" item_state = "fox_jacket" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null species_fit = null sprite_sheets = null @@ -418,28 +492,27 @@ icon_state = "chronx_hood" item_state = "chronx_hood" flags = HEADCOVERSEYES | BLOCKHAIR - action_button_name = "Transform Hood" + actions_types = list(/datum/action/item_action/toggle) var/adjusted = 0 /obj/item/clothing/head/fluff/chronx/ui_action_click() adjust() -/obj/item/clothing/head/fluff/chronx/verb/adjust() - set name = "Transform Hood" - set category = "Object" - set src in usr - if(isliving(usr) && !usr.incapacitated()) - if(adjusted) - icon_state = initial(icon_state) - item_state = initial(item_state) - to_chat(usr, "You untransform \the [src].") - adjusted = 0 - else - icon_state += "_open" - item_state += "_open" - to_chat(usr, "You transform \the [src].") - adjusted = 1 - usr.update_inv_head() +/obj/item/clothing/head/fluff/chronx/proc/adjust() + if(adjusted) + icon_state = initial(icon_state) + item_state = initial(item_state) + to_chat(usr, "You untransform \the [src].") + adjusted = 0 + else + icon_state += "_open" + item_state += "_open" + to_chat(usr, "You transform \the [src].") + adjusted = 1 + usr.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/chaplain_hoodie/fluff/chronx //chronx100: Hughe O'Splash name = "Cthulhu's Robes" @@ -448,22 +521,10 @@ icon_state = "chronx_robe" item_state = "chronx_robe" flags_size = ONESIZEFITSALL - action_button_name = "Transform Robes" + actions_types = list(/datum/action/item_action/toggle) adjust_flavour = "untransform" ignore_suitadjust = 0 -/obj/item/clothing/suit/chaplain_hoodie/fluff/chronx/New() - ..() - verbs -= /obj/item/clothing/suit/verb/openjacket - -/obj/item/clothing/suit/chaplain_hoodie/fluff/chronx/verb/adjust() - set name = "Transform Robes" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) - return - adjustsuit(usr) - /obj/item/clothing/shoes/black/fluff/chronx //chronx100: Hughe O'Splash name = "Cthulhu's Boots" desc = "Boots worn by the worshipers of Cthulhu. You see a name inscribed in blood on the inside: Hughe O'Splash" @@ -496,26 +557,3 @@ suit_adjusted = 1 species_fit = null sprite_sheets = null - -/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat - desc = "A cheap plastic tattoo application pen.
This one seems heavily used." - tattoo_name = "circuitry tattoo" - tattoo_icon = "Elliot Circuit Tattoo" - tattoo_r = 48 - tattoo_g = 138 - tattoo_b = 176 - -/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self(mob/user as mob) - if(!used) - var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null - if(ink_color && !(user.incapacitated() || used) ) - tattoo_r = hex2num(copytext(ink_color, 2, 4)) - tattoo_g = hex2num(copytext(ink_color, 4, 6)) - tattoo_b = hex2num(copytext(ink_color, 6, 8)) - - to_chat(user, "You change the color setting on the [src].") - - update_icon() - - else - to_chat(user, "The [src] is out of ink!") diff --git a/code/modules/food/recipes_table.dm b/code/modules/food/recipes_table.dm index 0c9f72dd6d5..005be6c1f7e 100644 --- a/code/modules/food/recipes_table.dm +++ b/code/modules/food/recipes_table.dm @@ -1,5 +1,5 @@ /* Example for reference when defining recipes -/datum/table_recipe/food +/datum/crafting_recipe/food name = "" //in-game display name reqs[] = list() //type paths of items/reagents consumed associated with how many are needed (equivalent to var/list/items and var/list/reagents combined) result //type path of item resulting from this craft @@ -9,7 +9,7 @@ fruit[] = list() //grown products required by the recipe */ -/datum/table_recipe/sandwich +/datum/crafting_recipe/sandwich name = "Sandwich" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1, @@ -17,55 +17,61 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sandwich + category = CAT_FOOD -/datum/table_recipe/slimesandwich +/datum/crafting_recipe/slimesandwich name = "Slime Jelly Sandwich" reqs = list( /datum/reagent/slimejelly = 5, /obj/item/weapon/reagent_containers/food/snacks/breadslice = 2, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime + category = CAT_FOOD -/datum/table_recipe/cherrysandwich +/datum/crafting_recipe/cherrysandwich name = "Cherry Jelly Sandwich" reqs = list( /datum/reagent/cherryjelly = 5, /obj/item/weapon/reagent_containers/food/snacks/breadslice = 2, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry + category = CAT_FOOD -/datum/table_recipe/slimeburger +/datum/crafting_recipe/slimeburger name = "Slime Jelly Burger" reqs = list( /datum/reagent/slimejelly = 5, /obj/item/weapon/reagent_containers/food/snacks/bun = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime + category = CAT_FOOD -/datum/table_recipe/jellyburger +/datum/crafting_recipe/jellyburger name = "Cherry Jelly Burger" reqs = list( /datum/reagent/cherryjelly = 5, /obj/item/weapon/reagent_containers/food/snacks/bun = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry + category = CAT_FOOD -/datum/table_recipe/herbsalad +/* Temporarily disabled until we can find a workaround for this fruit shit. +/datum/crafting_recipe/herbsalad name = "herb salad" fruit = list("ambrosia" = 3, "apple" = 1) result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad -/datum/table_recipe/herbsalad/AdjustChems(var/obj/resultobj as obj) +/datum/crafting_recipe/herbsalad/AdjustChems(var/obj/resultobj as obj) if(istype(resultobj, /obj/item/weapon/reagent_containers)) var/obj/item/weapon/reagent_containers/RC = resultobj RC.reagents.del_reagent("toxin") -/datum/table_recipe/aesirsalad +/datum/crafting_recipe/aesirsalad name = "Aesir salad" fruit = list("ambrosiadeus" = 3, "goldapple" = 1) result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad -/datum/table_recipe/validsalad +/datum/crafting_recipe/validsalad name = "valid salad" fruit = list("ambrosia" = 3, "potato" = 1) reqs = list( @@ -73,20 +79,12 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/validsalad -/datum/table_recipe/validsalad/AdjustChems(var/obj/resultobj as obj) +/datum/crafting_recipe/validsalad/AdjustChems(var/obj/resultobj as obj) if(istype(resultobj, /obj/item/weapon/reagent_containers)) var/obj/item/weapon/reagent_containers/RC = resultobj RC.reagents.del_reagent("toxin") -/datum/table_recipe/notasandwich - name = "not-a-sandwich" - reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/breadslice = 2, - /obj/item/clothing/mask/fakemoustache = 1, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/notasandwich - -/datum/table_recipe/wrap +/datum/crafting_recipe/wrap name = "egg wrap" fruit = list("cabbage" = 1) reqs = list( @@ -94,75 +92,95 @@ /obj/item/weapon/reagent_containers/food/snacks/friedegg = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/wrap +*/ -/datum/table_recipe/sushi_Ebi +/datum/crafting_recipe/notasandwich + name = "not-a-sandwich" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/breadslice = 2, + /obj/item/clothing/mask/fakemoustache = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/notasandwich + category = CAT_FOOD + + +/datum/crafting_recipe/sushi_Ebi name = "Ebi Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/weapon/reagent_containers/food/snacks/boiled_shrimp = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Ebi + category = CAT_FOOD -/datum/table_recipe/sushi_Ikura +/datum/crafting_recipe/sushi_Ikura name = "Ikura Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/fish_eggs/salmon = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Ikura + category = CAT_FOOD -/datum/table_recipe/sushi_Inari +/datum/crafting_recipe/sushi_Inari name = "Inari Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/weapon/reagent_containers/food/snacks/fried_tofu = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Inari + category = CAT_FOOD -/datum/table_recipe/sushi_Sake +/datum/crafting_recipe/sushi_Sake name = "Sake Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/weapon/reagent_containers/food/snacks/salmonmeat = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Sake + category = CAT_FOOD -/datum/table_recipe/sushi_SmokedSalmon +/datum/crafting_recipe/sushi_SmokedSalmon name = "Smoked Salmon Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/weapon/reagent_containers/food/snacks/salmonsteak = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_SmokedSalmon + category = CAT_FOOD -/datum/table_recipe/sushi_Masago +/datum/crafting_recipe/sushi_Masago name = "Masago Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/fish_eggs/goldfish = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Masago + category = CAT_FOOD -/datum/table_recipe/sushi_Tobiko +/datum/crafting_recipe/sushi_Tobiko name = "Tobiko Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/fish_eggs/shark = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko + category = CAT_FOOD -/datum/table_recipe/sushi_TobikoEgg +/datum/crafting_recipe/sushi_TobikoEgg name = "Tobiko and Egg Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko = 1, /obj/item/weapon/reagent_containers/food/snacks/egg = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/sushi_TobikoEgg + category = CAT_FOOD -/datum/table_recipe/sushi_Tai +/datum/crafting_recipe/sushi_Tai name = "Tai Sushi" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, /obj/item/weapon/reagent_containers/food/snacks/catfishmeat = 1, ) - result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai \ No newline at end of file + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai + category = CAT_FOOD diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c6636d034e0..b15761d8c57 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -36,7 +36,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi verbs += /mob/dead/observer/proc/dead_tele // Our new boo spell. - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/boo(src)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/boo(null)) can_reenter_corpse = flags & GHOST_CAN_REENTER started_as_observer = flags & GHOST_IS_OBSERVER diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index 993f2b6e344..39dae4c0746 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -20,6 +20,7 @@ var/global/list/boo_phrases=list( school = "transmutation" charge_max = 600 clothes_req = 0 + stat_allowed = 1 invocation = "" invocation_type = "none" range = 1 // Or maybe 3? diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index d0bed142a38..af1dab9098c 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -1,51 +1,54 @@ // At minimum every mob has a hear_say proc. -/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) +/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(!client) - return + return 0 - if(speaker && !speaker.client && istype(src,/mob/dead/observer) && client.prefs.toggles & CHAT_GHOSTEARS && !speaker in view(src)) + if(isobserver(src) && client.prefs.toggles & CHAT_GHOSTEARS) + if(speaker && !speaker.client && !(speaker in view(src))) //Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE') //Or someone snoring. So we make it where they won't hear it. - return + return 0 //make sure the air can transmit speech - hearer's side var/turf/T = get_turf(src) - if((T) && (!(istype(src, /mob/dead/observer)))) //Ghosts can hear even in vacuum. + if(T && !isobserver(src)) var/datum/gas_mixture/environment = T.return_air() - var/pressure = (environment)? environment.return_pressure() : 0 + var/pressure = environment ? environment.return_pressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1) - return + return 0 - if(pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet + if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet italics = 1 - sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact + sound_vol *= 0.5 - if(sleeping || stat == 1) + if(sleeping || stat == UNCONSCIOUS) hear_sleep(message) - return + return 0 //non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet. if(language && (language.flags & NONVERBAL)) - if(!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src))) + if(disabilities & BLIND || blinded) //blind people can't see dumbass message = stars(message) - if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages - if(!say_understands(speaker,language)) - if(istype(speaker,/mob/living/simple_animal)) - var/mob/living/simple_animal/S = speaker - if(S.speak.len) - message = pick(S.speak) - else - stars(message) + if(!speaker || !(speaker in view(src))) + message = stars(message) + + if(!say_understands(speaker, language)) + if(isanimal(speaker)) + var/mob/living/simple_animal/S = speaker + if(S.speak.len) + message = pick(S.speak) else - if(language) - message = language.scramble(message) - else - message = stars(message) + message = stars(message) + else + if(language) + message = language.scramble(message) + else + message = stars(message) var/speaker_name = speaker.name - if(istype(speaker, /mob/living/carbon/human)) + if(ishuman(speaker)) var/mob/living/carbon/human/H = speaker speaker_name = H.GetVoice() @@ -53,7 +56,7 @@ message = "[message]" var/track = null - if(istype(src, /mob/dead/observer)) + if(isobserver(src)) if(italics && client.prefs.toggles & CHAT_GHOSTRADIO) return if(speaker_name != speaker.real_name && speaker.real_name) @@ -62,7 +65,7 @@ if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src)) message = "[message]" - if(sdisabilities & DEAF || ear_deaf) + if(disabilities & DEAF || ear_deaf) if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set if(speaker == src) to_chat(src, "You cannot hear yourself speak!") @@ -78,12 +81,11 @@ src.playsound_local(source, speech_sound, sound_vol, 1) -/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/atom/follow_target) - +/mob/proc/hear_radio(var/message, var/verb = "says", var/datum/language/language = null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname = "", var/atom/follow_target) if(!client) return - if(sleeping || stat==1) //If unconscious or sleeping + if(sleeping || stat == UNCONSCIOUS) //If unconscious or sleeping hear_sleep(message) return @@ -93,25 +95,27 @@ //non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet. if(language && (language.flags & NONVERBAL)) - if(!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src))) + if(disabilities & BLIND || blinded) //blind people can't see dumbass message = stars(message) - if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages - if(!say_understands(speaker,language)) - if(isanimal(speaker)) - var/mob/living/simple_animal/S = speaker - if(S.speak && S.speak.len) - message = pick(S.speak) - else - return + if(!speaker || !(speaker in view(src))) + message = stars(message) + + if(!say_understands(speaker, language)) + if(isanimal(speaker)) + var/mob/living/simple_animal/S = speaker + if(S.speak && S.speak.len) + message = pick(S.speak) else - if(language) - message = language.scramble(message) - else - message = stars(message) + return + else + if(language) + message = language.scramble(message) + else + message = stars(message) - if(hard_to_hear) - message = stars(message) + if(hard_to_hear) + message = stars(message) var/speaker_name = "unknown" if(speaker) @@ -178,7 +182,7 @@ formatted = language.format_message_radio(message, verb) else formatted = "[verb], \"[message]\"" - if(sdisabilities & DEAF || ear_deaf) + if(disabilities & DEAF || ear_deaf) if(prob(20)) to_chat(src, "You feel your headset vibrate but can hear nothing from it!") else if(track) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index bbc313e0421..559dac3abbf 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -165,7 +165,7 @@ return list(wear_mask, back, l_hand, r_hand) /mob/proc/get_id_card() - for(var/obj/item/I in src.get_all_slots()) + for(var/obj/item/I in get_all_slots()) . = I.GetID() if(.) break diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 9996c3eeb89..9f47fc9910c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -96,15 +96,13 @@ f_loss += 60 - ear_damage += 30 - ear_deaf += 120 + adjustEarDamage(30, 120) if(3.0) b_loss += 30 if(prob(50) && !shielded) Paralyse(1) - ear_damage += 15 - ear_deaf += 60 + adjustEarDamage(15,60) adjustBruteLoss(b_loss) adjustFireLoss(f_loss) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index d478194bc44..4cccb6e57ed 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -59,7 +59,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || brain_op_stage == 4.0) + if(health < config.health_threshold_dead || !get_int_organ(/obj/item/organ/internal/brain)) death() blinded = 1 stat = DEAD @@ -95,7 +95,7 @@ move_delay_add = max(0, move_delay_add - rand(1, 2)) //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own + if(disabilities & BLIND) //disabled-blind, doesn't get better on its own blinded = 1 else if(eye_blind) //blindness, heals slowly over time eye_blind = max(eye_blind-1,0) @@ -104,12 +104,12 @@ eye_blurry = max(eye_blurry-1, 0) //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) + if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own + setEarDamage(-1, max(ear_deaf, 1)) else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) + adjustEarDamage(0,-1) else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) + adjustEarDamage(-0.05, 0) //Other if(stunned) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index e2862184b79..daba3852764 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -88,37 +88,4 @@ icon_state = "queen_s" for(var/image/I in overlays_standing) - overlays += I - - -/* -/mob/living/carbon/alien/humanoid/queen/verb/evolve() // -- TLE - set name = "Evolve (1000)" - set desc = "The ultimate transformation. Become an alien Empress. Only one empress can exist at a time." - set category = "Alien" - - if(powerc(1000)) - // Queen check - var/no_queen = 1 - for(var/mob/living/carbon/alien/humanoid/empress/E in living_mob_list) - if(!E.key && E.brain_op_stage != 4) - continue - no_queen = 0 - - if(no_queen) - adjustToxLoss(-1000) - to_chat(src, "You begin to evolve!") - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] begins to twist and contort!"), 1) - var/mob/living/carbon/alien/humanoid/empress/new_xeno = new(loc) - if(mind) - mind.transfer_to(new_xeno) - else - new_xeno.key = key - new_xeno.mind.name = new_xeno.name - qdel(src) - else - to_chat(src, "We already have an alive empress.") - return - -*/ \ No newline at end of file + overlays += I \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index c8bd8765a97..19f3368ce96 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -87,15 +87,13 @@ f_loss += 60 - ear_damage += 30 - ear_deaf += 120 + adjustEarDamage(30,120) if(3.0) b_loss += 30 if(prob(50)) Paralyse(1) - ear_damage += 15 - ear_deaf += 60 + adjustEarDamage(15,60) adjustBruteLoss(b_loss) adjustFireLoss(f_loss) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 4e7b974d855..76ceef6ad2e 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -19,7 +19,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if(health < -25 || brain_op_stage == 4.0) + if(health < -25 || !get_int_organ(/obj/item/organ/internal/brain)) death() blinded = 1 silent = 0 @@ -54,7 +54,7 @@ move_delay_add = max(0, move_delay_add - rand(1, 2)) //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own + if(disabilities & BLIND) //disabled-blind, doesn't get better on its own blinded = 1 else if(eye_blind) //blindness, heals slowly over time eye_blind = max(eye_blind-1,0) @@ -63,12 +63,12 @@ eye_blurry = max(eye_blurry-1, 0) //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) + if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own + setEarDamage(-1, max(ear_deaf, 1)) else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) + adjustEarDamage(0,-1) else if(ear_damage < 25) //ear damage heals slowly under this threshold. - ear_damage = max(ear_damage-0.05, 0) + adjustEarDamage(-0.05,0) //Other if(stunned) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index d558e50a1b4..aac43c16ac3 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -50,12 +50,17 @@ return ..() -/mob/living/carbon/brain/update_canmove() +/mob/living/carbon/brain/update_canmove(delay_action_updates = 0) if(in_contents_of(/obj/mecha)) canmove = 1 use_me = 1 //If it can move, let it emote - else if(istype(loc, /obj/item/device/mmi)) canmove = 1 //mmi won't move anyways so whatever - else canmove = 0 + else if(istype(loc, /obj/item/device/mmi)) + canmove = 1 //mmi won't move anyways so whatever + else + canmove = 0 + + if(!delay_action_updates) + update_action_buttons_icon() return canmove /mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. @@ -94,4 +99,10 @@ I'm using this for Stat to give it a more nifty interface to work with stat("Exosuit Integrity", "[!M.health ? "0" : "[(M.health / initial(M.health)) * 100]"]%") /mob/living/carbon/brain/can_safely_leave_loc() - return 0 //You're not supposed to be ethereal jaunting, brains \ No newline at end of file + return 0 //You're not supposed to be ethereal jaunting, brains + +/mob/living/carbon/brain/adjustEarDamage() + return + +/mob/living/carbon/brain/setEarDamage() // no ears to damage or heal + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index f75cfee8f9b..dd2e81ed35b 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -21,8 +21,7 @@ /obj/item/organ/internal/brain/surgeryize() if(!owner) return - owner.ear_damage = 0 //Yeah, didn't you...hear? The ears are totally inside the brain. - owner.ear_deaf = 0 + owner.setEarDamage(0,0) //Yeah, didn't you...hear? The ears are totally inside the brain. /obj/item/organ/internal/brain/xeno name = "xenomorph brain" diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 7b04e52f69b..aad88276473 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -183,7 +183,6 @@ src.brainmob.container = src src.brainmob.stat = 0 src.brainmob.silent = 0 - src.brainmob.brain_op_stage = 4.0 dead_mob_list -= src.brainmob ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1fea808c660..f30ff8ed0f2 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -644,8 +644,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(do_mob(usr, src, POCKET_STRIP_DELAY)) if(internal) internal = null - if(internals) - internals.icon_state = "internal0" + update_internals_hud_icon(0) else var/no_mask2 if(!(wear_mask && wear_mask.flags & AIRTIGHT)) @@ -655,8 +654,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return internal = ITEM - if(internals) - internals.icon_state = "internal1" + update_internals_hud_icon(1) visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].", \ "[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].") @@ -858,7 +856,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) else clear_alert("handcuffed") - update_action_buttons() //some of our action buttons might be unusable when we're handcuffed. + update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed. update_inv_handcuffed() update_hud_handcuffed() @@ -1031,3 +1029,16 @@ so that different stomachs can handle things in different ways VB*/ var/obj/item/LH = get_inactive_hand() if(LH) . |= LH.GetAccess() + +/mob/living/carbon/proc/can_breathe_gas() + if(!wear_mask) + return TRUE + + if(!(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) && internal == null) + return TRUE + + return FALSE + +/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0) + if(hud_used && hud_used.internals) + hud_used.internals.icon_state = "internal[internal_state]" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 07a6a0d28cd..e900fc10517 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,15 +1,12 @@ -/mob/living/carbon/ +/mob/living/carbon gender = MALE hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD) var/list/stomach_contents = list() var/list/internal_organs = list() - var/brain_op_stage = 0.0 var/antibodies = 0 - var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm var/life_tick = 0 // The amount of life ticks that have processed on this mob. - var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain - // life should decrease this by 1 every tick + // total amount of wounds on mob, used to spread out healing and the like over all wounds var/number_wounds = 0 var/obj/item/handcuffed = null //Whether or not the mob is handcuffed diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index fca8c59fec3..b0ccdc8381d 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -2,4 +2,8 @@ losebreath = 0 med_hud_set_health() med_hud_set_status() + + if(reagents) + reagents.death_metabolize(src) + ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 40c935188cf..ef5768fcb0e 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -10,7 +10,7 @@ act = copytext(act, 1, t1) var/muzzled = is_muzzled() - if(sdisabilities & MUTE || silent) + if(disabilities & MUTE || silent) muzzled = 1 //var/m_type = 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9a48fcc8593..a67510c622f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -39,6 +39,8 @@ martial_art = default_martial_art + handcrafting = new() + var/mob/M = src faction |= "\ref[M]" //what @@ -53,6 +55,9 @@ UpdateAppearance() +/mob/living/carbon/human/OpenCraftingMenu() + handcrafting.craft(src) + /mob/living/carbon/human/prepare_data_huds() //Update med hud images... ..() @@ -350,8 +355,7 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - ear_damage += 30 - ear_deaf += 120 + adjustEarDamage(30, 120) if(prob(70) && !shielded) Paralyse(10) @@ -375,8 +379,7 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - ear_damage += 15 - ear_deaf += 60 + adjustEarDamage(15,60) if(prob(50) && !shielded) Paralyse(10) @@ -599,7 +602,6 @@ dat += " ↳Pockets:[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]" dat += " ↳ID:[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"]" - dat += " ↳PDA:[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty"]" if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index e6388e8673e..0626c89fa1f 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -55,6 +55,8 @@ var/global/default_martial_art = new/datum/martial_art var/speech_problem_flag = 0 + var/datum/personal_crafting/handcrafting + var/datum/martial_art/martial_art = null var/special_voice = "" // For changing our voice. Used by a symptom. diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index aa115ad8c4c..cf66c1d2c15 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -79,7 +79,7 @@ break if(thrust) - if((movement_dir || thrust.stabilization_on) && thrust.allow_thrust(0.01, src)) + if((movement_dir || thrust.stabilizers) && thrust.allow_thrust(0.01, src)) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index ec65c450792..5e77278be6f 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -262,7 +262,7 @@ MYPDA = wear_pda else MYPDA = new(src) - equip_to_slot_or_del(MYPDA, slot_wear_pda) + equip_to_slot_or_del(MYPDA, slot_belt) MYPDA.owner = real_name MYPDA.ownjob = alt_title MYPDA.ownrank = job @@ -954,4 +954,4 @@ if(RPID) RPID.registered_name = MYID.registered_name RPID.name = MYID.name - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 47448a73262..5e0a4335b83 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -78,8 +78,6 @@ if(slot_wear_id) // the only relevant check for this is the uniform check return 1 - if(slot_wear_pda) - return 1 if(slot_l_ear) return has_organ("head") if(slot_r_ear) @@ -166,9 +164,8 @@ update_fhair() update_head_accessory() if(internal) - if(internals) - internals.icon_state = "internal0" internal = null + update_internals_hud_icon(0) sec_hud_set_ID() update_inv_wear_mask() else if(I == wear_id) @@ -251,9 +248,6 @@ wear_id = W sec_hud_set_ID() update_inv_wear_id(redraw_mob) - if(slot_wear_pda) - wear_pda = W - update_inv_wear_pda(redraw_mob) if(slot_l_ear) l_ear = W if(l_ear.slot_flags & SLOT_TWOEARS) @@ -340,8 +334,6 @@ return belt if(slot_wear_id) return wear_id - if(slot_wear_pda) - return wear_pda if(slot_l_ear) return l_ear if(slot_r_ear) @@ -521,16 +513,6 @@ if(!(I.slot_flags & SLOT_ID)) return 0 return 1 - if(slot_wear_pda) - if(wear_pda) - return 0 - if(!w_uniform) - if(!disable_warning) - to_chat(src, "You need a jumpsuit before you can attach this [name].") - return 0 - if(!(I.slot_flags & SLOT_PDA)) - return 0 - return 1 if(slot_l_store) if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them. return 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a13f7d31150..b2b71d60545 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -328,7 +328,6 @@ /mob/living/carbon/human/get_breath_from_internal(volume_needed) //making this call the parent would be far too complicated - if(internal) var/null_internals = 0 //internals are invalid, therefore turn them off var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped. @@ -353,12 +352,10 @@ if(internal) //check for hud updates every time this is called - if(internals) - internals.icon_state = "internal1" + update_internals_hud_icon(1) return internal.remove_air_volume(volume_needed) //returns the valid air else - if(internals) - internals.icon_state = "internal0" + update_internals_hud_icon(0) return null @@ -819,9 +816,6 @@ handle_organs() handle_blood() - //the analgesic effect wears off slowly - analgesic = max(0, analgesic - 1) - if(paralysis) blinded = 1 stat = UNCONSCIOUS @@ -867,7 +861,7 @@ else //blindness - if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own + if(disabilities & BLIND) // Disabled-blind, doesn't get better on its own blinded = 1 else if(eye_blind) // Blindness, heals slowly over time @@ -887,18 +881,18 @@ //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) + if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own + setEarDamage(-1, max(ear_deaf, 1)) else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf - 1, 0) + adjustEarDamage(0,-1) else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster - ear_damage = max(ear_damage - 0.15, 0) - ear_deaf = max(ear_deaf, 1) + adjustEarDamage(-0.15,0) + setEarDamage(-1, max(ear_deaf, 1)) else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage - 0.05, 0) + adjustEarDamage(-0.05,0) if(flying) animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING) @@ -990,8 +984,10 @@ /mob/living/carbon/human/handle_shock() ..() - if(status_flags & GODMODE) return 0 //godmode - if(analgesic || (species && species.flags & NO_PAIN)) return // analgesic avoids all traumatic shock temporarily + if(status_flags & GODMODE) + return 0 //godmode + if(species && species.flags & NO_PAIN) + return if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse shock_stage = max(shock_stage, 61) @@ -1040,9 +1036,11 @@ /mob/living/carbon/human/proc/handle_pulse() - if(mob_master.current_cycle % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) + if(mob_master.current_cycle % 5) + return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) - if(species && species.flags & NO_BLOOD) return PULSE_NONE //No blood, no pulse. + if(species && species.flags & NO_BLOOD) + return PULSE_NONE //No blood, no pulse. if(stat == DEAD) return PULSE_NONE //that's it, you're dead, nothing can influence your pulse @@ -1060,25 +1058,21 @@ temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds for(var/datum/reagent/R in reagents.reagent_list) - if(R.id in bradycardics) + if(R.heart_rate_decrease) if(temp <= PULSE_THREADY && temp >= PULSE_NORM) temp-- - break //one reagent is enough - //comment out the breaks to make med effects stack - for(var/datum/reagent/R in reagents.reagent_list) //handles different chems' influence on pulse - if(R.id in tachycardics) + break + + for(var/datum/reagent/R in reagents.reagent_list)//handles different chems' influence on pulse + if(R.heart_rate_increase) if(temp <= PULSE_FAST && temp >= PULSE_NONE) temp++ break + for(var/datum/reagent/R in reagents.reagent_list) //To avoid using fakedeath - if(R.id in heartstopper) + if(R.heart_rate_stop) temp = PULSE_NONE break - for(var/datum/reagent/R in reagents.reagent_list) //Conditional heart-stoppage - if(R.id in cheartstopper) - if(R.volume >= R.overdose_threshold) - temp = PULSE_NONE - break return temp diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 552daf2ba48..72e6ff63314 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -38,8 +38,7 @@ say(temp) winset(client, "input", "text=[null]") -/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null) - +/mob/living/carbon/human/say_understands(var/mob/other, var/datum/language/speaking = null) if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak. return 1 @@ -51,21 +50,15 @@ if(istype(other, /mob/living/simple_animal/diona)) if(other.languages.len >= 2) //They've sucked down some blood and can speak common now. return 1 - if(istype(other, /mob/living/silicon)) + if(issilicon(other)) return 1 - if(istype(other, /mob/living/simple_animal/bot)) + if(isbot(other)) return 1 - if(istype(other, /mob/living/carbon/brain)) + if(isbrain(other)) return 1 - if(istype(other, /mob/living/carbon/slime)) + if(isslime(other)) return 1 - //This is already covered by mob/say_understands() - //if(istype(other, /mob/living/simple_animal)) - // if((other.universal_speak && !speaking) || src.universal_speak || src.universal_understand) - // return 1 - // return 0 - return ..() /mob/living/carbon/human/proc/HasVoiceChanger() @@ -113,7 +106,7 @@ var/list/returns[3] var/speech_problem_flag = 0 - if(silent || (sdisabilities & MUTE)) + if(silent || (disabilities & MUTE)) message = "" speech_problem_flag = 1 @@ -148,7 +141,7 @@ if(prob(braindam)) message = uppertext(message) verb = "yells loudly" - + if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) message = "[message]" @@ -166,57 +159,70 @@ used_radios += I if("headset") - if(l_ear && istype(l_ear,/obj/item/device/radio)) - var/obj/item/device/radio/R = l_ear - R.talk_into(src,message,null,verb,speaking) - used_radios += l_ear - else if(r_ear && istype(r_ear,/obj/item/device/radio)) - var/obj/item/device/radio/R = r_ear - R.talk_into(src,message,null,verb,speaking) - used_radios += r_ear + var/obj/item/device/radio/R = null + if(isradio(l_ear)) + R = l_ear + used_radios += R + if(R.talk_into(src, message, null, verb, speaking)) + return + + if(isradio(r_ear)) + R = r_ear + used_radios += R + if(R.talk_into(src, message, null, verb, speaking)) + return if("right ear") var/obj/item/device/radio/R - var/has_radio = 0 - if(r_ear && istype(r_ear,/obj/item/device/radio)) + if(isradio(r_ear)) R = r_ear - has_radio = 1 - if(r_hand && istype(r_hand, /obj/item/device/radio)) + else if(isradio(r_hand)) R = r_hand - has_radio = 1 - if(has_radio) - R.talk_into(src,message,null,verb,speaking) + if(R) used_radios += R - + R.talk_into(src, message, null, verb, speaking) if("left ear") var/obj/item/device/radio/R - var/has_radio = 0 - if(l_ear && istype(l_ear,/obj/item/device/radio)) + if(isradio(l_ear)) R = l_ear - has_radio = 1 - if(l_hand && istype(l_hand,/obj/item/device/radio)) + else if(isradio(l_hand)) R = l_hand - has_radio = 1 - if(has_radio) - R.talk_into(src,message,null,verb,speaking) + if(R) used_radios += R + R.talk_into(src, message, null, verb, speaking) if("whisper") whisper_say(message, speaking, alt_name) return 1 else if(message_mode) - if(l_ear && istype(l_ear,/obj/item/device/radio)) - l_ear.talk_into(src,message, message_mode, verb, speaking) + if(isradio(l_ear)) used_radios += l_ear - else if(r_ear && istype(r_ear,/obj/item/device/radio)) - r_ear.talk_into(src,message, message_mode, verb, speaking) + if(l_ear.talk_into(src, message, message_mode, verb, speaking)) + return + + if(isradio(r_ear)) used_radios += r_ear + if(r_ear.talk_into(src, message, message_mode, verb, speaking)) + return /mob/living/carbon/human/handle_speech_sound() var/list/returns[2] if(species.speech_sounds && prob(species.speech_chance)) returns[1] = sound(pick(species.speech_sounds)) returns[2] = 50 - return returns \ No newline at end of file + return returns + +/mob/living/carbon/human/binarycheck() + . = FALSE + var/obj/item/device/radio/headset/R + if(istype(l_ear, /obj/item/device/radio/headset)) + R = l_ear + if(R.translate_binary) + . = TRUE + + if(istype(r_ear, /obj/item/device/radio/headset)) + R = r_ear + if(R.translate_binary) + . = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 40fcfb738b8..bae949dd9af 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -125,8 +125,7 @@ H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy. to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.") H.internal = H.get_item_by_slot(tank_slot) - if(H.internals) - H.internals.icon_state = "internal1" + H.update_internals_hud_icon(1) // Plasmamen are so fucking different that they need their own proc. /datum/species/plasmaman/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 9091fcd9079..617d63c798b 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -615,25 +615,22 @@ /datum/species/proc/handle_hud_icons(mob/living/carbon/human/H) if(H.healths) - if(H.analgesic) - H.healths.icon_state = "health_health_numb" + if(H.stat == DEAD) + H.healths.icon_state = "health7" else - if(H.stat == DEAD) - H.healths.icon_state = "health7" - else - switch(H.hal_screwyhud) - if(1) H.healths.icon_state = "health6" - if(2) H.healths.icon_state = "health7" - if(5) H.healths.icon_state = "health0" - else - switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss) - if(100 to INFINITY) H.healths.icon_state = "health0" - if(80 to 100) H.healths.icon_state = "health1" - if(60 to 80) H.healths.icon_state = "health2" - if(40 to 60) H.healths.icon_state = "health3" - if(20 to 40) H.healths.icon_state = "health4" - if(0 to 20) H.healths.icon_state = "health5" - else H.healths.icon_state = "health6" + switch(H.hal_screwyhud) + if(1) H.healths.icon_state = "health6" + if(2) H.healths.icon_state = "health7" + if(5) H.healths.icon_state = "health0" + else + switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss) + if(100 to INFINITY) H.healths.icon_state = "health0" + if(80 to 100) H.healths.icon_state = "health1" + if(60 to 80) H.healths.icon_state = "health2" + if(40 to 60) H.healths.icon_state = "health3" + if(20 to 40) H.healths.icon_state = "health4" + if(0 to 20) H.healths.icon_state = "health5" + else H.healths.icon_state = "health6" if(H.healthdoll) H.healthdoll.overlays.Cut() diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 3c60c837769..26c20a82a82 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -81,11 +81,6 @@ /datum/species/unathi/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) -/datum/species/unathi/equip(var/mob/living/carbon/human/H) - if(H.mind.assigned_role != "Clown") - H.unEquip(H.shoes) - H.equip_or_collect(new /obj/item/clothing/shoes/sandal(H), slot_shoes) - /datum/species/tajaran name = "Tajaran" name_plural = "Tajaran" @@ -146,11 +141,6 @@ /datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) -/datum/species/tajaran/equip(var/mob/living/carbon/human/H) - if(H.mind.assigned_role != "Clown") - H.unEquip(H.shoes) - H.equip_or_collect(new /obj/item/clothing/shoes/sandal(H), slot_shoes) - /datum/species/vulpkanin name = "Vulpkanin" name_plural = "Vulpkanin" @@ -362,8 +352,7 @@ H.equip_or_collect(new /obj/item/weapon/tank/emergency_oxygen/vox(H), slot_l_hand) to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") H.internal = H.l_hand - if(H.internals) - H.internals.icon_state = "internal1" + H.update_internals_hud_icon(1) /datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) updatespeciescolor(H) @@ -801,8 +790,7 @@ "is pulling themselves apart!") /datum/species/diona/can_understand(var/mob/other) - var/mob/living/simple_animal/diona/D = other - if(istype(D)) + if(istype(other, /mob/living/simple_animal/diona)) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8f9a428830a..d6c9f7ae286 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -990,16 +990,6 @@ var/global/list/damage_icon_parts = list() client.screen += r_store r_store.screen_loc = ui_storage2 -/mob/living/carbon/human/update_inv_wear_pda() - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_pda] - if(inv) - inv.update_icon() - - if(wear_pda) - client.screen += wear_pda - wear_pda.screen_loc = ui_pda - /mob/living/carbon/human/update_inv_wear_mask(var/update_icons = 1) ..() if(client && hud_used) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 671e289ee21..985047a8284 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -181,19 +181,17 @@ /mob/living/carbon/proc/get_breath_from_internal(volume_needed) if(internal) - if(!contents.Find(internal)) + if(internal.loc != src) internal = null if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet internal = null //turn off internals if(internal) - if(internals) - internals.icon_state = "internal1" + update_internals_hud_icon(1) return internal.remove_air_volume(volume_needed) else - if(internals) - internals.icon_state = "internal0" + update_internals_hud_icon(0) return @@ -437,12 +435,6 @@ see_invisible = see_override -/mob/living/carbon/handle_actions() - ..() - for(var/obj/item/I in internal_organs) - give_action_button(I, 1) - - /mob/living/carbon/handle_hud_icons() return diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index b1c83a1e7c1..0a86f2756cf 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -16,8 +16,6 @@ src.traumatic_shock -= R.shock_reduction // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball if(src.slurring) src.traumatic_shock -= 10 - if(src.analgesic) - src.traumatic_shock = 0 // broken or ripped off organs will add quite a bit of pain if(istype(src,/mob/living/carbon/human)) diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index d8a89b4d49f..b51e0084ee3 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -217,9 +217,9 @@ src.density = !( src.lying ) - if(src.sdisabilities & BLIND) + if(src.disabilities & BLIND) src.blinded = 1 - if(src.sdisabilities & DEAF) + if(src.disabilities & DEAF) src.ear_deaf = 1 if(src.eye_blurry > 0) @@ -243,6 +243,7 @@ else if(nutrition >= get_grow_nutrition() && amount_grown < 10) nutrition -= 20 amount_grown++ + update_action_buttons_icon() if(amount_grown >= 10 && !Victim && !Target && !ckey) if(is_adult) diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index ab12c584259..23233fd5e09 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -33,8 +33,9 @@ if(default_spells.len) for(var/spell in default_spells) var/obj/effect/proc_holder/spell/S = spell - if(!S) return - H.AddSpell(new S) + if(!S) + return + H.mind.AddSpell(new S(null)) /datum/superheroes/proc/assign_id(var/mob/living/carbon/human/H) var/obj/item/weapon/card/id/syndicate/W = new(H) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 14585f6ae21..e17d9af6250 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -2,4 +2,5 @@ blinded = max(blinded, 1) clear_fullscreens() + update_action_buttons_icon() ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1bdc8e9eb57..a151a062bce 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -49,9 +49,7 @@ handle_disabilities() // eye, ear, brain damages handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc - handle_actions() - - update_canmove() + update_canmove(1) // set to 1 to not update icon action buttons; rip this argument out if Life is ever refactored to be non-stupid. -Fox if(client) //regular_hud_updates() //THIS DOESN'T FUCKING UPDATE SHIT @@ -176,7 +174,7 @@ /mob/living/proc/handle_disabilities() //Eyes - if(sdisabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own + if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own eye_blind = max(eye_blind, 1) else if(eye_blind) //blindness, heals slowly over time eye_blind = max(eye_blind-1,0) @@ -197,7 +195,6 @@ handle_vision() handle_hud_icons() - update_action_buttons() return 1 @@ -247,84 +244,6 @@ /mob/living/proc/handle_hud_icons_health() return -/mob/living/proc/handle_actions() - //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent - for(var/datum/action/A in actions) - if(A.CheckRemoval(src)) - A.Remove(src) - for(var/obj/item/I in src) - give_action_button(I, 1) - return - -/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0) - if(I.action_button_name) - if(!I.action) - if(I.action_button_custom_type) - I.action = new I.action_button_custom_type - else - I.action = new /datum/action/item_action - I.action.name = I.action_button_name - I.action.target = I - I.action.Grant(src) - - if(recursive) - for(var/obj/item/T in I) - give_action_button(T, recursive - 1) - -/mob/living/update_action_buttons() - if(!hud_used) return - if(!client) return - - if(!hud_used.hud_shown) - return - - client.screen -= hud_used.hide_actions_toggle - for(var/datum/action/A in actions) - if(A.button) - client.screen -= A.button - - if(hud_used.action_buttons_hidden) - if(!hud_used.hide_actions_toggle) - hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.UpdateIcon() - - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1) - //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1) - - client.screen += hud_used.hide_actions_toggle - return - - var/button_number = 0 - for(var/datum/action/A in actions) - button_number++ - if(A.button == null) - var/obj/screen/movable/action_button/N = new(hud_used) - N.owner = A - A.button = N - - var/obj/screen/movable/action_button/B = A.button - - B.UpdateIcon() - - B.name = A.UpdateName() - - client.screen += B - - if(!B.moved) - B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) - //hud_used.SetButtonCoords(B,button_number) - - if(button_number > 0) - if(!hud_used.hide_actions_toggle) - hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.InitialiseIcon(src) - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) - //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) - client.screen += hud_used.hide_actions_toggle - - /mob/living/proc/process_nations() if(client) var/client/C = client diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4e2007872a2..69a32f2c285 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -3,6 +3,9 @@ ..() return QDEL_HINT_HARDDEL_NOW +/mob/living/proc/OpenCraftingMenu() + return + /mob/living/Stat() . = ..() if(. && get_rig_stats) @@ -343,7 +346,7 @@ dead_mob_list -= src living_mob_list |= src mob_list |= src - ear_deaf = 0 + setEarDamage(-1,0) timeofdeath = 0 /mob/living/proc/rejuvenate() @@ -370,13 +373,11 @@ hallucination = 0 nutrition = 400 bodytemperature = 310 - sdisabilities = 0 disabilities = 0 blinded = 0 eye_blind = 0 eye_blurry = 0 - ear_deaf = 0 - ear_damage = 0 + setEarDamage(0,0) heal_overall_damage(1000, 1000) ExtinguishMob() fire_stacks = 0 @@ -643,7 +644,7 @@ //called when the mob receives a bright flash /mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash) - if(check_eye_prot() < intensity && (override_blindness_check || !(sdisabilities & BLIND))) + if(check_eye_prot() < intensity && (override_blindness_check || !(disabilities & BLIND))) overlay_fullscreen("flash", type) addtimer(src, "clear_fullscreen", 25, FALSE, "flash", 25) return 1 @@ -834,6 +835,15 @@ /mob/living/proc/get_permeability_protection() return 0 +/mob/living/proc/attempt_harvest(obj/item/I, mob/user) + if(stat == DEAD && !isnull(butcher_results)) //can we butcher it? + if(istype(I, /obj/item/weapon/kitchen/knife)) + to_chat(user, "You begin to butcher [src]...") + playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) + if(do_mob(user, src, 80)) + harvest(user) + return 1 + /mob/living/proc/harvest(mob/living/user) if(qdeleted(src)) return diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6bd7c162308..19dc6f99cd1 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -7,10 +7,10 @@ //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS - var/bruteloss = 0.0 //Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) - var/oxyloss = 0.0 //Oxygen depravation damage (no air in lungs) - var/toxloss = 0.0 //Toxic damage caused by being poisoned or radiated - var/fireloss = 0.0 //Burn damage caused by being way too hot, too cold or burnt. + var/bruteloss = 0 //Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) + var/oxyloss = 0 //Oxygen depravation damage (no air in lungs) + var/toxloss = 0 //Toxic damage caused by being poisoned or radiated + var/fireloss = 0 //Burn damage caused by being way too hot, too cold or burnt. var/cloneloss = 0 //Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot. var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are stunned if it gets too high. Holodeck and hallucinations deal this. @@ -23,11 +23,6 @@ //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas. - var/t_plasma = null - var/t_oxygen = null - var/t_sl_gas = null - var/t_n2 = null - var/now_pushing = null var/atom/movable/cameraFollow = null @@ -36,9 +31,8 @@ var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20 var/update_slimes = 1 - var/specialsauce = 0 //Has this person consumed enough special sauce? IF so they're a ticking time bomb of death. var/implanting = 0 //Used for the mind-slave implant - var/silent = null //Can't talk. Value goes down every life proc. + var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. var/floating = 0 var/nightvision = 0 @@ -49,7 +43,6 @@ var/list/icon/pipes_shown = list() var/last_played_vent - var/list/datum/action/actions = list() var/step_count = 0 var/list/butcher_results = null diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 876a1d9c98b..dbcefec7365 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -29,7 +29,7 @@ var/list/department_radio_keys = list( ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", ":Z" = "Service", "#Z" = "Service", ".Z" = "Service", ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private", - ":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops" + ":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops" ) @@ -48,22 +48,7 @@ proc/get_radio_key_from_channel(var/channel) return key /mob/living/proc/binarycheck() - - if(istype(src, /mob/living/silicon/pai)) - return - - if(!ishuman(src)) - return - - var/mob/living/carbon/human/H = src - if(H.l_ear || H.r_ear) - var/obj/item/device/radio/headset/dongle - if(istype(H.l_ear,/obj/item/device/radio/headset)) - dongle = H.l_ear - else - dongle = H.r_ear - if(!istype(dongle)) return - if(dongle.translate_binary) return 1 + return FALSE /mob/living/proc/get_default_language() return default_language @@ -123,27 +108,27 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="") if(client) if(client.prefs.muted & MUTE_IC) - to_chat(src, "\red You cannot speak in IC (Muted).") + to_chat(src, "You cannot speak in IC (Muted).") return message = trim_strip_html_properly(message) if(stat) - if(stat == 2) + if(stat == DEAD) return say_dead(message) return var/message_mode = parse_message_mode(message, "headset") - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) + if(copytext(message, 1, 2) == "*") + return emote(copytext(message, 2)) //parse the radio code and consume it if(message_mode) if(message_mode == "headset") - message = copytext(message,2) //it would be really nice if the parse procs could do this for us. + message = copytext(message, 2) //it would be really nice if the parse procs could do this for us. else - message = copytext(message,3) + message = copytext(message, 3) message = trim_left(message) @@ -184,7 +169,7 @@ proc/get_radio_key_from_channel(var/channel) if(!message || message == "") return 0 - var/list/obj/item/used_radios = new + var/list/used_radios = list() if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)) return 1 @@ -204,11 +189,14 @@ proc/get_radio_key_from_channel(var/channel) var/msg if(!speaking || !(speaking.flags & NO_TALK_MSG)) msg = "\The [src] talks into \the [used_radios[1]]" - for(var/mob/living/M in hearers(5, src)) - if((M != src) && msg) + + if(msg) + for(var/mob/living/M in hearers(5, src) - src) M.show_message(msg) - if(speech_sound) - sound_vol *= 0.5 + + if(speech_sound) + sound_vol *= 0.5 + var/turf/T = get_turf(src) @@ -216,7 +204,7 @@ proc/get_radio_key_from_channel(var/channel) if(speaking) if(speaking.flags & NONVERBAL) if(prob(30)) - src.custom_emote(1, "[pick(speaking.signlang_verb)].") + custom_emote(1, "[pick(speaking.signlang_verb)].") if(speaking.flags & SIGNLANG) return say_signlang(message, pick(speaking.signlang_verb), speaking) @@ -227,11 +215,11 @@ proc/get_radio_key_from_channel(var/channel) if(T) //make sure the air can transmit speech - speaker's side var/datum/gas_mixture/environment = T.return_air() - var/pressure = (environment)? environment.return_pressure() : 0 + var/pressure = environment ? environment.return_pressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE) message_range = 1 - if(pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet + if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet italics = 1 sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact @@ -239,26 +227,26 @@ proc/get_radio_key_from_channel(var/channel) var/list/hearturfs = list() for(var/I in hear) - if(istype(I, /mob/)) + if(ismob(I)) var/mob/M = I listening += M - hearturfs += M.locs[1] + hearturfs += get_turf(M) for(var/obj/O in M.contents) listening_obj |= O - else if(istype(I, /obj/)) + if(isobj(I)) var/obj/O = I - hearturfs += O.locs[1] + hearturfs += get_turf(O) listening_obj |= O for(var/mob/M in player_list) if(!M.client) continue //skip monkeys and leavers - if(istype(M, /mob/new_player)) + if(isnewplayer(M)) continue - if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice + if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS) && client) // client is so that ghosts don't have to listen to mice listening |= M continue - if(M.loc && M.locs[1] in hearturfs) + if(get_turf(M) in hearturfs) listening |= M var/list/speech_bubble_recipients = list() @@ -354,7 +342,7 @@ proc/get_radio_key_from_channel(var/channel) return if(stat) - if(stat == 2) + if(stat == DEAD) return say_dead(message) return @@ -380,7 +368,7 @@ proc/get_radio_key_from_channel(var/channel) verb = "[speaking.speech_verb] [adverb]" not_heard = "[speaking.speech_verb] something [adverb]" else - not_heard = "[verb] something" //TODO get rid of the null language and just prevent speech if language is null + not_heard = "[verb] something" message = trim(message) @@ -391,11 +379,12 @@ proc/get_radio_key_from_channel(var/channel) speech_problem_flag = handle_s[3] if(verb == "yells loudly") verb = "slurs emphatically" + else if(speech_problem_flag) var/adverb = pick("quietly", "softly") verb = "[verb] [adverb]" - if(!message || message=="") + if(!message) return var/atom/whisper_loc = get_whisper_loc() @@ -412,7 +401,7 @@ proc/get_radio_key_from_channel(var/channel) //Pass whispers on to anything inside the immediate listeners. for(var/mob/L in listening) for(var/mob/C in L.contents) - if(istype(C,/mob/living)) + if(isliving(C)) listening += C //pass on the message to objects that can hear us. @@ -452,11 +441,11 @@ proc/get_radio_key_from_channel(var/channel) flick_overlay(I, speech_bubble_recipients, 30) if(watching.len) - var/rendered = "[src.name] [not_heard]." + var/rendered = "[name] [not_heard]." for(var/mob/M in watching) M.show_message(rendered, 2) - log_whisper("[src.name]/[src.key] : [message]") + log_whisper("[name]/[key] : [message]") return 1 /mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 6e062860eed..3cf863a3591 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -521,7 +521,7 @@ to_chat(src, "You are far too small to pull anything!") return -/mob/living/silicon/pai/update_canmove() +/mob/living/silicon/pai/update_canmove(delay_action_updates = 0) . = ..() density = 0 //this is reset every canmove update otherwise diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 8412aa322cb..1089e05862a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -337,7 +337,7 @@ /mob/living/silicon/robot/drone/remove_robot_verbs() src.verbs -= silicon_subsystems -/mob/living/silicon/robot/drone/update_canmove() +/mob/living/silicon/robot/drone/update_canmove(delay_action_updates = 0) . = ..() density = 0 //this is reset every canmove update otherwise diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 90dc2a059ac..b2c8857f040 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -17,8 +17,7 @@ SetStunned(min(stunned, 30)) SetParalysis(min(paralysis, 30)) SetWeakened(min(weakened, 20)) - sleeping = 0 - ear_deaf = 0 + SetSleeping(0) /mob/living/silicon/robot/proc/handle_robot_cell() if(stat != DEAD) @@ -228,12 +227,14 @@ weapon_lock = 0 weaponlock_time = 120 -/mob/living/silicon/robot/update_canmove() +/mob/living/silicon/robot/update_canmove(delay_action_updates = 0) if(paralysis || stunned || weakened || buckled || lockcharge) canmove = 0 else canmove = 1 update_transform() + if(!delay_action_updates) + update_action_buttons_icon() return canmove //Robots on fire diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 8a66bc1fb89..b7f3eec50bc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -88,6 +88,8 @@ var/list/robot_verbs_default = list( var/obj/item/borg/sight/hud/sec/sechud = null var/obj/item/borg/sight/hud/med/healthhud = null + var/datum/action/item_action/toggle_research_scanner/scanner = null + /mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0) spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) @@ -144,6 +146,7 @@ var/list/robot_verbs_default = list( cell_component.installed = 1 diag_hud_set_borgcell() + scanner = new(src) scanner.Grant(src) /mob/living/silicon/robot/proc/init(var/alien=0) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c3dd1b71ae4..f467925d309 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -358,4 +358,12 @@ return ..() /mob/living/silicon/is_mechanical() - return 1 \ No newline at end of file + return 1 + +/////////////////////////////////// EAR DAMAGE //////////////////////////////////// + +/mob/living/silicon/adjustEarDamage() + return + +/mob/living/silicon/setEarDamage() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 39d54ab1696..3cc10b39d42 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -161,7 +161,7 @@ diag_hud.add_hud_to(src) permanent_huds |= diag_hud -/mob/living/simple_animal/bot/update_canmove() +/mob/living/simple_animal/bot/update_canmove(delay_action_updates = 0) . = ..() if(!on) . = 0 diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 4cbf3dd91ce..1d5b4da0e83 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -21,24 +21,17 @@ universal_speak = 1 var/list/construct_spells = list() loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm) + del_on_death = 1 + deathmessage = "collapses in a shattered heap." /mob/living/simple_animal/construct/New() ..() name = text("[initial(name)] ([rand(1, 1000)])") real_name = name for(var/spell in construct_spells) - AddSpell(new spell(src)) + AddSpell(new spell(null)) updateglow() -/mob/living/simple_animal/construct/death() - ..() - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] collapses in a shattered heap. ") - ghostize() - qdel(src) - return - /mob/living/simple_animal/construct/examine(mob/user) to_chat(user, "*---------*") ..(user) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index e0196fbcec2..5f078682947 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -38,7 +38,7 @@ . = ..() regenerate_icons() -/mob/living/simple_animal/pet/corgi/death() +/mob/living/simple_animal/pet/corgi/death(gibbed) ..() regenerate_icons() @@ -612,6 +612,8 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 loot = list(/obj/effect/decal/cleanable/blood/gibs/robot) + del_on_death = 1 + deathmessage = "blows apart!" /mob/living/simple_animal/pet/corgi/Ian/borgi/emag_act(user as mob) if(!emagged) @@ -656,12 +658,8 @@ s.set_up(3, 1, src) s.start() -/mob/living/simple_animal/pet/corgi/Ian/borgi/death() - ..() - visible_message("[src] blows apart!") +/mob/living/simple_animal/pet/corgi/Ian/borgi/death(gibbed) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() - respawnable_list += src - qdel(src) - return + ..() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 06fb36b5787..7dd9a50c828 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -241,7 +241,7 @@ var/global/chicken_count = 0 pixel_y = rand(0, 10) chicken_count += 1 -/mob/living/simple_animal/chicken/death() +/mob/living/simple_animal/chicken/death(gibbed) ..() chicken_count -= 1 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index dee6489b9cb..4d499e9f54f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -116,7 +116,7 @@ M << 'sound/effects/mousesqueek.ogg' ..() -/mob/living/simple_animal/mouse/death() +/mob/living/simple_animal/mouse/death(gibbed) layer = MOB_LAYER if(client) client.time_died_as_mouse = world.time diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index eba412580db..30f55a2220f 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -17,7 +17,7 @@ ..() regenerate_icons() -/mob/living/simple_animal/pet/death() +/mob/living/simple_animal/pet/death(gibbed) ..() regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 6bbadd7e8d5..a76fe47cdba 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -64,21 +64,18 @@ response_harm = "stomps on" emote_see = list("jiggles", "bounces in place") var/colour = "grey" + del_on_death = 1 /mob/living/simple_animal/adultslime/New() ..() overlays += "aslime-:33" -/mob/living/simple_animal/slime/adult/death() - var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc) - S1.icon_state = "[src.colour] baby slime" - S1.icon_living = "[src.colour] baby slime" - S1.icon_dead = "[src.colour] baby slime dead" - S1.colour = "[src.colour]" - var/mob/living/simple_animal/slime/S2 = new /mob/living/simple_animal/slime (src.loc) - S2.icon_state = "[src.colour] baby slime" - S2.icon_living = "[src.colour] baby slime" - S2.icon_dead = "[src.colour] baby slime dead" - S2.colour = "[src.colour]" - qdel(src) \ No newline at end of file +/mob/living/simple_animal/slime/adult/death(gibbed) + for(var/i in 1 to 2) + var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime (src.loc) + S.icon_state = "[colour] baby slime" + S.icon_living = "[colour] baby slime" + S.icon_dead = "[colour] baby slime dead" + S.colour = "[colour]" + ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 4ddfa827dc3..b453cfa5ea2 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -40,6 +40,8 @@ speak_emote = list("beeps","clicks","chirps") can_hide = 1 ventcrawler = 2 + loot = list(/obj/effect/decal/cleanable/blood/gibs/robot) + del_on_death = 1 /mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob, params) @@ -205,20 +207,14 @@ ..() -/mob/living/simple_animal/spiderbot/death() - - living_mob_list -= src - dead_mob_list += src - +/mob/living/simple_animal/spiderbot/death(gibbed) if(camera) camera.status = 0 if(held_item) held_item.forceMove(src.loc) held_item = null - - robogibs(src.loc, viruses) - qdel(src) + ..() //Cannibalized from the parrot mob. ~Zuhayr diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 56f63ee99be..6cd1d147211 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -21,15 +21,16 @@ a_intent = I_HARM attack_sound = 'sound/weapons/bladeslice.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - var/dead = 0 unsuitable_atmos_damage = 15 + heat_damage_per_tick = 20 faction = list("alien") status_flags = CANPUSH minbodytemp = 0 see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM - heat_damage_per_tick = 20 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + death_sound = 'sound/voice/hiss6.ogg' + deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." /mob/living/simple_animal/hostile/alien/drone @@ -47,7 +48,6 @@ /mob/living/simple_animal/hostile/alien/drone/handle_automated_action() if(!..()) //AIStatus is off return - plant_cooldown-- if(AIStatus == AI_IDLE) if(!plants_off && prob(10) && plant_cooldown<=0) @@ -136,14 +136,6 @@ damage = 30 icon_state = "toxin" -/mob/living/simple_animal/hostile/alien/death() - ..() - if(dead == 0) - dead = 1 - visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") - playsound(src, 'sound/voice/hiss6.ogg', 100, 1) - - /mob/living/simple_animal/hostile/alien/maid name = "lusty xenomorph maid" melee_damage_lower = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index c24b0b6a844..4899eef3aaf 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -39,6 +39,7 @@ //Spaceborn beings don't get hurt by space atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 + del_on_death = 1 var/datum/reagent/beegent = null //hehe, beegent var/obj/structure/beebox/beehome = null @@ -61,8 +62,6 @@ /mob/living/simple_animal/hostile/poison/bees/death(gibbed) beegent = null ..() - ghostize() - qdel(src) /mob/living/simple_animal/hostile/poison/bees/examine(mob/user) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index ddd302c3e8c..b7fbbec41fb 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -55,12 +55,8 @@ icon_living = "holocarp" maxbodytemp = INFINITY gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + del_on_death = 1 -/mob/living/simple_animal/hostile/carp/holocarp/death() - ..() - ghostize() - qdel(src) - return /mob/living/simple_animal/hostile/carp/megacarp icon = 'icons/mob/alienqueen.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 94cf8dae65c..b3ea7f442fa 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -24,6 +24,8 @@ speak_emote = list("states") gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE loot = list(/obj/effect/decal/cleanable/blood/gibs/robot) + deathmessage = "blows apart!" + del_on_death = 1 /mob/living/simple_animal/hostile/hivebot/range name = "Hivebot" @@ -45,15 +47,11 @@ maxHealth = 80 ranged = 1 -/mob/living/simple_animal/hostile/hivebot/death() - ..() - visible_message("[src] blows apart!") +/mob/living/simple_animal/hostile/hivebot/death(gibbed) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() - ghostize() - qdel(src) - return + ..() /mob/living/simple_animal/hostile/hivebot/tele//this still needs work name = "Beacon" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index faf0cc0f9a3..a3739dfe088 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -219,7 +219,7 @@ //////////////END HOSTILE MOB TARGETTING AND AGGRESSION//////////// -/mob/living/simple_animal/hostile/death() +/mob/living/simple_animal/hostile/death(gibbed) LoseAggro() mouse_opacity = 1 ..() diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index c4a71cca618..a770f6b1c32 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -16,6 +16,8 @@ var/life_span = INFINITY //how long until they despawn var/mob/living/parent_mob var/multiply_chance = 0 //if we multiply on hit + deathmessage = "vanishes into thin air! It was a fake!" + del_on_death = 1 /mob/living/simple_animal/hostile/illusion/Life() @@ -23,12 +25,6 @@ if(world.time > life_span) death() -/mob/living/simple_animal/hostile/illusion/death(gibbed) - ..() - visible_message("\The [src] vanishes into thin air! It was a fake!") - ghostize() - qdel(src) - /mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, health = 100, damage = 0, replicate = 0 ) appearance = original.appearance parent_mob = original diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index f14d1bf649a..c0616bc5eea 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -27,18 +27,13 @@ var/is_electronic = 0 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + del_on_death = 1 /mob/living/simple_animal/hostile/mimic/FindTarget() . = ..() if(.) custom_emote(1, "growls at [.]") -/mob/living/simple_animal/hostile/mimic/death() - ..() - visible_message("[src]
stops moving!") - ghostize() - qdel(src) - /mob/living/simple_animal/hostile/mimic/emp_act(severity) if(is_electronic) switch(severity) @@ -100,7 +95,7 @@ ..() icon_state = initial(icon_state) -/mob/living/simple_animal/hostile/mimic/crate/death() +/mob/living/simple_animal/hostile/mimic/crate/death(gibbed) var/obj/structure/closet/crate/C = new(get_turf(src)) // Put loot in crate for(var/obj/O in src) @@ -135,7 +130,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell death() -/mob/living/simple_animal/hostile/mimic/copy/death() +/mob/living/simple_animal/hostile/mimic/copy/death(gibbed) for(var/atom/movable/M in src) M.loc = get_turf(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 83e8b78164f..9433f4923af 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -194,7 +194,7 @@ visible_message("The [P.name] was repelled by [src.name]'s girth!") return -/mob/living/simple_animal/hostile/asteroid/goldgrub/death() +/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed) alerted = 0 Reward() ..() @@ -321,14 +321,12 @@ throw_message = "falls right through the strange body of the" environment_smash = 0 pass_flags = PASSTABLE + del_on_death = 1 /mob/living/simple_animal/hostile/asteroid/hivelordbrood/New() ..() spawn(100) - qdel(src) - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/death() - qdel(src) + death() /mob/living/simple_animal/hostile/asteroid/goliath name = "goliath" diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index e6dda5e301c..99e6f61431c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -26,6 +26,7 @@ ventcrawler = 2 robust_searching = 1 speak_emote = list("squeaks") + deathmessage = "fainted" var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight @@ -88,8 +89,7 @@ icon_state = "mushroom_color" UpdateMushroomCap() -/mob/living/simple_animal/hostile/mushroom/death() - visible_message("[src] fainted.") +/mob/living/simple_animal/hostile/mushroom/death(gibbed) ..() UpdateMushroomCap() diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 89835092ffd..d3fec4bf8d8 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -24,6 +24,7 @@ speak_emote = list("yarrs") loot = list(/obj/effect/landmark/mobcorpse/pirate, /obj/item/weapon/melee/energy/sword/pirate) + del_on_death = 1 faction = list("pirate") /mob/living/simple_animal/hostile/pirate/ranged @@ -38,11 +39,4 @@ minimum_distance = 5 projectiletype = /obj/item/projectile/beam loot = list(/obj/effect/landmark/mobcorpse/pirate/ranged, - /obj/item/weapon/gun/energy/laser) - - -/mob/living/simple_animal/hostile/pirate/death() - ..() - ghostize() - qdel(src) - return \ No newline at end of file + /obj/item/weapon/gun/energy/laser) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 9a64b5c4d3e..9f98b205fc9 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -40,6 +40,8 @@ var/has_loot = 1 faction = list("malf_drone") + deathmessage = "suddenly breaks apart." + del_on_death = 1 /mob/living/simple_animal/hostile/retaliate/malf_drone/New() ..() @@ -149,11 +151,6 @@ hostile_drone = 0 walk(src,0) -/mob/living/simple_animal/hostile/retaliate/malf_drone/death() - ..() - visible_message("\blue [bicon(src)] [src] suddenly breaks apart.") - qdel(src) - /mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell. //some random debris left behind if(has_loot) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm index 210ff43ebda..66972b06d2e 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm @@ -46,6 +46,7 @@ faction = list("undead") // did I mention ghost loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm) + del_on_death = 1 /mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(var/check_drift = 0) return 1 @@ -61,10 +62,6 @@ else invisibility = pick(0,60,60,invisibility) ..() -/mob/living/simple_animal/hostile/retaliate/ghost/death() - ..() - qdel(src) - return /mob/living/simple_animal/hostile/retaliate/skeleton name = "skeleton" @@ -92,11 +89,7 @@ faction = list("undead") loot = list(/obj/effect/decal/remains/human) - -/mob/living/simple_animal/hostile/retaliate/skeleton/death() - ..() - qdel(src) - return + del_on_death = 1 /mob/living/simple_animal/hostile/retaliate/zombie name = "zombie" @@ -124,8 +117,4 @@ faction = list("undead") loot = list(/obj/effect/decal/cleanable/blood/gibs) - -/mob/living/simple_animal/hostile/retaliate/zombie/death() - ..() - qdel(src) - return \ No newline at end of file + del_on_death = 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 0126dd5c704..30bdb8c95e2 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -24,6 +24,7 @@ status_flags = CANPUSH loot = list(/obj/effect/landmark/mobcorpse/russian, /obj/item/weapon/kitchen/knife) + del_on_death = 1 /mob/living/simple_animal/hostile/russian/ranged @@ -39,8 +40,3 @@ loot = list(/obj/effect/landmark/mobcorpse/russian/ranged, /obj/item/weapon/gun/projectile/shotgun/boltaction) casingtype = /obj/item/ammo_casing/a762 - -/mob/living/simple_animal/hostile/russian/death() - ..() - qdel(src) - return diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm index a186bbe3d09..c59cdf0570a 100644 --- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm +++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm @@ -184,7 +184,7 @@ //Harder to kill the head, but it can kill off the whole worm -/mob/living/simple_animal/hostile/spaceWorm/wormHead/death() +/mob/living/simple_animal/hostile/spaceWorm/wormHead/death(gibbed) ..() if(prob(catastrophicDeathProb)) for(var/mob/living/simple_animal/hostile/spaceWorm/SW in totalWormSegments) @@ -294,7 +294,7 @@ qdel(src) -/mob/living/simple_animal/hostile/spaceWorm/death() +/mob/living/simple_animal/hostile/spaceWorm/death(gibbed) ..() if(myHead) myHead.totalWormSegments -= src diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 1c7836c0a13..cb48c63b66f 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -52,9 +52,9 @@ /mob/living/simple_animal/hostile/statue/New(loc, var/mob/living/creator) ..() // Give spells - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flicker_lights(src)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/blindness(src)) - AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision(src)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flicker_lights(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/blindness(null)) + AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision(null)) // Give nightvision see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 72388af0037..d3f63450fe6 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -24,11 +24,7 @@ check_friendly_fire = 1 status_flags = CANPUSH loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier) - -/mob/living/simple_animal/hostile/syndicate/death() - ..() - qdel(src) - return + del_on_death = 1 ///////////////Sword and shield//////////// @@ -124,9 +120,5 @@ minbodytemp = 0 flying = 1 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE - -/mob/living/simple_animal/hostile/viscerator/death() - ..() - visible_message("\red [src] is smashed into pieces!") - qdel(src) - return + del_on_death = 1 + deathmessage = "is smashed into pieces!" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index b47312b15df..9d22827a292 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -30,6 +30,8 @@ faction = list("hostile", "winter") loot = list(/obj/item/stack/sheet/wood) gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE + deathmessage = "is hacked into pieces!" + del_on_death = 1 /mob/living/simple_animal/hostile/tree/FindTarget() . = ..() @@ -42,9 +44,4 @@ if(istype(L)) if(prob(15)) L.Weaken(3) - L.visible_message("\the [src] knocks down \the [L]!") - -/mob/living/simple_animal/hostile/tree/death() - ..() - visible_message("\red [src] is hacked into pieces!") - qdel(src) \ No newline at end of file + L.visible_message("\the [src] knocks down \the [L]!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm index 12ede5955ea..6552999aef8 100644 --- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm @@ -33,14 +33,14 @@ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE -/mob/living/simple_animal/hostile/winter/snowman/death() +/mob/living/simple_animal/hostile/winter/snowman/death(gibbed) if(prob(50)) //50% chance to drop weapon on death, if it has one to drop loot = list(/obj/item/weapon/melee/candy_sword) if(prob(20)) //chance to become a stationary snowman structure instead of a corpse loot.Add(/obj/structure/snowman) - visible_message("The [src.name] shimmers as its animating magic fades away!") + deathmessage = "shimmers as its animating magic fades away!" + del_on_death = 1 ..() //this is just to make sure it gets properly killed before we qdel it - qdel(src) else ..() @@ -73,7 +73,7 @@ icon_living = "santa" icon_dead = "santa-dead" -/mob/living/simple_animal/hostile/winter/santa/death() +/mob/living/simple_animal/hostile/winter/santa/death(gibbed) ..() if(death_message) visible_message(death_message) @@ -121,7 +121,7 @@ melee_damage_lower = 15 melee_damage_upper = 25 //that's gonna leave a mark, for sure -/mob/living/simple_animal/hostile/winter/santa/stage_4/death() +/mob/living/simple_animal/hostile/winter/santa/stage_4/death(gibbed) to_chat(world, "
") to_chat(world, "THE FAT MAN HAS FALLEN!") to_chat(world, "SANTA CLAUS HAS BEEN DEFEATED!") diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 983faec63d6..1266b31f746 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -112,7 +112,7 @@ hear_radio_list -= src return ..() -/mob/living/simple_animal/parrot/death() +/mob/living/simple_animal/parrot/death(gibbed) if(held_item) held_item.loc = src.loc held_item = null diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 736b6c9b599..99a65c0052d 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -25,16 +25,10 @@ faction = list("cult") status_flags = CANPUSH loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm) + del_on_death = 1 + deathmessage = "lets out a contented sigh as their form unwinds." - death() - ..() - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] lets out a contented sigh as their form unwinds. ") - ghostize() - qdel(src) - attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri if(istype(O, /obj/item/device/soulstone)) O.transfer_soul("SHADE", src, user) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 362846dfd4a..d2dbd5f14f2 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -71,8 +71,14 @@ var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions). + + var/mob/living/simple_animal/hostile/spawner/nest + var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions var/list/loot = list() //list of things spawned at mob's loc when it dies + var/del_on_death = 0 //causes mob to be deleted on death, useful for mobs that spawn lootable corpses + var/deathmessage = "" + var/death_sound = null //The sound played on death /mob/living/simple_animal/New() @@ -434,6 +440,8 @@ return else user.changeNext_move(CLICK_CD_MELEE) + if(attempt_harvest(O, user)) + return user.do_attack_animation(src) if(istype(O) && istype(user) && !O.attack(src, user)) var/damage = 0 @@ -451,7 +459,6 @@ user.visible_message("[user] gently taps [src] with [O].",\ "This weapon is ineffective, it does no damage.") adjustBruteLoss(damage) - ..() /mob/living/simple_animal/movement_delay() @@ -468,15 +475,28 @@ stat(null, "Health: [round((health / maxHealth) * 100)]%") /mob/living/simple_animal/death(gibbed) + if(nest) + nest.spawned_mobs -= src + nest = null if(loot.len) for(var/i in loot) new i(loc) - health = 0 - icon_state = icon_dead - stat = DEAD - density = 0 if(!gibbed) - visible_message("\The [src] stops moving...") + if(death_sound) + playsound(get_turf(src),death_sound, 200, 1) + if(deathmessage) + visible_message("\The [src] [deathmessage]") + else if(!del_on_death) + visible_message("\The [src] stops moving...") + if(del_on_death) + ghostize() + qdel(src) + else + health = 0 + icon_state = icon_dead + stat = DEAD + density = 0 + lying = 1 ..() /mob/living/simple_animal/ex_act(severity) @@ -616,7 +636,7 @@ return verb -/mob/living/simple_animal/update_canmove() +/mob/living/simple_animal/update_canmove(delay_action_updates = 0) if(paralysis || stunned || weakened || stat || resting) drop_r_hand() drop_l_hand() @@ -626,6 +646,8 @@ else canmove = 1 update_transform() + if(!delay_action_updates) + update_action_buttons_icon() return canmove /mob/living/simple_animal/update_transform() @@ -693,3 +715,9 @@ /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion return + +/mob/living/simple_animal/adjustEarDamage() + return + +/mob/living/simple_animal/setEarDamage() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm new file mode 100644 index 00000000000..0cbf24cf6e2 --- /dev/null +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -0,0 +1,83 @@ +/mob/living/simple_animal/hostile/spawner + name = "monster nest" + icon = 'icons/mob/animal.dmi' + health = 100 + maxHealth = 100 + var/list/spawned_mobs = list() + var/max_mobs = 5 + var/spawn_delay = 0 + var/spawn_time = 300 //30 seconds default + var/mob_type = /mob/living/simple_animal/hostile/carp + var/spawn_text = "emerges from" + status_flags = 0 + anchored = 1 + AIStatus = AI_OFF + a_intent = "harm" + stop_automated_movement = 1 + wander = 0 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + maxbodytemp = 350 + layer = MOB_LAYER-0.1 + sentience_type = SENTIENCE_BOSS + + +/mob/living/simple_animal/hostile/spawner/Destroy() + for(var/mob/living/simple_animal/L in spawned_mobs) + if(L.nest == src) + L.nest = null + spawned_mobs = null + return ..() + +/mob/living/simple_animal/hostile/spawner/process_ai() + ..() + spawn_mob() + +/mob/living/simple_animal/hostile/spawner/proc/spawn_mob() + if(spawned_mobs.len >= max_mobs) + return 0 + if(spawn_delay > world.time) + return 0 + spawn_delay = world.time + spawn_time + var/mob/living/simple_animal/L = new mob_type(src.loc) + spawned_mobs += L + L.nest = src + L.faction = src.faction + visible_message("[L] [spawn_text] [src].") + +/mob/living/simple_animal/hostile/spawner/syndicate + name = "warp beacon" + icon = 'icons/obj/device.dmi' + icon_state = "syndbeacon" + spawn_text = "warps in from" + mob_type = /mob/living/simple_animal/hostile/syndicate/ranged + faction = list("syndicate") + +/mob/living/simple_animal/hostile/spawner/mining + name = "monster den" + desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids." + icon_state = "hole" + icon_living = "hole" + health = 200 + maxHealth = 200 + max_mobs = 3 + icon = 'icons/mob/nest.dmi' + spawn_text = "crawls out of" + mob_type = /mob/living/simple_animal/hostile/asteroid/goldgrub + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + faction = list("mining") + +/mob/living/simple_animal/hostile/spawner/mining/goliath + name = "goliath den" + desc = "A den housing a nest of goliaths, oh god why?" + mob_type = /mob/living/simple_animal/hostile/asteroid/goliath + +/mob/living/simple_animal/hostile/spawner/mining/hivelord + name = "hivelord den" + desc = "A den housing a nest of hivelords." + mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord + +/mob/living/simple_animal/hostile/spawner/mining/basilisk + name = "basilisk den" + desc = "A den housing a nest of basilisks, bring a coat." + mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index a6eb14fb25d..b21c3110b1d 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -79,7 +79,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, src.procreate() -/mob/living/simple_animal/tribble/death() // Gotta make sure to remove tribbles from the list on death +/mob/living/simple_animal/tribble/death(gibbed) // Gotta make sure to remove tribbles from the list on death ..() totaltribbles -= 1 diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm deleted file mode 100644 index ba68a18a12b..00000000000 --- a/code/modules/mob/living/simple_animal/vox.dm +++ /dev/null @@ -1,169 +0,0 @@ -/mob/living/simple_animal/vox/armalis/ - - name = "serpentine alien" - real_name = "serpentine alien" - desc = "A one-eyed, serpentine creature, half-machine, easily nine feet from tail to beak!" - icon = 'icons/mob/vox.dmi' - icon_state = "armalis" - icon_living = "armalis" - maxHealth = 500 - health = 500 - response_harm = "slashes at the" - harm_intent_damage = 0 - melee_damage_lower = 30 - melee_damage_upper = 40 - attacktext = "slammed its enormous claws into" - speed = -1 - attack_sound = 'sound/weapons/bladeslice.ogg' - status_flags = 0 - universal_speak = 1 - - var/armour = null - var/amp = null - var/quills = 3 - -/mob/living/simple_animal/vox/armalis/death(gibbed) - if(!gibbed) - stat = DEAD - visible_message("[src] shudders violently and explodes!
","\red You feel your body rupture!") - explosion(get_turf(loc), -1, -1, 3, 5) - gib() - return - return ..() - -/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - if(O.force) - if(O.force >= 25) - var/damage = O.force - if(O.damtype == STAMINA) - damage = 0 - health -= damage - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") - else - to_chat(usr, "\red This weapon is ineffective, it does no damage.") - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - -/mob/living/simple_animal/vox/armalis/verb/fire_quill(mob/target as mob in oview()) - - set name = "Fire quill" - set desc = "Fires a viciously pointed quill at a high speed." - set category = "Alien" - - if(quills<=0) - return - - to_chat(src, "\red You launch a razor-sharp quill at [target]!") - for(var/mob/O in oviewers()) - if((O.client && !( O.blinded ))) - to_chat(O, "\red [src] launches a razor-sharp quill at [target]!") - - var/obj/item/weapon/quill/Q = new(loc) - Q.fingerprintslast = src.ckey - Q.throw_at(target,10,30) - - quills-- - - spawn(100) - to_chat(src, "\red You feel a fresh quill slide into place.") - quills++ - -/obj/item/weapon/quill - name = "vox quill" - desc = "A wickedly barbed quill from some bizarre animal." - icon_state = "quill" - item_state = "quill" - throwforce = 5 - w_class = 3 - sharp = 1 - edge = 0 - -/mob/living/simple_animal/vox/armalis/verb/message_mob() - set category = "Alien" - set name = "Commune with creature" - set desc = "Send a telepathic message to an unlucky recipient." - - var/list/targets = list() - var/target = null - var/text = null - - targets += getmobs() //Fill list, prompt user with list - target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets - text = input("What would you like to say?", "Speak to creature", null, null) - - if(!target || !text) - return - - var/mob/M = targets[target] - - if(istype(M, /mob/dead/observer) || M.stat == DEAD) - to_chat(src, "Not even the armalis can speak to the dead.") - return - - to_chat(M, "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]") - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.name == "Vox") - return - to_chat(H, "\red Your nose begins to bleed...") - H.drip(1) - -/mob/living/simple_animal/vox/armalis/verb/shriek() - set category = "Alien" - set name = "Shriek" - set desc = "Give voice to a psychic shriek." - -/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - if(istype(O,/obj/item/vox/armalis_armour)) - user.drop_item() - armour = O - speed = 1 - maxHealth += 200 - health += 200 - O.loc = src - visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].") - regenerate_icons() - return - if(istype(O,/obj/item/vox/armalis_amp)) - user.drop_item() - amp = O - O.loc = src - visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].") - regenerate_icons() - return - return ..() - -/mob/living/simple_animal/vox/armalis/regenerate_icons() - - overlays = list() - if(armour) - var/icon/armour = image('icons/mob/vox.dmi',"armour") - speed = 1 - overlays += armour - if(amp) - var/icon/amp = image('icons/mob/vox.dmi',"amplifier") - overlays += amp - return - -/obj/item/vox/armalis_armour - - name = "strange armour" - desc = "Hulking reinforced armour for something huge." - icon = 'icons/obj/clothing/suits.dmi' - icon_state = "armour-armalis" - item_state = "armour-armalis" - -/obj/item/vox/armalis_amp - - name = "strange lenses" - desc = "A series of metallic lenses and chains." - icon = 'icons/obj/clothing/hats.dmi' - icon_state = "amp" - item_state = "amp" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index cc9788a15fe..d470e19c401 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -6,6 +6,7 @@ hud_used = null if(mind && mind.current == src) spellremove(src) + mobspellremove(src) for(var/infection in viruses) qdel(infection) ghostize() @@ -61,19 +62,19 @@ if(!client) return if(type) - if(type & 1 && (sdisabilities & BLIND || blinded || paralysis) )//Vision related + if(type & 1 && (disabilities & BLIND || blinded || paralysis) )//Vision related if(!( alt )) return else msg = alt type = alt_type - if(type & 2 && (sdisabilities & DEAF || ear_deaf))//Hearing related + if(type & 2 && (disabilities & DEAF || ear_deaf))//Hearing related if(!( alt )) return else msg = alt type = alt_type - if((type & 1 && sdisabilities & BLIND)) + if((type & 1 && disabilities & BLIND)) return // Added voice muffling for Issue 41. if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2)) @@ -158,8 +159,6 @@ /mob/proc/Life() // handle_typing_indicator() -// if(organStructure) -// organStructure.ProcessOrgans() return @@ -257,7 +256,6 @@ var/list/slot_equipment_priority = list( \ slot_back,\ slot_wear_id,\ - slot_wear_pda,\ slot_w_uniform,\ slot_wear_suit,\ slot_wear_mask,\ @@ -961,8 +959,8 @@ var/list/slot_equipment_priority = list( \ if(mind && mind.changeling) add_stings_to_statpanel(mind.changeling.purchasedpowers) - if(spell_list && spell_list.len) - for(var/obj/effect/proc_holder/spell/S in spell_list) + if(mob_spell_list && mob_spell_list.len) + for(var/obj/effect/proc_holder/spell/S in mob_spell_list) add_spell_to_statpanel(S) if(mind && istype(src, /mob/living) && mind.spell_list && mind.spell_list.len) for(var/obj/effect/proc_holder/spell/S in mind.spell_list) @@ -995,6 +993,7 @@ var/list/slot_equipment_priority = list( \ for(var/obj/effect/proc_holder/changeling/S in stings) if(S.chemical_cost >=0 && S.can_be_used_by(src)) statpanel("[S.panel]",((S.chemical_cost > 0) ? "[S.chemical_cost]" : ""),S) + /mob/proc/add_spell_to_statpanel(var/obj/effect/proc_holder/spell/S) switch(S.charge_type) if("recharge") @@ -1003,17 +1002,6 @@ var/list/slot_equipment_priority = list( \ statpanel(S.panel,"[S.charge_counter]/[S.charge_max]",S) if("holdervar") statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S) - /* // Why have a duplicate set of turfs in the stat panel? - if(listed_turf) - if(get_dist(listed_turf,src) > 1) - listed_turf = null - else - statpanel(listed_turf.name,listed_turf.name,listed_turf) - for(var/atom/A in listed_turf) - if(A.invisibility > see_invisible) - continue - statpanel(listed_turf.name,A.name,A) - */ // facing verbs @@ -1028,7 +1016,7 @@ var/list/slot_equipment_priority = list( \ return 1 //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. -/mob/proc/update_canmove() +/mob/proc/update_canmove(delay_action_updates = 0) var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH) var/buckle_lying = !(buckled && !buckled.buckle_lying) if(ko || resting || stunned) @@ -1053,6 +1041,8 @@ var/list/slot_equipment_priority = list( \ layer = initial(layer) update_transform() + if(!delay_action_updates) + update_action_buttons_icon() return canmove /mob/proc/fall(var/forced) @@ -1366,18 +1356,17 @@ mob/proc/yank_out_object() /mob/proc/setEarDamage() return -/mob/proc/AddSpell(var/obj/effect/proc_holder/spell/spell) - spell_list += spell - if(!spell.action) - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - if(isliving(src)) - spell.action.Grant(src) - return +/mob/proc/AddSpell(obj/effect/proc_holder/spell/S) + mob_spell_list += S + S.action.Grant(src) + +/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind + if(!spell) + return + for(var/obj/effect/proc_holder/spell/S in mob_spell_list) + if(istype(S, spell)) + qdel(S) + mob_spell_list -= S //override to avoid rotating pixel_xy on mobs /mob/shuttleRotate(rotation) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 0786320e9cb..37bb39b7754 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -2,18 +2,13 @@ density = 1 layer = 4.0 animate_movement = 2 -// flags = NOREACT pressure_resistance = 8 var/datum/mind/mind var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak - //Not in use yet - var/obj/effect/organstructure/organStructure = null - var/obj/screen/hands = null var/obj/screen/pullin = null - var/obj/screen/internals = null var/obj/screen/i_select = null var/obj/screen/m_select = null var/obj/screen/healths = null @@ -35,24 +30,21 @@ var/lastattacker = null var/lastattacked = null var/attack_log = list( ) - var/already_placed = 0.0 var/obj/machinery/machine = null var/other_mobs = null var/memory = "" - var/poll_answer = 0.0 - var/sdisabilities = 0 //Carbon var/disabilities = 0 //Carbon var/atom/movable/pulling = null var/next_move = null var/notransform = null //Carbon var/other = 0.0 var/hand = null - var/eye_blind = null //Carbon - var/eye_blurry = null //Carbon - var/ear_deaf = null //Carbon - var/ear_damage = null //Carbon - var/stuttering = null //Carbon - var/slurring = null //Carbon + var/eye_blind = 0 //Carbon + var/eye_blurry = 0 //Carbon + var/ear_deaf = 0 //Carbon + var/ear_damage = 0 //Carbon + var/stuttering = 0 //Carbon + var/slurring = 0 //Carbon var/real_name = null var/flavor_text = "" var/med_record = "" @@ -64,8 +56,6 @@ var/druggy = 0 //Carbon var/confused = 0 //Carbon var/drunk = 0 - var/antitoxs = null - var/plasma = null var/sleeping = 0 //Carbon var/resting = 0 //Carbon var/lying = 0 @@ -96,11 +86,11 @@ var/nutrition = 400.0//Carbon var/overeatduration = 0 // How long this guy is overeating //Carbon - var/paralysis = 0.0 - var/stunned = 0.0 - var/weakened = 0.0 + var/paralysis = 0 + var/stunned = 0 + var/weakened = 0 var/slowed = 0 - var/losebreath = 0.0//Carbon + var/losebreath = 0 //Carbon var/intent = null//Living var/shakecamera = 0 var/a_intent = I_HELP//Living @@ -123,10 +113,9 @@ hud_possible = list(SPECIALROLE_HUD) var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining. - var/datum/action/scan_mode/scanner = new - var/list/grabbed_by = list( ) - var/list/requests = list( ) + var/list/grabbed_by = list() + var/list/requests = list() var/list/mapobjs = list() @@ -136,17 +125,10 @@ var/emote_cd = 0 // Used to supress emote spamming. 1 if on CD, 2 if disabled by admin (manually set), else 0 - var/music_lastplayed = "null" - var/job = null//Living - var/const/blindness = 1//Carbon - var/const/deafness = 2//Carbon - var/const/muteness = 4//Carbon - - var/datum/dna/dna = null//Carbon - var/radiation = 0.0//Carbon + var/radiation = 0 //Carbon var/list/mutations = list() //Carbon -- Doohl //see: setup.dm for list of mutations @@ -159,24 +141,24 @@ var/has_enabled_antagHUD = 0 var/antagHUD = 0 -//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed. - var/proc_holder_list[] = list()//Right now unused. - //Also unlike the spell list, this would only store the object in contents, not an object in itself. - /* Add this line to whatever stat module you need in order to use the proc holder list. +//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed. + var/proc_holder_list[] = list() + + /* //Also unlike the spell list, this would only store the object in contents, not an object in itself. + + Add this line to whatever stat module you need in order to use the proc holder list. Unlike the object spell system, it's also possible to attach verb procs from these objects to right-click menus. This requires creating a verb for the object proc holder. if(proc_holder_list.len)//Generic list for proc_holder objects. for(var/obj/effect/proc_holder/P in proc_holder_list) - statpanel("[P.panel]","",P) - */ + statpanel("[P.panel]","",P)*/ //The last mob/living/carbon to push/drag/grab this mob (mostly used by slimes friend recognition) var/mob/living/carbon/LAssailant = null -//Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button - var/obj/effect/proc_holder/spell/list/spell_list = list() + var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap. //Changlings, but can be used in other modes // var/obj/effect/proc_holder/changpower/list/power_list = list() @@ -197,9 +179,6 @@ var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics - var/list/radar_blips = list() // list of screen objects, radar blips - var/radar_open = 0 // nonzero is radar is open - var/atom/movable/remote_control //Calls relaymove() to whatever it is var/remote_view = 0 // Set to 1 to prevent view resets on Life @@ -221,11 +200,11 @@ var/turf/listed_turf = null //the current turf being examined in the stat panel var/list/shouldnt_see = list(/atom/movable/lighting_overlay) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes - var/kills=0 + var/kills = 0 var/stance_damage = 0 //Whether this mob's ability to stand has been affected - var/list/active_genes=list() + var/list/active_genes = list() var/last_movement = -100 // Last world.time the mob actually moved of its own accord. @@ -233,4 +212,6 @@ var/datum/vision_override/vision_type = null //Vision override datum. - var/list/permanent_huds = list() \ No newline at end of file + var/list/permanent_huds = list() + + var/list/actions = list() \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ff29bda1d9d..f78f6ba314f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -63,7 +63,7 @@ proc/iscuffed(A) proc/isdeaf(A) if(istype(A, /mob)) var/mob/M = A - return (M.sdisabilities & DEAF) || M.ear_deaf + return (M.disabilities & DEAF) || M.ear_deaf return 0 proc/hassensorlevel(A, var/level) @@ -358,7 +358,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) /proc/is_blind(A) if(iscarbon(A)) var/mob/living/carbon/C = A - if(C.sdisabilities & BLIND || C.blinded) + if(C.disabilities & BLIND || C.blinded) return 1 return 0 diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index c926fabf2d8..f280bec0ce1 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -53,13 +53,12 @@ say_dead_direct("[pick("complains", "moans", "whines", "laments", "blubbers", "salts")], \"[message]\"", src) -/mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null) - - if(src.stat == 2) //Dead +/mob/proc/say_understands(var/mob/other, var/datum/language/speaking = null) + if(stat == DEAD) return 1 //Universal speak makes everything understandable, for obvious reasons. - else if(src.universal_speak || src.universal_understand) + if(universal_speak || universal_understand) return 1 //Languages are handled after. @@ -78,7 +77,7 @@ return 1 //Language check. - for(var/datum/language/L in src.languages) + for(var/datum/language/L in languages) if(speaking.name == L.name) return 1 @@ -92,9 +91,9 @@ if(speaking) verb = speaking.get_spoken_verb(ending) else - if(ending=="!") - verb = pick("exclaims","shouts","yells") - else if(ending=="?") + if(ending == "!") + verb = pick("exclaims", "shouts", "yells") + else if(ending == "?") verb = "asks" return verb @@ -123,8 +122,8 @@ //parses the message mode code (e.g. :h, :w) from text, such as that supplied to say. //returns the message mode string or null for no message mode. //standard mode is the mode returned for the special ';' radio code. -/mob/proc/parse_message_mode(var/message, var/standard_mode="headset") - if(length(message) >= 1 && copytext(message,1,2) == ";") +/mob/proc/parse_message_mode(var/message, var/standard_mode = "headset") + if(length(message) >= 1 && copytext(message, 1, 2) == ";") return standard_mode if(length(message) >= 2) @@ -136,7 +135,7 @@ //parses the language code (e.g. :j) from text, such as that supplied to say. //returns the language object only if the code corresponds to a language that src can speak, otherwise null. /mob/proc/parse_language(var/message) - var/prefix = copytext(message,1,2) + var/prefix = copytext(message, 1, 2) if(length(message) >= 1 && prefix == "!") return all_languages["Noise"] diff --git a/code/modules/mob/spirit/mask/mask.dm b/code/modules/mob/spirit/mask/mask.dm index 03ba63dbe01..2b907ca7f5a 100644 --- a/code/modules/mob/spirit/mask/mask.dm +++ b/code/modules/mob/spirit/mask/mask.dm @@ -4,9 +4,9 @@ /mob/spirit/mask/New() ..() - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/create_talisman(src)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/blood_speech(src)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/shatter_lights(src)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/create_talisman(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/blood_speech(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/shatter_lights(null)) /mob/spirit/mask/verb/go_to_follower() diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index def65e1859d..9c6c8f2fa73 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -15,10 +15,10 @@ var/global/image/typing_indicator if(ishuman(src)) var/mob/living/carbon/human/H = src - if(H.sdisabilities & MUTE || H.silent) + if(H.disabilities & MUTE || H.silent) overlays -= typing_indicator return - + if(client) if((client.prefs.toggles & SHOW_TYPING) || stat != CONSCIOUS || is_muzzled()) overlays -= typing_indicator diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 00ce925fae0..689799680ec 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -154,6 +154,7 @@ /obj/item/device/camera/spooky/CheckParts() + ..() var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents if(C) pictures_max = C.pictures_max diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index 3ff212085af..4dfd8575a22 100755 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -11,7 +11,7 @@ var/global/list/obj/item/device/pda/PDAs = list() icon_state = "pda" item_state = "electronic" w_class = 1 - slot_flags = SLOT_PDA | SLOT_BELT + slot_flags = SLOT_ID | SLOT_BELT //Main variables var/owner = null @@ -295,11 +295,21 @@ var/global/list/obj/item/device/pda/PDAs = list() if(can_use(usr)) start_program(find_program(/datum/data/pda/app/main_menu)) notifying_programs.Cut() - overlays.Cut() + overlays -= image('icons/obj/pda.dmi', "pda-r") to_chat(usr, "You press the reset button on \the [src].") else to_chat(usr, "You cannot do this while restrained.") +/obj/item/device/pda/AltClick() + if(issilicon(usr)) + return + + if(can_use(usr)) + if(id) + remove_id() + else + usr << "This PDA does not have an ID in it!" + /obj/item/device/pda/proc/remove_id() if(id) if(ismob(loc)) @@ -308,6 +318,7 @@ var/global/list/obj/item/device/pda/PDAs = list() to_chat(usr, "You remove the ID from the [name].") else id.forceMove(get_turf(src)) + overlays -= image('icons/goonstation/objects/pda_overlay.dmi', id.icon_state) id = null /obj/item/device/pda/verb/verb_remove_id() @@ -399,7 +410,9 @@ var/global/list/obj/item/device/pda/PDAs = list() if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) if( can_use(user) )//If they can still act. id_check(user, 2) - to_chat(user, "You put the ID into \the [src]'s slot.") + to_chat(user, "You put the ID into \the [src]'s slot.
You can remove it with ALT click.
") + overlays += image('icons/goonstation/objects/pda_overlay.dmi', C.icon_state) + else if(istype(C, /obj/item/device/paicard) && !src.pai) user.drop_item() C.forceMove(src) @@ -483,4 +496,4 @@ var/global/list/obj/item/device/pda/PDAs = list() return 1 else close(usr) - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/pda/app.dm b/code/modules/pda/app.dm index 86c7f85aec0..e7c433c65a6 100644 --- a/code/modules/pda/app.dm +++ b/code/modules/pda/app.dm @@ -31,7 +31,6 @@ pda.play_ringtone() if(blink && !(src in pda.notifying_programs)) - pda.overlays.Cut() pda.overlays += image('icons/obj/pda.dmi', "pda-r") pda.notifying_programs |= src @@ -39,7 +38,7 @@ if(src in pda.notifying_programs) pda.notifying_programs -= src if(!pda.notifying_programs.len) - pda.overlays.Cut() + pda.overlays -= image('icons/obj/pda.dmi', "pda-r") /datum/data/pda/proc/ @@ -94,4 +93,4 @@ /datum/data/pda/utility/scanmode/proc/scan_mob(mob/living/C as mob, mob/living/user as mob) -/datum/data/pda/utility/scanmode/proc/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob) \ No newline at end of file +/datum/data/pda/utility/scanmode/proc/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 4107de926bc..a661c0e3701 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -235,7 +235,7 @@ /obj/item/ammo_casing/shotgun/dart/bioterror/New() ..() reagents.add_reagent("neurotoxin", 6) - reagents.add_reagent("spores", 6) + reagents.add_reagent("spore", 6) reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT reagents.add_reagent("coniine", 6) reagents.add_reagent("sodium_thiopental", 6) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 29faec1ac97..5d0e190ee04 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -251,7 +251,9 @@ obj/item/weapon/gun/proc/newshot(params) I.loc = src update_icon() update_gunlight(user) - verbs += /obj/item/weapon/gun/proc/toggle_gunlight + var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src) + if(loc == user) + A.Grant(user) if(istype(I, /obj/item/weapon/screwdriver)) if(F && can_flashlight) @@ -262,7 +264,8 @@ obj/item/weapon/gun/proc/newshot(params) update_gunlight(user) S.update_brightness(user) update_icon() - verbs -= /obj/item/weapon/gun/proc/toggle_gunlight + for(var/datum/action/item_action/toggle_gunlight/TGL in actions) + qdel(TGL) if(unique_rename) if(istype(I, /obj/item/weapon/pen)) @@ -296,6 +299,10 @@ obj/item/weapon/gun/proc/newshot(params) else set_light(0) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + /obj/item/weapon/gun/pickup(mob/user) ..() if(azoom) @@ -376,7 +383,7 @@ obj/item/weapon/gun/proc/newshot(params) /datum/action/toggle_scope_zoom name = "Toggle Scope" - check_flags = AB_CHECK_ALIVE|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING button_icon_state = "sniper_zoom" var/obj/item/weapon/gun/gun = null diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 757315019ab..d0e7efcd26b 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -5,7 +5,7 @@ can_suppress = 1 burst_size = 3 fire_delay = 2 - action_button_name = "Toggle Firemode" + actions_types = list(/datum/action/item_action/toggle_firemode) /obj/item/weapon/gun/projectile/automatic/isHandgun() return 0 @@ -58,6 +58,9 @@ playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/gun/projectile/automatic/can_shoot() return get_ammo() @@ -107,7 +110,7 @@ fire_delay = 2 can_suppress = 0 burst_size = 1 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/wt550/update_icon() ..() @@ -129,7 +132,6 @@ origin_tech = "combat=5;materials=2;syndicate=8" mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/Gunshot_smg.ogg' - action_button_name = "Toggle Grenade Launcher" can_suppress = 0 var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel burst_size = 3 @@ -227,7 +229,7 @@ can_suppress = 0 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New() ..() diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index 61032f819fd..462341fdc36 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -39,7 +39,7 @@ mag_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/gyropistol/isHandgun() return 1 @@ -65,7 +65,7 @@ burst_size = 1 fire_delay = 0 select = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/speargun/update_icon() return diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 661a14a44b4..d1d65dcbfc0 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -8,7 +8,7 @@ can_suppress = 1 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/pistol/isHandgun() return 1 @@ -64,4 +64,4 @@ can_suppress = 0 burst_size = 3 fire_delay = 2 - action_button_name = "Toggle Firemode" + actions_types = list(/datum/action/item_action/toggle_firemode) diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 1d9949173ad..cf7c2a4bb35 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -15,7 +15,7 @@ zoomable = TRUE zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. slot_flags = SLOT_BACK - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/sniper_rifle/update_icon() if(magazine) diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index c0465a83beb..4efeb570e0f 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -26,7 +26,7 @@ can_suppress = 0 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon() ..() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 40bb5fb43bc..bce80d857b1 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -518,6 +518,9 @@ var/const/INGEST = 2 return res +/datum/reagents/proc/get_reagent(type) + . = locate(type) in reagent_list + /datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. if(!isnum(amount)) return 1 @@ -606,4 +609,4 @@ atom/proc/create_reagents(max_vol) reagent_list.Cut() reagent_list = null if(my_atom && my_atom.reagents == src) - my_atom.reagents = null \ No newline at end of file + my_atom.reagents = null diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index acbb9648098..197df4425ec 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -280,7 +280,7 @@ energy = 100 max_energy = 100 desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." - dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead", "synthanol") + dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol") hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing") diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm index 3d1ec96501b..e451b561469 100644 --- a/code/modules/reagents/newchem/Blob-Reagents.dm +++ b/code/modules/reagents/newchem/Blob-Reagents.dm @@ -49,7 +49,7 @@ volume = ..() M.apply_damage(0.6*volume, TOX) M.hallucination += 0.6*volume - M.reagents.add_reagent("spores", 0.4*volume) + M.reagents.add_reagent("spore", 0.4*volume) /datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute name = "Lexorin Jelly" diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm index 66d1217931d..daea5802d64 100644 --- a/code/modules/reagents/newchem/chem_heater.dm +++ b/code/modules/reagents/newchem/chem_heater.dm @@ -18,7 +18,7 @@ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) component_parts += new /obj/item/weapon/stock_parts/console_screen(null) RefreshParts() - + /obj/machinery/chem_heater/upgraded/New() ..() component_parts = list() @@ -68,7 +68,7 @@ stat |= NOPOWER nanomanager.update_uis(src) -/obj/machinery/chem_heater/attackby(var/obj/item/I as obj, var/mob/user as mob) +/obj/machinery/chem_heater/attackby(obj/item/I, mob/user) if(isrobot(user)) return @@ -96,10 +96,10 @@ default_deconstruction_crowbar(I) return 1 -/obj/machinery/chem_heater/attack_hand(var/mob/user as mob) +/obj/machinery/chem_heater/attack_hand(mob/user) ui_interact(user) -/obj/machinery/chem_heater/attack_ai(mob/user as mob) +/obj/machinery/chem_heater/attack_ai(mob/user) src.add_hiddenprint(user) return src.attack_hand(user) @@ -126,8 +126,9 @@ eject_beaker() . = 0 //updated in eject_beaker() already -/obj/machinery/chem_heater/ui_interact(var/mob/user, ui_key = "main", var/datum/nanoui/ui = null) - if(user.stat || user.restrained()) return +/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null) + if(user.stat || user.restrained()) + return var/data[0] data["targetTemp"] = desired_temp diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 6793f19548a..6f8e7fd6308 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -122,31 +122,6 @@ qdel(ate_heart) ..() -/datum/reagent/spore - name = "Blob Spores" - id = "spore" - description = "Spores of some blob creature thingy." - reagent_state = LIQUID - color = "#CE760A" // rgb: 206, 118, 10 - var/client/blob_client = null - var/blob_point_rate = 3 - -/datum/reagent/spore/on_mob_life(mob/living/M) - if(holder.has_reagent("atrazine",45)) - holder.del_reagent("spore") //apparently this never metabolizes and stays in forever unless you have 45 units of atrazine in you or some stupid thing like that. - if(prob(1)) - to_chat(M, "Your mouth tastes funny.") - if(prob(1) && prob(25)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(directory[ckey(C.key)]) - blob_client = directory[ckey(C.key)] - C.gib() - if(blob_client) - var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate) - if(core.overmind && core.overmind.mind) - core.overmind.mind.name = C.name - //virus food /datum/reagent/virus_food name = "Virus Food" diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm index 201cc97f806..4790b4d01ec 100644 --- a/code/modules/reagents/newchem/drinks.dm +++ b/code/modules/reagents/newchem/drinks.dm @@ -201,7 +201,7 @@ name = "Uplink" id = "uplink" result = "uplink" - required_reagents = list("rum" = 1, "vodka" = 1, "tequilla" = 1, "whiskey" = 1, "synthanol" = 1) + required_reagents = list("rum" = 1, "vodka" = 1, "tequila" = 1, "whiskey" = 1, "synthanol" = 1) result_amount = 5 /datum/reagent/ethanol/synthanol/synthnsoda diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 37cdef2b103..ac9f2bdcc39 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -12,6 +12,7 @@ color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 35 addiction_chance = 70 + heart_rate_increase = 1 /datum/reagent/nicotine/on_mob_life(mob/living/M) var/smoke_message = pick("You feel relaxed.", "You feel calmed.", "You feel less stressed.", "You feel more placid.", "You feel more undivided.") @@ -234,6 +235,7 @@ overdose_threshold = 20 addiction_chance = 60 metabolization_rate = 0.6 + heart_rate_increase = 1 /datum/reagent/methamphetamine/on_mob_life(mob/living/M) if(prob(5)) @@ -292,11 +294,11 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 1)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + if(C.can_breathe_gas()) C.emote("gasp") C.losebreath++ - C.reagents.add_reagent("toxin",10) - C.reagents.add_reagent("neurotoxin2",20) + C.reagents.add_reagent("toxin", 10) + C.reagents.add_reagent("neurotoxin2", 20) /datum/chemical_reaction/saltpetre name = "saltpetre" @@ -432,7 +434,7 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 1)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + if(C.can_breathe_gas()) C.reagents.add_reagent("jenkem", 25) /datum/reagent/jenkem diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 5d4fb8ef6bc..5b5e5722c46 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -478,15 +478,15 @@ if(istype(E)) E.damage = max(E.damage-1, 0) M.eye_blurry = max(M.eye_blurry-1 , 0) - M.ear_damage = max(M.ear_damage-1, 0) + M.adjustEarDamage(-1,0) if(prob(50)) M.disabilities &= ~NEARSIGHTED if(prob(30)) - M.sdisabilities &= ~BLIND + M.disabilities &= ~BLIND M.eye_blind = 0 if(M.ear_damage <= 25) if(prob(30)) - M.ear_deaf = 0 + M.setEarDamage(-1,0) ..() /datum/chemical_reaction/oculine @@ -696,7 +696,7 @@ /datum/reagent/mutadone/on_mob_life(mob/living/carbon/human/M) M.jitteriness = 0 - var/needs_update = M.mutations.len > 0 || M.disabilities > 0 || M.sdisabilities > 0 + var/needs_update = M.mutations.len > 0 || M.disabilities > 0 if(needs_update) for(var/block=1;block<=DNA_SE_LENGTH;block++) diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index e9ffc9a7c5f..4508125387e 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -84,6 +84,18 @@ addiction_list.Remove(R) update_total() +/datum/reagents/proc/death_metabolize(mob/living/M) + if(!M) + return + if(M.stat != DEAD) //what part of DEATH_metabolize don't you get? + return + for(var/A in reagent_list) + var/datum/reagent/R = A + if(!istype(R)) + continue + if(M && R) + R.on_mob_death(M) + /datum/reagents/proc/overdose_list() var/od_chems[0] for(var/datum/reagent/R in reagent_list) diff --git a/code/modules/reagents/newchem/paradise_pop.dm b/code/modules/reagents/newchem/paradise_pop.dm index 4ba859c430e..055b96020db 100644 --- a/code/modules/reagents/newchem/paradise_pop.dm +++ b/code/modules/reagents/newchem/paradise_pop.dm @@ -25,6 +25,13 @@ reagent_state = LIQUID color = "#44FF44" +/datum/reagent/apple_pocalypse/on_mob_life(mob/living/M) + if(prob(1)) + var/turf/simulated/T = get_turf(M) + goonchem_vortex(T, 0, 2, 1) + to_chat(M, "You briefly feel super-massive, like a black hole. Probably just your imagination...") + ..() + //Berry Banned: This one is tasty and safe to drink, might have a low chance of healing a random damage type? /datum/reagent/berry_banned name = "Berry Banned" @@ -33,6 +40,25 @@ reagent_state = LIQUID color = "#FF44FF" +/datum/reagent/berry_banned/on_mob_life(mob/living/M) + if(prob(10)) + var/heal_type = rand(0, 5) //still prefer the string version + switch(heal_type) + if(0) + M.adjustBruteLoss(-0.5*REM) + if(1) + M.adjustFireLoss(-0.5*REM) + if(2) + M.adjustToxLoss(-0.5*REM) + if(3) + M.adjustOxyLoss(-0.5*REM) + if(4) + M.adjustCloneLoss(-0.5*REM) + if(5) + M.adjustBrainLoss(-1*REM) + to_chat(M, "You feel slightly rejuvinated!") + ..() + //Berry Banned 2: This one is tasty and toxic. Deals toxin damage and MAYBE plays the "BWOINK!" sound if it kills someone? /datum/reagent/berry_banned2 name = "Berry Banned" @@ -41,6 +67,18 @@ reagent_state = LIQUID color = "#FF44FF" +/datum/reagent/berry_banned2/on_mob_life(mob/living/M) + if(prob(50)) + M.adjustToxLoss(2*REM) //double strength of poison berry juice alone, because it's concentrated (this is equal to the damage of normal toxin, less often) + if(prob(10)) + to_chat(M, "You feel slightly rejuvinated!") //meta this! + ..() + +/datum/reagent/berry_banned2/on_mob_death(mob/living/M) + M << sound('sound/effects/adminhelp.ogg',0,1,0,25) + to_chat(M, "PM from-Administrator: BWOINK!") + ..() + //Blackeye Brew: Chance to make the drinker say greytider-themed things like "I thought clown was valid!" /datum/reagent/blackeye_brew name = "Blackeye Brew" @@ -49,6 +87,21 @@ reagent_state = LIQUID color = "#4d2600" +/datum/reagent/blackeye_brew/on_mob_life(mob/living/M) + if(prob(25)) + var/list/tider_talk = list("CLOWN IS VALID, RIGHT?", + "SHITMINS! SHITMINS! SHITMINS!", + "FURRIES ARE OPPRESSED!", + "I OWN THIS SERVER NOW, I JUST BOUGHT IT.", + "SECRET TECHNIQUE: TOOLBOX TO THE FACE!", + "SECRET TECHNIQUE: PLASMA CANISTER FIRE!", + "SECRET TECHNIQUE: TABLE AND DISPOSAL!", + "[pick("MY BROTHER", " MY DOG", "MY BEST FRIEND", "THE BORER", "GEORGE MELONS", "SHITMINS")] DID IT!", + "WHAT DO YOU MEAN [pick("Barrack Obama", "John Cena", "Hughe Jass", "Hitler", "xX360noscopeXx")] ISN'T AN ACCEPTABLE NAME?", + "WHAT THE FUCK DID YOU JUST FUCKING SAY ABOUT ME, YOU LITTLE BITCH? I'LL HAVE YOU KNOW I GRADUATED TOP OF MY CLASS IN...") + M.say(pick(tider_talk)) + ..() + //Grape Granade: causes the drinker to sometimes burp, has a low chance to cause a goonchem vortex that pushes things within a very small radius (1-2 tiles) away from the drinker /datum/reagent/grape_granade name = "Grape Granade" @@ -57,6 +110,16 @@ reagent_state = LIQUID color = "#9933ff" +/datum/reagent/grape_granade/on_mob_life(mob/living/M) + if(prob(1)) + var/turf/simulated/T = get_turf(M) + goonchem_vortex(T, 1, 1, 2) + M.emote("burp") + to_chat(M, "You feel ready to burst! Oh wait, just a burp...") + else if(prob(25)) + M.emote("burp") + ..() + //Meteor Malt: Sometimes causes screen shakes for the drinker like a meteor impact, low chance to add 1-5 units of a random mineral reagent to the drinker's blood (iron, copper, silver, gold, uranium, carbon, etc) /datum/reagent/meteor_malt name = "Meteor Malt" @@ -64,3 +127,13 @@ description = "Soft drinks have been detected on collision course with your tastebuds." reagent_state = LIQUID color = "#cc9900" + +/datum/reagent/meteor_malt/on_mob_life(mob/living/M) + if(prob(25)) + M << sound('sound/effects/meteorimpact.ogg',0,1,0,25) + shake_camera(M, 3, 1) + if(prob(5)) + var/amount = rand(1, 5) + var/mineral = pick("copper", "iron", "gold", "carbon", "silver", "aluminum", "silicon", "sodiumchloride", "plasma") + M.reagents.add_reagent(mineral, amount) + ..() diff --git a/code/modules/reagents/newchem/patch.dm b/code/modules/reagents/newchem/patch.dm index f686d293c24..2392dd26db5 100644 --- a/code/modules/reagents/newchem/patch.dm +++ b/code/modules/reagents/newchem/patch.dm @@ -18,35 +18,23 @@ desc = "Helps with brute injuries." icon_state = "bandaid_brute" instant_application = 1 - -/obj/item/weapon/reagent_containers/food/pill/patch/styptic/New() - ..() - reagents.add_reagent("styptic_powder", 40) + list_reagents = list("styptic_powder" = 40) /obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf name = "burn patch" desc = "Helps with burn injuries." icon_state = "bandaid_burn" instant_application = 1 - -/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf/New() - ..() - reagents.add_reagent("silver_sulfadiazine", 40) + list_reagents = list("silver_sulfadiazine" = 40) /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh name = "syntheflesh patch" desc = "Helps with burn injuries." icon_state = "bandaid_med" instant_application = 1 - -/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh/New() - ..() - reagents.add_reagent("synthflesh", 20) + list_reagents = list("synthflesh" = 20) /obj/item/weapon/reagent_containers/food/pill/patch/nicotine name = "nicotine patch" desc = "Helps temporarily curb the cravings of nicotine dependency." - -/obj/item/weapon/reagent_containers/food/pill/patch/nicotine/New() - ..() - reagents.add_reagent("nicotine", 20) \ No newline at end of file + list_reagents = list("nicotine" = 20) \ No newline at end of file diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index 5bb6700dd49..96cbecf3680 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -356,8 +356,7 @@ if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) + M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15)) if(M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") if(prob(M.ear_damage - 10 + 5)) @@ -385,8 +384,7 @@ if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) + M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15)) if(M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") if(prob(M.ear_damage - 10 + 5)) diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index 1590ae2b9c2..e9729b47f10 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -229,8 +229,8 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 1)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) - C.reagents.add_reagent("cyanide",7) + if(C.can_breathe_gas()) + C.reagents.add_reagent("cyanide", 7) /datum/reagent/itching_powder name = "Itching Powder" @@ -633,8 +633,8 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 2)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) - C.reagents.add_reagent("sarin",4) + if(C.can_breathe_gas()) + C.reagents.add_reagent("sarin", 4) /datum/reagent/sarin/on_mob_life(mob/living/M) switch(current_cycle) @@ -748,6 +748,7 @@ description = "A rare drug that causes the user to appear dead for some time." reagent_state = LIQUID color = "#60A584" + heart_rate_stop = 1 /datum/chemical_reaction/capulettium name = "capulettium" @@ -778,6 +779,7 @@ description = "A rare and expensive drug that causes the user to appear dead for some time while they retain consciousness and vision." reagent_state = LIQUID color = "#60A584" + heart_rate_stop = 1 /datum/chemical_reaction/capulettium_plus name = "capulettium_plus" diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm index 10b5ff13344..1b69b88e071 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm @@ -44,7 +44,7 @@ name = "Patron" id = "patron" result = "patron" - required_reagents = list("tequilla" = 10, "silver" = 1) + required_reagents = list("tequila" = 10, "silver" = 1) result_amount = 10 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' @@ -228,15 +228,15 @@ name = "Brave Bull" id = "bravebull" result = "bravebull" - required_reagents = list("tequilla" = 2, "kahlua" = 1) + required_reagents = list("tequila" = 2, "kahlua" = 1) result_amount = 3 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -/datum/chemical_reaction/tequilla_sunrise - name = "Tequilla Sunrise" - id = "tequillasunrise" - result = "tequillasunrise" - required_reagents = list("tequilla" = 2, "orangejuice" = 1) +/datum/chemical_reaction/tequila_sunrise + name = "Tequila Sunrise" + id = "tequilasunrise" + result = "tequilasunrise" + required_reagents = list("tequila" = 2, "orangejuice" = 1) result_amount = 3 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' @@ -317,7 +317,7 @@ name = "Margarita" id = "margarita" result = "margarita" - required_reagents = list("tequilla" = 2, "limejuice" = 1) + required_reagents = list("tequila" = 2, "limejuice" = 1) result_amount = 3 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' @@ -325,7 +325,7 @@ name = "Long Island Iced Tea" id = "longislandicedtea" result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) + required_reagents = list("vodka" = 1, "gin" = 1, "tequila" = 1, "cubalibre" = 1) result_amount = 4 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm index 2f3d02b9884..3adfab86292 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -11,6 +11,9 @@ //var/list/viruses = list() var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) var/shock_reduction = 0 + var/heart_rate_increase = 0 + var/heart_rate_decrease = 0 + var/heart_rate_stop = 0 var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin var/can_grow_in_plants = 1 //Determines if the reagent can be grown in plants, 0 means it cannot be grown //Processing flags, defines the type of mobs the reagent will affect @@ -70,6 +73,9 @@ holder.remove_reagent(id, metabolization_rate) //By default it slowly disappears. current_cycle++ +/datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect + return + // Called when two reagents of the same are mixing. /datum/reagent/proc/on_merge(data) return diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 910c1791fd7..bc3fc46c1af 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -130,9 +130,9 @@ color = "#664300" // rgb: 102, 67, 0 alcohol_perc = 0.2 -/datum/reagent/ethanol/tequilla +/datum/reagent/ethanol/tequila name = "Tequila" - id = "tequilla" + id = "tequila" description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" color = "#A8B0B7" // rgb: 168, 176, 183 alcohol_perc = 0.4 @@ -182,6 +182,7 @@ reagent_state = LIQUID color = "#102000" // rgb: 16, 32, 0 alcohol_perc = 0.3 + heart_rate_increase = 1 /datum/reagent/ethanol/thirteenloko/on_mob_life(mob/living/M) M.nutrition += nutriment_factor @@ -323,9 +324,9 @@ color = "#664300" // rgb: 102, 67, 0 alcohol_perc = 0.3 -/datum/reagent/ethanol/tequilla_sunrise +/datum/reagent/ethanol/tequila_sunrise name = "Tequila Sunrise" - id = "tequillasunrise" + id = "tequilasunrise" description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" reagent_state = LIQUID color = "#664300" // rgb: 102, 67, 0 @@ -623,6 +624,7 @@ color = "#2E2E61" // rgb: 46, 46, 97 dizzy_adj = 6 alcohol_perc = 0.7 + heart_rate_decrease = 1 /datum/reagent/ethanol/neurotoxin/on_mob_life(mob/living/M) M.weakened = max(M.weakened, 3) diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm index 6969b9e3677..418fc80daf4 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm @@ -176,6 +176,7 @@ adj_temp_hot = 25 overdose_threshold = 45 addiction_chance = 1 // It's true. + heart_rate_increase = 1 /datum/reagent/drink/coffee/on_mob_life(mob/living/M) if(holder.has_reagent("frostoil")) diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm index fa2f661f648..ccc617d2aaa 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm @@ -25,7 +25,6 @@ if(E.mend_fracture()) E.perma_injury = 0 M.disabilities = 0 - M.sdisabilities = 0 M.eye_blurry = 0 M.eye_blind = 0 M.SetWeakened(0) diff --git a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm index ec3996f485c..7cbc79b41b0 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm @@ -77,6 +77,7 @@ color = "#9087A2" metabolization_rate = 0.2 addiction_chance = 65 + heart_rate_decrease = 1 /datum/reagent/space_drugs/on_mob_life(mob/living/M) M.druggy = max(M.druggy, 15) @@ -84,4 +85,31 @@ if(M.canmove && !M.restrained()) step(M, pick(cardinal)) if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) + ..() + +/datum/reagent/psilocybin + name = "Psilocybin" + id = "psilocybin" + description = "A strong psycotropic derived from certain species of mushroom." + color = "#E700E7" // rgb: 231, 0, 231 + +/datum/reagent/psilocybin/on_mob_life(mob/living/M) + M.druggy = max(M.druggy, 30) + switch(current_cycle) + if(1 to 5) + if(!M.stuttering) M.stuttering = 1 + M.Dizzy(5) + if(prob(10)) M.emote(pick("twitch","giggle")) + if(5 to 10) + if(!M.stuttering) M.stuttering = 1 + M.Jitter(10) + M.Dizzy(10) + M.druggy = max(M.druggy, 35) + if(prob(20)) M.emote(pick("twitch","giggle")) + if(10 to INFINITY) + if(!M.stuttering) M.stuttering = 1 + M.Jitter(20) + M.Dizzy(20) + M.druggy = max(M.druggy, 40) + if(prob(30)) M.emote(pick("twitch","giggle")) ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm index cf425957f8c..45059ed84dd 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm @@ -84,12 +84,4 @@ id = "glycerol" description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." reagent_state = LIQUID - color = "#808080" // rgb: 128, 128, 128 - - -/datum/reagent/nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." - reagent_state = LIQUID color = "#808080" // rgb: 128, 128, 128 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index b31bfe7230b..57dfd93c19d 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -166,7 +166,6 @@ id = "blackpepper" description = "A powder ground from peppercorns. *AAAACHOOO*" reagent_state = SOLID - // no color (ie, black) /datum/reagent/cocoa name = "Cocoa Powder" @@ -194,35 +193,6 @@ M.nutrition += nutriment_factor ..() - -/datum/reagent/psilocybin - name = "Psilocybin" - id = "psilocybin" - description = "A strong psycotropic derived from certain species of mushroom." - color = "#E700E7" // rgb: 231, 0, 231 - -/datum/reagent/psilocybin/on_mob_life(mob/living/M) - M.druggy = max(M.druggy, 30) - switch(current_cycle) - if(1 to 5) - if(!M.stuttering) M.stuttering = 1 - M.Dizzy(5) - if(prob(10)) M.emote(pick("twitch","giggle")) - if(5 to 10) - if(!M.stuttering) M.stuttering = 1 - M.Jitter(10) - M.Dizzy(10) - M.druggy = max(M.druggy, 35) - if(prob(20)) M.emote(pick("twitch","giggle")) - if(10 to INFINITY) - if(!M.stuttering) M.stuttering = 1 - M.Jitter(20) - M.Dizzy(20) - M.druggy = max(M.druggy, 40) - if(prob(30)) M.emote(pick("twitch","giggle")) - ..() - - /datum/reagent/sprinkles name = "Sprinkles" id = "sprinkles" diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm index 6a2c2320894..cc5592dd42e 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_med.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm @@ -100,6 +100,7 @@ description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly." reagent_state = LIQUID color = "#0000C8" // rgb: 200, 165, 220 + heart_rate_decrease = 1 /datum/reagent/cryoxadone/on_mob_life(mob/living/M) if(M.bodytemperature < 265) diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm index a11232427ea..20ccb420e85 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -324,10 +324,10 @@ ..() -/datum/reagent/spores +/datum/reagent/spore name = "Spore Toxin" - id = "spores" - description = "A toxic spore cloud which blocks vision when ingested." + id = "spore" + description = "A natural toxin produced by blob spores that inhibits vision when ingested." color = "#9ACD32" /datum/reagent/spores/on_mob_life(mob/living/M) diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm similarity index 94% rename from code/modules/reagents/reagent_containers/glass/bottle.dm rename to code/modules/reagents/reagent_containers/bottle.dm index 363ff89119f..95fb36d439d 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -1,363 +1,349 @@ - -//Not to be confused with /obj/item/weapon/reagent_containers/food/drinks/bottle - -/obj/item/weapon/reagent_containers/glass/bottle - name = "bottle" - desc = "A small bottle." - icon = 'icons/obj/chemical.dmi' - icon_state = null - item_state = "atoxinbottle" - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,25,30) - flags = OPENCONTAINER - volume = 30 - -/obj/item/weapon/reagent_containers/glass/bottle/New() - ..() - if(!icon_state) - icon_state = "bottle[rand(1,20)]" - - - //Copypasta from /obj/item/weapon/reagent_containers/glass/beaker -/obj/item/weapon/reagent_containers/glass/bottle/on_reagent_change() - update_icon() - -/obj/item/weapon/reagent_containers/glass/bottle/pickup(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/glass/bottle/dropped(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/glass/bottle/attack_hand() - ..() - update_icon() - -/obj/item/weapon/reagent_containers/glass/bottle/update_icon() - overlays.Cut() - - if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10") - - var/percent = round((reagents.total_volume / volume) * 100) - switch(percent) - if(0 to 24) - filling.icon_state = "[icon_state]10" - if(25 to 49) - filling.icon_state = "[icon_state]25" - if(50 to 74) - filling.icon_state = "[icon_state]50" - if(75 to 90) - filling.icon_state = "[icon_state]75" - if(91 to INFINITY) - filling.icon_state = "[icon_state]100" - - filling.icon += mix_color_from_reagents(reagents.reagent_list) - overlays += filling - - if(!is_open_container()) - var/image/lid = image(icon, src, "lid_bottle") - overlays += lid - -/obj/item/weapon/reagent_containers/glass/bottle/toxin - name = "toxin bottle" - desc = "A small bottle of toxins. Do not drink, it is poisonous." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle12" - list_reagents = list("toxin" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/cyanide - name = "cyanide bottle" - desc = "A small bottle of cyanide. Bitter almonds?" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle12" - list_reagents = list("cyanide" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/mutagen - name = "unstable mutagen bottle" - desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle20" - list_reagents = list("mutagen" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/ammonia - name = "ammonia bottle" - desc = "A small bottle." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle20" - list_reagents = list("ammonia" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/diethylamine - name = "diethylamine bottle" - desc = "A small bottle." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - list_reagents = list("diethylamine" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/facid - name = "Fluorosulfuric Acid Bottle" - desc = "A small bottle. Contains a small amount of Fluorosulfuric Acid" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - list_reagents = list("facid" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine - name = "Adminordrazine Bottle" - desc = "A small bottle. Contains the liquid essence of the gods." - icon = 'icons/obj/drinks.dmi' - icon_state = "holyflask" - list_reagents = list("adminordrazine" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/capsaicin - name = "Capsaicin Bottle" - desc = "A small bottle. Contains hot sauce." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle3" - list_reagents = list("capsaicin" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/frostoil - name = "Frost Oil Bottle" - desc = "A small bottle. Contains cold sauce." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - list_reagents = list("frostoil" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/morphine - name = "Morphine Bottle" - desc = "A small bottle. Contains morphine." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - list_reagents = list("morphine" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/ether - name = "Ether Bottle" - desc = "A small bottle. Contains ether." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - list_reagents = list("ether" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/charcoal - name = "Charcoal Bottle" - desc = "A small bottle. Contains charcoal." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - list_reagents = list("charcoal" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/epinephrine - name = "Epinephrine Bottle" - desc = "A small bottle. Contains epinephrine." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - list_reagents = list("epinephrine" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/pancuronium - name = "Pancuronium Bottle" - desc = "A small bottle of pancuronium." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle14" - list_reagents = list("pancuronium" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/sulfonal - name = "Sulfonal Bottle" - desc = "A small bottle of Sulfonal." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle19" - list_reagents = list("sulfonal" = 30) - -//Reagent bottles - -/obj/item/weapon/reagent_containers/glass/bottle/reagent - name = "Reagent Bottle" - desc = "A bottle for storing reagents" - icon_state = "rbottle" - volume = 50 - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/oil - name = "Oil Bottle" - desc = "A reagent bottle. Contains oil." - icon_state = "rbottle1" - list_reagents = list("oil" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol - name = "Phenol Bottle" - desc = "A reagent bottle. Contains phenol." - icon_state = "rbottle2" - list_reagents = list("phenol" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone - name = "Acetone Bottle" - desc = "A reagent bottle. Contains acetone." - icon_state = "rbottle3" - list_reagents = list("acetone" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia - name = "Ammonia Bottle" - desc = "A reagent bottle. Contains ammonia." - icon_state = "rbottle4" - list_reagents = list("ammonia" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine - name = "Diethylamine Bottle" - desc = "A reagent bottle. Contains diethylamine." - icon_state = "rbottle5" - list_reagents = list("diethylamine" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/acid - name = "Acid Bottle" - desc = "A reagent bottle. Contains sulfuric acid." - icon_state = "rbottle6" - list_reagents = list("sacid" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde - name = "Formaldehyde Bottle" - desc = "A reagent bottle. Contains formaldehyde." - icon_state = "rbottle" - list_reagents = list("formaldehyde" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine - name = "Morphine Bottle" - desc = "A reagent bottle. Contains morphine." - list_reagents = list("morphine" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin - name = "Insulin Bottle" - desc = "A reagent bottle. Contains insulin." - list_reagents = list("insulin" = 50) - - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/hairgrownium - name = "Hair Grow Gel" - desc = "A bottle full of a stimulative hair growth formula" - list_reagents = list("hairgrownium" = 50) - -/obj/item/weapon/reagent_containers/glass/bottle/reagent/hair_dye - name = "Quantum Hair Dye Bottle" - desc = "A bottle of the ever-changing quantum hair dye." - list_reagents = list("hair_dye" = 50) - -////////////////////Traitor Poison Bottle////////////////////////////// - -/obj/item/weapon/reagent_containers/glass/bottle/traitor - desc = "It has a small skull and crossbones on it. Uh-oh!" - possible_transfer_amounts = list(5,10,15,25,30,40) - volume = 40 - -/obj/item/weapon/reagent_containers/glass/bottle/traitor/New() - ..() - reagents.add_reagent(pick_list("chemistry_tools.json", "traitor_poison_bottle"), 40) - -/obj/item/weapon/reagent_containers/glass/bottle/plasma - name = "plasma dust bottle" - desc = "A small bottle of plasma in dust form. Extremely toxic and reacts with micro-organisms inside blood." - icon_state = "bottle8" - list_reagents = list("plasma_dust" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine - name = "diphenhydramine bottle" - desc = "A small bottle of diphenhydramine." - icon_state = "bottle20" - list_reagents = list("diphenhydramine" = 30) - -/obj/item/weapon/reagent_containers/glass/bottle/flu_virion - name = "Flu virion culture bottle" - desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/advance/flu - -/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion - name = "Epiglottis virion culture bottle" - desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/advance/voice_change - -/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion - name = "Liver enhancement virion culture bottle" - desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/advance/heal - -/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion - name = "Hullucigen virion culture bottle" - desc = "A small bottle. Contains hullucigen virion culture in synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/advance/hullucigen - -/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat - name = "Pierrot's Throat culture bottle" - desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/pierrot_throat - -/obj/item/weapon/reagent_containers/glass/bottle/cold - name = "Rhinovirus culture bottle" - desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/advance/cold - -/obj/item/weapon/reagent_containers/glass/bottle/retrovirus - name = "Retrovirus culture bottle" - desc = "A small bottle. Contains a retrovirus culture in a synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/dna_retrovirus - -/obj/item/weapon/reagent_containers/glass/bottle/gbs - name = "GBS culture bottle" - desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit - icon_state = "bottle3" - amount_per_transfer_from_this = 5 - spawned_disease = /datum/disease/gbs - -/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs - name = "GBS culture bottle" - desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit - icon_state = "bottle3" - spawned_disease = /datum/disease/fake_gbs - -/obj/item/weapon/reagent_containers/glass/bottle/brainrot - name = "Brainrot culture bottle" - desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium." - icon_state = "bottle3" - spawned_disease = /datum/disease/brainrot - -/obj/item/weapon/reagent_containers/glass/bottle/magnitis - name = "Magnitis culture bottle" - desc = "A small bottle. Contains a small dosage of Fukkos Miracos." - icon_state = "bottle3" - spawned_disease = /datum/disease/magnitis - -/obj/item/weapon/reagent_containers/glass/bottle/wizarditis - name = "Wizarditis culture bottle" - desc = "A small bottle. Contains a sample of Rincewindus Vulgaris." - icon_state = "bottle3" - spawned_disease = /datum/disease/wizarditis - -/obj/item/weapon/reagent_containers/glass/bottle/anxiety - name = "Severe Anxiety culture bottle" - desc = "A small bottle. Contains a sample of Lepidopticides." - icon_state = "bottle3" - spawned_disease = /datum/disease/anxiety - -/obj/item/weapon/reagent_containers/glass/bottle/beesease - name = "Beesease culture bottle" - desc = "A small bottle. Contains a sample of invasive Apidae." - icon_state = "bottle3" - spawned_disease = /datum/disease/beesease - -/obj/item/weapon/reagent_containers/glass/bottle/fluspanish - name = "Spanish flu culture bottle" - desc = "A small bottle. Contains a sample of Inquisitius." - icon_state = "bottle3" - spawned_disease = /datum/disease/fluspanish - -/obj/item/weapon/reagent_containers/glass/bottle/tuberculosis - name = "Fungal Tuberculosis culture bottle" - desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus." - icon_state = "bottle3" - spawned_disease = /datum/disease/tuberculosis - -/obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure - name = "BVAK bottle" - desc = "A small bottle containing Bio Virus Antidote Kit." - icon_state = "bottle5" - list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) + +//Not to be confused with /obj/item/weapon/reagent_containers/food/drinks/bottle + +/obj/item/weapon/reagent_containers/glass/bottle + name = "bottle" + desc = "A small bottle." + icon = 'icons/obj/chemical.dmi' + icon_state = null + item_state = "atoxinbottle" + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,25,30) + flags = OPENCONTAINER + volume = 30 + +/obj/item/weapon/reagent_containers/glass/bottle/New() + ..() + if(!icon_state) + icon_state = "bottle[rand(1,20)]" + +/obj/item/weapon/reagent_containers/glass/bottle/on_reagent_change() + update_icon() + +/obj/item/weapon/reagent_containers/glass/bottle/update_icon() + overlays.Cut() + + if(reagents.total_volume) + var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10") + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 24) + filling.icon_state = "[icon_state]10" + if(25 to 49) + filling.icon_state = "[icon_state]25" + if(50 to 74) + filling.icon_state = "[icon_state]50" + if(75 to 90) + filling.icon_state = "[icon_state]75" + if(91 to INFINITY) + filling.icon_state = "[icon_state]100" + + filling.icon += mix_color_from_reagents(reagents.reagent_list) + overlays += filling + + if(!is_open_container()) + var/image/lid = image(icon, src, "lid_bottle") + overlays += lid + +/obj/item/weapon/reagent_containers/glass/bottle/toxin + name = "toxin bottle" + desc = "A small bottle of toxins. Do not drink, it is poisonous." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle12" + list_reagents = list("toxin" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/cyanide + name = "cyanide bottle" + desc = "A small bottle of cyanide. Bitter almonds?" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle12" + list_reagents = list("cyanide" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/mutagen + name = "unstable mutagen bottle" + desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle20" + list_reagents = list("mutagen" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/ammonia + name = "ammonia bottle" + desc = "A small bottle." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle20" + list_reagents = list("ammonia" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/diethylamine + name = "diethylamine bottle" + desc = "A small bottle." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + list_reagents = list("diethylamine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/facid + name = "Fluorosulfuric Acid Bottle" + desc = "A small bottle. Contains a small amount of Fluorosulfuric Acid" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + list_reagents = list("facid" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine + name = "Adminordrazine Bottle" + desc = "A small bottle. Contains the liquid essence of the gods." + icon = 'icons/obj/drinks.dmi' + icon_state = "holyflask" + list_reagents = list("adminordrazine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/capsaicin + name = "Capsaicin Bottle" + desc = "A small bottle. Contains hot sauce." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle3" + list_reagents = list("capsaicin" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/frostoil + name = "Frost Oil Bottle" + desc = "A small bottle. Contains cold sauce." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + list_reagents = list("frostoil" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/morphine + name = "Morphine Bottle" + desc = "A small bottle. Contains morphine." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + list_reagents = list("morphine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/ether + name = "Ether Bottle" + desc = "A small bottle. Contains ether." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + list_reagents = list("ether" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/charcoal + name = "Charcoal Bottle" + desc = "A small bottle. Contains charcoal." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + list_reagents = list("charcoal" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/epinephrine + name = "Epinephrine Bottle" + desc = "A small bottle. Contains epinephrine." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + list_reagents = list("epinephrine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/pancuronium + name = "Pancuronium Bottle" + desc = "A small bottle of pancuronium." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle14" + list_reagents = list("pancuronium" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/sulfonal + name = "Sulfonal Bottle" + desc = "A small bottle of Sulfonal." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + list_reagents = list("sulfonal" = 30) + +//Reagent bottles + +/obj/item/weapon/reagent_containers/glass/bottle/reagent + name = "Reagent Bottle" + desc = "A bottle for storing reagents" + icon_state = "rbottle" + volume = 50 + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/oil + name = "Oil Bottle" + desc = "A reagent bottle. Contains oil." + icon_state = "rbottle1" + list_reagents = list("oil" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol + name = "Phenol Bottle" + desc = "A reagent bottle. Contains phenol." + icon_state = "rbottle2" + list_reagents = list("phenol" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone + name = "Acetone Bottle" + desc = "A reagent bottle. Contains acetone." + icon_state = "rbottle3" + list_reagents = list("acetone" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia + name = "Ammonia Bottle" + desc = "A reagent bottle. Contains ammonia." + icon_state = "rbottle4" + list_reagents = list("ammonia" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine + name = "Diethylamine Bottle" + desc = "A reagent bottle. Contains diethylamine." + icon_state = "rbottle5" + list_reagents = list("diethylamine" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/acid + name = "Acid Bottle" + desc = "A reagent bottle. Contains sulfuric acid." + icon_state = "rbottle6" + list_reagents = list("sacid" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde + name = "Formaldehyde Bottle" + desc = "A reagent bottle. Contains formaldehyde." + icon_state = "rbottle" + list_reagents = list("formaldehyde" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine + name = "Morphine Bottle" + desc = "A reagent bottle. Contains morphine." + list_reagents = list("morphine" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin + name = "Insulin Bottle" + desc = "A reagent bottle. Contains insulin." + list_reagents = list("insulin" = 50) + + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/hairgrownium + name = "Hair Grow Gel" + desc = "A bottle full of a stimulative hair growth formula" + list_reagents = list("hairgrownium" = 50) + +/obj/item/weapon/reagent_containers/glass/bottle/reagent/hair_dye + name = "Quantum Hair Dye Bottle" + desc = "A bottle of the ever-changing quantum hair dye." + list_reagents = list("hair_dye" = 50) + +////////////////////Traitor Poison Bottle////////////////////////////// + +/obj/item/weapon/reagent_containers/glass/bottle/traitor + desc = "It has a small skull and crossbones on it. Uh-oh!" + possible_transfer_amounts = list(5,10,15,25,30,40) + volume = 40 + +/obj/item/weapon/reagent_containers/glass/bottle/traitor/New() + ..() + reagents.add_reagent(pick_list("chemistry_tools.json", "traitor_poison_bottle"), 40) + +/obj/item/weapon/reagent_containers/glass/bottle/plasma + name = "plasma dust bottle" + desc = "A small bottle of plasma in dust form. Extremely toxic and reacts with micro-organisms inside blood." + icon_state = "bottle8" + list_reagents = list("plasma_dust" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine + name = "diphenhydramine bottle" + desc = "A small bottle of diphenhydramine." + icon_state = "bottle20" + list_reagents = list("diphenhydramine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/flu_virion + name = "Flu virion culture bottle" + desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/flu + +/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion + name = "Epiglottis virion culture bottle" + desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/voice_change + +/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion + name = "Liver enhancement virion culture bottle" + desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/heal + +/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion + name = "Hullucigen virion culture bottle" + desc = "A small bottle. Contains hullucigen virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/hullucigen + +/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat + name = "Pierrot's Throat culture bottle" + desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/pierrot_throat + +/obj/item/weapon/reagent_containers/glass/bottle/cold + name = "Rhinovirus culture bottle" + desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/advance/cold + +/obj/item/weapon/reagent_containers/glass/bottle/retrovirus + name = "Retrovirus culture bottle" + desc = "A small bottle. Contains a retrovirus culture in a synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/dna_retrovirus + +/obj/item/weapon/reagent_containers/glass/bottle/gbs + name = "GBS culture bottle" + desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit + icon_state = "bottle3" + amount_per_transfer_from_this = 5 + spawned_disease = /datum/disease/gbs + +/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs + name = "GBS culture bottle" + desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit + icon_state = "bottle3" + spawned_disease = /datum/disease/fake_gbs + +/obj/item/weapon/reagent_containers/glass/bottle/brainrot + name = "Brainrot culture bottle" + desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium." + icon_state = "bottle3" + spawned_disease = /datum/disease/brainrot + +/obj/item/weapon/reagent_containers/glass/bottle/magnitis + name = "Magnitis culture bottle" + desc = "A small bottle. Contains a small dosage of Fukkos Miracos." + icon_state = "bottle3" + spawned_disease = /datum/disease/magnitis + +/obj/item/weapon/reagent_containers/glass/bottle/wizarditis + name = "Wizarditis culture bottle" + desc = "A small bottle. Contains a sample of Rincewindus Vulgaris." + icon_state = "bottle3" + spawned_disease = /datum/disease/wizarditis + +/obj/item/weapon/reagent_containers/glass/bottle/anxiety + name = "Severe Anxiety culture bottle" + desc = "A small bottle. Contains a sample of Lepidopticides." + icon_state = "bottle3" + spawned_disease = /datum/disease/anxiety + +/obj/item/weapon/reagent_containers/glass/bottle/beesease + name = "Beesease culture bottle" + desc = "A small bottle. Contains a sample of invasive Apidae." + icon_state = "bottle3" + spawned_disease = /datum/disease/beesease + +/obj/item/weapon/reagent_containers/glass/bottle/fluspanish + name = "Spanish flu culture bottle" + desc = "A small bottle. Contains a sample of Inquisitius." + icon_state = "bottle3" + spawned_disease = /datum/disease/fluspanish + +/obj/item/weapon/reagent_containers/glass/bottle/tuberculosis + name = "Fungal Tuberculosis culture bottle" + desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus." + icon_state = "bottle3" + spawned_disease = /datum/disease/tuberculosis + +/obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure + name = "BVAK bottle" + desc = "A small bottle containing Bio Virus Antidote Kit." + icon_state = "bottle5" + list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 12334c2941d..419325445f0 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -80,18 +80,6 @@ else M.LAssailant = user - // /vg/: Logging transfers of bad things - if(isobj(target)) - if(target.reagents_to_log.len) - var/list/badshit=list() - for(var/bad_reagent in target.reagents_to_log) - if(reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl = "([english_list(badshit)])" - message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") - log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You transfer [trans] units of the solution.") if(src.reagents.total_volume<=0) diff --git a/code/modules/reagents/reagent_containers/drugs.dm b/code/modules/reagents/reagent_containers/drugs.dm deleted file mode 100644 index 8071347a275..00000000000 --- a/code/modules/reagents/reagent_containers/drugs.dm +++ /dev/null @@ -1,136 +0,0 @@ -/obj/item/weapon/reagent_containers/drugs - name = " " - var/base_name = " " - desc = " " - icon = 'icons/obj/chemical.dmi' - icon_state = "baggie" - item_state = "beaker" - amount_per_transfer_from_this = 2 - possible_transfer_amounts = 2 - volume = 10 - flags = OPENCONTAINER - - var/label_text = "" - -/obj/item/weapon/reagent_containers/drugs/New() - ..() - src.pixel_x = rand(-10.0, 10) //Randomizes postion - src.pixel_y = rand(-10.0, 10) - base_name = name - -/obj/item/weapon/reagent_containers/drugs/afterattack(obj/target, mob/user, proximity) - if(!proximity) - return - - if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - - if(!target.reagents.total_volume && target.reagents) - to_chat(user, "\red [target] is empty.") - return - - if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "\red [src] is full.") - return - - for(var/datum/reagent/A in target.reagents.reagent_list) - if(A.reagent_state != 1) - to_chat(user, "\red You can only put powders in [src].") - return - - var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].") - - else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. - if(!reagents.total_volume) - to_chat(user, "\red [src] is empty.") - return - - if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "\red [target] is full.") - return - - // /vg/: Logging transfers of bad things - if(target.reagents_to_log.len) - var/list/badshit=list() - for(var/bad_reagent in target.reagents_to_log) - if(reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl = "([english_list(badshit)])" - message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") - log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "\blue You transfer [trans] units of the solution to [target].") - - //Safety for dumping stuff into a ninja suit. It handles everything through attackby() and this is unnecessary. - - /*else if(istype(target, /obj/machinery/bunsen_burner)) - return - - else if(istype(target, /obj/machinery/radiocarbon_spectrometer)) - return*/ - - -/obj/item/weapon/reagent_containers/drugs/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen)) - var/tmp_label = sanitize(input(user, "Enter a label for [src.name]","Label",src.label_text)) - if(length(tmp_label) > 10) - to_chat(user, "\red The label can be at most 10 characters long.") - else - to_chat(user, "\blue You set the label to \"[tmp_label]\".") - src.label_text = tmp_label - src.update_name_label() - -/obj/item/weapon/reagent_containers/drugs/proc/update_name_label() - if(src.label_text == "") - src.name = src.base_name - else - src.name = "[src.base_name] ([src.label_text])" - -/obj/item/weapon/reagent_containers/drugs/baggie - name = "baggie" - desc = "A baggie. Can hold up to 10 units." - icon = 'icons/obj/chemical.dmi' - icon_state = "baggie" - item_state = "beaker" - -/obj/item/weapon/reagent_containers/drugs/on_reagent_change() - update_icon() - -/obj/item/weapon/reagent_containers/drugs/pickup(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/drugs/dropped(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/drugs/attack_hand() - ..() - update_icon() - -/obj/item/weapon/reagent_containers/drugs/update_icon() - overlays.Cut() - - if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]2") - - switch(reagents.total_volume) - if(0 to 2) - filling.icon_state = "[icon_state]2" - if(3 to 4) - filling.icon_state = "[icon_state]4" - if(5 to 6) - filling.icon_state = "[icon_state]6" - if(7 to 8) - filling.icon_state = "[icon_state]8" - if(9 to 10) - filling.icon_state = "[icon_state]10" - - - filling.icon += mix_color_from_reagents(reagents.reagent_list) - overlays += filling - -/obj/item/weapon/reagent_containers/drugs/baggie/meth - list_reagents = list("methamphetamine" = 10) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index d114460b244..6d72ec2221c 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -7,7 +7,7 @@ ..() flags &= ~OPENCONTAINER -/obj/item/weapon/reagent_containers/food/drinks/cans/attack_self(mob/user as mob) +/obj/item/weapon/reagent_containers/food/drinks/cans/attack_self(mob/user) if(canopened == 0) playsound(src.loc,'sound/effects/canopen.ogg', rand(10,50), 1) to_chat(user, "You open the drink with an audible pop!") @@ -28,7 +28,7 @@ qdel(src) return crushed_can -/obj/item/weapon/reagent_containers/food/drinks/cans/attack(mob/M as mob, mob/user as mob, proximity) +/obj/item/weapon/reagent_containers/food/drinks/cans/attack(mob/M, mob/user, proximity) if(canopened == 0) to_chat(user, "You need to open the drink!") return @@ -58,94 +58,46 @@ else return ..(target, user, proximity) -/* examine(mob/user) - if(!..(user, 1)) - return - if(!reagents || reagents.total_volume==0) - to_chat(user, "\blue \The [src] is empty!") - else if(reagents.total_volume<=src.volume/4) - to_chat(user, "\blue \The [src] is almost empty!") - else if(reagents.total_volume<=src.volume*0.66) - to_chat(user, "\blue \The [src] is half full!") - else if(reagents.total_volume<=src.volume*0.90) - to_chat(user, "\blue \The [src] is almost full!") - else - to_chat(user, "\blue \The [src] is full!")*/ - - -//DRINKS - /obj/item/weapon/reagent_containers/food/drinks/cans/cola name = "Space Cola" desc = "Cola. in space." icon_state = "cola" - New() - ..() - reagents.add_reagent("cola", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("cola" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle name = "Bottled Water" desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles." icon_state = "waterbottle" is_plastic = 1 - New() - ..() - reagents.add_reagent("water", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("water" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/beer name = "Space Beer" desc = "Contains only water, malt and hops." icon_state = "beer" is_glass = 1 - New() - ..() - reagents.add_reagent("beer", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("beer" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/adminbooze name = "Admin Booze" desc = "Bottled Griffon tears. Drink with caution." icon_state = "adminbooze" is_glass = 1 - New() - ..() - reagents.add_reagent("adminordrazine", 5) - reagents.add_reagent("capsaicin", 5) - reagents.add_reagent("methamphetamine", 20) - reagents.add_reagent("thirteenloko", 20) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("adminordrazine" = 5, "capsaicin" = 5, "methamphetamine"= 20, "thirteenloko" = 20) /obj/item/weapon/reagent_containers/food/drinks/cans/madminmalt name = "Madmin Malt" desc = "Bottled essence of angry admins. Drink with EXTREME caution." icon_state = "madminmalt" is_glass = 1 - New() - ..() - reagents.add_reagent("hell_water", 20) - reagents.add_reagent("neurotoxin", 15) - reagents.add_reagent("thirteenloko", 15) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("hell_water" = 20, "neurotoxin" = 15, "thirteenloko" = 15) /obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew name = "Badmin Brew" desc = "Bottled trickery and terrible admin work. Probably shouldn't drink this one at all." icon_state = "badminbrew" is_glass = 1 - New() - ..() - reagents.add_reagent("mutagen", 25) - reagents.add_reagent("charcoal", 10) - reagents.add_reagent("thirteenloko", 15) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("mutagen" = 25, "charcoal" = 10, "thirteenloko" = 15) /obj/item/weapon/reagent_containers/food/drinks/cans/ale name = "Magm-Ale" @@ -153,117 +105,74 @@ icon_state = "alebottle" item_state = "beer" is_glass = 1 - New() - ..() - reagents.add_reagent("ale", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - + list_reagents = list("ale" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind name = "Space Mountain Wind" desc = "Blows right through you like a space wind." icon_state = "space_mountain_wind" - New() - ..() - reagents.add_reagent("spacemountainwind", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("spacemountainwind" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko name = "Thirteen Loko" desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly." icon_state = "thirteen_loko" - New() - ..() - reagents.add_reagent("thirteenloko", 25) - reagents.add_reagent("psilocybin", 5) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("thirteenloko" = 25, "psilocybin" = 5) /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb name = "Dr. Gibb" desc = "A delicious mixture of 42 different flavors." icon_state = "dr_gibb" - New() - ..() - reagents.add_reagent("dr_gibb", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("dr_gibb" = 30) + /obj/item/weapon/reagent_containers/food/drinks/cans/starkist name = "Star-kist" desc = "The taste of a star in liquid form. And, a bit of tuna...?" icon_state = "starkist" - New() - ..() - reagents.add_reagent("brownstar", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("brownstar" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/space_up name = "Space-Up" desc = "Tastes like a hull breach in your mouth." icon_state = "space-up" - New() - ..() - reagents.add_reagent("space_up", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("space_up" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime name = "Lemon-Lime" desc = "You wanted ORANGE. It gave you Lemon Lime." icon_state = "lemon-lime" - New() - ..() - reagents.add_reagent("lemon_lime", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("lemon_lime" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea name = "Vrisk Serket Iced Tea" desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?" icon_state = "ice_tea_can" - New() - ..() - reagents.add_reagent("icetea", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("icetea" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice name = "Grapel Juice" desc = "500 pages of rules of how to appropriately enter into a combat with this juice!" icon_state = "purple_can" - New() - ..() - reagents.add_reagent("grapejuice", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("grapejuice" = 30) /obj/item/weapon/reagent_containers/food/drinks/cans/tonic name = "T-Borg's Tonic Water" desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." icon_state = "tonic" - New() - ..() - reagents.add_reagent("tonic", 50) + list_reagents = list("tonic" = 50) /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater name = "Soda Water" desc = "A can of soda water. Still water's more refreshing cousin." icon_state = "sodawater" - New() - ..() - reagents.add_reagent("sodawater", 50) + list_reagents = list("sodawater" = 50) /obj/item/weapon/reagent_containers/food/drinks/cans/synthanol name = "Beep's Classic Synthanol" desc = "A can of IPC booze, however that works." icon_state = "synthanolcan" - New() - ..() - reagents.add_reagent("synthanol", 50) + list_reagents = list("synthanol" = 50) /obj/item/weapon/reagent_containers/food/drinks/cans/bottler name = "generic beverage container" @@ -273,18 +182,6 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/on_reagent_change() update_icon() -/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/pickup(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/dropped(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/attack_hand() - ..() - update_icon() - /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/update_icon() overlays.Cut() @@ -313,6 +210,7 @@ desc = "A glass bottle suitable for beverages." icon_state = "glass_bottle" is_glass = 1 + /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/plastic_bottle name = "plastic bottle" desc = "A plastic bottle suitable for beverages." diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index 29bd6e7dc53..85cd8c05a87 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -8,10 +8,10 @@ /obj/item/weapon/reagent_containers/food/condiment name = "condiment container" desc = "Just your average condiment container." - icon = 'icons/obj/food/food.dmi' + icon = 'icons/obj/food/containers.dmi' icon_state = "emptycondiment" flags = OPENCONTAINER - possible_transfer_amounts = list(1,5,10) + possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50) volume = 50 //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites. var/list/possible_states = list( @@ -21,90 +21,69 @@ "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), "frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"), - "blackpepper" = list("pepermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), + "blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), - "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"), - "flour" =list("flour", "flour sack", "A big bag of flour. Good for baking!"), - "rice" =list("rice", "rice sack", "A big bag of rice. Good for cooking!")) + "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!")) + var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. - -/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W as obj, mob/user as mob, params) +/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W, mob/user, params) return - -/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user as mob) +/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user) return -/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M as mob, mob/user as mob, def_zone) - var/datum/reagents/R = src.reagents +/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone) - if(!R || !R.total_volume) - to_chat(user, "\red None of [src] left, oh no!") + if(!reagents || !reagents.total_volume) + to_chat(user, "None of [src] left, oh no!") return 0 if(M == user) - to_chat(M, "\blue You swallow some of contents of the [src].") - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(0) - reagents.trans_to(M, 10) + to_chat(M, "You swallow some of contents of \the [src].") + else + user.visible_message("[user] attempts to feed [M] from [src].") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The condiment might be empty after the delay. + user.visible_message("[user] feeds [M] from [src].") + add_logs(M, user, "fed", reagentlist(src)) - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - else if( istype(M, /mob/living/carbon/human) ) + var/fraction = min(10/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, 10) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + return 1 - for(var/mob/O in viewers(world.view, user)) - O.show_message("\red [user] attempts to feed [M] [src].", 1) - if(!do_mob(user, M)) return - for(var/mob/O in viewers(world.view, user)) - O.show_message("\red [user] feeds [M] [src].", 1) - - M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [key_name(user)] Reagents: [reagentlist(src)]") - user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [key_name(M)] Reagents: [reagentlist(src)]") - if(M.ckey) - msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])") - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(0) - reagents.trans_to(M, 10) - - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - return 0 - -/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I, mob/user, params) return /obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) - if(!proximity) return + if(!proximity) + return if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) - to_chat(user, "\red [target] is empty.") + to_chat(user, "[target] is empty!") return if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "\red [src] is full.") + to_chat(user, "[src] is full!") return - var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].") + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) + to_chat(user, "You fill [src] with [trans] units of the contents of [target].") //Something like a glass or a food item. Player probably wants to transfer TO it. else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) if(!reagents.total_volume) - to_chat(user, "\red [src] is empty.") + to_chat(user, "[src] is empty!") return if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "\red you can't add anymore to [target].") + to_chat(user, "you can't add anymore to [target]!") return var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "\blue You transfer [trans] units of the condiment to [target].") + to_chat(user, "You transfer [trans] units of the condiment to [target].") /obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() if(!possible_states.len) @@ -118,7 +97,7 @@ desc = temp_list[3] else - name = "condiment bottle" + name = "[originalname] bottle" main_reagent = reagents.get_master_reagent_name() if(reagents.reagent_list.len==1) desc = "Looks like it is [lowertext(main_reagent)], but you are not sure." @@ -129,46 +108,17 @@ icon_state = "emptycondiment" name = "condiment bottle" desc = "An empty condiment bottle." - return - /obj/item/weapon/reagent_containers/food/condiment/enzyme name = "universal enzyme" desc = "Used in cooking various dishes." icon_state = "enzyme" - New() - ..() - reagents.add_reagent("enzyme", 50) + list_reagents = list("enzyme" = 50) /obj/item/weapon/reagent_containers/food/condiment/sugar name = "sugar bottle" desc = "Tasty spacey sugar!" - - New() - ..() - reagents.add_reagent("sugar", 50) - -/obj/item/weapon/reagent_containers/food/condiment/flour - name = "flour sack" - desc = "A big bag of flour. Good for baking!" - icon_state = "flour" - item_state = "flour" - possible_states = list() - - New() - ..() - reagents.add_reagent("flour", 30) - -/obj/item/weapon/reagent_containers/food/condiment/rice - name = "rice sack" - desc = "A big bag of rice. Good for cooking!" - icon_state = "rice" - item_state = "flour" - possible_states = list() - - New() - ..() - reagents.add_reagent("rice", 30) + list_reagents = list("sugar" = 50) /obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then name = "salt shaker" // a large one. @@ -177,12 +127,9 @@ possible_transfer_amounts = list(1,20) //for clown turning the lid off amount_per_transfer_from_this = 1 volume = 20 + list_reagents = list("sodiumchloride" = 20) possible_states = list() - New() - ..() - reagents.add_reagent("sodiumchloride", 20) - /obj/item/weapon/reagent_containers/food/condiment/saltshaker/suicide_act(mob/user) user.visible_message("[user] begins to swap forms with the salt shaker! It looks like \he's trying to commit suicide.") var/newname = "[name]" @@ -190,7 +137,7 @@ user.name = newname user.real_name = newname desc = "Salt. From dead crew, presumably." - return TOXLOSS + return (TOXLOSS) /obj/item/weapon/reagent_containers/food/condiment/peppermill name = "pepper mill" @@ -199,38 +146,66 @@ possible_transfer_amounts = list(1,20) //for clown turning the lid off amount_per_transfer_from_this = 1 volume = 20 + list_reagents = list("blackpepper" = 20) possible_states = list() - New() - ..() - reagents.add_reagent("blackpepper", 20) +/obj/item/weapon/reagent_containers/food/condiment/milk + name = "space milk" + desc = "It's milk. White and nutritious goodness!" + icon_state = "milk" + item_state = "carton" + list_reagents = list("milk" = 50) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/flour + name = "flour sack" + desc = "A big bag of flour. Good for baking!" + icon_state = "flour" + item_state = "flour" + list_reagents = list("flour" = 30) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/soymilk + name = "soy milk" + desc = "It's soy milk. White and nutritious goodness!" + icon_state = "soymilk" + item_state = "carton" + list_reagents = list("soymilk" = 50) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/rice + name = "rice sack" + desc = "A big bag of rice. Good for cooking!" + icon_state = "rice" + item_state = "flour" + list_reagents = list("rice" = 30) + possible_states = list() + +/obj/item/weapon/reagent_containers/food/condiment/soysauce + name = "soy sauce" + desc = "A salty soy-based flavoring." + icon_state = "soysauce" + list_reagents = list("soysauce" = 50) + possible_states = list() /obj/item/weapon/reagent_containers/food/condiment/syndisauce name = "\improper Chef Excellence's Special Sauce" desc = "A potent sauce extracted from the potent amanita mushrooms. Death never tasted quite so delicious." - amount_per_transfer_from_this = 5 - volume = 50 - New() - ..() - reagents.add_reagent("amanitin", 50) + list_reagents = list("amanitin" = 50) + possible_states = list() //Food packs. To easily apply deadly toxi... delicious sauces to your food! + /obj/item/weapon/reagent_containers/food/condiment/pack name = "condiment pack" desc = "A small plastic pack with condiments to put on your food" icon_state = "condi_empty" volume = 10 amount_per_transfer_from_this = 10 - possible_transfer_amounts = 10 + possible_transfer_amounts = list() possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) - var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. -/obj/item/weapon/reagent_containers/food/condiment/pack/New() - ..() - pixel_x = rand(-7, 7) - pixel_y = rand(-7, 7) - -/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M as mob, mob/user as mob, def_zone) //Can't feed these to people directly. +/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. return /obj/item/weapon/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity) @@ -243,8 +218,7 @@ qdel(src) return if(target.reagents.total_volume >= target.reagents.maximum_volume) - to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!")//Not sure if food can ever be full, but better safe than sorry. - + to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!") //Not sure if food can ever be full, but better safe than sorry. qdel(src) return else @@ -268,18 +242,12 @@ //Ketchup /obj/item/weapon/reagent_containers/food/condiment/pack/ketchup - name = "Ketchup pack" - originalname = "Ketchup" - -/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup/New() - ..() - reagents.add_reagent("ketchup", 10) + name = "ketchup pack" + originalname = "ketchup" + list_reagents = list("ketchup" = 10) //Hot sauce /obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce - name = "Hotsauce pack" - originalname = "Hotsauce" - -/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce/New() - ..() - reagents.add_reagent("capsaicin", 10) \ No newline at end of file + name = "hotsauce pack" + originalname = "hotsauce" + list_reagents = list("capsaicin" = 10) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 8766e784dd7..41486497be2 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -8,19 +8,21 @@ icon_state = null flags = OPENCONTAINER consume_sound = 'sound/items/drink.ogg' - possible_transfer_amounts = list(5,10,25) + possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 /obj/item/weapon/reagent_containers/food/drinks/New() ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) bitesize = amount_per_transfer_from_this if(bitesize < 5) bitesize = 5 -/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user as mob) +/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user) return -/obj/item/weapon/reagent_containers/food/drinks/attack(mob/M as mob, mob/user as mob, def_zone) +/obj/item/weapon/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, " None of [src] left, oh no!") return 0 @@ -95,7 +97,7 @@ return -/obj/item/weapon/reagent_containers/food/drinks/attackby(var/obj/item/I, mob/user as mob, params) +/obj/item/weapon/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird return if(is_hot(I)) @@ -123,22 +125,51 @@ /// Drinks. END //////////////////////////////////////////////////////////////////////////////// -/obj/item/weapon/reagent_containers/food/drinks/golden_cup - desc = "A golden cup" - name = "golden cup" +/obj/item/weapon/reagent_containers/food/drinks/trophy + name = "pewter cup" + desc = "Everyone gets a trophy." + icon_state = "pewter_cup" + w_class = 1 + force = 1 + throwforce = 1 + amount_per_transfer_from_this = 5 + materials = list(MAT_METAL=100) + possible_transfer_amounts = list() + volume = 5 + flags = CONDUCT | OPENCONTAINER + +/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup + name = "gold cup" + desc = "You're winner!" icon_state = "golden_cup" - item_state = "golden_cup" //yup :) w_class = 4 force = 14 throwforce = 10 amount_per_transfer_from_this = 20 materials = list(MAT_GOLD=1000) - possible_transfer_amounts = null volume = 150 - flags = CONDUCT | OPENCONTAINER -/obj/item/weapon/reagent_containers/food/drinks/golden_cup/tournament_26_06_2011 - desc = "A golden cup. It will be presented to a winner of tournament 26 june and name of the winner will be graved on it." +/obj/item/weapon/reagent_containers/food/drinks/trophy/silver_cup + name = "silver cup" + desc = "Best loser!" + icon_state = "silver_cup" + w_class = 3 + force = 10 + throwforce = 8 + amount_per_transfer_from_this = 15 + materials = list(MAT_SILVER=800) + volume = 100 + +/obj/item/weapon/reagent_containers/food/drinks/trophy/bronze_cup + name = "bronze cup" + desc = "At least you ranked!" + icon_state = "bronze_cup" + w_class = 2 + force = 5 + throwforce = 4 + amount_per_transfer_from_this = 10 + materials = list(MAT_METAL=400) + volume = 25 ///////////////////////////////////////////////Drinks @@ -146,158 +177,84 @@ // rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50. // Formatting is the same as food. -/obj/item/weapon/reagent_containers/food/drinks/milk - name = "\improper Space Milk" - desc = "It's milk. White and nutritious goodness!" - icon_state = "milk" - item_state = "carton" - New() - ..() - reagents.add_reagent("milk", 50) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - -/* Flour is no longer a reagent -/obj/item/weapon/reagent_containers/food/drinks/flour - name = "flour sack" - desc = "A big bag of flour. Good for baking!" - icon = 'icons/obj/food/food.dmi' - icon_state = "flour" - item_state = "flour" - New() - ..() - reagents.add_reagent("flour", 50) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) -*/ - -/obj/item/weapon/reagent_containers/food/drinks/soymilk - name = "\improper SoyMilk" - desc = "It's soy milk. White and nutritious goodness!" - icon_state = "soymilk" - item_state = "carton" - New() - ..() - reagents.add_reagent("soymilk", 50) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) /obj/item/weapon/reagent_containers/food/drinks/coffee - name = "\improper Robust Coffee" + name = "Robust Coffee" desc = "Careful, the beverage you're about to enjoy is extremely hot." icon_state = "coffee" - New() - ..() - reagents.add_reagent("coffee", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("coffee" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/ice + name = "Ice Cup" + desc = "Careful, cold ice, do not chew." + icon_state = "coffee" + list_reagents = list("ice" = 30) /obj/item/weapon/reagent_containers/food/drinks/tea - name = "\improper Duke Purple Tea" + name = "Duke Purple Tea" desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea." - icon_state = "teacup" - item_state = "coffee" - New() - ..() - reagents.add_reagent("tea", 30) - if(prob(20)) - reagents.add_reagent("mugwort", 3) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("tea" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/tea/New() + ..() + if(prob(20)) + reagents.add_reagent("mugwort", 3) /obj/item/weapon/reagent_containers/food/drinks/mugwort - name = "\improper Mugwort Tea" + name = "Mugwort Tea" desc = "A bitter herbal tea." icon_state = "manlydorfglass" item_state = "coffee" - New() - ..() - reagents.add_reagent("mugwort", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - -/obj/item/weapon/reagent_containers/food/drinks/ice - name = "\improper Ice Cup" - desc = "Careful, cold ice, do not chew." - icon_state = "coffee" - New() - ..() - reagents.add_reagent("ice", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("mugwort" = 30) /obj/item/weapon/reagent_containers/food/drinks/h_chocolate - name = "\improper Dutch Hot Coco" + name = "Dutch Hot Coco" desc = "Made in Space South America." - icon_state = "hot_coco" - item_state = "coffee" - New() - ..() - reagents.add_reagent("hot_coco", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("hot_coco" = 30, "sugar" = 5) /obj/item/weapon/reagent_containers/food/drinks/chocolate - name = "\improper Hot Chocolate" + name = "Hot Chocolate" desc = "Made in Space Switzerland." icon_state = "hot_coco" item_state = "coffee" - New() - ..() - reagents.add_reagent("chocolate", 45) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("chocolate" = 30) /obj/item/weapon/reagent_containers/food/drinks/weightloss - name = "\improper Weight-Loss Shake" + name = "Weight-Loss Shake" desc = "A shake designed to cause weight loss. The package proudly proclaims that it is 'tapeworm free.'" icon_state = "coffee" item_state = "coffee" - New() - ..() - reagents.add_reagent("lipolicide", 30) - reagents.add_reagent("chocolate", 5) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - + list_reagents = list("lipolicide" = 30, "chocolate" = 5) /obj/item/weapon/reagent_containers/food/drinks/dry_ramen - name = "\improper Cup Ramen" - desc = "Just add 10ml water, self heats! A taste that reminds you of your school years." + name = "Cup Ramen" + desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years." icon_state = "ramen" - New() - ..() - reagents.add_reagent("dry_ramen", 30) - if(prob(20)) - reagents.add_reagent("enzyme", 3) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("dry_ramen" = 30) + +/obj/item/weapon/reagent_containers/food/drinks/dry_ramen/New() + ..() + if(prob(20)) + reagents.add_reagent("enzyme", 3) /obj/item/weapon/reagent_containers/food/drinks/chicken_soup - name = "\improper Cup Chicken Soup" + name = "Cup Chicken Soup" desc = "A delicious and soothing cup of chicken noodle soup; just like spessmom used to make it." icon_state = "ramen" - New() - ..() - reagents.add_reagent("chicken_soup", 30) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + list_reagents = list("chicken_soup" = 30) /obj/item/weapon/reagent_containers/food/drinks/sillycup name = "paper cup" desc = "A paper water cup." icon_state = "water_cup_e" - possible_transfer_amounts = null + possible_transfer_amounts = list() volume = 10 - New() - ..() - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - on_reagent_change() - if(reagents.total_volume) - icon_state = "water_cup" - else - icon_state = "water_cup_e" + +/obj/item/weapon/reagent_containers/food/drinks/sillycup/on_reagent_change() + if(reagents.total_volume) + icon_state = "water_cup" + else + icon_state = "water_cup_e" //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink @@ -308,20 +265,14 @@ name = "shaker" desc = "A metal shaker to mix drinks in." icon_state = "shaker" + materials = list(MAT_METAL=1500) amount_per_transfer_from_this = 10 volume = 100 /obj/item/weapon/reagent_containers/food/drinks/flask - name = "Captain's Flask" - desc = "A metal flask belonging to the captain" + name = "flask" + desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." icon_state = "flask" - materials = list(MAT_SILVER=500) - volume = 60 - -/obj/item/weapon/reagent_containers/food/drinks/flask/detflask - name = "Detective's Flask" - desc = "A metal flask with a leather band and golden badge belonging to the detective." - icon_state = "detflask" materials = list(MAT_METAL=250) volume = 60 @@ -329,19 +280,25 @@ name = "flask" desc = "For those who can't be bothered to hang out at the bar to drink." icon_state = "barflask" - volume = 60 -/obj/item/weapon/reagent_containers/food/drinks/britcup - name = "cup" - desc = "A cup with the british flag emblazoned on it." - icon_state = "britcup" - volume = 30 +/obj/item/weapon/reagent_containers/food/drinks/flask/gold + name = "captain's flask" + desc = "A gold flask belonging to the captain." + icon_state = "flask_gold" + materials = list(MAT_GOLD=500) + +/obj/item/weapon/reagent_containers/food/drinks/flask/detflask + name = "detective's flask" + desc = "The detective's only true friend." + icon_state = "detflask" + list_reagents = list("whiskey" = 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" + materials = list() /obj/item/weapon/reagent_containers/food/drinks/flask/thermos name = "vintage thermos" @@ -361,3 +318,10 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "lithiumflask" volume = 50 + + +/obj/item/weapon/reagent_containers/food/drinks/britcup + name = "cup" + desc = "A cup with the british flag emblazoned on it." + icon_state = "britcup" + volume = 30 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 17b52aaf5a7..678078bc7fd 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -7,18 +7,21 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle amount_per_transfer_from_this = 10 volume = 100 + throwforce = 15 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it -/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob) +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0) //Creates a shattering noise and replaces the bottle with a broken_bottle - user.drop_item() - var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc) - user.put_in_active_hand(B) - if(prob(33)) - new /obj/item/weapon/shard(target.loc) // Create a glass shard at the target's location! + var/new_location = get_turf(loc) + var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(new_location) + if(ranged) + B.loc = new_location + else + user.drop_item() + user.put_in_active_hand(B) B.icon_state = src.icon_state var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) @@ -26,13 +29,20 @@ I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) B.icon = I - playsound(src, "shatter", 70, 1) - user.put_in_active_hand(B) - src.transfer_fingerprints_to(B) + if(isGlass) + if(prob(33)) + new/obj/item/weapon/shard(new_location) + playsound(src, "shatter", 70, 1) + else + B.name = "broken carton" + B.force = 0 + B.throwforce = 0 + B.desc = "A carton with the bottom half burst open. Might give you a papercut." + transfer_fingerprints_to(B) qdel(src) -/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob) +/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user) if(!target) return @@ -40,25 +50,24 @@ if(user.a_intent != I_HARM || !isGlass) return ..() - force = 15 //Smashing bottles over someoen's head hurts. var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at - var/armor_block = 0 //Get the target's armour values for normal attack damage. + var/armor_block = 0 //Get the target's armor values for normal attack damage. var/armor_duration = 0 //The more force the bottle has, the longer the duration. //Calculating duration and calculating damage. if(ishuman(target)) var/mob/living/carbon/human/H = target - var/headarmor = 0 // Target's head armour - armor_block = H.run_armor_check(affecting, "melee", armour_penetration = armour_penetration) // For normal attack damage + var/headarmor = 0 // Target's head armor + armor_block = H.run_armor_check(affecting, "melee","","",armour_penetration) // For normal attack damage //If they have a hat/helmet and the user is targeting their head. if(istype(H.head, /obj/item/clothing/head) && affecting == "head") - // If their head has an armour value, assign headarmor to it, else give it 0. + // If their head has an armor value, assign headarmor to it, else give it 0. if(H.head.armor["melee"]) headarmor = H.head.armor["melee"] else @@ -70,221 +79,201 @@ armor_duration = (duration - headarmor) + force else - //Only humans can have armour, right? + //Only humans can have armor, right? armor_block = target.run_armor_check(affecting, "melee") if(affecting == "head") armor_duration = duration + force armor_duration /= 10 //Apply the damage! - target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0) + armor_block = min(90, armor_block) + target.apply_damage(force, BRUTE, affecting, armor_block) // You are going to knock someone out for longer if they are not wearing a helmet. - if(affecting == "head" && istype(target, /mob/living/carbon/)) - - //Display an attack message. - for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been hit over the head with a bottle of [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] hit himself with a bottle of [src.name] on the head!"), 1) + var/head_attack_message = "" + if(affecting == "head" && iscarbon(target)) + head_attack_message = " on the head" //Weaken the target for the duration that we calculated and divide it by 5. if(armor_duration) target.apply_effect(min(armor_duration, 10) , WEAKEN) // Never weaken more than a flash! + //Display an attack message. + if(target != user) + target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]!", \ + "[user] has hit [target][head_attack_message] with a bottle of [src.name]!") else - //Default attack message and don't weaken the target. - for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been attacked with a bottle of [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] has attacked himself with a bottle of [src.name]!"), 1) + user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]!", \ + "[target] hits \himself with a bottle of [src.name][head_attack_message]!") //Attack logs - user.attack_log += text("\[[time_stamp()]\] Has attacked [key_name(target)] with a bottle!") - target.attack_log += text("\[[time_stamp()]\] Has been smashed with a bottle by [key_name(user)]") - if(target.ckey) - msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with a bottle. (INTENT: [uppertext(user.a_intent)])") - if(!iscarbon(user)) - target.LAssailant = null - else - target.LAssailant = user + add_logs(target, user, "attacked", src) //The reagents in the bottle splash all over the target, thanks for the idea Nodrak - if(src.reagents) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\blue The contents of the [src] splashes all over [target]!"), 1) - src.reagents.reaction(target, TOUCH) + SplashReagents(target) //Finally, smash the bottle. This kills (del) the bottle. - src.smash(target, user) + smash(target, user) - return +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(mob/M) + if(reagents && reagents.total_volume) + M.visible_message("The contents of \the [src] splashes all over [M]!") + reagents.reaction(M, TOUCH) + reagents.clear_reagents() //Keeping this here for now, I'll ask if I should keep it here. /obj/item/weapon/broken_bottle - - name = "broken bottle" + name = "Broken Bottle" desc = "A bottle with a sharp broken bottom." icon = 'icons/obj/drinks.dmi' icon_state = "broken_bottle" - force = 9.0 - throwforce = 5.0 + force = 9 + throwforce = 5 throw_speed = 3 throw_range = 5 + w_class = 1 item_state = "beer" hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("stabbed", "slashed", "attacked") - sharp = 1 - edge = 0 var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") + sharp = 1 + edge = 1 /obj/item/weapon/reagent_containers/food/drinks/bottle/gin - name = "\improper Griffeater Gin" + name = "Griffeater Gin" desc = "A bottle of high quality gin, produced in the New London Space Station." icon_state = "ginbottle" - New() - ..() - reagents.add_reagent("gin", 100) + list_reagents = list("gin" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey - name = "\improper Uncle Git's Special Reserve" + name = "Uncle Git's Special Reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." icon_state = "whiskeybottle" - New() - ..() - reagents.add_reagent("whiskey", 100) + list_reagents = list("whiskey" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka - name = "\improper Tunguska Triple Distilled" + name = "Tunguska Triple Distilled" desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." icon_state = "vodkabottle" - New() - ..() - reagents.add_reagent("vodka", 100) + list_reagents = list("vodka" = 100) -/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla - name = "\improper Caccavo Guaranteed Quality Tequilla" +/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka/badminka + name = "Badminka Vodka" + desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'." + icon_state = "badminka" + list_reagents = list("vodka" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/tequila + name = "Caccavo Guaranteed Quality Tequila" desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!" - icon_state = "tequillabottle" - New() - ..() - reagents.add_reagent("tequilla", 100) + icon_state = "tequilabottle" + list_reagents = list("tequila" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing - name = "\improper Bottle of Nothing" - desc = "A bottle filled with nothing" + name = "Bottle of Nothing" + desc = "A bottle filled with nothing." icon_state = "bottleofnothing" - New() - ..() - reagents.add_reagent("nothing", 100) + list_reagents = list("nothing" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/patron - name = "\improper Wrapp Artiste Patron" - desc = "Silver laced tequilla, served in space night clubs across the galaxy." + name = "Wrapp Artiste Patron" + desc = "Silver laced tequila, served in space night clubs across the galaxy." icon_state = "patronbottle" - New() - ..() - reagents.add_reagent("patron", 100) + list_reagents = list("patron" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/rum - name = "\improper Captain Pete's Cuban Spiced Rum" + name = "Captain Pete's Cuban Spiced Rum" desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." icon_state = "rumbottle" - New() - ..() - reagents.add_reagent("rum", 100) + list_reagents = list("rum" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater - name = "\improper Flask of Holy Water" + name = "Flask of Holy Water" desc = "A flask of the chaplain's holy water." icon_state = "holyflask" - New() - ..() - reagents.add_reagent("holywater", 100) + list_reagents = list("holywater" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell + desc = "A flask of holy water...it's been sitting in the Necropolis a while though." + list_reagents = list("hell_water" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth - name = "\improper Goldeneye Vermouth" + name = "Goldeneye Vermouth" desc = "Sweet, sweet dryness~" icon_state = "vermouthbottle" - New() - ..() - reagents.add_reagent("vermouth", 100) + list_reagents = list("vermouth" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua - name = "\improper Robert Robust's Coffee Liqueur" - desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK" + name = "Robert Robust's Coffee Liqueur" + desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK." icon_state = "kahluabottle" - New() - ..() - reagents.add_reagent("kahlua", 100) + list_reagents = list("kahlua" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager - name = "\improper College Girl Goldschlager" + name = "College Girl Goldschlager" desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." icon_state = "goldschlagerbottle" - New() - ..() - reagents.add_reagent("goldschlager", 100) + list_reagents = list("goldschlager" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac - name = "\improper Chateau De Baton Premium Cognac" + name = "Chateau De Baton Premium Cognac" desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" - New() - ..() - reagents.add_reagent("cognac", 100) + list_reagents = list("cognac" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/wine - name = "\improper Doublebeard Bearded Special Wine" + name = "Doublebeard Bearded Special Wine" desc = "A faint aura of unease and asspainery surrounds the bottle." icon_state = "winebottle" - New() - ..() - reagents.add_reagent("wine", 100) + list_reagents = list("wine" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe - name = "\improper Jailbreaker Verte" - desc = "One sip of this and you just know you're gonna have a good time." + name = "Extra-Strong Absinthe" + desc = "An strong alcoholic drink brewed and distributed by" icon_state = "absinthebottle" - New() - ..() - reagents.add_reagent("absinthe", 100) + list_reagents = list("absinthe" = 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium + name = "Gwyn's Premium Absinthe" + desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs." + icon_state = "absinthepremium" + +/obj/item/weapon/reagent_containers/food/drinks/bottle/hcider + name = "Jian Hard Cider" + desc = "Apple juice for adults." + icon_state = "hcider" + volume = 50 + list_reagents = list("suicider" = 50) //////////////////////////JUICES AND STUFF /////////////////////// /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice - name = "orange juice" + name = "Orange Juice" desc = "Full of vitamins and deliciousness!" icon_state = "orangejuice" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("orangejuice", 100) + list_reagents = list("orangejuice" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/cream - name = "milk cream" + name = "Milk Cream" desc = "It's cream. Made from milk. What else did you think you'd find in there?" icon_state = "cream" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("cream", 100) + list_reagents = list("cream" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice - name = "tomato juice" + name = "Tomato Juice" desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." icon_state = "tomatojuice" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("tomatojuice", 100) + list_reagents = list("tomatojuice" = 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice - name = "lime juice" + name = "Lime Juice" desc = "Sweet-sour goodness." icon_state = "limejuice" item_state = "carton" isGlass = 0 - New() - ..() - reagents.add_reagent("limejuice", 100) + list_reagents = list("limejuice" = 100) diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index b2ba9cf7a36..23ce26cf5e4 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -11,626 +11,549 @@ righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' materials = list(MAT_GLASS=500) - - proc/smash(mob/living/target as mob, mob/living/user as mob) - //Creates a shattering noise and replaces the drinking glass with a glass shard - user.drop_item() - var/obj/item/weapon/shard/S = new /obj/item/weapon/shard(user.loc) - user.put_in_active_hand(S) - - playsound(src, "shatter", 70, 1) - user.put_in_active_hand(S) - src.transfer_fingerprints_to(S) - - qdel(src) - - - attack(mob/living/target as mob, mob/living/user as mob) - - if(!target) +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs + var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I + if(reagents) + if(reagents.total_volume >= reagents.maximum_volume) + to_chat(user, "[src] is full.") + else + to_chat(user, "You break [E] in [src].") + E.reagents.trans_to(src, E.reagents.total_volume) + qdel(E) return + else + ..() - if(user.a_intent != I_HARM) - return ..() - - force = 5 - - var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at - - var/armor_block = 0 //Get the target's armour values for normal attack damage. - - //Calculating damage. - if(ishuman(target)) - - var/mob/living/carbon/human/H = target - armor_block = H.run_armor_check(affecting, "melee") // For normal attack damage - - else - //Only humans can have armour, right? - armor_block = target.run_armor_check(affecting, "melee") - - //Apply the damage! - target.apply_damage(force, BRUTE, affecting, armor_block) - - if(affecting == "head" && istype(target, /mob/living/carbon/)) - - //Display an attack message. - for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been hit over the head with a [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] hit himself with a [src.name] on the head!"), 1) - - else - //Default attack message - for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been attacked with a [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] has attacked himself with a [src.name]!"), 1) - - //Attack logs - user.attack_log += text("\[[time_stamp()]\] Has attacked [target.name] ([target.ckey]) with a drinking glass!") - target.attack_log += text("\[[time_stamp()]\] Has been smashed with a drinking glass by [user.name] ([user.ckey])") - log_attack("[user.name] ([user.ckey]) attacked [target.name] with a drinking glass. ([target.ckey])") - if(!iscarbon(user)) - target.LAssailant = null - else - target.LAssailant = user - - //The reagents in the bottle splash all over the target, thanks for the idea Nodrak - if(src.reagents) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\blue The contents of the [src] splashes all over [target]!"), 1) - src.reagents.reaction(target, TOUCH) - - //Finally, smash the bottle. This kills (del) the bottle. - src.smash(target, user) +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() // *scream + if(reagents.reagent_list.len > 0) + switch(reagents.get_master_reagent_id()) + if("beer") + icon_state = "beerglass" + name = "Beer glass" + desc = "A freezing pint of beer" + if("cider") + icon_state = "rewriter" + name = "Cider" + desc = "a refreshing glass of traditional cider" + if("beer2") + icon_state = "beerglass" + name = "Beer glass" + desc = "A freezing pint of beer" + if("ale") + icon_state = "aleglass" + name = "Ale glass" + desc = "A freezing pint of delicious Ale" + if("milk") + icon_state = "glass_white" + name = "Glass of milk" + desc = "White and nutritious goodness!" + if("cream") + icon_state = "glass_white" + name = "Glass of cream" + desc = "Ewwww..." + if("chocolate") + icon_state = "chocolateglass" + name = "Glass of chocolate" + desc = "Tasty" + if("hot_coco") + icon_state = "hot_coco" + name = "Glass of hot coco" + desc = "Delicious and cozy" + if("lemonjuice") + icon_state = "lemonglass" + name = "Glass of lemonjuice" + desc = "Sour..." + if("cola") + icon_state = "glass_brown" + name = "Glass of Space Cola" + desc = "A glass of refreshing Space Cola" + if("nuka_cola") + icon_state = "nuka_colaglass" + name = "Nuka Cola" + desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" + if("orangejuice") + icon_state = "glass_orange" + name = "Glass of Orange juice" + desc = "Vitamins! Yay!" + if("tomatojuice") + icon_state = "glass_red" + name = "Glass of Tomato juice" + desc = "Are you sure this is tomato juice?" + if("blood") + icon_state = "glass_red" + name = "Glass of Tomato juice" + desc = "Are you sure this is tomato juice?" + if("limejuice") + icon_state = "glass_green" + name = "Glass of Lime juice" + desc = "A glass of sweet-sour lime juice." + if("whiskey") + icon_state = "whiskeyglass" + name = "Glass of whiskey" + desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + if("gin") + icon_state = "ginvodkaglass" + name = "Glass of gin" + desc = "A crystal clear glass of Griffeater gin." + if("vodka") + icon_state = "ginvodkaglass" + name = "Glass of vodka" + desc = "The glass contain wodka. Xynta." + if("sake") + icon_state = "ginvodkaglass" + name = "Glass of Sake" + desc = "A glass of Sake." + if("goldschlager") + icon_state = "ginvodkaglass" + name = "Glass of goldschlager" + desc = "100 proof that teen girls will drink anything with gold in it." + if("wine") + icon_state = "wineglass" + name = "Glass of wine" + desc = "A very classy looking drink." + if("cognac") + icon_state = "cognacglass" + name = "Glass of cognac" + desc = "Damn, you feel like some kind of French aristocrat just by holding this." + if("kahlua") + icon_state = "kahluaglass" + name = "Glass of RR coffee Liquor" + desc = "DAMN, THIS THING LOOKS ROBUST" + if("vermouth") + icon_state = "vermouthglass" + name = "Glass of Vermouth" + desc = "You wonder why you're even drinking this straight." + if("triple_citrus") + icon_state = "triplecitrus" + name = "Glass of Triplecitrus Juice" + desc = "As colorful and healthy as it is delicious." + if("mojito") + icon_state = "mojito" + name = "Glass of Mojito" + desc = "Fresh from Spesscuba." + if("tequila") + icon_state = "tequilaglass" + name = "Glass of Tequila" + desc = "Now all that's missing is the weird colored shades!" + if("patron") + icon_state = "patronglass" + name = "Glass of Patron" + desc = "Drinking patron in the bar, with all the subpar ladies." + if("rum") + icon_state = "rumglass" + name = "Glass of Rum" + desc = "Now you want to Pray for a pirate suit, don't you?" + if("absinthe") + icon_state = "absinthebottle" + name = "Glass of Absinthe" + desc = "The green fairy is going to get you now!" + if("gintonic") + icon_state = "gintonicglass" + name = "Gin and Tonic" + desc = "A mild but still great cocktail. Drink up, like a true Englishman." + if("ginsonic") + icon_state = "ginsonic" + name = "Gin and Sonic" + desc = "An extremely high amperage drink. Absolutely not for the true Englishman." + if("whiskeycola") + icon_state = "whiskeycolaglass" + name = "Whiskey Cola" + desc = "An innocent-looking mixture of cola and Whiskey. Delicious." + if("whiterussian") + icon_state = "whiterussianglass" + name = "White Russian" + desc = "A very nice looking drink. But that's just, like, your opinion, man." + if("screwdrivercocktail") + icon_state = "screwdriverglass" + name = "Screwdriver" + desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + if("bloodymary") + icon_state = "bloodymaryglass" + name = "Bloody Mary" + desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + if("martini") + icon_state = "martiniglass" + name = "Classic Martini" + desc = "Damn, the bartender even stirred it, not shook it." + if("vodkamartini") + icon_state = "martiniglass" + name = "Vodka martini" + desc ="A bastardisation of the classic martini. Still great." + if("gargleblaster") + icon_state = "gargleblasterglass" + name = "Pan-Galactic Gargle Blaster" + desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." + if("bravebull") + icon_state = "bravebullglass" + name = "Brave Bull" + desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up." + if("tequilasunrise") + icon_state = "tequilasunriseglass" + name = "Tequila Sunrise" + desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + if("toxinsspecial") + icon_state = "toxinsspecialglass" + name = "Toxins Special" + desc = "Whoah, this thing is on FIRE" + if("beepskysmash") + icon_state = "beepskysmashglass" + name = "Beepsky Smash" + desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + if("doctorsdelight") + icon_state = "doctorsdelightglass" + name = "Doctor's Delight" + desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." + if("manlydorf") + icon_state = "manlydorfglass" + name = "The Manly Dorf" + desc = "A manly concotion made from Ale and Beer. Intended for true men only." + if("irishcream") + icon_state = "irishcreamglass" + name = "Irish Cream" + desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + if("cubalibre") + icon_state = "cubalibreglass" + name = "Cuba Libre" + desc = "A classic mix of rum and cola." + if("b52") + icon_state = "b52glass" + name = "B-52" + desc = "Kahlua, Irish Cream, and congac. You will get bombed." + if("atomicbomb") + icon_state = "atomicbombglass" + name = "Atomic Bomb" + desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + if("longislandicedtea") + icon_state = "longislandicedteaglass" + name = "Long Island Iced Tea" + desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + if("threemileisland") + icon_state = "threemileislandglass" + name = "Three Mile Island Ice Tea" + desc = "A glass of this is sure to prevent a meltdown." + if("margarita") + icon_state = "margaritaglass" + name = "Margarita" + desc = "On the rocks with salt on the rim. Arriba~!" + if("blackrussian") + icon_state = "blackrussianglass" + name = "Black Russian" + desc = "For the lactose-intolerant. Still as classy as a White Russian." + if("vodkatonic") + icon_state = "vodkatonicglass" + name = "Vodka and Tonic" + desc = "For when a gin and tonic isn't russian enough." + if("manhattan") + icon_state = "manhattanglass" + name = "Manhattan" + desc = "The Detective's undercover drink of choice. He never could stomach gin..." + if("manhattan_proj") + icon_state = "proj_manhattanglass" + name = "Manhattan Project" + desc = "A scienitst drink of choice, for thinking how to blow up the station." + if("ginfizz") + icon_state = "ginfizzglass" + name = "Gin Fizz" + desc = "Refreshingly lemony, deliciously dry." + if("irishcoffee") + icon_state = "irishcoffeeglass" + name = "Irish Coffee" + desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + if("suicider") + icon_state = "suicider" + name = "Suicider" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + if("whiskeysoda") + icon_state = "whiskeysodaglass2" + name = "Whiskey Soda" + desc = "Ultimate refreshment." + if("tonic") + icon_state = "glass_clear" + name = "Glass of Tonic Water" + desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." + if("sodawater") + icon_state = "glass_clear" + name = "Glass of Soda Water" + desc = "Soda water. Why not make a scotch and soda?" + if("water") + icon_state = "glass_clear" + name = "Glass of Water" + desc = "The father of all refreshments." + if("spacemountainwind") + icon_state = "Space_mountain_wind_glass" + name = "Glass of Space Mountain Wind" + desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." + if("thirteenloko") + icon_state = "thirteen_loko_glass" + name = "Glass of Thirteen Loko" + desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" + if("dr_gibb") + icon_state = "dr_gibb_glass" + name = "Glass of Dr. Gibb" + desc = "Dr. Gibb. Not as dangerous as the name might imply." + if("space_up") + icon_state = "space-up_glass" + name = "Glass of Space-up" + desc = "Space-up. It helps keep your cool." + if("moonshine") + icon_state = "glass_clear" + name = "Moonshine" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + if("soymilk") + icon_state = "glass_white" + name = "Glass of soy milk" + desc = "White and nutritious soy goodness!" + if("berryjuice") + icon_state = "berryjuice" + name = "Glass of berry juice" + desc = "Berry juice. Or maybe its jam. Who cares?" + if("poisonberryjuice") + icon_state = "poisonberryjuice" + name = "Glass of poison berry juice" + desc = "A glass of deadly juice." + if("carrotjuice") + icon_state = "carrotjuice" + name = "Glass of carrot juice" + desc = "It is just like a carrot but without crunching." + if("potato") + icon_state = "glass_brown" + name = "Glass of potato juice" + desc = "Who in the hell requests this? Gross!" + if("banana") + icon_state = "banana" + name = "Glass of banana juice" + desc = "The raw essence of a banana. HONK" + if("bahama_mama") + icon_state = "bahama_mama" + name = "Bahama Mama" + desc = "Tropic cocktail" + if("singulo") + icon_state = "singulo" + name = "Singulo" + desc = "A blue-space beverage." + if("alliescocktail") + icon_state = "alliescocktail" + name = "Allies cocktail" + desc = "A drink made from your allies." + if("antifreeze") + icon_state = "antifreeze" + name = "Anti-freeze" + desc = "The ultimate refreshment." + if("barefoot") + icon_state = "b&p" + name = "Barefoot" + desc = "Barefoot and pregnant" + if("demonsblood") + icon_state = "demonsblood" + name = "Demons Blood" + desc = "Just looking at this thing makes the hair at the back of your neck stand up." + if("booger") + icon_state = "booger" + name = "Booger" + desc = "Ewww..." + if("snowwhite") + icon_state = "snowwhite" + name = "Snow White" + desc = "A cold refreshment." + if("aloe") + icon_state = "aloe" + name = "Aloe" + desc = "Very, very, very good." + if("andalusia") + icon_state = "andalusia" + name = "Andalusia" + desc = "A nice, strange named drink." + if("sbiten") + icon_state = "sbitenglass" + name = "Sbiten" + desc = "A spicy mix of Vodka and Spice. Very hot." + if("red_mead") + icon_state = "red_meadglass" + name = "Red Mead" + desc = "A True Vikings Beverage, though its color is strange." + if("mead") + icon_state = "meadglass" + name = "Mead" + desc = "A Vikings Beverage, though a cheap one." + if("iced_beer") + icon_state = "iced_beerglass" + name = "Iced Beer" + desc = "A beer so frosty, the air around it freezes." + if("grog") + icon_state = "grogglass" + name = "Grog" + desc = "A fine and cepa drink for Space." + if("soy_latte") + icon_state = "soy_latte" + name = "Soy Latte" + desc = "A nice and refrshing beverage while you are reading." + if("cafe_latte") + icon_state = "cafe_latte" + name = "Cafe Latte" + desc = "A nice, strong and refreshing beverage while you are reading." + if("cafe_mocha") + icon_state = "cafe_latte" + name = "Cafe Mocha" + desc = "The perfect blend of coffe, milk, and chocolate." + if("acidspit") + icon_state = "acidspitglass" + name = "Acid Spit" + desc = "A drink from Nanotrasen. Made from live aliens." + if("amasec") + icon_state = "amasecglass" + name = "Amasec" + desc = "Always handy before COMBAT!!!" + if("neurotoxin") + icon_state = "neurotoxinglass" + name = "Neurotoxin" + desc = "A drink that is guaranteed to knock you silly." + if("hippiesdelight") + icon_state = "hippiesdelightglass" + name = "Hippie's Delight" + desc = "A drink enjoyed by people during the 1960's." + if("bananahonk") + icon_state = "bananahonkglass" + name = "Banana Honk" + desc = "A drink from Banana Heaven." + if("silencer") + icon_state = "silencerglass" + name = "Silencer" + desc = "A drink from mime Heaven." + if("nothing") + icon_state = "nothing" + name = "Nothing" + desc = "Absolutely nothing." + if("devilskiss") + icon_state = "devilskiss" + name = "Devils Kiss" + desc = "Creepy time!" + if("changelingsting") + icon_state = "changelingsting" + name = "Changeling Sting" + desc = "A stingy drink." + if("irishcarbomb") + icon_state = "irishcarbomb" + name = "Irish Car Bomb" + desc = "An irish car bomb." + if("syndicatebomb") + icon_state = "syndicatebomb" + name = "Syndicate Bomb" + desc = "A syndicate bomb." + if("erikasurprise") + icon_state = "erikasurprise" + name = "Erika Surprise" + desc = "The surprise is, it's green!" + if("driestmartini") + icon_state = "driestmartiniglass" + name = "Driest Martini" + desc = "Only for the experienced. You think you see sand floating in the glass." + if("ice") + icon_state = "iceglass" + name = "Glass of ice" + desc = "Generally, you're supposed to put something else in there too..." + if("icecoffee") + icon_state = "icedcoffeeglass" + name = "Iced Coffee" + desc = "A drink to perk you up and refresh you!" + if("coffee") + icon_state = "glass_brown" + name = "Glass of coffee" + desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + if("bilk") + icon_state = "glass_brown" + name = "Glass of bilk" + desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + if("fuel") + icon_state = "dr_gibb_glass" + name = "Glass of welder fuel" + desc = "Unless you are an industrial tool, this is probably not safe for consumption." + if("brownstar") + icon_state = "brownstar" + name = "Brown Star" + desc = "Its not what it sounds like..." + if("tea") + icon_state = "glass_brown" + name = "Glass of Tea" + desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?" + if("icetea") + icon_state = "icetea" + name = "Iced Tea" + desc = "No relation to a certain rap artist/ actor." + if("milkshake") + icon_state = "milkshake" + name = "Milkshake" + desc = "Glorious brainfreezing mixture." + if("lemonade") + icon_state = "lemonade" + name = "Lemonade" + desc = "Oh the nostalgia..." + if("kiraspecial") + icon_state = "kiraspecial" + name = "Kira Special" + desc = "Long live the guy who everyone had mistaken for a girl. Baka!" + if("rewriter") + icon_state = "rewriter" + name = "Rewriter" + desc = "The secert of the sanctuary of the Libarian..." + if("applejack") + icon_state = "cognacglass" + name = "Glass of applejack" + desc = "When cider isn't strong enough, you gotta jack it." + if("jackrose") + icon_state = "patronglass" + name = "Jack Rose" + desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s." + if("synthanol") + icon_state = "synthanolglass" + name = "Glass of Synthanol" + desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." + if("robottears") + icon_state = "robottearsglass" + name = "Glass of Robot Tears" + desc = "No robots were hurt in the making of this drink." + if("trinary") + icon_state = "trinaryglass" + name = "Glass of Trinary" + desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." + if("servo") + icon_state = "servoglass" + name = "Glass of Servo" + desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." + if("synthnsoda") + icon_state = "synthnsodaglass" + name = "Glass of Synth 'n Soda" + desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon." + if("synthignon") + icon_state = "synthignonglass" + name = "Glass of Synthignon" + desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." + if("uplink") + icon_state = "uplinkglass" + name = "Glass of Uplink" + desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." + if("holywater") + icon_state = "glass_clear" + name = "Glass of Water" + desc = "The father of all refreshments." - on_reagent_change() - /*if(reagents.reagent_list.len > 1 ) - icon_state = "glass_brown" - name = "Glass of Hooch" - desc = "Two or more drinks, mixed together."*/ - /*else if(reagents.reagent_list.len == 1) - for(var/datum/reagent/R in reagents.reagent_list) - switch(R.id)*/ - if(reagents.reagent_list.len > 0) - //mrid = R.get_master_reagent_id() - switch(reagents.get_master_reagent_id()) - if("beer") - icon_state = "beerglass" - name = "Beer glass" - desc = "A freezing pint of beer" - if("cider") - icon_state = "rewriter" - name = "Cider" - desc = "a refreshing glass of traditional cider" - if("beer2") - icon_state = "beerglass" - name = "Beer glass" - desc = "A freezing pint of beer" - if("ale") - icon_state = "aleglass" - name = "Ale glass" - desc = "A freezing pint of delicious Ale" - if("milk") - icon_state = "glass_white" - name = "Glass of milk" - desc = "White and nutritious goodness!" - if("cream") - icon_state = "glass_white" - name = "Glass of cream" - desc = "Ewwww..." - if("chocolate") - icon_state = "chocolateglass" - name = "Glass of chocolate" - desc = "Tasty" - if("hot_coco") - icon_state = "hot_coco" - name = "Glass of hot coco" - desc = "Delicious and cozy" - if("lemonjuice") - icon_state = "lemonglass" - name = "Glass of lemonjuice" - desc = "Sour..." - if("cola") - icon_state = "glass_brown" - name = "Glass of Space Cola" - desc = "A glass of refreshing Space Cola" - if("nuka_cola") - icon_state = "nuka_colaglass" - name = "Nuka Cola" - desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" - if("orangejuice") - icon_state = "glass_orange" - name = "Glass of Orange juice" - desc = "Vitamins! Yay!" - if("tomatojuice") - icon_state = "glass_red" - name = "Glass of Tomato juice" - desc = "Are you sure this is tomato juice?" - if("blood") - icon_state = "glass_red" - name = "Glass of Tomato juice" - desc = "Are you sure this is tomato juice?" - if("limejuice") - icon_state = "glass_green" - name = "Glass of Lime juice" - desc = "A glass of sweet-sour lime juice." - if("whiskey") - icon_state = "whiskeyglass" - name = "Glass of whiskey" - desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - if("gin") - icon_state = "ginvodkaglass" - name = "Glass of gin" - desc = "A crystal clear glass of Griffeater gin." - if("vodka") - icon_state = "ginvodkaglass" - name = "Glass of vodka" - desc = "The glass contain wodka. Xynta." - if("sake") - icon_state = "ginvodkaglass" - name = "Glass of Sake" - desc = "A glass of Sake." - if("goldschlager") - icon_state = "ginvodkaglass" - name = "Glass of goldschlager" - desc = "100 proof that teen girls will drink anything with gold in it." - if("wine") - icon_state = "wineglass" - name = "Glass of wine" - desc = "A very classy looking drink." - if("cognac") - icon_state = "cognacglass" - name = "Glass of cognac" - desc = "Damn, you feel like some kind of French aristocrat just by holding this." - if("kahlua") - icon_state = "kahluaglass" - name = "Glass of RR coffee Liquor" - desc = "DAMN, THIS THING LOOKS ROBUST" - if("vermouth") - icon_state = "vermouthglass" - name = "Glass of Vermouth" - desc = "You wonder why you're even drinking this straight." - if("triple_citrus") - icon_state = "triplecitrus" - name = "Glass of Triplecitrus Juice" - desc = "As colorful and healthy as it is delicious." - if("mojito") - icon_state = "mojito" - name = "Glass of Mojito" - desc = "Fresh from Spesscuba." - if("tequilla") - icon_state = "tequillaglass" - name = "Glass of Tequilla" - desc = "Now all that's missing is the weird colored shades!" - if("patron") - icon_state = "patronglass" - name = "Glass of Patron" - desc = "Drinking patron in the bar, with all the subpar ladies." - if("rum") - icon_state = "rumglass" - name = "Glass of Rum" - desc = "Now you want to Pray for a pirate suit, don't you?" - if("absinthe") - icon_state = "absinthebottle" - name = "Glass of Absinthe" - desc = "The green fairy is going to get you now!" - if("gintonic") - icon_state = "gintonicglass" - name = "Gin and Tonic" - desc = "A mild but still great cocktail. Drink up, like a true Englishman." - if("ginsonic") - icon_state = "ginsonic" - name = "Gin and Sonic" - desc = "An extremely high amperage drink. Absolutely not for the true Englishman." - if("whiskeycola") - icon_state = "whiskeycolaglass" - name = "Whiskey Cola" - desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - if("whiterussian") - icon_state = "whiterussianglass" - name = "White Russian" - desc = "A very nice looking drink. But that's just, like, your opinion, man." - if("screwdrivercocktail") - icon_state = "screwdriverglass" - name = "Screwdriver" - desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - if("bloodymary") - icon_state = "bloodymaryglass" - name = "Bloody Mary" - desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." - if("martini") - icon_state = "martiniglass" - name = "Classic Martini" - desc = "Damn, the bartender even stirred it, not shook it." - if("vodkamartini") - icon_state = "martiniglass" - name = "Vodka martini" - desc ="A bastardisation of the classic martini. Still great." - if("gargleblaster") - icon_state = "gargleblasterglass" - name = "Pan-Galactic Gargle Blaster" - desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." - if("bravebull") - icon_state = "bravebullglass" - name = "Brave Bull" - desc = "Tequilla and Coffee liquor, brought together in a mouthwatering mixture. Drink up." - if("tequillasunrise") - icon_state = "tequillasunriseglass" - name = "Tequilla Sunrise" - desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - if("toxinsspecial") - icon_state = "toxinsspecialglass" - name = "Toxins Special" - desc = "Whoah, this thing is on FIRE" - if("beepskysmash") - icon_state = "beepskysmashglass" - name = "Beepsky Smash" - desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - if("doctorsdelight") - icon_state = "doctorsdelightglass" - name = "Doctor's Delight" - desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." - if("manlydorf") - icon_state = "manlydorfglass" - name = "The Manly Dorf" - desc = "A manly concotion made from Ale and Beer. Intended for true men only." - if("irishcream") - icon_state = "irishcreamglass" - name = "Irish Cream" - desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - if("cubalibre") - icon_state = "cubalibreglass" - name = "Cuba Libre" - desc = "A classic mix of rum and cola." - if("b52") - icon_state = "b52glass" - name = "B-52" - desc = "Kahlua, Irish Cream, and congac. You will get bombed." - if("atomicbomb") - icon_state = "atomicbombglass" - name = "Atomic Bomb" - desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - if("longislandicedtea") - icon_state = "longislandicedteaglass" - name = "Long Island Iced Tea" - desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - if("threemileisland") - icon_state = "threemileislandglass" - name = "Three Mile Island Ice Tea" - desc = "A glass of this is sure to prevent a meltdown." - if("margarita") - icon_state = "margaritaglass" - name = "Margarita" - desc = "On the rocks with salt on the rim. Arriba~!" - if("blackrussian") - icon_state = "blackrussianglass" - name = "Black Russian" - desc = "For the lactose-intolerant. Still as classy as a White Russian." - if("vodkatonic") - icon_state = "vodkatonicglass" - name = "Vodka and Tonic" - desc = "For when a gin and tonic isn't russian enough." - if("manhattan") - icon_state = "manhattanglass" - name = "Manhattan" - desc = "The Detective's undercover drink of choice. He never could stomach gin..." - if("manhattan_proj") - icon_state = "proj_manhattanglass" - name = "Manhattan Project" - desc = "A scienitst drink of choice, for thinking how to blow up the station." - if("ginfizz") - icon_state = "ginfizzglass" - name = "Gin Fizz" - desc = "Refreshingly lemony, deliciously dry." - if("irishcoffee") - icon_state = "irishcoffeeglass" - name = "Irish Coffee" - desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - if("suicider") - icon_state = "suicider" - name = "Suicider" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("whiskeysoda") - icon_state = "whiskeysodaglass2" - name = "Whiskey Soda" - desc = "Ultimate refreshment." - if("tonic") - icon_state = "glass_clear" - name = "Glass of Tonic Water" - desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - if("sodawater") - icon_state = "glass_clear" - name = "Glass of Soda Water" - desc = "Soda water. Why not make a scotch and soda?" - if("water") - icon_state = "glass_clear" - name = "Glass of Water" - desc = "The father of all refreshments." - if("spacemountainwind") - icon_state = "Space_mountain_wind_glass" - name = "Glass of Space Mountain Wind" - desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - if("thirteenloko") - icon_state = "thirteen_loko_glass" - name = "Glass of Thirteen Loko" - desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass" - if("dr_gibb") - icon_state = "dr_gibb_glass" - name = "Glass of Dr. Gibb" - desc = "Dr. Gibb. Not as dangerous as the name might imply." - if("space_up") - icon_state = "space-up_glass" - name = "Glass of Space-up" - desc = "Space-up. It helps keep your cool." - if("moonshine") - icon_state = "glass_clear" - name = "Moonshine" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - if("soymilk") - icon_state = "glass_white" - name = "Glass of soy milk" - desc = "White and nutritious soy goodness!" - if("berryjuice") - icon_state = "berryjuice" - name = "Glass of berry juice" - desc = "Berry juice. Or maybe its jam. Who cares?" - if("poisonberryjuice") - icon_state = "poisonberryjuice" - name = "Glass of poison berry juice" - desc = "A glass of deadly juice." - if("carrotjuice") - icon_state = "carrotjuice" - name = "Glass of carrot juice" - desc = "It is just like a carrot but without crunching." - if("potato") - icon_state = "glass_brown" - name = "Glass of potato juice" - desc = "Who in the hell requests this? Gross!" - if("banana") - icon_state = "banana" - name = "Glass of banana juice" - desc = "The raw essence of a banana. HONK" - if("bahama_mama") - icon_state = "bahama_mama" - name = "Bahama Mama" - desc = "Tropic cocktail" - if("singulo") - icon_state = "singulo" - name = "Singulo" - desc = "A blue-space beverage." - if("alliescocktail") - icon_state = "alliescocktail" - name = "Allies cocktail" - desc = "A drink made from your allies." - if("antifreeze") - icon_state = "antifreeze" - name = "Anti-freeze" - desc = "The ultimate refreshment." - if("barefoot") - icon_state = "b&p" - name = "Barefoot" - desc = "Barefoot and pregnant" - if("demonsblood") - icon_state = "demonsblood" - name = "Demons Blood" - desc = "Just looking at this thing makes the hair at the back of your neck stand up." - if("booger") - icon_state = "booger" - name = "Booger" - desc = "Ewww..." - if("snowwhite") - icon_state = "snowwhite" - name = "Snow White" - desc = "A cold refreshment." - if("aloe") - icon_state = "aloe" - name = "Aloe" - desc = "Very, very, very good." - if("andalusia") - icon_state = "andalusia" - name = "Andalusia" - desc = "A nice, strange named drink." - if("sbiten") - icon_state = "sbitenglass" - name = "Sbiten" - desc = "A spicy mix of Vodka and Spice. Very hot." - if("red_mead") - icon_state = "red_meadglass" - name = "Red Mead" - desc = "A True Vikings Beverage, though its color is strange." - if("mead") - icon_state = "meadglass" - name = "Mead" - desc = "A Vikings Beverage, though a cheap one." - if("iced_beer") - icon_state = "iced_beerglass" - name = "Iced Beer" - desc = "A beer so frosty, the air around it freezes." - if("grog") - icon_state = "grogglass" - name = "Grog" - desc = "A fine and cepa drink for Space." - if("soy_latte") - icon_state = "soy_latte" - name = "Soy Latte" - desc = "A nice and refrshing beverage while you are reading." - if("cafe_latte") - icon_state = "cafe_latte" - name = "Cafe Latte" - desc = "A nice, strong and refreshing beverage while you are reading." - if("cafe_mocha") - icon_state = "cafe_latte" - name = "Cafe Mocha" - desc = "The perfect blend of coffe, milk, and chocolate." - if("acidspit") - icon_state = "acidspitglass" - name = "Acid Spit" - desc = "A drink from Nanotrasen. Made from live aliens." - if("amasec") - icon_state = "amasecglass" - name = "Amasec" - desc = "Always handy before COMBAT!!!" - if("neurotoxin") - icon_state = "neurotoxinglass" - name = "Neurotoxin" - desc = "A drink that is guaranteed to knock you silly." - if("hippiesdelight") - icon_state = "hippiesdelightglass" - name = "Hippie's Delight" - desc = "A drink enjoyed by people during the 1960's." - if("bananahonk") - icon_state = "bananahonkglass" - name = "Banana Honk" - desc = "A drink from Banana Heaven." - if("silencer") - icon_state = "silencerglass" - name = "Silencer" - desc = "A drink from mime Heaven." - if("nothing") - icon_state = "nothing" - name = "Nothing" - desc = "Absolutely nothing." - if("devilskiss") - icon_state = "devilskiss" - name = "Devils Kiss" - desc = "Creepy time!" - if("changelingsting") - icon_state = "changelingsting" - name = "Changeling Sting" - desc = "A stingy drink." - if("irishcarbomb") - icon_state = "irishcarbomb" - name = "Irish Car Bomb" - desc = "An irish car bomb." - if("syndicatebomb") - icon_state = "syndicatebomb" - name = "Syndicate Bomb" - desc = "A syndicate bomb." - if("erikasurprise") - icon_state = "erikasurprise" - name = "Erika Surprise" - desc = "The surprise is, it's green!" - if("driestmartini") - icon_state = "driestmartiniglass" - name = "Driest Martini" - desc = "Only for the experienced. You think you see sand floating in the glass." - if("ice") - icon_state = "iceglass" - name = "Glass of ice" - desc = "Generally, you're supposed to put something else in there too..." - if("icecoffee") - icon_state = "icedcoffeeglass" - name = "Iced Coffee" - desc = "A drink to perk you up and refresh you!" - if("coffee") - icon_state = "glass_brown" - name = "Glass of coffee" - desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - if("bilk") - icon_state = "glass_brown" - name = "Glass of bilk" - desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - if("fuel") - icon_state = "dr_gibb_glass" - name = "Glass of welder fuel" - desc = "Unless you are an industrial tool, this is probably not safe for consumption." - if("brownstar") - icon_state = "brownstar" - name = "Brown Star" - desc = "Its not what it sounds like..." - if("tea") - icon_state = "glass_brown" - name = "Glass of Tea" - desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?" - if("icetea") - icon_state = "icetea" - name = "Iced Tea" - desc = "No relation to a certain rap artist/ actor." - if("milkshake") - icon_state = "milkshake" - name = "Milkshake" - desc = "Glorious brainfreezing mixture." - if("lemonade") - icon_state = "lemonade" - name = "Lemonade" - desc = "Oh the nostalgia..." - if("kiraspecial") - icon_state = "kiraspecial" - name = "Kira Special" - desc = "Long live the guy who everyone had mistaken for a girl. Baka!" - if("rewriter") - icon_state = "rewriter" - name = "Rewriter" - desc = "The secert of the sanctuary of the Libarian..." - if("applejack") - icon_state = "cognacglass" - name = "Glass of applejack" - desc = "When cider isn't strong enough, you gotta jack it." - if("jackrose") - icon_state = "patronglass" - name = "Jack Rose" - desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s." - if("synthanol") - icon_state = "synthanolglass" - name = "Glass of Synthanol" - desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." - if("robottears") - icon_state = "robottearsglass" - name = "Glass of Robot Tears" - desc = "No robots were hurt in the making of this drink." - if("trinary") - icon_state = "trinaryglass" - name = "Glass of Trinary" - desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." - if("servo") - icon_state = "servoglass" - name = "Glass of Servo" - desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." - if("synthnsoda") - icon_state = "synthnsodaglass" - name = "Glass of Synth 'n Soda" - desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon." - if("synthignon") - icon_state = "synthignonglass" - name = "Glass of Synthignon" - desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." - if("uplink") - icon_state = "uplinkglass" - name = "Glass of Uplink" - desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." - if("holywater") - icon_state = "glass_clear" - name = "Glass of Water" - desc = "The father of all refreshments." - - - else - icon_state ="glass_brown" - name = "Glass of ..what?" - desc = "You can't really tell what this is." - else - icon_state = "glass_empty" - name = "glass" - desc = "Your standard drinking glass." -// center_of_mass = list("x"=16, "y"=10) - return + else + icon_state ="glass_brown" + name = "Glass of ..what?" + desc = "You can't really tell what this is." + else + icon_state = "glass_empty" + name = "glass" + desc = "Your standard drinking glass." // for /obj/machinery/vending/sovietsoda /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda - New() - ..() - reagents.add_reagent("sodawater", 50) - on_reagent_change() + list_reagents = list("sodawater" = 50) + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola - New() - ..() - reagents.add_reagent("cola", 50) - on_reagent_change() + list_reagents = list("cola" = 50) /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss - New() - ..() - reagents.add_reagent("devilskiss", 50) - on_reagent_change() + list_reagents = list("devilskiss" = 50) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/drinks/jar.dm b/code/modules/reagents/reagent_containers/food/drinks/jar.dm deleted file mode 100644 index 1ddd831ea90..00000000000 --- a/code/modules/reagents/reagent_containers/food/drinks/jar.dm +++ /dev/null @@ -1,29 +0,0 @@ - - -///jar - -/obj/item/weapon/reagent_containers/food/drinks/jar - name = "empty jar" - desc = "A jar. You're not sure what it's supposed to hold." - icon_state = "jar" - item_state = "beaker" - New() - ..() - reagents.add_reagent("slimejelly", 50) - - on_reagent_change() - if(reagents.reagent_list.len > 0) - switch(reagents.get_master_reagent_id()) - if("slimejelly") - icon_state = "jar_slime" - name = "slime jam" - desc = "A jar of slime jam. Delicious!" - else - icon_state ="jar_what" - name = "jar of something" - desc = "You can't really tell what this is." - else - icon_state = "jar" - name = "empty jar" - desc = "A jar. You're not sure what it's supposed to hold." - return diff --git a/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm b/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm index 46289547909..42781cd1e57 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm @@ -11,10 +11,15 @@ if(reagents.total_volume) var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]1") - switch(reagents.total_volume) - if(0 to 4) filling.icon_state = "[icon_state]1" - if(5 to 11) filling.icon_state = "[icon_state]5" - if(12 to INFINITY) filling.icon_state = "[icon_state]12" + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 25) + filling.icon_state = "[icon_state]1" + if(26 to 79) + filling.icon_state = "[icon_state]5" + if(80 to INFINITY) + filling.icon_state = "[icon_state]12" filling.icon += mix_color_from_reagents(reagents.reagent_list) overlays += filling diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm deleted file mode 100644 index 75919c4314f..00000000000 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ /dev/null @@ -1,104 +0,0 @@ -/* - -/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob, params) - - if(istype(W,/obj/item/weapon/shard) || istype(W,/obj/item/weapon/reagent_containers/food/snacks)) - var/obj/item/weapon/reagent_containers/food/snacks/csandwich/S = new(get_turf(src)) - S.attackby(W,user, params) - qdel(src) - ..() - -/obj/item/weapon/reagent_containers/food/snacks/csandwich - name = "sandwich" - desc = "The best thing since sliced bread." - icon_state = "breadslice" - trash = /obj/item/trash/plate - bitesize = 2 - - var/list/ingredients = list() - -/obj/item/weapon/reagent_containers/food/snacks/csandwich/attackby(obj/item/W as obj, mob/user as mob, params) - - var/sandwich_limit = 4 - for(var/obj/item/O in ingredients) - if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/breadslice)) - sandwich_limit += 4 - - if(src.contents.len > sandwich_limit) - to_chat(user, "\red If you put anything else on \the [src] it's going to collapse.") - return - else if(istype(W,/obj/item/weapon/shard)) - to_chat(user, "\blue You hide [W] in \the [src].") - user.drop_item() - W.loc = src - update() - return - else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks)) - to_chat(user, "\blue You layer [W] over \the [src].") - var/obj/item/weapon/reagent_containers/F = W - F.reagents.trans_to(src, F.reagents.total_volume) - user.drop_item() - W.loc = src - ingredients += W - update() - return - ..() - -/obj/item/weapon/reagent_containers/food/snacks/csandwich/proc/update() - var/fullname = "" //We need to build this from the contents of the var. - var/i = 0 - - overlays.Cut() - - for(var/obj/item/weapon/reagent_containers/food/snacks/O in ingredients) - - i++ - if(i == 1) - fullname += "[O.name]" - else if(i == ingredients.len) - fullname += " and [O.name]" - else - fullname += ", [O.name]" - - var/image/I = new(src.icon, "sandwich_filling") - I.color = O.filling_color - I.pixel_x = pick(list(-1,0,1)) - I.pixel_y = (i*2)+1 - overlays += I - - var/image/T = new(src.icon, "sandwich_top") - T.pixel_x = pick(list(-1,0,1)) - T.pixel_y = (ingredients.len * 2)+1 - overlays += T - - name = lowertext("[fullname] sandwich") - if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich" - w_class = n_ceil(Clamp((ingredients.len/2),1,3)) - -/obj/item/weapon/reagent_containers/food/snacks/csandwich/Destroy() - for(var/obj/item/O in ingredients) - qdel(O) - return ..() - -/obj/item/weapon/reagent_containers/food/snacks/csandwich/examine(mob/user) - ..(user) - var/obj/item/O = pick(contents) - to_chat(user, "\blue You think you can see [O.name] in there.") - -/obj/item/weapon/reagent_containers/food/snacks/csandwich/attack(mob/M as mob, mob/user as mob, def_zone) - - var/obj/item/shard - for(var/obj/item/O in contents) - if(istype(O,/obj/item/weapon/shard)) - shard = O - break - - var/mob/living/H - if(istype(M,/mob/living)) - H = M - - if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. - to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") - H.adjustBruteLoss(5) //TODO: Target head if human. - ..() -*/ \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index cf0b9132b57..2dbc77e0ba7 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -114,17 +114,6 @@ to_chat(user, "[target] is full.") return - // /vg/: Logging transfers of bad things - if(target.reagents_to_log.len) - var/list/badshit=list() - for(var/bad_reagent in target.reagents_to_log) - if(reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl = "([english_list(badshit)])" - message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") - log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - var/trans = reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "You transfer [trans] units of the solution to [target].") @@ -132,12 +121,6 @@ to_chat(user, "You cannot fill [target] while it is sealed.") return - /*else if(istype(target, /obj/machinery/bunsen_burner)) - return - - else if(istype(target, /obj/machinery/radiocarbon_spectrometer)) - return*/ - else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids return @@ -148,7 +131,7 @@ return -/obj/item/weapon/reagent_containers/glass/attackby(var/obj/item/I, mob/user as mob, params) +/obj/item/weapon/reagent_containers/glass/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird return if(is_hot(I)) @@ -181,22 +164,11 @@ item_state = "beaker" materials = list(MAT_GLASS=500) var/obj/item/device/assembly_holder/assembly = null + var/can_assembly = 1 /obj/item/weapon/reagent_containers/glass/beaker/on_reagent_change() update_icon() -/obj/item/weapon/reagent_containers/glass/beaker/pickup(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/dropped(mob/user) - ..() - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/attack_hand() - ..() - update_icon() - /obj/item/weapon/reagent_containers/glass/beaker/update_icon() overlays.Cut() @@ -233,7 +205,7 @@ set name = "Remove Assembly" set category = "Object" set src in usr - if(usr.stat || !usr.canmove || usr.restrained()) + if(usr.incapacitated()) return if(assembly) to_chat(usr, "You detach [assembly] from \the [src]") @@ -248,8 +220,8 @@ reagents.chem_temp += 30 reagents.handle_reactions() -/obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W,/obj/item/device/assembly_holder)) +/obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/device/assembly_holder) && can_assembly) if(assembly) to_chat(usr, "The [src] already has an assembly.") return ..() @@ -299,6 +271,17 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25) flags = OPENCONTAINER + can_assembly = 0 + +/obj/item/weapon/reagent_containers/glass/beaker/drugs + name = "baggie" + desc = "A baggie. Can hold up to 10 units." + icon_state = "baggie" + amount_per_transfer_from_this = 2 + possible_transfer_amounts = 2 + volume = 10 + flags = OPENCONTAINER + can_assembly = 0 /obj/item/weapon/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" @@ -319,15 +302,21 @@ possible_transfer_amounts = list(5,10,15,25,30,50,100,300) flags = OPENCONTAINER + /obj/item/weapon/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) /obj/item/weapon/reagent_containers/glass/beaker/sulphuric list_reagents = list("sacid" = 50) + /obj/item/weapon/reagent_containers/glass/beaker/slime list_reagents = list("slimejelly" = 50) +/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth + list_reagents = list("methamphetamine" = 10) + + /obj/item/weapon/reagent_containers/glass/bucket desc = "It's a bucket." name = "bucket" @@ -349,14 +338,4 @@ user.unEquip(src) qdel(src) else - ..() - -/obj/item/weapon/reagent_containers/glass/beaker/vial - name = "vial" - desc = "Small glass vial. Looks fragile." - icon_state = "vial" - materials = list(MAT_GLASS=500) - volume = 15 - amount_per_transfer_from_this = 5 - possible_transfer_amounts = list(1,5,15) - flags = OPENCONTAINER \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 73f0afc9a61..dd69297780a 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -17,31 +17,27 @@ /obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user) if(!reagents.total_volume) - to_chat(user, "\red [src] is empty.") + to_chat(user, "[src] is empty!") return - if(!istype(M)) + if(!iscarbon(M)) return - if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) - to_chat(user, "\blue You inject [M] with [src].") - to_chat(M, "\red You feel a tiny prick!") - src.reagents.add_reagent(M) + if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) // Ignore flag should be checked first or there will be an error message. + to_chat(M, "You feel a tiny prick!") + to_chat(user, "You inject [M] with [src].") + if(M.reagents) var/list/injected = list() - for(var/datum/reagent/R in src.reagents.reagent_list) + for(var/datum/reagent/R in reagents.reagent_list) injected += R.name - var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained]") - if(M.ckey) - msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user var/trans = reagents.trans_to(M, amount_per_transfer_from_this) - to_chat(user, "\blue [trans] units injected. [reagents.total_volume] units remaining in [src].") + + to_chat(user, "[trans] unit\s injected. [reagents.total_volume] unit\s remaining in [src].") + + var/contained = english_list(injected) + + add_logs(M, user, "injected", src, "([contained])") /obj/item/weapon/reagent_containers/hypospray/CMO list_reagents = list("omnizine" = 30) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 7f027fc8a97..1da5f07b2e5 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -17,7 +17,7 @@ icon_state = "pill[rand(1,20)]" /obj/item/weapon/reagent_containers/food/pill/attack_self(mob/user) - return + return /obj/item/weapon/reagent_containers/food/pill/attack(mob/living/carbon/M, mob/user, def_zone) if(!istype(M)) @@ -38,17 +38,6 @@ to_chat(user, "[target] is empty. Cant dissolve [src].") return - // /vg/: Logging transfers of bad things - if(target.reagents_to_log.len) - var/list/badshit=list() - for(var/bad_reagent in target.reagents_to_log) - if(reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl = "([english_list(badshit)])" - message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") - log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - to_chat(user, "You dissolve [src] in [target].") reagents.trans_to(target, reagents.total_volume) for(var/mob/O in viewers(2, user)) @@ -56,8 +45,6 @@ spawn(5) qdel(src) - return - //////////////////////////////////////////////////////////////////////////////// /// Pills. END //////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index b268b6aa883..71232fa1dad 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -209,40 +209,15 @@ if(ismob(target) && target == user) src.reagents.reaction(target, INGEST) - if(isobj(target)) - // /vg/: Logging transfers of bad things - if(target.reagents_to_log.len) - var/list/badshit=list() - for(var/bad_reagent in target.reagents_to_log) - if(reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl = "([english_list(badshit)])" - message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] ") - log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - spawn(5) var/datum/reagent/blood/B for(var/datum/reagent/blood/d in src.reagents.reagent_list) B = d break - var/datum/reagent/water/W - for(var/datum/reagent/water/r in src.reagents.reagent_list) - W = r - break var/trans - if(W && istype(target,/mob/living/carbon/human/slime)) - var/mob/living/carbon/human/slime/S = target - S.vessel.add_reagent("water", 5) - S.vessel.update_total() if(B && istype(target,/mob/living/carbon)) - if(istype(target,/mob/living/carbon/human/slime)) - var/mob/living/carbon/human/slime/S = target - S.reagents.add_reagent("blood", 5) - S.reagents.update_total() - else - var/mob/living/carbon/C = target - C.inject_blood(src,5) + var/mob/living/carbon/C = target + C.inject_blood(src, 5) else trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index cf1181a0653..9024904f7e3 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -54,6 +54,7 @@ /obj/machinery/disposal/initialize() // this will get a copy of the air turf and take a SEND PRESSURE amount of air from it + ..() var/atom/L = loc var/datum/gas_mixture/env = new env.copy_from(L.return_air()) @@ -1376,4 +1377,4 @@ else dirs = alldirs.Copy() - src.streak(dirs) \ No newline at end of file + src.streak(dirs) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 79536efbe60..28a03e5f790 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -45,6 +45,7 @@ heat_gen /= max(1, tot_rating) /obj/machinery/r_n_d/server/initialize() + ..() if(!files) files = new /datum/research(src) var/list/temp_list if(!id_with_upload.len) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 96746f780d8..4eb8d06ceb3 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -16,11 +16,11 @@ name = "Slime management console" desc = "A computer used for remotely handling slimes." networks = list("SS13") - off_action = new/datum/action/camera_off/xenobio - var/datum/action/slime_place/slime_place_action = new - var/datum/action/slime_pick_up/slime_up_action = new - var/datum/action/feed_slime/feed_slime_action = new - var/datum/action/monkey_recycle/monkey_recycle_action = new + off_action = new /datum/action/innate/camera_off/xenobio + var/datum/action/innate/slime_place/slime_place_action = new + var/datum/action/innate/slime_pick_up/slime_up_action = new + var/datum/action/innate/feed_slime/feed_slime_action = new + var/datum/action/innate/monkey_recycle/monkey_recycle_action = new var/list/stored_slimes = list() var/max_slimes = 5 @@ -62,7 +62,7 @@ return return ..() -/datum/action/camera_off/xenobio/Activate() +/datum/action/innate/camera_off/xenobio/Activate() if(!target || !ishuman(target)) return var/mob/living/carbon/C = target @@ -88,12 +88,11 @@ src.Remove(C) -/datum/action/slime_place +/datum/action/innate/slime_place name = "Place Slimes" - action_type = AB_INNATE button_icon_state = "slime_down" -/datum/action/slime_place/Activate() +/datum/action/innate/slime_place/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner @@ -106,12 +105,11 @@ S.visible_message("[S] warps in!") X.stored_slimes -= S -/datum/action/slime_pick_up +/datum/action/innate/slime_pick_up name = "Pick up Slime" - action_type = AB_INNATE button_icon_state = "slime_up" -/datum/action/slime_pick_up/Activate() +/datum/action/innate/slime_pick_up/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner @@ -131,12 +129,11 @@ X.stored_slimes += S -/datum/action/feed_slime +/datum/action/innate/feed_slime name = "Feed Slimes" - action_type = AB_INNATE button_icon_state = "monkey_down" -/datum/action/feed_slime/Activate() +/datum/action/innate/feed_slime/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner @@ -151,12 +148,11 @@ to_chat(owner, "[X] now has [X.monkeys] monkeys left.") -/datum/action/monkey_recycle +/datum/action/innate/monkey_recycle name = "Recycle Monkeys" - action_type = AB_INNATE button_icon_state = "monkey_up" -/datum/action/monkey_recycle/Activate() +/datum/action/innate/monkey_recycle/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 2810617bd12..2595d9bf95d 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -47,7 +47,7 @@ name = "Activate Pill" /datum/action/item_action/hands_free/activate_pill/Trigger() - if(!Checks()) + if(!..()) return to_chat(owner, "You grit your teeth and burst the implanted [target]!") add_logs(owner, null, "swallowed an implanted pill", target) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index b753bcf71a5..2fa12d1a0dc 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -49,7 +49,7 @@ implant_color = "#DE7E00" slot = "brain_antidrop" origin_tech = "materials=5;programming=4;biotech=4" - organ_action_name = "Toggle Anti-Drop" + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click() active = !active @@ -263,7 +263,7 @@ implant_color = "#007ACC" slot = "shoulders" origin_tech = "materials=5;biotech=4;powerstorage=4" - organ_action_name = "Toggle Arm Mod" + actions_types = list(/datum/action/item_action/organ_action/toggle) var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! var/out = 0//determines if the item is in the owner's hand or not var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. @@ -319,7 +319,7 @@ desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_tase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" - organ_action_name = "Toggle Arm Cannon Taser" + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) @@ -329,7 +329,7 @@ desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_lase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it - organ_action_name = "Toggle Arm Cannon Laser" + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() holder = new /obj/item/weapon/gun/energy/laser/mounted(src) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 27ab9ea3b99..9c28a60b055 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -8,9 +8,7 @@ var/zone = "chest" var/slot vital = 0 - var/organ_action_name = null var/non_primary = 0 - action_button_custom_type = /datum/action/item_action/organ_action /obj/item/organ/internal/New(var/mob/living/carbon/holder) if(istype(holder)) @@ -41,8 +39,9 @@ parent.internal_organs |= src //M.internal_organs_by_name[src] |= src(H,1) loc = null - if(organ_action_name) - action_button_name = organ_action_name + for(var/X in actions) + var/datum/action/A = X + A.Grant(M) /obj/item/organ/internal/remove(mob/living/carbon/M, special = 0) @@ -61,14 +60,18 @@ else parent.internal_organs -= src - if(organ_action_name) - action_button_name = null + for(var/X in actions) + var/datum/action/A = X + A.Remove(M) /obj/item/organ/internal/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) insert(target) ..() +/obj/item/organ/internal/item_action_slot_check(slot, mob/user) + return + /obj/item/organ/internal/proc/on_find(mob/living/finder) return @@ -197,7 +200,7 @@ icon_state = "cursedheart-off" icon_base = "cursedheart" origin_tech = "biotech=5" - organ_action_name = "pump your blood" + actions_types = list(/datum/action/item_action/organ_action/cursed_heart) var/last_pump = 0 var/pump_delay = 30 //you can pump 1 second early, for lag, but no more (otherwise you could spam heal) var/blood_loss = 100 //600 blood is human default, so 5 failures (below 122 blood is where humans die because reasons?) @@ -235,25 +238,33 @@ if(owner) to_chat(owner, "Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!") + +/datum/action/item_action/organ_action/cursed_heart + name = "pump your blood" + //You are now brea- pumping blood manually -/obj/item/organ/internal/heart/cursed/ui_action_click() - if(world.time < (last_pump + (pump_delay-10))) //no spam - to_chat(owner, "Too soon!") - return +/datum/action/item_action/organ_action/cursed_heart/Trigger() + . = ..() + if(. && istype(target,/obj/item/organ/internal/heart/cursed)) + var/obj/item/organ/internal/heart/cursed/cursed_heart = target - last_pump = world.time - playsound(owner, 'sound/effects/singlebeat.ogg', 40, 1) - to_chat(owner, "Your heart beats.") + if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam + to_chat(owner, "Too soon!") + return - var/mob/living/carbon/human/H = owner - if(istype(H)) - H.vessel.add_reagent("blood", (blood_loss*0.5))//gain half the blood back from a failure - if(owner.client) - owner.client.color = "" + cursed_heart.last_pump = world.time + playsound(owner,'sound/effects/singlebeat.ogg',40,1) + to_chat(owner, "Your heart beats.") - H.adjustBruteLoss(-heal_brute) - H.adjustFireLoss(-heal_burn) - H.adjustOxyLoss(-heal_oxy) + var/mob/living/carbon/human/H = owner + if(istype(H)) + H.vessel.add_reagent("blood", (cursed_heart.blood_loss*0.5))//gain half the blood back from a failure + if(owner.client) + owner.client.color = "" + + H.adjustBruteLoss(-cursed_heart.heal_brute) + H.adjustFireLoss(-cursed_heart.heal_burn) + H.adjustOxyLoss(-cursed_heart.heal_oxy) /obj/item/organ/internal/lungs name = "lungs" @@ -346,7 +357,7 @@ if(!owner) return owner.disabilities &= ~NEARSIGHTED - owner.sdisabilities &= ~BLIND + owner.disabilities &= ~BLIND owner.eye_blurry = 0 owner.eye_blind = 0 @@ -527,7 +538,7 @@ to_chat(owner, "HONK") owner.sleeping = 0 owner.stuttering = 20 - owner.ear_deaf = 30 + owner.adjustEarDamage(0, 30) owner.Weaken(3) owner << 'sound/items/AirHorn.ogg' if(prob(30)) diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm index b2f6945b6f1..0bd2d138948 100644 --- a/code/modules/surgery/organs/pain.dm +++ b/code/modules/surgery/organs/pain.dm @@ -12,8 +12,6 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0 return if(reagents.has_reagent("hydrocodone")) return - if(analgesic) - return if(world.time < next_pain_time && !force) return if(amount > 10 && istype(src,/mob/living/carbon/human)) @@ -55,8 +53,6 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) return if(reagents.has_reagent("hydrocodone")) return - if(analgesic) - return var/msg = "\red [message]" if(flash_strength >= 1) msg = "\red [message]" @@ -94,8 +90,6 @@ mob/living/carbon/human/proc/handle_pain() return if(reagents.has_reagent("hydrocodone")) return - if(analgesic) - return var/maxdam = 0 var/obj/item/organ/external/damaged_organ = null for(var/obj/item/organ/external/E in organs) diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm index 8277be6f241..0f75fe9f80f 100644 --- a/code/modules/surgery/organs/subtypes/diona.dm +++ b/code/modules/surgery/organs/subtypes/diona.dm @@ -170,7 +170,7 @@ if(!owner) return owner.disabilities &= ~NEARSIGHTED - owner.sdisabilities &= ~BLIND + owner.disabilities &= ~BLIND owner.eye_blurry = 0 owner.eye_blind = 0 diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 1249a58c0d0..d64fbf70e3d 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -150,7 +150,7 @@ if(!owner) return owner.disabilities &= ~NEARSIGHTED - owner.sdisabilities &= ~BLIND + owner.disabilities &= ~BLIND owner.eye_blurry = 0 owner.eye_blind = 0 diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 2ae4e439e5e..f226edc08eb 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -40,6 +40,8 @@ desc = "An artificially made bluespace crystal, it looks delicate." origin_tech = "bluespace=2" blink_range = 4 // Not as good as the organic stuff! + points = 0 // nice try + refined_type = null // Polycrystals, aka stacks diff --git a/code/world.dm b/code/world.dm index e11070d8e79..6fa54acfbe7 100644 --- a/code/world.dm +++ b/code/world.dm @@ -282,31 +282,6 @@ var/world_topic_spam_protect_time = world.timeofday sleep_check = world.timeofday waiting++ //#undef INACTIVITY_KICK -/* -#define DISCONNECTED_DELETE 6000 //10 minutes in ticks (approx) -/world/proc/KickDisconnectedClients() - spawn(-1) - //set background = 1 - while(1) - sleep(DISCONNECTED_DELETE) - for(var/mob/living/carbon/human/C in living_mob_list) - if(dd_hasprefix(C.key,@)) return - if(!C.client && C.brain_op_stage!=4.0 && C.lastKnownIP) - sleep(600) - if(!C.client && C.stat != DEAD && C.brain_op_stage!=4.0) - job_master.FreeRole(C.job) - message_admins("[key_name_admin(C)], the [C.job] has been freed due to (Client disconnect for 10 minutes)\n") - for(var/obj/item/W in C) - C.unEquip(W) - del(C) - else if(!C.key && C.stat != DEAD && C.brain_op_stage!=4.0) - job_master.FreeRole(C.job) - message_admins("[key_name_admin(C)], the [C.job] has been freed due to (Client quit BYOND)\n") - for(var/obj/item/W in C) - C.unEquip(W) - del(C) -#undef INACTIVITY_KICK -*/ /hook/startup/proc/loadMode() world.load_mode() diff --git a/html/changelog.html b/html/changelog.html index 53d19fd8d73..df0593625b4 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,162 @@ -->
+

20 July 2016

+

Allfd updated:

+
    +
  • Added hologram fluff sprites
  • +
+

Ar3nn updated:

+
    +
  • Gets rid of some weird lattices floating in mid-space
  • +
+

Chakirski updated:

+
    +
  • Adds M.E. Reaper sprite.
  • +
  • AI can now choose a 32x64 reaper hologram.
  • +
  • Cigarette packs no longer show near-duplicate messages when examined.
  • +
+

CrAzYPiLoT updated:

+
    +
  • Ports randomized space ruins from /tg/ station. There is a number of maps which can be spawned at any location on the empty z-level at roundstart, and up to three random ones will be chosen each round. Credits to KorPhaeron.
  • +
  • Lays the groundwork for a future lavaland implementation, if we choose to have it.
  • +
  • Adds a feature to the map loader where areas with the right var set can be distinctly initialized on map load - meaning separate APCs, and the like.
  • +
  • Using a z-level specific initialization freeze system, large elaborate maps like the cyberiad can be loaded without a single runtime, with minimal impact on the round elsewhere.
  • +
  • Adds a delete mode to the "Fill" buildmode - just alt-click for the second corner, and everything within will be removed.
  • +
  • Adds a "Jump To" function in VV, which is useful for getting an idea of what exactly you're looking at.
  • +
  • Added view count to newscaster feeds and messages.
  • +
+

Crazylemon64 updated:

+
    +
  • Abductors consoles link correctly again
  • +
+

DaveTheHeadcrab updated:

+
    +
  • Plastic explosives are now a subtype of grenades. Shouldn't be any noticable difference for players.
  • +
  • Plastic explosives no longer use the wire datum. You may directly attach an assembly holder (Such as a remote signaller + igniter assembly)
  • +
  • Adds X-4 shaped charges, designed for breaching explosively without harming the user. Pick some up at your local nukies r us.
  • +
  • Replaces tablecrafting with personal crafting, click the hammer icon by your intent selector to use it.
  • +
  • Removes the PDA slot, your PDA can now go in your ID slot (Again).
  • +
  • You can now alt click to remove an ID from a PDA, for quick interaction while it's in your ID slot.
  • +
  • Adds an overlay for an ID while it's inserted into your PDA.
  • +
+

FalseIncarnate updated:

+
    +
  • Adds new Bottler machine for making unique beverages! Order one from cargo today!
  • +
  • Adds 6 new drinks obtainable via the Bottler. Get brewing!
  • +
  • Grapes now can be properly juiced again, as they now have the right kitchen tag.
  • +
  • Adds effects to the Paradise Pop reagents. Drink them all to unlock their powers!
  • +
+

Fox McCloud updated:

+
    +
  • Adds in fans which can block atmospherics passing over them
  • +
  • All mass driver blast doors have a fan underneath them, allowing you to use them repeatedly instead of once
  • +
  • Fixes medical, security, and employment records not being displayed
  • +
  • Adds in a weather system
  • +
  • Removes most of the miner's uniform equipment from their lockers and puts it in a miner's wardrobe
  • +
  • Miners start off with a lot of their clothing equipment equipped to them
  • +
  • Miners now have unique headset sprites
  • +
  • Miners no longer have lanterns, but a seclite; they can attach this to their kinetic accelerators now
  • +
  • Miners have workboots instead of black shoes
  • +
  • Miners no longer have a default mining scanner but an advanced one that works at reduced range (5 instead of 7) and has a longer cooldown between pulses (5 instead of 3.5)
  • +
  • removed extra mining hardsuit from the outpost
  • +
  • removed medikit spam from outpost; now just a toxin kit and a regular medical kit
  • +
  • Bluespace crystals now earn you points and can be refined into bluespace polycrystal sheets
  • +
  • Spare vouchers from QM and HoP removed
  • +
  • removed armor from the fake tactical turtleneck
  • +
  • Can scan vending machines with your PDA to pay for items (if there's an ID in your PDA)
  • +
  • Sleepers no longer require a console to build, only the sleeper itself
  • +
  • Clicking on the sleeper brings up the menu that was previously brought up for the console
  • +
  • Adds in syndicate sleepers--these sleepers are not only syndie themed but also allow the user to inject chems into themselves while inside the sleepers
  • +
  • Sleepers can now inject silver sulfadiazine
  • +
  • removes cryofeeds from cryodorms and adds in 2 more cryopods
  • +
  • Fixes pre-spawned loaded belts not having proper overlays
  • +
  • nanites will no longer purge chems, but will now heal internal organ damage, attempt to mend fractures, and will no longer cure beneficial viruses
  • +
  • cold and hot drinks should now properly heat you up or cool you down (this also goes for medical reagents)
  • +
  • beer no longer reduces jitteriness
  • +
  • toxins special and antifreeze heat you up
  • +
  • banana juice and banana honk now heals monkeys
  • +
  • Fixes atrazine not killing nymphs
  • +
  • mining autoinjectors no longer poison you
  • +
  • combat hypospray now has omni+epinephrine+teporone
  • +
  • stimpack is now meth+coffee instead of meth+epinephrine
  • +
  • Cheese and synth meat amount creation scales with volume of the reaction
  • +
  • sprinkles now heals all members of sec (brig phys, sec pod pilot, magistrate, and IAA are no longer left out)
  • +
  • Fixes syndi+shielded+hos hardsuit sprite issues
  • +
  • Fixes wizard's who have a regular satchel set in their prefs winding up with none
  • +
  • Spellbooks are automatically bound to wizards at round start (no more ragin' exploitative mages)
  • +
  • Fixes mining outpost lacking an APC
  • +
  • Fixes being able to exploit and turn artificial bluespace crystals into regular bluespace crystals
  • +
+

FreeStylaLT updated:

+
    +
  • Added courtroom, left of brig.
  • +
  • Remapped brig
  • +
  • Moved prisoner processing and evidence storage to the right of brig, next to Detective's office.
  • +
  • Changed current processing to Interrogation and a hallway.
  • +
  • Re-mapped Conference and Locker rooms.
  • +
  • Lots of other minor tweaks to brig.
  • +
  • Seriously, way too many small changes to list here, go and have a look at the brig yourself.
  • +
  • Removed temp. detainment and observation from brig.
  • +
+

KasparoVy updated:

+
    +
  • Wearing a suit will no longer cause runtimes due to the way suit-collars are handled.
  • +
  • The north direction sprite of the Vulpkanin 'Patch' facial hair style won't hang a pixel off the head anymore.
  • +
+

Krausus updated:

+
    +
  • All admins can now see "admin log" messages.
  • +
  • Admins can now toggle "admin log" messages on or off.
  • +
  • Admins will no longer be notified about ghosted admins jumping around.
  • +
  • Beating on simple animals will no longer be twice as noisy as intended.
  • +
  • Emergency Response Teams are now usable again.
  • +
+

Kyep updated:

+
    +
  • adds botany, basketball court, individual cells, library computer and more to perma. Makes it far less boring.
  • +
  • Tracking implants are now useful, showing the implanted person's general location, and health status, on prisoner consoles.
  • +
  • The NODROP flag now works correctly on jumpsuits.
  • +
  • Improved admin 'select equipment' verb. ERT option now works, costumes get IDs and proper headsets, two new costumes added, and some outfits minorly tweaked (e.g: tunnel clowns get toolbelts).
  • +
  • Prevented NPCs being made into objective targets.
  • +
+

LittleBigKid2000 and TullyBBurnalot updated:

+
    +
  • Stethoscopes can now be used to tell if a person's heart or lungs are damaged, or if they have any at all. Now they're actually useful instead of telling you the obvious in a vague way.
  • +
  • Stethoscopes can no longer be used to hear the heartbeat and breathing of a person that doesn't have a heart or lungs.
  • +
+

Tauka Usanake updated:

+
    +
  • Adds a Hydroponics HUD and a night vision version of it that can both be created in R&D. It provides additional details on plants in hydro trays and soil plots. Shows the health, nutrient, water, toxin, pest, and weed level of the plant as well as whenever it is ready to be harvested or is dead.
  • +
+

TullyBBurnalot updated:

+
    +
  • Handless cuffing no longer possible. Can still cuff people with one hand
  • +
+

TullyBurnalot updated:

+
    +
  • Mobs with PSY_RESISTANCE are no longer valid targets for REMOTE_VIEW
  • +
  • When emagged, Photocopiers now have a cooldown if used to copy butts
  • +
+

Twinmold updated:

+
    +
  • Fixes removing ID cards from laptops with the Eject ID verb.
  • +
+

monster860 updated:

+
    +
  • A bunch of interfaces now use /datum/browser.
  • +
  • The ChemMaster now uses the asset cache, eliminating the enormous lag spike when you first use it. Yey!
  • +
  • Fixes the window not closing when selecting an icon for the chem-master
  • +
  • Fixes the chem master window not updating when selecting an icon
  • +
  • The chem-master icon selection window now has a 4x5 grid of icons.
  • +
+

tigercat2000 updated:

+
    +
  • Gas tanks now have an action button for accessing their interface.
  • +
  • You can now shift-click on movable HUD elements (such as action buttons) to reset them to their initial position.
  • +
  • Implants with limited uses, such as freedom implants, now delete themselves when they run out of uses.
  • +
+

13 July 2016

Ar3nn updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e620d091fe4..ce569c985b3 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2225,3 +2225,169 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. monster860: - rscadd: The ChemMaster now uses NanoUI! Yey! - bugfix: Alerts are no broken ghostly outlines +2016-07-20: + Allfd: + - rscadd: Added hologram fluff sprites + Ar3nn: + - rscdel: Gets rid of some weird lattices floating in mid-space + Chakirski: + - imageadd: Adds M.E. Reaper sprite. + - rscadd: AI can now choose a 32x64 reaper hologram. + - tweak: Cigarette packs no longer show near-duplicate messages when examined. + CrAzYPiLoT: + - rscadd: Ports randomized space ruins from /tg/ station. There is a number of maps + which can be spawned at any location on the empty z-level at roundstart, and + up to three random ones will be chosen each round. Credits to KorPhaeron. + - rscadd: Lays the groundwork for a future lavaland implementation, if we choose + to have it. + - rscadd: Adds a feature to the map loader where areas with the right var set can + be distinctly initialized on map load - meaning separate APCs, and the like. + - rscadd: Using a z-level specific initialization freeze system, large elaborate + maps like the cyberiad can be loaded without a single runtime, with minimal + impact on the round elsewhere. + - rscadd: Adds a delete mode to the "Fill" buildmode - just alt-click for the second + corner, and everything within will be removed. + - rscadd: Adds a "Jump To" function in VV, which is useful for getting an idea of + what exactly you're looking at. + - rscadd: Added view count to newscaster feeds and messages. + Crazylemon64: + - bugfix: Abductors consoles link correctly again + DaveTheHeadcrab: + - tweak: Plastic explosives are now a subtype of grenades. Shouldn't be any noticable + difference for players. + - tweak: Plastic explosives no longer use the wire datum. You may directly attach + an assembly holder (Such as a remote signaller + igniter assembly) + - rscadd: Adds X-4 shaped charges, designed for breaching explosively without harming + the user. Pick some up at your local nukies r us. + - rscadd: Replaces tablecrafting with personal crafting, click the hammer icon by + your intent selector to use it. + - rscdel: Removes the PDA slot, your PDA can now go in your ID slot (Again). + - rscadd: You can now alt click to remove an ID from a PDA, for quick interaction + while it's in your ID slot. + - rscadd: Adds an overlay for an ID while it's inserted into your PDA. + FalseIncarnate: + - rscadd: Adds new Bottler machine for making unique beverages! Order one from cargo + today! + - rscadd: Adds 6 new drinks obtainable via the Bottler. Get brewing! + - bugfix: Grapes now can be properly juiced again, as they now have the right kitchen + tag. + - rscadd: Adds effects to the Paradise Pop reagents. Drink them all to unlock their + powers! + Fox McCloud: + - rscadd: Adds in fans which can block atmospherics passing over them + - bugfix: All mass driver blast doors have a fan underneath them, allowing you to + use them repeatedly instead of once + - bugfix: Fixes medical, security, and employment records not being displayed + - rscadd: Adds in a weather system + - tweak: Removes most of the miner's uniform equipment from their lockers and puts + it in a miner's wardrobe + - tweak: Miners start off with a lot of their clothing equipment equipped to them + - rscadd: Miners now have unique headset sprites + - tweak: Miners no longer have lanterns, but a seclite; they can attach this to + their kinetic accelerators now + - tweak: Miners have workboots instead of black shoes + - tweak: Miners no longer have a default mining scanner but an advanced one that + works at reduced range (5 instead of 7) and has a longer cooldown between pulses + (5 instead of 3.5) + - tweak: removed extra mining hardsuit from the outpost + - tweak: removed medikit spam from outpost; now just a toxin kit and a regular medical + kit + - rscadd: Bluespace crystals now earn you points and can be refined into bluespace + polycrystal sheets + - tweak: Spare vouchers from QM and HoP removed + - tweak: removed armor from the fake tactical turtleneck + - rscadd: Can scan vending machines with your PDA to pay for items (if there's an + ID in your PDA) + - tweak: Sleepers no longer require a console to build, only the sleeper itself + - tweak: Clicking on the sleeper brings up the menu that was previously brought + up for the console + - rscadd: Adds in syndicate sleepers--these sleepers are not only syndie themed + but also allow the user to inject chems into themselves while inside the sleepers + - tweak: Sleepers can now inject silver sulfadiazine + - tweak: removes cryofeeds from cryodorms and adds in 2 more cryopods + - bugfix: Fixes pre-spawned loaded belts not having proper overlays + - tweak: nanites will no longer purge chems, but will now heal internal organ damage, + attempt to mend fractures, and will no longer cure beneficial viruses + - bugfix: cold and hot drinks should now properly heat you up or cool you down (this + also goes for medical reagents) + - tweak: beer no longer reduces jitteriness + - tweak: toxins special and antifreeze heat you up + - tweak: banana juice and banana honk now heals monkeys + - bugfix: Fixes atrazine not killing nymphs + - tweak: mining autoinjectors no longer poison you + - tweak: combat hypospray now has omni+epinephrine+teporone + - tweak: stimpack is now meth+coffee instead of meth+epinephrine + - tweak: Cheese and synth meat amount creation scales with volume of the reaction + - tweak: sprinkles now heals all members of sec (brig phys, sec pod pilot, magistrate, + and IAA are no longer left out) + - bugfix: Fixes syndi+shielded+hos hardsuit sprite issues + - bugfix: Fixes wizard's who have a regular satchel set in their prefs winding up + with none + - bugfix: Spellbooks are automatically bound to wizards at round start (no more + ragin' exploitative mages) + - bugfix: Fixes mining outpost lacking an APC + - bugfix: Fixes being able to exploit and turn artificial bluespace crystals into + regular bluespace crystals + FreeStylaLT: + - rscadd: Added courtroom, left of brig. + - tweak: Remapped brig + - tweak: Moved prisoner processing and evidence storage to the right of brig, next + to Detective's office. + - tweak: Changed current processing to Interrogation and a hallway. + - tweak: Re-mapped Conference and Locker rooms. + - tweak: Lots of other minor tweaks to brig. + - tweak: Seriously, way too many small changes to list here, go and have a look + at the brig yourself. + - rscdel: Removed temp. detainment and observation from brig. + KasparoVy: + - bugfix: Wearing a suit will no longer cause runtimes due to the way suit-collars + are handled. + - bugfix: The north direction sprite of the Vulpkanin 'Patch' facial hair style + won't hang a pixel off the head anymore. + Krausus: + - tweak: All admins can now see "admin log" messages. + - rscadd: Admins can now toggle "admin log" messages on or off. + - tweak: Admins will no longer be notified about ghosted admins jumping around. + - bugfix: Beating on simple animals will no longer be twice as noisy as intended. + - bugfix: Emergency Response Teams are now usable again. + Kyep: + - tweak: adds botany, basketball court, individual cells, library computer and more + to perma. Makes it far less boring. + - tweak: Tracking implants are now useful, showing the implanted person's general + location, and health status, on prisoner consoles. + - bugfix: The NODROP flag now works correctly on jumpsuits. + - tweak: 'Improved admin ''select equipment'' verb. ERT option now works, costumes + get IDs and proper headsets, two new costumes added, and some outfits minorly + tweaked (e.g: tunnel clowns get toolbelts).' + - bugfix: Prevented NPCs being made into objective targets. + LittleBigKid2000 and TullyBBurnalot: + - rscadd: Stethoscopes can now be used to tell if a person's heart or lungs are + damaged, or if they have any at all. Now they're actually useful instead of + telling you the obvious in a vague way. + - bugfix: Stethoscopes can no longer be used to hear the heartbeat and breathing + of a person that doesn't have a heart or lungs. + Tauka Usanake: + - rscadd: Adds a Hydroponics HUD and a night vision version of it that can both + be created in R&D. It provides additional details on plants in hydro trays and + soil plots. Shows the health, nutrient, water, toxin, pest, and weed level of + the plant as well as whenever it is ready to be harvested or is dead. + TullyBBurnalot: + - tweak: Handless cuffing no longer possible. Can still cuff people with one hand + TullyBurnalot: + - tweak: Mobs with PSY_RESISTANCE are no longer valid targets for REMOTE_VIEW + - rscadd: When emagged, Photocopiers now have a cooldown if used to copy butts + Twinmold: + - bugfix: Fixes removing ID cards from laptops with the Eject ID verb. + monster860: + - rscadd: A bunch of interfaces now use /datum/browser. + - rscadd: The ChemMaster now uses the asset cache, eliminating the enormous lag + spike when you first use it. Yey! + - bugfix: Fixes the window not closing when selecting an icon for the chem-master + - bugfix: Fixes the chem master window not updating when selecting an icon + - tweak: The chem-master icon selection window now has a 4x5 grid of icons. + tigercat2000: + - rscadd: Gas tanks now have an action button for accessing their interface. + - rscadd: You can now shift-click on movable HUD elements (such as action buttons) + to reset them to their initial position. + - tweak: Implants with limited uses, such as freedom implants, now delete themselves + when they run out of uses. diff --git a/html/changelogs/AutoChangeLog-pr-4691.yml b/html/changelogs/AutoChangeLog-pr-4691.yml deleted file mode 100644 index f5da3e847c1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4691.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Tauka Usanake -delete-after: True -changes: - - rscadd: "Adds a Hydroponics HUD and a night vision version of it that can both be created in R&D. It provides additional details on plants in hydro trays and soil plots. Shows the health, nutrient, water, toxin, pest, and weed level of the plant as well as whenever it is ready to be harvested or is dead." diff --git a/html/changelogs/AutoChangeLog-pr-4766.yml b/html/changelogs/AutoChangeLog-pr-4766.yml deleted file mode 100644 index 08ce1490a18..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4766.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Kyep -delete-after: True -changes: - - tweak: "Tracking implants are now useful, showing the implanted person's general location, and health status, on prisoner consoles." - - bugfix: "The NODROP flag now works correctly on jumpsuits." diff --git a/html/changelogs/AutoChangeLog-pr-4780.yml b/html/changelogs/AutoChangeLog-pr-4780.yml deleted file mode 100644 index b12b862e58b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4780.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: CrAzYPiLoT -delete-after: True -changes: - - rscadd: "Ports randomized space ruins from /tg/ station. There is a number of maps which can be spawned at any location on the empty z-level at roundstart, and up to three random ones will be chosen each round. Credits to KorPhaeron." - - rscadd: "Lays the groundwork for a future lavaland implementation, if we choose to have it." - - rscadd: "Adds a feature to the map loader where areas with the right var set can be distinctly initialized on map load - meaning separate APCs, and the like." - - rscadd: "Using a z-level specific initialization freeze system, large elaborate maps like the cyberiad can be loaded without a single runtime, with minimal impact on the round elsewhere." - - rscadd: "Adds a delete mode to the \"Fill\" buildmode - just alt-click for the second corner, and everything within will be removed." - - rscadd: "Adds a \"Jump To\" function in VV, which is useful for getting an idea of what exactly you're looking at." diff --git a/html/changelogs/AutoChangeLog-pr-4838.yml b/html/changelogs/AutoChangeLog-pr-4838.yml deleted file mode 100644 index aaa0b54a91f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4838.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: FalseIncarnate -delete-after: True -changes: - - rscadd: "Adds new Bottler machine for making unique beverages! Order one from cargo today!" - - rscadd: "Adds 6 new drinks obtainable via the Bottler. Get brewing!" - - bugfix: "Grapes now can be properly juiced again, as they now have the right kitchen tag." diff --git a/html/changelogs/AutoChangeLog-pr-4843.yml b/html/changelogs/AutoChangeLog-pr-4843.yml deleted file mode 100644 index 4f34b686053..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4843.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: FreeStylaLT -delete-after: True -changes: - - rscadd: "Added courtroom, left of brig." - - tweak: "Remapped brig" - - tweak: "Moved prisoner processing and evidence storage to the right of brig, next to Detective's office." - - tweak: "Changed current processing to Interrogation and a hallway." - - tweak: "Re-mapped Conference and Locker rooms." - - tweak: "Lots of other minor tweaks to brig." - - tweak: "Seriously, way too many small changes to list here, go and have a look at the brig yourself." - - rscdel: "Removed temp. detainment and observation from brig." diff --git a/html/changelogs/AutoChangeLog-pr-4881.yml b/html/changelogs/AutoChangeLog-pr-4881.yml new file mode 100644 index 00000000000..2d7a5ed3321 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4881.yml @@ -0,0 +1,5 @@ +author: TullyBBurnalot +delete-after: True +changes: + - rscadd: "More beds outside the Operating Theaters, Pajama Wardrobes outside and inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per OR, table with cards" + - tweak: "Sinks moved closer to Surgical Tables, moved light fixtures in the Operating Theaters, tables with surgical tools now made of glass for maximum style points and Xenomorph Larva Whack-A-Mole" diff --git a/html/changelogs/AutoChangeLog-pr-4895.yml b/html/changelogs/AutoChangeLog-pr-4895.yml deleted file mode 100644 index c2a7433e6a0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4895.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: TullyBBurnalot -delete-after: True -changes: - - tweak: "Handless cuffing no longer possible. Can still cuff people with one hand" diff --git a/html/changelogs/AutoChangeLog-pr-4965.yml b/html/changelogs/AutoChangeLog-pr-4965.yml deleted file mode 100644 index a6942e01a2b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4965.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: TullyBurnalot -delete-after: True -changes: - - tweak: "Mobs with PSY_RESISTANCE are no longer valid targets for REMOTE_VIEW" diff --git a/html/changelogs/AutoChangeLog-pr-4971.yml b/html/changelogs/AutoChangeLog-pr-4971.yml deleted file mode 100644 index c5f00cfae84..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4971.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: monster860 -delete-after: True -changes: - - rscadd: "A bunch of interfaces now use /datum/browser." diff --git a/html/changelogs/AutoChangeLog-pr-5002.yml b/html/changelogs/AutoChangeLog-pr-5002.yml deleted file mode 100644 index 2cc493a1396..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5002.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Chakirski -delete-after: True -changes: - - imageadd: "Adds M.E. Reaper sprite." - - rscadd: "AI can now choose a 32x64 reaper hologram." diff --git a/html/changelogs/AutoChangeLog-pr-5006.yml b/html/changelogs/AutoChangeLog-pr-5006.yml deleted file mode 100644 index bdb7ca07b95..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5006.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds in fans which can block atmospherics passing over them" - - bugfix: "All mass driver blast doors have a fan underneath them, allowing you to use them repeatedly instead of once" diff --git a/html/changelogs/AutoChangeLog-pr-5010.yml b/html/changelogs/AutoChangeLog-pr-5010.yml deleted file mode 100644 index c271978add0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5010.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Ar3nn -delete-after: True -changes: - - rscdel: "Gets rid of some weird lattices floating in mid-space" diff --git a/html/changelogs/AutoChangeLog-pr-5011.yml b/html/changelogs/AutoChangeLog-pr-5011.yml deleted file mode 100644 index 382c456aa44..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5011.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: TullyBurnalot -delete-after: True -changes: - - rscadd: "When emagged, Photocopiers now have a cooldown if used to copy butts" diff --git a/html/changelogs/AutoChangeLog-pr-5014.yml b/html/changelogs/AutoChangeLog-pr-5014.yml deleted file mode 100644 index d0e42fdf454..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5014.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes medical, security, and employment records not being displayed" diff --git a/html/changelogs/AutoChangeLog-pr-5015.yml b/html/changelogs/AutoChangeLog-pr-5015.yml deleted file mode 100644 index b062492b106..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5015.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: LittleBigKid2000 and TullyBBurnalot -delete-after: True -changes: - - rscadd: "Stethoscopes can now be used to tell if a person's heart or lungs are damaged, or if they have any at all. Now they're actually useful instead of telling you the obvious in a vague way." - - bugfix: "Stethoscopes can no longer be used to hear the heartbeat and breathing of a person that doesn't have a heart or lungs." diff --git a/html/changelogs/AutoChangeLog-pr-5037.yml b/html/changelogs/AutoChangeLog-pr-5037.yml deleted file mode 100644 index 16ea58b944e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5037.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: monster860 -delete-after: True -changes: - - rscadd: "The ChemMaster now uses the asset cache, eliminating the enormous lag spike when you first use it. Yey!" - - bugfix: "Fixes the window not closing when selecting an icon for the chem-master" - - bugfix: "Fixes the chem master window not updating when selecting an icon" - - tweak: "The chem-master icon selection window now has a 4x5 grid of icons." diff --git a/html/changelogs/AutoChangeLog-pr-5041.yml b/html/changelogs/AutoChangeLog-pr-5041.yml deleted file mode 100644 index e2e9b771382..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5041.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: DaveTheHeadcrab -delete-after: True -changes: - - tweak: "Plastic explosives are now a subtype of grenades. Shouldn't be any noticable difference for players." - - tweak: "Plastic explosives no longer use the wire datum. You may directly attach an assembly holder (Such as a remote signaller + igniter assembly)" - - rscadd: "Adds X-4 shaped charges, designed for breaching explosively without harming the user. Pick some up at your local nukies r us." diff --git a/html/changelogs/AutoChangeLog-pr-5044.yml b/html/changelogs/AutoChangeLog-pr-5044.yml deleted file mode 100644 index 7431255c248..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5044.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kyep -delete-after: True -changes: - - tweak: "Improved admin 'select equipment' verb. ERT option now works, costumes get IDs and proper headsets, two new costumes added, and some outfits minorly tweaked (e.g: tunnel clowns get toolbelts)." diff --git a/html/changelogs/AutoChangeLog-pr-5048.yml b/html/changelogs/AutoChangeLog-pr-5048.yml deleted file mode 100644 index 9bc066a0d59..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5048.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Chakirski -delete-after: True -changes: - - tweak: "Cigarette packs no longer show near-duplicate messages when examined." diff --git a/html/changelogs/AutoChangeLog-pr-5054.yml b/html/changelogs/AutoChangeLog-pr-5054.yml deleted file mode 100644 index 02c9a234f6d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5054.yml +++ /dev/null @@ -1,14 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Removes most of the miner's uniform equipment from their lockers and puts it in a miner's wardrobe" - - tweak: "Miners start off with a lot of their clothing equipment equipped to them" - - rscadd: "Miners now have unique headset sprites" - - tweak: "Miners no longer have lanterns, but a seclite; they can attach this to their kinetic accelerators now" - - tweak: "Miners have workboots instead of black shoes" - - tweak: "Miners no longer have a default mining scanner but an advanced one that works at reduced range (5 instead of 7) and has a longer cooldown between pulses (5 instead of 3.5)" - - tweak: "removed extra mining hardsuit from the outpost" - - tweak: "removed medikit spam from outpost; now just a toxin kit and a regular medical kit" - - rscadd: "Bluespace crystals now earn you points and can be refined into bluespace polycrystal sheets" - - tweak: "Spare vouchers from QM and HoP removed" - - tweak: "removed armor from the fake tactical turtleneck" diff --git a/html/changelogs/AutoChangeLog-pr-5056.yml b/html/changelogs/AutoChangeLog-pr-5056.yml deleted file mode 100644 index d61ca42084b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5056.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - bugfix: "Wearing a suit will no longer cause runtimes due to the way suit-collars are handled." - - bugfix: "The north direction sprite of the Vulpkanin 'Patch' facial hair style won't hang a pixel off the head anymore." diff --git a/html/changelogs/AutoChangeLog-pr-5062.yml b/html/changelogs/AutoChangeLog-pr-5062.yml deleted file mode 100644 index a7dbddfd294..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5062.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Can scan vending machines with your PDA to pay for items (if there's an ID in your PDA)" diff --git a/html/changelogs/AutoChangeLog-pr-5065.yml b/html/changelogs/AutoChangeLog-pr-5065.yml deleted file mode 100644 index d2c1f45c59d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5065.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Krausus -delete-after: True -changes: - - tweak: "All admins can now see \"admin log\" messages." - - rscadd: "Admins can now toggle \"admin log\" messages on or off." - - tweak: "Admins will no longer be notified about ghosted admins jumping around." diff --git a/html/changelogs/AutoChangeLog-pr-5067.yml b/html/changelogs/AutoChangeLog-pr-5067.yml deleted file mode 100644 index d4fffce4cdf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5067.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Allfd -delete-after: True -changes: - - rscadd: "Added hologram fluff sprites" diff --git a/html/changelogs/AutoChangeLog-pr-5071.yml b/html/changelogs/AutoChangeLog-pr-5071.yml deleted file mode 100644 index 75141816f29..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5071.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Sleepers no longer require a console to build, only the sleeper itself" - - tweak: "Clicking on the sleeper brings up the menu that was previously brought up for the console" - - rscadd: "Adds in syndicate sleepers--these sleepers are not only syndie themed but also allow the user to inject chems into themselves while inside the sleepers" - - tweak: "Sleepers can now inject silver sulfadiazine" - - tweak: "removes cryofeeds from cryodorms and adds in 2 more cryopods" diff --git a/html/changelogs/AutoChangeLog-pr-5072.yml b/html/changelogs/AutoChangeLog-pr-5072.yml deleted file mode 100644 index 0b6a6b13ac5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5072.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes pre-spawned loaded belts not having proper overlays" diff --git a/html/changelogs/AutoChangeLog-pr-5074.yml b/html/changelogs/AutoChangeLog-pr-5074.yml deleted file mode 100644 index 626b811a2c7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5074.yml +++ /dev/null @@ -1,14 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "nanites will no longer purge chems, but will now heal internal organ damage, attempt to mend fractures, and will no longer cure beneficial viruses" - - bugfix: "cold and hot drinks should now properly heat you up or cool you down (this also goes for medical reagents)" - - tweak: "beer no longer reduces jitteriness" - - tweak: "toxins special and antifreeze heat you up" - - tweak: "banana juice and banana honk now heals monkeys" - - bugfix: "Fixes atrazine not killing nymphs" - - tweak: "mining autoinjectors no longer poison you" - - tweak: "combat hypospray now has omni+epinephrine+teporone" - - tweak: "stimpack is now meth+coffee instead of meth+epinephrine" - - tweak: "Cheese and synth meat amount creation scales with volume of the reaction" - - tweak: "sprinkles now heals all members of sec (brig phys, sec pod pilot, magistrate, and IAA are no longer left out)" diff --git a/html/changelogs/AutoChangeLog-pr-5083.yml b/html/changelogs/AutoChangeLog-pr-5083.yml deleted file mode 100644 index 40bdae5f2c1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5083.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kyep -delete-after: True -changes: - - bugfix: "Prevented NPCs being made into objective targets." diff --git a/html/changelogs/AutoChangeLog-pr-5084.yml b/html/changelogs/AutoChangeLog-pr-5084.yml deleted file mode 100644 index 7915ea660b3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5084.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes syndi+shielded+hos hardsuit sprite issues" diff --git a/html/changelogs/AutoChangeLog-pr-5089.yml b/html/changelogs/AutoChangeLog-pr-5089.yml new file mode 100644 index 00000000000..a43df58ee05 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5089.yml @@ -0,0 +1,6 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Tajarans and Unathi can now wear all shoe and glove types" + - tweak: "Glove clipping removed except for black gloves, which makes them fingerless gloves" + - rscadd: "Adds sandals as a loadout option" diff --git a/html/changelogs/AutoChangeLog-pr-5090.yml b/html/changelogs/AutoChangeLog-pr-5090.yml new file mode 100644 index 00000000000..3252d032abc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5090.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds in simple animal mob spawners" diff --git a/html/changelogs/AutoChangeLog-pr-5091.yml b/html/changelogs/AutoChangeLog-pr-5091.yml new file mode 100644 index 00000000000..cae8cf4032f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5091.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds shielded hardsuit to the nuke ops uplink for 30 TC" diff --git a/html/changelogs/AutoChangeLog-pr-5092.yml b/html/changelogs/AutoChangeLog-pr-5092.yml new file mode 100644 index 00000000000..25004699c9e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5092.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Implements the powerfist and adds it to the uplink for 8 TC" diff --git a/html/changelogs/AutoChangeLog-pr-5102.yml b/html/changelogs/AutoChangeLog-pr-5102.yml new file mode 100644 index 00000000000..f99b59db6a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5102.yml @@ -0,0 +1,8 @@ +author: Fox McCloud +delete-after: True +changes: + - rscdel: "Removed drinking glass shattering (regular bottle shattering is still a thing)" + - rscadd: "Captain's flask is now gold instead of silver" + - tweak: "Bottles have a throwforce of 15" + - rscadd: "can crack eggs into drinking glasses" + - tweak: "Detective's flask starts out with 30 units of whiskey" diff --git a/html/changelogs/AutoChangeLog-pr-5107.yml b/html/changelogs/AutoChangeLog-pr-5107.yml new file mode 100644 index 00000000000..d7a906a976f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5107.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscdel: "removes redundant object verbs that have an action button" diff --git a/html/changelogs/AutoChangeLog-pr-5111.yml b/html/changelogs/AutoChangeLog-pr-5111.yml new file mode 100644 index 00000000000..7ac1169830d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5111.yml @@ -0,0 +1,4 @@ +author: Kyep +delete-after: True +changes: + - rscadd: "Added new syndicate costumes to \"select equipment\" admin verb." diff --git a/html/changelogs/AutoChangeLog-pr-5112.yml b/html/changelogs/AutoChangeLog-pr-5112.yml new file mode 100644 index 00000000000..ceab85d927f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5112.yml @@ -0,0 +1,4 @@ +author: FreeStylaLT +delete-after: True +changes: + - rscadd: "Added new syndicate item Chameleon SecHUD to uplink store, available for all antags. It can morph into various eyewear while being a flashproof sechud." diff --git a/html/changelogs/AutoChangeLog-pr-5113.yml b/html/changelogs/AutoChangeLog-pr-5113.yml new file mode 100644 index 00000000000..f6e80fee660 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5113.yml @@ -0,0 +1,4 @@ +author: Alffd +delete-after: True +changes: + - rscadd: "Added a 6th Vulpkanin tail option." diff --git a/html/changelogs/AutoChangeLog-pr-5131.yml b/html/changelogs/AutoChangeLog-pr-5131.yml new file mode 100644 index 00000000000..fe4d3b2ba46 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5131.yml @@ -0,0 +1,6 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes up mindswap spell so it behaves more properly" + - bugfix: "Fixes genetic abilities action buttons not properly clearing" + - bugfix: "Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs and other sources" diff --git a/html/changelogs/AutoChangeLog-pr-5045.yml b/html/changelogs/AutoChangeLog-pr-5133.yml similarity index 55% rename from html/changelogs/AutoChangeLog-pr-5045.yml rename to html/changelogs/AutoChangeLog-pr-5133.yml index db6fa79b8a2..b6791c98619 100644 --- a/html/changelogs/AutoChangeLog-pr-5045.yml +++ b/html/changelogs/AutoChangeLog-pr-5133.yml @@ -1,4 +1,4 @@ author: Fox McCloud delete-after: True changes: - - rscadd: "Adds in a weather system" + - bugfix: "ACTUALLY FIXES MINING APC" diff --git a/html/changelogs/AutoChangeLog-pr-5134.yml b/html/changelogs/AutoChangeLog-pr-5134.yml new file mode 100644 index 00000000000..7b1826aa212 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5134.yml @@ -0,0 +1,4 @@ +author: FalseIncarnate +delete-after: True +changes: + - bugfix: "Engineers can properly show up for work with their hats and coats to keep warm." diff --git a/html/changelogs/AutoChangeLog-pr-5141.yml b/html/changelogs/AutoChangeLog-pr-5141.yml new file mode 100644 index 00000000000..e7fc1672f8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5141.yml @@ -0,0 +1,4 @@ +author: monster860 +delete-after: True +changes: + - bugfix: "Brig timer UI reopening after being closed fixed." diff --git a/html/changelogs/AutoChangeLog-pr-5142.yml b/html/changelogs/AutoChangeLog-pr-5142.yml new file mode 100644 index 00000000000..3b02e3a3158 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5142.yml @@ -0,0 +1,4 @@ +author: Alffd +delete-after: True +changes: + - tweak: "Fixes animations, side view, and pixel fill for Vulpkanin tail 6" diff --git a/html/changelogs/AutoChangeLog-pr-5143.yml b/html/changelogs/AutoChangeLog-pr-5143.yml new file mode 100644 index 00000000000..348453e89b8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5143.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes brig cell timers not having the option to flash people" diff --git a/icons/goonstation/objects/pda_overlay.dmi b/icons/goonstation/objects/pda_overlay.dmi new file mode 100644 index 00000000000..4c7cb24a7f4 Binary files /dev/null and b/icons/goonstation/objects/pda_overlay.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 127b63a154a..3269c8ae7b5 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 5bdf365b547..7553227171c 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 0ac606eb617..2a5ac2889c2 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 1a84149f45f..f950b2bdf74 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/nest.dmi b/icons/mob/nest.dmi new file mode 100644 index 00000000000..7dab335929e Binary files /dev/null and b/icons/mob/nest.dmi differ diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi index 25b3d7355d9..2dab86ef7f9 100644 Binary files a/icons/mob/screen_midnight.dmi and b/icons/mob/screen_midnight.dmi differ diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi index d14e354d7f4..8d90aa7c3b3 100644 Binary files a/icons/mob/screen_operative.dmi and b/icons/mob/screen_operative.dmi differ diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi index 9e22298fc27..cca826d272c 100644 Binary files a/icons/mob/screen_plasmafire.dmi and b/icons/mob/screen_plasmafire.dmi differ diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi index ec36561ea0c..77aefd6a16b 100644 Binary files a/icons/mob/screen_retro.dmi and b/icons/mob/screen_retro.dmi differ diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi index 0e412d41c9c..3af866db6bd 100644 Binary files a/icons/mob/screen_slimecore.dmi and b/icons/mob/screen_slimecore.dmi differ diff --git a/icons/mob/screen_white.dmi b/icons/mob/screen_white.dmi index a30d30bd3ef..8288217dcd0 100644 Binary files a/icons/mob/screen_white.dmi and b/icons/mob/screen_white.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 00e0112c53f..9f851fc894c 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 1eb8c732641..21205081639 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 6b3a721a732..0be3a5a32d7 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index dd3633784a5..b1c332e6d75 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi new file mode 100644 index 00000000000..6825f6c652d Binary files /dev/null and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 049172bf356..b4956c33a9e 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index b82dcb47f3c..25138117609 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 7867fac04b4..2c9a230d1df 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/paradise.dme b/paradise.dme index 182814075af..4e095cdde39 100644 --- a/paradise.dme +++ b/paradise.dme @@ -20,6 +20,7 @@ #include "code\__DEFINES\bots.dm" #include "code\__DEFINES\clothing.dm" #include "code\__DEFINES\combat.dm" +#include "code\__DEFINES\crafting.dm" #include "code\__DEFINES\error_handler.dm" #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\game.dm" @@ -97,7 +98,7 @@ #include "code\_onclick\rig.dm" #include "code\_onclick\telekinesis.dm" #include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\action.dm" +#include "code\_onclick\hud\action_button.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alert.dm" #include "code\_onclick\hud\alien.dm" @@ -183,6 +184,7 @@ #include "code\controllers\Processes\weather.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" +#include "code\datums\action.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\beam.dm" @@ -815,6 +817,7 @@ #include "code\game\objects\items\weapons\paiwire.dm" #include "code\game\objects\items\weapons\pneumaticCannon.dm" #include "code\game\objects\items\weapons\power_cells.dm" +#include "code\game\objects\items\weapons\powerfist.dm" #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\scissors.dm" @@ -1127,8 +1130,10 @@ #include "code\modules\client\preference\loadout\gear_tweaks.dm" #include "code\modules\client\preference\loadout\loadout.dm" #include "code\modules\client\preference\loadout\loadout_accessories.dm" +#include "code\modules\client\preference\loadout\loadout_cosmetics.dm" #include "code\modules\client\preference\loadout\loadout_general.dm" #include "code\modules\client\preference\loadout\loadout_hat.dm" +#include "code\modules\client\preference\loadout\loadout_shoes.dm" #include "code\modules\client\preference\loadout\loadout_suit.dm" #include "code\modules\client\preference\loadout\loadout_uniform.dm" #include "code\modules\clothing\clothing.dm" @@ -1233,9 +1238,9 @@ #include "code\modules\computer3\computers\robot.dm" #include "code\modules\computer3\computers\security.dm" #include "code\modules\computer3\computers\welcome.dm" +#include "code\modules\crafting\craft.dm" #include "code\modules\crafting\guncrafting.dm" #include "code\modules\crafting\recipes.dm" -#include "code\modules\crafting\table.dm" #include "code\modules\customitems\item_defines.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\detective_work\detective_work.dm" @@ -1598,8 +1603,8 @@ #include "code\modules\mob\living\simple_animal\powers.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\spawner.dm" #include "code\modules\mob\living\simple_animal\tribbles.dm" -#include "code\modules\mob\living\simple_animal\vox.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" #include "code\modules\mob\living\simple_animal\bot\construction.dm" @@ -1858,8 +1863,8 @@ #include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_cold.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\bottle.dm" #include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\drugs.dm" #include "code\modules\reagents\reagent_containers\food.dm" #include "code\modules\reagents\reagent_containers\glass_containers.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" @@ -1869,16 +1874,13 @@ #include "code\modules\reagents\reagent_containers\food\cans.dm" #include "code\modules\reagents\reagent_containers\food\condiment.dm" #include "code\modules\reagents\reagent_containers\food\drinks.dm" -#include "code\modules\reagents\reagent_containers\food\sandwich.dm" #include "code\modules\reagents\reagent_containers\food\snacks.dm" #include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm" #include "code\modules\reagents\reagent_containers\food\drinks\drinkingglass.dm" -#include "code\modules\reagents\reagent_containers\food\drinks\jar.dm" #include "code\modules\reagents\reagent_containers\food\drinks\shotglass.dm" #include "code\modules\reagents\reagent_containers\food\snacks\candy.dm" #include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" #include "code\modules\reagents\reagent_containers\food\snacks\seafood.dm" -#include "code\modules\reagents\reagent_containers\glass\bottle.dm" #include "code\modules\recycling\conveyor2.dm" #include "code\modules\recycling\disposal-construction.dm" #include "code\modules\recycling\disposal.dm"