diff --git a/_maps/map_files/MetaStation/MetaStation.v40D.dmm b/_maps/map_files/MetaStation/MetaStation.v40D.dmm
index 328d3e8e007..db480a267f4 100644
--- a/_maps/map_files/MetaStation/MetaStation.v40D.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v40D.dmm
@@ -3896,7 +3896,7 @@
"bwV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
"bwW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/device/radio/intercom{dir = 2; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
"bwX" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
-"bwY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/corgi/Ian,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
+"bwY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/pet/corgi/Ian,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
"bwZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
"bxa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/fancy/carpet,/area/bridge)
"bxb" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/showcase{desc = "A slightly battered looking TV. Vaious Nanotrasen infomercials play on a loop, accompanied by a jaunty tune."; dir = 1; icon = 'icons/obj/computer.dmi'; icon_state = "security_det"; name = "NanoTrasen corporate newsfeed"; pixel_x = 2; pixel_y = 3},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"})
@@ -4229,7 +4229,7 @@
"bDq" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/pump,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/window/reinforced{dir = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway - Atmospherics"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 8},/area/hallway/primary/starboard)
"bDr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard)
"bDs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/starboard)
-"bDt" = (/obj/machinery/light,/obj/machinery/computer/security/telescreen{dir = 1; name = "MiniSat Monitor"; network = list("MiniSat","tcomm"); pixel_x = 0; pixel_y = -29},/mob/living/simple_animal/fox/Renault,/turf/simulated/floor/fancy/carpet{tag = "icon-carpetside"; icon_state = "carpetside"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
+"bDt" = (/obj/machinery/light,/obj/machinery/computer/security/telescreen{dir = 1; name = "MiniSat Monitor"; network = list("MiniSat","tcomm"); pixel_x = 0; pixel_y = -29},/mob/living/simple_animal/pet/fox/Renault,/turf/simulated/floor/fancy/carpet{tag = "icon-carpetside"; icon_state = "carpetside"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bDu" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint/science{name = "Security Post - Research Division"})
"bDv" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/atmos)
"bDw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/atmos)
@@ -4606,7 +4606,7 @@
"bKD" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/green/visible,/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 4},/turf/simulated/floor/plating,/area/atmos)
"bKE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/maintcentral{name = "Central Maintenance"})
"bKF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/engine,/area/toxins/explab)
-"bKG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/mob/living/simple_animal/pug{desc = "It's Pugley III, the loveable four-legged test subject."; dir = 8; name = "Pugley III"; real_name = "Pugley III"},/turf/simulated/floor/engine,/area/toxins/explab)
+"bKG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/mob/living/simple_animal/pet/pug{desc = "It's Pugley III, the loveable four-legged test subject."; dir = 8; name = "Pugley III"; real_name = "Pugley III"},/turf/simulated/floor/engine,/area/toxins/explab)
"bKH" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"bKI" = (/obj/item/stack/cable_coil,/obj/structure/lattice/catwalk,/turf/space,/area/solar/port)
"bKJ" = (/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 7; pixel_y = 4},/obj/item/weapon/storage/pill_bottle/epinephrine{pixel_x = 3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry)
@@ -6423,7 +6423,7 @@
"ctA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"ctB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/medbay{name = "Medbay Central"})
"ctC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
-"ctD" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/mob/living/simple_animal/cat/Runtime,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"ctD" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"ctE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"ctF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"ctG" = (/obj/structure/closet/secure_closet/scientist,/obj/item/weapon/storage/backpack/satchel_tox,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index ba976b45402..26440cffee6 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -1021,7 +1021,7 @@
"tG" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Head of Personnel"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/computer/secure_data,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tI" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
-"tJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/mob/living/simple_animal/corgi/Ian,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
+"tJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/mob/living/simple_animal/pet/corgi/Ian,/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tK" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"tM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/hallway/primary/central)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 0ff0b186d7e..09070f45596 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -3492,7 +3492,7 @@
"bpl" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/crew_quarters/heads)
"bpm" = (/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bpn" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
-"bpo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/mob/living/simple_animal/corgi/Ian,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
+"bpo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/mob/living/simple_animal/pet/corgi/Ian,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads)
"bpp" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bpq" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Gravity Generator APC"; pixel_x = -25; pixel_y = 1},/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/turf/simulated/floor/plasteel,/area/engine/gravity_generator)
"bpr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/gravity_generator)
@@ -4199,7 +4199,7 @@
"bCR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/medical/cmo)
"bCS" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
"bCT" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/weapon/stamp/cmo,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
-"bCU" = (/obj/structure/table/glass,/obj/item/weapon/pen,/obj/item/clothing/tie/stethoscope,/mob/living/simple_animal/cat/Runtime,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
+"bCU" = (/obj/structure/table/glass,/obj/item/weapon/pen,/obj/item/clothing/tie/stethoscope,/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
"bCV" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{pixel_x = 25},/obj/machinery/camera{c_tag = "Chief Medical Office"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
"bCW" = (/turf/simulated/floor/engine,/area/toxins/xenobiology)
"bCX" = (/obj/machinery/camera{c_tag = "Xenobiology Test Chamber"; dir = 2; network = list("Xeno","RD"); pixel_x = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology)
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 1bb59607ae9..e160a9e1d29 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -394,6 +394,7 @@
"hD" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/suppy)
"hE" = (/obj/machinery/door/airlock/centcom{name = "Supply Shuttle"; req_access_txt = "106"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/suppy)
"hF" = (/obj/machinery/computer/supplycomp,/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/suppy)
+"hG" = (/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/unsimulated/floor/plating,/area/wizard_station)
"hH" = (/turf/unsimulated/floor{name = "plating"},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space)
"hI" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{icon_state = "swall_f9"},/area/space)
"hJ" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/space)
@@ -663,7 +664,6 @@
"nt" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"nu" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows2"},/area/wizard_station)
"nv" = (/obj/structure/bookcase,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
-"nw" = (/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/wizard_station)
"nx" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ny" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"nz" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
@@ -828,7 +828,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababbWcicicicicibWaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDbWcjcjcjcjcjbWabab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababbWbWbWbWbWbWbWabababababababababababababababbWbWbWbWbWbWbWabab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
@@ -839,7 +839,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacckacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
@@ -972,7 +972,7 @@ ababababababababababaaaaaaaaaaaaaaaaaalnjsaaaajsmdmejWmfjWlnjsjsaaaaaaaaaaaaaaaa
ababababababababababaaaaaaaaaaaaaakKmqmrmsmtmumtmtmqmvmsmtmtmumtmtaajsaaaaaaaaaaababababababgzgIhMhNhNhNhNhNhNmwihihhNhNhNhNhNhNhPmxmxmxmylsgzmzmzmzmzmzmzgzabababababababababababababababababababababababababababababababababmBmBmBmBmBmBmBmBmBmCmDmDmDmDmDmDmDmDmDmDmDmDmDmCmBmBmBmBmBmBmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaamEmFjvjvmFmEmGmHjvjvjvhbmJmEmKmLlnmMjsjsaaaaaaababababababgzgIhNmNmNmOmPmQhNihihihhNmRmSmTmUmVhNgIgJgIgIgLjmmzmzmzmzmzmWgzabababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaanhnijvjvninhmMmMjvjvjvjvnjnhnknllSlSnmaaaaaaaaababababababgzgIhNihihihloihnnihihihnoihloihlonphNgIhcgKgJhcgznqnqnqnqnqlqgzabababababababababababababababababababababababababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaanunvjvlGjvnwlUlGjvnxjvjvnynunzhdnBnChenEaaaaaaababababababgzgIhNnFihihihihnGihihihnHihihihihihhNgIgIgIgKiGgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababababababmBmZnanbnbnInbnbncndmDmDmDmDmDnJnKnJmDmDmDmDmDnencnfnfnLnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaanunvjvlGjvhGlUlGjvnxjvjvnynunzhdnBnChenEaaaaaaababababababgzgIhNnFihihihihnGihihihnHihihihihihhNgIgIgIgKiGgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababababababmBmZnanbnbnInbnbncndmDmDmDmDmDnJnKnJmDmDmDmDmDnencnfnfnLnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaanMnijvjWlUhfjWjvjvnOjvjvjvnMnPnQnmnRlhaaaaaaaaababababababgzgIhNnFihihnSnThNnUnVnUhNnWnXihihihhNgIgKgIhciGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDnJnYnJmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaajdnZjvjvnZjdoajvlGjWjvjvoajdobocodoeaaaaaaaaaaababababababgzgIhNihihgOhNhNhNofogihhNhNhNihihihhNgIgIgJgIiGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaajwmqojmsmtokmtmqkIolkImsmtokmtmqjsjsjsaaaaaaaaababababababgzgIhNgQgPgRhNgIhNopopophNgIhNiloqorhNgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index 082608ae120..a8e338695bf 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -61,7 +61,7 @@
/obj/effect/hotspot/proc/perform_exposure()
var/turf/simulated/location = loc
- if(!istype(location)) return 0
+ if(!istype(location) || !(location.air)) return 0
if(volume > CELL_VOLUME*0.95) bypassing = 1
else bypassing = 0
@@ -101,7 +101,7 @@
Kill()
return
- if(location.air.toxins < 0.5 || location.air.oxygen < 0.5)
+ if(!(location.air) || location.air.toxins < 0.5 || location.air.oxygen < 0.5)
Kill()
return
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
new file mode 100644
index 00000000000..ff5062598ff
--- /dev/null
+++ b/code/__DEFINES/say.dm
@@ -0,0 +1,29 @@
+/*
+ Defines for use in saycode and text formatting.
+ Currently contains speech spans and message modes
+*/
+
+//Message modes. Each one defines a radio channel, more or less.
+#define MODE_HEADSET "headset"
+#define MODE_ROBOT "robot"
+#define MODE_R_HAND "right hand"
+#define MODE_L_HAND "left hand"
+#define MODE_INTERCOM "intercom"
+#define MODE_BINARY "binary"
+#define MODE_WHISPER "whisper"
+#define MODE_SECURE_HEADSET "secure headset"
+#define MODE_DEPARTMENT "department"
+#define MODE_ALIEN "alientalk"
+#define MODE_HOLOPAD "holopad"
+#define MODE_CHANGELING "changeling"
+
+//Spans. Robot speech, italics, etc. Applied in compose_message().
+#define SPAN_ROBOT "robot"
+#define SPAN_YELL "yell"
+#define SPAN_ITALICS "italics"
+#define SPAN_SANS "sans"
+
+//bitflag #defines for return value of the radio() proc.
+#define ITALICS 1
+#define REDUCE_RANGE 2
+#define NOPASS 4
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index b88b3c48814..e9fd430285d 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1351,6 +1351,10 @@ var/global/list/common_tools = list(
/obj/item/weapon/twohanded/fireaxe,\
/obj/item/weapon/hatchet,\
/obj/item/weapon/throwing_star,\
+ /obj/item/clothing/glasses/sunglasses/garb,\
+ /obj/item/clothing/glasses/sunglasses/gar,\
+ /obj/item/clothing/glasses/hud/security/sunglasses/gars,\
+ /obj/item/clothing/glasses/meson/gar,\
/obj/item/weapon/twohanded/spear)
//Because is_sharp is used for food or something.
diff --git a/code/controllers/subsystem/shuttles/supply.dm b/code/controllers/subsystem/shuttles/supply.dm
index 3aa57e82b16..3fcc981725c 100644
--- a/code/controllers/subsystem/shuttles/supply.dm
+++ b/code/controllers/subsystem/shuttles/supply.dm
@@ -303,10 +303,6 @@
updateUsrDialog()
return
-/obj/machinery/computer/ordercomp/say_quote(text)
- return "flashes, \"[text]\""
-
-
/obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob)
if(!allowed(user))
user << "Access Denied."
@@ -530,7 +526,3 @@
status_signal.data["command"] = command
frequency.post_signal(src, status_signal)
-
-
-/obj/machinery/computer/supplycomp/say_quote(text)
- return "flashes, \"[text]\""
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index c8eda50e5a4..de27718296c 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -215,7 +215,7 @@
stage3 = list("Must... eat... chocolate....", "YAP")
stage4 = list("Visions of washing machines assail your mind!")
stage5 = list("AUUUUUU!!!")
- new_form = /mob/living/simple_animal/corgi
+ new_form = /mob/living/simple_animal/pet/corgi
/datum/disease/transformation/corgi/stage_act()
..()
diff --git a/code/datums/goon_mutations_disabilities.dm b/code/datums/goon_mutations_disabilities.dm
index 5dfa25597c0..9da8e51307e 100644
--- a/code/datums/goon_mutations_disabilities.dm
+++ b/code/datums/goon_mutations_disabilities.dm
@@ -4,10 +4,8 @@
text_gain_indication = "You feel an off sensation in your voicebox."
text_lose_indication = "The off sensation passes."
-/datum/mutation/human/wacky/say_mod(var/message)
- if(message)
- message = "[message]"
- return message
+/datum/mutation/human/wacky/get_spans()
+ return list(SPAN_SANS)
/datum/mutation/human/mute
name = "Mute"
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 39d63400ddb..f3315d1cfd6 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -20,6 +20,8 @@ var/datum/atom_hud/huds = list( \
var/list/hud_icons = list() //these will be the indexes for the atom's hud_list
/datum/atom_hud/proc/remove_hud_from(var/mob/M)
+ if(src in M.permanent_huds)
+ return
for(var/atom/A in hudatoms)
remove_from_single_hud(M, A)
hudusers -= M
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index ee04d98a260..8d9e3560156 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1392,7 +1392,7 @@
mind.assigned_role = "Animal"
mind.special_role = "Animal"
-/mob/living/simple_animal/corgi/mind_initialize()
+/mob/living/simple_animal/pet/corgi/mind_initialize()
..()
mind.assigned_role = "Corgi"
mind.special_role = "Corgi"
diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm
index 846a7978006..1548615ddd0 100644
--- a/code/datums/mutations.dm
+++ b/code/datums/mutations.dm
@@ -88,6 +88,9 @@
if(message)
return message
+/datum/mutation/human/proc/get_spans()
+ return list()
+
/datum/mutation/human/hulk
name = "Hulk"
@@ -179,6 +182,8 @@
/datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner)
if(..()) return
+ if((SEE_MOBS & owner.permanent_sight_flags) && (SEE_OBJS & owner.permanent_sight_flags) && (SEE_TURFS & owner.permanent_sight_flags)) //Xray flag combo
+ return
owner.see_in_dark = initial(owner.see_in_dark)
owner.sight = initial(owner.sight)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 3b5ca3a4ae9..4b2b44a65ee 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -801,24 +801,28 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
name = "Corgi Crate"
cost = 50
containertype = /obj/structure/closet/critter/corgi
+ contains = list(/obj/item/clothing/tie/petcollar)
containername = "corgi crate"
/datum/supply_packs/organic/cat
name = "Cat Crate"
cost = 50 //Cats are worth as much as corgis.
containertype = /obj/structure/closet/critter/cat
+ contains = list(/obj/item/clothing/tie/petcollar)
containername = "cat crate"
/datum/supply_packs/organic/pug
name = "Pug Crate"
cost = 50
containertype = /obj/structure/closet/critter/pug
+ contains = list(/obj/item/clothing/tie/petcollar)
containername = "pug crate"
/datum/supply_packs/organic/fox
name = "Fox Crate"
cost = 55 //Foxes are cool.
containertype = /obj/structure/closet/critter/fox
+ contains = list(/obj/item/clothing/tie/petcollar)
containername = "fox crate"
/datum/supply_packs/organic/butterfly
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index cc8f14c2573..cc04a274cfc 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -7,6 +7,9 @@
var/throw_range = 7
var/mob/pulledby = null
var/languages = 0 //For say() and Hear()
+ var/verb_say = "says"
+ var/verb_ask = "asks"
+ var/verb_yell = "yells"
var/inertia_dir = 0
var/pass_flags = 0
glide_size = 8
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 6a1cba35502..c86fa683896 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -114,6 +114,12 @@
message = M.say_mod(message)
return message
+/datum/dna/proc/mutations_get_spans()
+ var/list/spans = list()
+ for(var/datum/mutation/human/M in mutations)
+ spans |= M.get_spans()
+ return spans
+
/proc/hardset_dna(mob/living/carbon/owner, ui, se, real_name, blood_type, datum/species/mrace, mcolor)
if(!istype(owner, /mob/living/carbon/monkey) && !istype(owner, /mob/living/carbon/human))
return
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index a50dc6945b6..babeb58ab51 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -703,7 +703,7 @@ var/list/sacrificed = list()
if(prob(30))
ticker.mode.grant_runeword(usr)
stone_or_gib(M)
- for(var/mob/victim in src.loc) //TO-DO: Move the shite above into the mob's own sac_act - see /mob/living/simple_animal/corgi/sac_act for an example
+ for(var/mob/victim in src.loc) //TO-DO: Move the shite above into the mob's own sac_act - see /mob/living/simple_animal/pet/corgi/sac_act for an example
victim.sac_act(src, victim) //Sacrifice procs are now seperate per mob, this allows us to allow sacrifice on as many mob types as we want without making an already clunky system worse
/* for(var/mob/living/carbon/alien/A)
for(var/mob/K in cultsinrange)
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index b66c86966aa..b086e9a1d5d 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -155,10 +155,9 @@
SSevent.reschedule()
else //Speed it up
- SSevent.frequency_lower = round(SSevent.frequency_lower * 0.8) //1 minute | 48 seconds | 34.8 seconds | 30.7 seconds | 24.6 seconds
- SSevent.frequency_upper = round(SSevent.frequency_upper * 0.6) //5 minutes | 3 minutes | 1 minute 48 seconds | 1 minute 4.8 seconds | 38.9 seconds
- if(SSevent.frequency_upper < SSevent.frequency_lower)
- SSevent.frequency_upper = SSevent.frequency_lower //this can't happen unless somehow multiple spellbooks are used, but just in case
+ SSevent.frequency_upper -= 600 //The upper bound falls a minute each time, making the AVERAGE time between events lessen
+ if(SSevent.frequency_upper < SSevent.frequency_lower) //Sanity
+ SSevent.frequency_upper = SSevent.frequency_lower
SSevent.reschedule()
message_admins("Summon Events intensifies, events will now occur every [SSevent.frequency_lower / 600] to [SSevent.frequency_upper / 600] minutes.")
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index fc342ed8beb..b6a7df9996f 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -200,6 +200,9 @@
finished = 1
return 1
else
+ if(SSevent.wizardmode) //If summon events was active, turn it off
+ SSevent.toggleWizardmode()
+ SSevent.resetFrequency()
return ..()
finished = 1
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 87f12d201e6..81b6adc491c 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -181,8 +181,7 @@ Security Officer
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
-// H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/sec(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/sec(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/device/flash/handheld(H), slot_l_store)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index fadbe84d6fb..4445626eb5e 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -51,6 +51,17 @@
treatment_fire = "omnizine"
treatment_tox = "omnizine"
+/obj/machinery/bot/medbot/derelict
+ name = "\improper Old Medibot"
+ desc = "Looks like it hasn't been modified since the late 2080s."
+ skin = "bezerk"
+ heal_threshold = 0
+ declare_crit = 0
+ treatment_oxy = "pancuronium"
+ treatment_brute = "pancuronium"
+ treatment_fire = "sodium_thiopental"
+ treatment_tox = "sodium_thiopental"
+
/obj/item/weapon/firstaid_arm_assembly
name = "incomplete medibot assembly."
desc = "A first aid kit with a robot arm permanently grafted to it."
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index 1204393f095..5a6b904683f 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -392,7 +392,14 @@ Auto Patrol: []"},
..()
return
- if(type != /obj/item/clothing/head/helmet) //Eh, but we don't want people making secbots out of space helmets.
+ if(type != /obj/item/clothing/head/helmet/sec) //Eh, but we don't want people making secbots out of space helmets.
+ return
+
+ if(!helmetCam) //I am so sorry for this. I could not think of a less terrible (and lazy) way.
+ user << "[src] needs to have a camera attached first."
+ return
+ if(F) //Has a flashlight. Player must remove it, else it will be lost forever.
+ user << "The mounted flashlight is in the way, remove it first."
return
if(S.secured)
@@ -458,7 +465,7 @@ Auto Patrol: []"},
else if(istype(I, /obj/item/weapon/screwdriver))
if(!build_step)
new /obj/item/device/assembly/signaler(get_turf(src))
- new /obj/item/clothing/head/helmet(get_turf(src))
+ new /obj/item/clothing/head/helmet/sec(get_turf(src))
user << "You disconnect the signaler from the helmet."
qdel(src)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 7429e162871..f93b7f48696 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -331,3 +331,18 @@
return 1
busy = 0
return 0
+
+
+/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
+ var/turf/prev_turf
+
+/obj/machinery/camera/portable/New()
+ ..()
+ assembly.state = 0 //These cameras are portable, and so shall be in the portable state if removed.
+ assembly.anchored = 0
+ assembly.update_icon()
+
+/obj/machinery/camera/portable/process() //Updates whenever the camera is moved.
+ if(cameranet && get_turf(src) != prev_turf)
+ cameranet.updatePortableCamera(src)
+ prev_turf = get_turf(src)
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 1bcc4decc8e..147ef9b1c15 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -367,9 +367,27 @@
else
if(food <= 0)
dat += "
You ran out of food and starved."
+ if(emagged)
+ user.nutrition = 0 //yeah you pretty hongry
+ user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor."
if(fuel <= 0)
dat += "
You ran out of fuel, and drift, slowly, into a star."
+ if(emagged)
+ var/mob/living/M = user
+ M.adjust_fire_stacks(5)
+ M.IgniteMob() //flew into a star, so you're on fire
+ user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames."
dat += "
OK...
"
+
+ if(emagged)
+ user << "You're never going to make it to Orion..."
+ user.death()
+ emagged = 0 //removes the emagged status after you lose
+ playing = 0 //also a new game
+ name = "The Orion Trail"
+ desc = "Learn how our ancestors got to Orion, and have fun in the process!"
+
+
else if(event)
dat = eventdat
else if(playing)
@@ -427,6 +445,77 @@
if(prob(75))
event = pickweight(events)
event()
+ if(emagged)
+ var/mob/living/carbon/M = usr //for some vars
+ switch(event)
+ if("Raiders")
+ if(prob(50))
+ usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?"
+ M.hallucination += 30
+ else
+ usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..."
+ M.take_organ_damage(30)
+ playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1)
+ if("Illness")
+ var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS
+ if(severity == 1)
+ M << "You suddenly feel slightly nauseous." //got off lucky
+ if(severity == 2)
+ usr << "You suddenly feel extremely nauseous and hunch over until it passes."
+ M.Stun(3)
+ if(severity >= 3) //you didn't pray hard enough
+ M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit."
+ M.Stun(5)
+ sleep(30)
+ M.visible_message("[M] throws up!", "You violently throw up!")
+ playsound(loc, 'sound/effects/splat.ogg', 50, 1)
+ M.nutrition -= 50 //lose a lot of food
+ var/turf/location = usr.loc
+ if(istype(location, /turf/simulated))
+ location.add_vomit_floor(src, 1)
+ if("Interstellar Flux")
+ if(prob(75))
+ M.Weaken(3)
+ M.visible_message("[M] is swept off their feet!", "A sudden gust of powerful wind slams you into the floor!")
+ M.take_organ_damage(25)
+ playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
+ else
+ M << "A violent gale blows past you, and you barely manage to stay standing!"
+ if("Collision") //by far the most damaging event
+ if(prob(90))
+ playsound(src.loc, 'sound/effects/bang.ogg', 100, 1)
+ var/turf/simulated/floor/F
+ for(F in orange(1, src))
+ F.ChangeTurf(/turf/space)
+ src.visible_message("Something slams into the floor around [src], exposing it to space!")
+ if(hull)
+ sleep(10)
+ src.visible_message("A new floor suddenly appears around [src]. What the hell?")
+ playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
+ var/turf/space/T
+ for(T in orange(1, src))
+ T.ChangeTurf(/turf/simulated/floor/plating/)
+ else
+ src.visible_message("Something slams into the floor around [src] - luckily, it didn't get through!")
+ playsound(src.loc, 'sound/effects/bang.ogg', 50, 1)
+ if("Malfunction")
+ playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1)
+ src.visible_message("[src] malfunctions, randomizing in-game stats!")
+ var/oldfood = food
+ var/oldfuel = fuel
+ food = rand(10,80) / rand(1,2)
+ fuel = rand(10,60) / rand(1,2)
+ if(electronics)
+ sleep(10)
+ if(oldfuel > fuel && oldfood > food)
+ src.audible_message("[src] lets out a somehow reassuring chime.")
+ else if(oldfuel < fuel || oldfood < food)
+ src.audible_message("[src] lets out a somehow ominous chime.")
+ food = oldfood
+ fuel = oldfuel
+ playsound(src.loc, 'sound/machines/chime.ogg', 50, 1)
+
+
else if(href_list["newgame"]) //Reset everything
newgame()
else if(href_list["menu"]) //back to the main menu
@@ -467,6 +556,15 @@
if(prob(75))
event = "BlackHole"
event()
+ if(emagged) //has to be here because otherwise it doesn't work
+ playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1)
+ src.visible_message("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!")
+ usr.Stun(10) //you can't run :^)
+ var/S = new /obj/singularity/academy(usr.loc)
+ emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting
+ sleep(50)
+ src.visible_message("[S] winks out, just as suddenly as it appeared.")
+ qdel(S)
else
event = null
turns += 1
@@ -499,7 +597,6 @@
eventdat += "
Fortunately you fended them off without any trouble."
eventdat += "Continue
"
eventdat += "Close
"
-
else if(event == "Interstellar Flux")
eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies."
eventdat += "
What will you do?"
@@ -513,7 +610,6 @@
alive -= 1
eventdat += "Continue
"
eventdat += "Close
"
-
else if(event == "Breakdown")
eventdat += "Oh no! The engine has broken down!"
eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days."
@@ -560,4 +656,60 @@
/obj/machinery/computer/arcade/orion_trail/proc/win()
playing = 0
- prizevend()
+ if(emagged)
+ new /obj/item/weapon/orion_ship(src.loc)
+ message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.")
+ else
+ prizevend()
+ emagged = 0
+ name = "The Orion Trail"
+ desc = "Learn how our ancestors got to Orion, and have fun in the process!"
+
+/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user as mob)
+ if(!emagged)
+ user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode."
+ name = "The Orion Trail: Realism Edition"
+ desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
+ newgame()
+ emagged = 1
+
+/obj/item/weapon/orion_ship
+ name = "model settler ship"
+ desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "ship"
+ w_class = 2
+ var/active = 0 //if the ship is on
+
+/obj/item/weapon/orion_ship/examine(mob/user)
+ ..()
+ if(!(in_range(user, src)))
+ return
+ if(!active)
+ user << "There's a little switch on the bottom. It's flipped down."
+ else
+ user << "There's a little switch on the bottom. It's flipped up."
+
+/obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse
+ if(active)
+ return
+
+ message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.")
+ log_game("[key_name(usr)] primed an explosive Orion ship for detonation.")
+
+ user << "You flip the switch on the underside of [src]."
+ active = 1
+ src.visible_message("[src] softly beeps and whirs to life!")
+ playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1)
+ say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.")
+ sleep(20)
+ src.visible_message("[src] begins to vibrate...")
+ say("Uh, Port? Having some issues with our reactor, could you check it out? Over.")
+ sleep(30)
+ say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-")
+ playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 25, 1)
+ sleep(3.6)
+ src.visible_message("[src] explodes!")
+ explosion(src.loc, 1,2,4, flame_range = 3)
+ qdel(src)
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 814bf42382a..a6ca46fdac5 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -132,6 +132,9 @@
icon_state = "supply"
req_access = list(access_cargo)
circuit = /obj/item/weapon/circuitboard/supplycomp
+ verb_say = "flashes"
+ verb_ask = "flashes"
+ verb_yell = "flashes"
var/temp = null
var/reqtime = 0 //Cooldown for requisitions - Quarxink
var/hacked = 0
@@ -150,6 +153,9 @@
icon = 'icons/obj/computer.dmi'
icon_state = "request"
circuit = /obj/item/weapon/circuitboard/ordercomp
+ verb_say = "flashes"
+ verb_ask = "flashes"
+ verb_yell = "flashes"
var/temp = null
var/reqtime = 0 //Cooldown for requisitions - Quarxink
- var/last_viewed_group = "categories"
\ No newline at end of file
+ var/last_viewed_group = "categories"
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 892539285a8..83f986aaf19 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -7,6 +7,7 @@ var/list/doppler_arrays = list()
icon_state = "tdoppler"
density = 1
anchored = 1
+ verb_say = "states coldly"
/obj/machinery/doppler_array/New()
..()
@@ -76,9 +77,6 @@ var/list/doppler_arrays = list()
for(var/message in messages)
say(message)
-/obj/machinery/doppler_array/say_quote(text)
- return "states coldly, \"[text]\""
-
/obj/machinery/doppler_array/power_change()
if(stat & BROKEN)
icon_state = "[initial(icon_state)]-broken"
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index ad61bfe4ece..b713085f801 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -85,11 +85,11 @@ var/const/HOLOPAD_MODE = RANGE_BASED
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
-/obj/machinery/hologram/holopad/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/obj/machinery/hologram/holopad/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(speaker && masters.len && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios.
for(var/mob/living/silicon/ai/master in masters)
if(masters[master] && speaker != master)
- raw_message = master.lang_treat(speaker, message_langs, raw_message)
+ raw_message = master.lang_treat(speaker, message_langs, raw_message, spans)
var/name_used = speaker.GetVoice()
var/rendered = "Holopad received, [name_used] [raw_message]"
master.show_message(rendered, 2)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 4336a6638bc..72aa050feb2 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -124,6 +124,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
+ verb_say = "beeps"
+ verb_ask = "beeps"
+ verb_yell = "beeps"
var/isbroken = 0 //1 if someone banged it with something heavy
var/ispowered = 1 //starts powered, changes with power_change()
//var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
@@ -1082,6 +1085,3 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa
say("Attention! Wanted issue distributed!")
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 75, 1)
return
-
-/obj/machinery/newscaster/say_quote(text)
- return "beeps, \"[text]\""
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index e357ff5cc1b..00d896cc6c0 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -369,12 +369,12 @@ var/list/obj/machinery/requests_console/allConsoles = list()
updateUsrDialog()
return
-/obj/machinery/say_quote(var/text)
- var/ending = copytext(text, length(text) - 2)
+/obj/machinery/say_quote(var/input, list/spans)
+ var/ending = copytext(input, length(input) - 2)
if (ending == "!!!")
- return "blares, \"[text]\""
+ return "blares, \"attach_spans(input, spans)\""
- return "beeps, \"[text]\""
+ return ..()
/obj/machinery/requests_console/proc/createmessage(source, title, message, priority, paper)
var/linkedsender
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 2e50af0bad5..1a70443e37f 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -59,7 +59,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
Broadcast_Message(signal.data["mob"],
signal.data["vmask"], signal.data["radio"],
signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"],
- 0, signal.data["compression"], signal.data["level"], signal.frequency)
+ 0, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"])
/** #### - Simple Broadcast - #### **/
@@ -83,7 +83,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency)
+ signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"])
if(!message_delay)
message_delay = 1
@@ -143,7 +143,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency)
+ signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency, signal.data["spans"])
/**
@@ -204,7 +204,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/proc/Broadcast_Message(var/atom/movable/AM,
var/vmask, var/obj/item/device/radio/radio,
var/message, var/name, var/job, var/realname,
- var/data, var/compression, var/list/level, var/freq)
+ var/data, var/compression, var/list/level, var/freq, var/list/spans)
message = copytext(message, 1, MAX_BROADCAST_LEN)
@@ -220,6 +220,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
virt.source = AM
virt.faketrack = data == 4 ? 1 : 0
virt.radio = radio
+ virt.verb_say = AM.verb_say
+ virt.verb_ask = AM.verb_ask
+ virt.verb_yell = AM.verb_yell
if(compression > 0)
message = Gibberish(message, compression + 40)
@@ -265,14 +268,14 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO))
receive |= M
- var/rendered = virt.compose_message(virt, virt.languages, message, freq) //Always call this on the virtualspeaker to advoid issues.
+ var/rendered = virt.compose_message(virt, virt.languages, message, freq, spans) //Always call this on the virtualspeaker to advoid issues.
for(var/atom/movable/hearer in receive)
- hearer.Hear(rendered, virt, AM.languages, message, freq)
+ hearer.Hear(rendered, virt, AM.languages, message, freq, spans)
if(length(receive))
// --- This following recording is intended for research and feedback in the use of department radio channels ---
- var/blackbox_msg = "[AM] [AM.say_quote(message)]"
+ var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]"
if(istype(blackbox))
switch(freq)
if(1459)
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 599c5a20429..1fd2f349c89 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -87,7 +87,8 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
"type" = signal.data["type"],
"server" = signal.data["server"],
"reject" = signal.data["reject"],
- "level" = signal.data["level"]
+ "level" = signal.data["level"],
+ "spans" = signal.data["spans"]
)
// Keep the "original" signal constant
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index ca9c7e69447..6c4e0122cf5 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -14,6 +14,9 @@
layer = 2.9
anchored = 1
density = 1
+ verb_say = "beeps"
+ verb_ask = "beeps"
+ verb_yell = "beeps"
var/active = 1 //No sales pitches if off!
var/vend_ready = 1 //Are we ready to vend?? Is it time??
var/vend_delay = 10 //How long does it take to vend?
@@ -505,9 +508,6 @@
say(message)
-/obj/machinery/vending/say_quote(text)
- return "beeps, \"[text]\""
-
/obj/machinery/vending/power_change()
if(stat & BROKEN)
icon_state = "[initial(icon_state)]-broken"
@@ -841,12 +841,14 @@
/obj/item/clothing/head/bandana = 1,/obj/item/clothing/under/soviet = 1,/obj/item/clothing/head/ushanka = 1,/obj/item/clothing/suit/imperium_monk = 1,
/obj/item/clothing/mask/gas/cyborg = 1,/obj/item/clothing/suit/holidaypriest = 1,/obj/item/clothing/head/wizard/marisa/fake = 1,
/obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/weapon/staff/broom = 1,
- /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
+ /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
/obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero = 1, /obj/item/clothing/head/sombrero/green = 1, /obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1,
- /obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1,/obj/item/clothing/glasses/cold=1,/obj/item/clothing/glasses/heat=1)
- contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1)
+ /obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1,/obj/item/clothing/glasses/cold=1,/obj/item/clothing/glasses/heat=1,
+ /obj/item/clothing/suit/whitedress = 1,
+ /obj/item/clothing/under/jester = 1, /obj/item/clothing/head/jester = 1)
+ contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1,/obj/item/clothing/glasses/sunglasses/garb = 1)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1)
refill_canister = /obj/item/weapon/vending_refill/autodrobe
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 4c768ff6722..88b7cc77e2d 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -236,9 +236,9 @@ obj/mecha/proc/can_use(mob/user)
/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
return
-/obj/mecha/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/obj/mecha/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(speaker == occupant && radio.broadcasting)
- radio.talk_into(speaker, text)
+ radio.talk_into(speaker, text, , spans)
return
////////////////////////////
diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index f085bf60e04..9f3662ae8ed 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -16,8 +16,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/proc/delete()
loc = null
if(reagents)
- reagents.delete()
- return
+ qdel(reagents)
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.alpha == 0) //Handle already transparent case
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index d00614174e9..dd4270ece3f 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -102,7 +102,7 @@
///////////////////////////////////////////////
//FOAM EFFECT DATUM
/datum/effect/effect/system/foam_spread
- var/amount = 5 // the size of the foam spread.
+ var/amount = 10 // the size of the foam spread.
var/obj/chemholder
var/obj/effect/effect/foam/foamtype = /obj/effect/effect/foam
var/metal = 0
@@ -126,7 +126,7 @@
else
location = get_turf(loca)
- amount = round(sqrt(amt / 3), 1)
+ amount = round(sqrt(amt / 2), 1)
carry.copy_to(chemholder, carry.total_volume)
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index efca03256f6..59220d9cee6 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -207,19 +207,18 @@
/obj/effect/effect/chem_smoke/Move()
..()
- for(var/atom/A in view(1, src))
- if(reagents.has_reagent("radium")||reagents.has_reagent("uranium")||reagents.has_reagent("carbon")||reagents.has_reagent("thermite"))//Prevents unholy radium spam by reducing the number of 'greenglows' down to something reasonable -Sieve
- if(prob(5))
- reagents.reaction(A)
- else
- reagents.reaction(A)
+ for(var/mob/living/A in view(1, src))
+ if(reagents.total_volume >= 1)
+ reagents.reaction(A, TOUCH)
+ reagents.trans_to(A.reagents, 10)
return
/obj/effect/effect/chem_smoke/Crossed(mob/living/carbon/M as mob )
..()
- reagents.reaction(M)
-
+ if(reagents.total_volume >= 1)
+ reagents.reaction(M, TOUCH)
+ reagents.trans_to(M.reagents, 10)
/datum/effect/effect/system/chem_smoke_spread
var/total_smoke = 0 // To stop it being spammed and lagging!
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index aa9c969d34f..538e98cb003 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -116,8 +116,5 @@
/obj/item/weapon/wirecutters = 1,
/obj/item/weapon/wrench = 4,
/obj/item/weapon/relic = 3,
- /obj/item/weapon/reagent_containers/food/drinks/muriatic_acid = 3,
- /obj/item/weapon/reagent_containers/food/drinks/caustic_soda = 3,
- /obj/item/weapon/reagent_containers/food/drinks/hydrogen_chloride = 3,
"" = 11
)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 2683891a35e..2cded397e04 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -242,7 +242,7 @@
// afterattack() and attack() prototypes moved to _onclick/item_attack.dm for consistency
-/obj/item/proc/talk_into(mob/M as mob, text)
+/obj/item/proc/talk_into(mob/M, input, channel, spans)
return
/obj/item/proc/dropped(mob/user as mob)
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index a8e111e3097..eff5162edfb 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -6,10 +6,9 @@
var/code = "electronic"
origin_tech = "bluespace=1"
-/obj/item/device/radio/beacon/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/obj/item/device/radio/beacon/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
return
-
/obj/item/device/radio/beacon/send_hear()
return null
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index a008a70b8bb..e87eb6da388 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -23,7 +23,7 @@
keyslot2 = null
..()
-/obj/item/device/radio/headset/talk_into(mob/living/M as mob, message, channel)
+/obj/item/device/radio/headset/talk_into(mob/living/M, message, channel, list/spans)
if (!listening)
return
..()
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 41410f8594b..195ba80422d 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -50,7 +50,7 @@
return canhear_range
-/obj/item/device/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/obj/item/device/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(!anyai && !(speaker in ai))
return
..()
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 8b038de7814..0143a4887b6 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -233,7 +233,7 @@
/obj/item/device/radio/proc/isWireCut(var/index)
return wires.IsIndexCut(index)
-/obj/item/device/radio/talk_into(atom/movable/M, message, channel)
+/obj/item/device/radio/talk_into(atom/movable/M, message, channel, list/spans)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return
@@ -359,7 +359,8 @@
"server" = null, // the last server to log this signal
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
"level" = position.z, // The source's z level
- "languages" = M.languages //The languages M is talking in.
+ "languages" = M.languages, //The languages M is talking in.
+ "spans" = spans //the span classes of this message.
)
signal.frequency = freq
@@ -403,7 +404,9 @@
"type" = 0,
"server" = null,
"reject" = 0,
- "level" = position.z
+ "level" = position.z,
+ "languages" = languages,
+ "spans" = spans
)
signal.frequency = text2num(freq) // Quick frequency set
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
@@ -420,14 +423,14 @@
// Send a mundane broadcast with limited targets:
Broadcast_Message(M, voicemask,
src, message, voice, jobname, real_name,
- filter_type, signal.data["compression"], list(position.z), freq)
+ filter_type, signal.data["compression"], list(position.z), freq, spans)
-/obj/item/device/radio/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/obj/item/device/radio/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(radio_freq)
return
if(broadcasting)
if(get_dist(src, speaker) <= canhear_range)
- talk_into(speaker, raw_message)
+ talk_into(speaker, raw_message, , spans)
/*
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 3704a488d45..487345421fd 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -123,6 +123,10 @@ MASS SPECTROMETER
mob_status = "Deceased"
oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.heart_attack)
+ user.show_message("Subject suffering from heart attack: Apply defibrillator immediately.")
user.show_message(text("Analyzing Results for []:\n\t Overall Status: []", M, mob_status), 1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index ff22ee44971..8258d6dc4e2 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -97,7 +97,7 @@
icon_state = "taperecorder_idle"
-/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
if(mytape && recording)
mytape.timestamp += mytape.used_capacity
mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [strip_html_properly(message)]"
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index ad5cb815cfa..fae1e6b4063 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -381,6 +381,9 @@
busy = 0
update_icon()
return
+ if(H.heart_attack)
+ H.heart_attack = 0
+ user.visible_message("[defib] pings: Patient's heart is now beating again.")
if(H.stat == 2)
var/health = H.health
M.visible_message("[M]'s body convulses a bit.")
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index bda6191104b..5826fe552f9 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -388,6 +388,25 @@
beakers += B1
beakers += B2
+/obj/item/weapon/grenade/chem_grenade/clf3
+ name = "clf3 grenade"
+ desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas."
+ stage = READY
+
+/obj/item/weapon/grenade/chem_grenade/clf3/New()
+ ..()
+ var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src)
+
+ B1.reagents.add_reagent("fluorosurfactant", 290)
+ B1.reagents.add_reagent("clf3", 10)
+ B2.reagents.add_reagent("water", 290)
+ B2.reagents.add_reagent("clf3", 10)
+
+ beakers += B1
+ beakers += B2
+
+
#undef EMPTY
#undef WIRED
#undef READY
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 749a4b281ce..a8b7ae88590 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -141,7 +141,12 @@
/obj/item/weapon/implant/chem/activate(var/cause)
if(!cause || !imp_in) return 0
var/mob/living/carbon/R = imp_in
- reagents.trans_to(R, cause)
+ var/injectamount = null
+ if (cause == "action_button")
+ injectamount = reagents.total_volume
+ else
+ injectamount = cause
+ reagents.trans_to(R, injectamount)
R << "You hear a faint *beep*."
if(!reagents.total_volume)
R << "You hear a faint click from your chest."
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 89b613af2e3..f9b6eecd4cc 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -178,4 +178,10 @@
new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src)
new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src)
new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/initropidril(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/pancuronium(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/coniine(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/curare(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/amanitin(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm
index efebaa75f45..82fd942e368 100644
--- a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm
@@ -44,11 +44,11 @@
/obj/structure/closet/critter/corgi
name = "corgi crate"
- content_mob = /mob/living/simple_animal/corgi
+ content_mob = /mob/living/simple_animal/pet/corgi
/obj/structure/closet/critter/corgi/New()
if(prob(50))
- content_mob = /mob/living/simple_animal/corgi/Lisa
+ content_mob = /mob/living/simple_animal/pet/corgi/Lisa
..()
/obj/structure/closet/critter/cow
@@ -69,20 +69,20 @@
/obj/structure/closet/critter/cat
name = "cat crate"
- content_mob = /mob/living/simple_animal/cat
+ content_mob = /mob/living/simple_animal/pet/cat
/obj/structure/closet/critter/cat/New()
if(prob(50))
- content_mob = /mob/living/simple_animal/cat/Proc
+ content_mob = /mob/living/simple_animal/pet/cat/Proc
..()
/obj/structure/closet/critter/pug
name = "pug crate"
- content_mob = /mob/living/simple_animal/pug
+ content_mob = /mob/living/simple_animal/pet/pug
/obj/structure/closet/critter/fox
name = "fox crate"
- content_mob = /mob/living/simple_animal/fox
+ content_mob = /mob/living/simple_animal/pet/fox
/obj/structure/closet/critter/butterfly
name = "butterflies crate"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 59928592fa7..115a165649d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -24,6 +24,7 @@
new /obj/item/weapon/cartridge/captain(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/device/radio/headset/heads/captain/alt(src)
+ new /obj/item/clothing/glasses/sunglasses/gar/supergar(src)
new /obj/item/clothing/gloves/color/captain(src)
new /obj/item/weapon/gun/energy/gun(src)
return
@@ -54,6 +55,7 @@
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/weapon/mining_voucher(src)
new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/clothing/tie/petcollar(src)
return
@@ -79,6 +81,7 @@
new /obj/item/clothing/under/rank/head_of_security/alt(src)
new /obj/item/clothing/head/HoS(src)
new /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch(src)
+ new /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars(src)
new /obj/item/weapon/storage/lockbox/loyalty(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/device/megaphone/sec(src)
@@ -136,6 +139,7 @@
/obj/structure/closet/secure_closet/security/New()
..()
new /obj/item/clothing/suit/armor/vest(src)
+ new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/head/beret/sec(src)
new /obj/item/clothing/head/soft/sec(src)
diff --git a/code/game/pooling/atom_pool.dm b/code/game/pooling/atom_pool.dm
index ca6f8f19341..c12302b7555 100644
--- a/code/game/pooling/atom_pool.dm
+++ b/code/game/pooling/atom_pool.dm
@@ -69,13 +69,14 @@ var/global/list/GlobalPool = list()
if(AM in GlobalPool[AM.type])
return
-
- AM.ResetVars()
-
+
if(!GlobalPool[AM.type])
GlobalPool[AM.type] = list()
- GlobalPool[AM.type] += AM
+ GlobalPool[AM.type] |= AM
+
+ AM.Destroy()
+ AM.ResetVars()
diff --git a/code/game/say.dm b/code/game/say.dm
index 4b71d01d9bb..4f0f24139dd 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -21,20 +21,25 @@ var/list/freqtospan = list(
return
if(message == "" || !message)
return
- send_speech(message)
+ var/list/spans = get_spans()
+ send_speech(message, 7, src, , spans)
-/atom/movable/proc/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/atom/movable/proc/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
return
/atom/movable/proc/can_speak()
return 1
-/atom/movable/proc/send_speech(message, range)
- var/rendered = compose_message(src, languages, message)
+/atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans)
+ var/rendered = compose_message(src, languages, message, , spans)
for(var/atom/movable/AM in get_hearers_in_view(range, src))
- AM.Hear(rendered, src, languages, message)
+ AM.Hear(rendered, src, languages, message, , spans)
-/atom/movable/proc/compose_message(atom/movable/speaker, message_langs, raw_message, radio_freq)
+//To get robot span classes, stuff like that.
+/atom/movable/proc/get_spans()
+ return list()
+
+/atom/movable/proc/compose_message(atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
//This proc uses text() because it is faster than appending strings. Thanks BYOND.
//Basic span
var/spanpart1 = ""
@@ -47,7 +52,7 @@ var/list/freqtospan = list(
//End name span.
var/endspanpart = ""
//Message
- var/messagepart = " [lang_treat(speaker, message_langs, raw_message)]"
+ var/messagepart = " [lang_treat(speaker, message_langs, raw_message, spans)]"
return "[spanpart1][spanpart2][freqpart][compose_track_href(speaker, message_langs, raw_message, radio_freq)][namepart][compose_job(speaker, message_langs, raw_message, radio_freq)][endspanpart][messagepart]"
@@ -57,32 +62,33 @@ var/list/freqtospan = list(
/atom/movable/proc/compose_job(atom/movable/speaker, message_langs, raw_message, radio_freq)
return ""
-/atom/movable/proc/say_quote(var/text)
- if(!text)
+/atom/movable/proc/say_quote(input, list/spans)
+ if(!input)
return "says, \"...\"" //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
- var/ending = copytext(text, length(text))
+ var/ending = copytext(input, length(input))
+ if(copytext(input, length(input) - 1) == "!!")
+ spans |= SPAN_YELL
+ input = attach_spans(input, spans)
if(ending == "?")
- return "asks, \"[text]\""
- if(copytext(text, length(text) - 1) == "!!")
- return "yells, \"[text]\""
+ return "[verb_ask], \"[input]\""
if(ending == "!")
- return "exclaims, \"[text]\""
+ return "[verb_yell], \"[input]\""
- return "says, \"[text]\""
+ return "[verb_say], \"[input]\""
-/atom/movable/proc/lang_treat(atom/movable/speaker, message_langs, raw_message)
+/atom/movable/proc/lang_treat(atom/movable/speaker, message_langs, raw_message, list/spans)
if(languages & message_langs)
var/atom/movable/AM = speaker.GetSource()
if(AM)
- return AM.say_quote(raw_message)
+ return AM.say_quote(raw_message, spans)
else
- return speaker.say_quote(raw_message)
+ return speaker.say_quote(raw_message, spans)
else if(message_langs & HUMAN)
var/atom/movable/AM = speaker.GetSource()
if(AM)
- return AM.say_quote(stars(raw_message))
+ return AM.say_quote(stars(raw_message), spans)
else
- return speaker.say_quote(stars(raw_message))
+ return speaker.say_quote(stars(raw_message), spans)
else if(message_langs & MONKEY)
return "chimpers."
else if(message_langs & ALIEN)
@@ -106,27 +112,44 @@ var/list/freqtospan = list(
return returntext
return "[copytext("[freq]", 1, 4)].[copytext("[freq]", 4, 5)]"
+/proc/attach_spans(input, list/spans)
+ return "[message_spans_start(spans)][input]"
+
+/proc/message_spans_start(list/spans)
+ var/output = ""
+ return output
+
+/mob/living/proc/say_test(var/text)
+ var/ending = copytext(text, length(text))
+ if (ending == "?")
+ return "1"
+ else if (ending == "!")
+ return "2"
+ return "0"
+
/atom/movable/proc/GetVoice()
return name
/atom/movable/proc/IsVocal()
return 1
-/atom/movable/proc/get_alt_name()
- return
-
+//HACKY VIRTUALSPEAKER STUFF BEYOND THIS POINT
//these exist mostly to deal with the AIs hrefs and job stuff.
-/atom/movable/proc/GetJob()
- return
+
+/atom/movable/proc/get_alt_name()
+
+/atom/movable/proc/GetJob() //Get a job, you lazy butte
/atom/movable/proc/GetTrack()
- return
/atom/movable/proc/GetSource()
- return
/atom/movable/proc/GetRadio()
+//VIRTUALSPEAKERS
/atom/movable/virtualspeaker
var/job
var/faketrack
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 56e0834c4af..4c5ff2617bc 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -268,10 +268,10 @@
if("slime") M.change_mob_type( /mob/living/simple_animal/slime , null, null, delmob )
if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob )
- if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob )
- if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/Runtime , null, null, delmob )
- if("corgi") M.change_mob_type( /mob/living/simple_animal/corgi , null, null, delmob )
- if("ian") M.change_mob_type( /mob/living/simple_animal/corgi/Ian , null, null, delmob )
+ if("cat") M.change_mob_type( /mob/living/simple_animal/pet/cat , null, null, delmob )
+ if("runtime") M.change_mob_type( /mob/living/simple_animal/pet/cat/Runtime , null, null, delmob )
+ if("corgi") M.change_mob_type( /mob/living/simple_animal/pet/corgi , null, null, delmob )
+ if("ian") M.change_mob_type( /mob/living/simple_animal/pet/corgi/Ian , null, null, delmob )
if("crab") M.change_mob_type( /mob/living/simple_animal/crab , null, null, delmob )
if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob )
if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob )
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 3706dd5fdf9..75fe87e9802 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -7,10 +7,13 @@
origin_tech = "magnets=1"
flags = HEAR
attachable = 1
+ verb_say = "beeps"
+ verb_ask = "beeps"
+ verb_yell = "beeps"
var/listening = 0
var/recorded = "" //the activation message
-/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(speaker == src)
return
@@ -28,9 +31,6 @@
listening = !listening
say("[listening ? "Now" : "No longer"] recording input.")
-/obj/machinery/vending/say_quote(text)
- return "beeps, \"[text]\""
-
/obj/item/device/assembly/voice/attack_self(mob/user)
if(!user)
return 0
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 52390b586ab..230efee1fc6 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -9,6 +9,9 @@
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
var/alt_desc = null
+ var/obj/item/device/flashlight/F = null
+ var/can_flashlight = 0
+
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
name = "ears"
@@ -404,3 +407,4 @@ atom/proc/generate_female_clothing(index,t_color,icon,type)
if(!user.stat && user.canmove && !user.restrained())
return 1
return 0
+
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 2dc8971664c..9a26058d953 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -15,6 +15,17 @@
item_state = "nvgmeson"
darkness_view = 8
+/obj/item/clothing/glasses/meson/gar
+ name = "gar mesons"
+ icon_state = "garm"
+ item_state = "garm"
+ desc = "Do the impossible, see the invisible!"
+ force = 10
+ throwforce = 10
+ throw_speed = 4
+ attack_verb = list("sliced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
/obj/item/clothing/glasses/science
name = "Science Goggles"
desc = "A pair of snazzy goggles used to protect against chemical spills."
@@ -78,6 +89,44 @@
flash_protect = 1
tint = 1
+/obj/item/clothing/glasses/sunglasses/garb
+ desc = "Go beyond impossible and kick reason to the curb!"
+ name = "black gar glasses"
+ icon_state = "garb"
+ item_state = "garb"
+ force = 10
+ throwforce = 10
+ throw_speed = 4
+ attack_verb = list("sliced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+/obj/item/clothing/glasses/sunglasses/garb/supergarb
+ desc = "Believe in us humans."
+ name = "black giga gar glasses"
+ icon_state = "supergarb"
+ item_state = "garb"
+ force = 12
+ throwforce = 12
+
+/obj/item/clothing/glasses/sunglasses/gar
+ desc = "Just who the hell do you think I am?!"
+ name = "gar glasses"
+ icon_state = "gar"
+ item_state = "gar"
+ force = 10
+ throwforce = 10
+ throw_speed = 4
+ attack_verb = list("sliced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+/obj/item/clothing/glasses/sunglasses/gar/supergar
+ desc = "We evolve past the person we were a minute before. Little by little we advance with each turn. That's how a drill works!"
+ name = "giga gar glasses"
+ icon_state = "supergar"
+ item_state = "gar"
+ force = 12
+ throwforce = 12
+
/obj/item/clothing/glasses/welding
name = "welding goggles"
desc = "Protects the eyes from welders; approved by the mad scientist association."
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 012a260bba5..709f923534c 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -65,3 +65,21 @@
emagged = 1
desc = desc + " The display flickers slightly."
+/obj/item/clothing/glasses/hud/security/sunglasses/gars
+ name = "HUD gar glasses"
+ desc = "GAR glasses with a HUD."
+ icon_state = "gars"
+ item_state = "garb"
+ force = 10
+ throwforce = 10
+ throw_speed = 4
+ attack_verb = list("sliced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+/obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars
+ name = "giga HUD gar glasses"
+ desc = "GIGA GAR glasses with a HUD."
+ icon_state = "supergars"
+ item_state = "garb"
+ force = 12
+ throwforce = 12
\ No newline at end of file
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index d1b15282247..a80c9ab289b 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -11,6 +11,28 @@
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
+ var/obj/machinery/camera/portable/helmetCam = null
+ var/spawnWithHelmetCam = 0
+ var/canAttachCam = 0
+
+
+/obj/item/clothing/head/helmet/New()
+ ..()
+ if(spawnWithHelmetCam)
+ helmetCam = new /obj/machinery/camera/portable(src)
+ helmetCam.c_tag = "Helmet-Mounted Camera (No User)([rand(1,999)])"
+ helmetCam.network = list("SS13")
+ update_icon()
+
+/obj/item/clothing/head/helmet/emp_act(severity)
+ if(helmetCam) //Transfer the EMP to the camera so you can still disable it this way.
+ helmetCam.emp_act(severity)
+ ..()
+
+/obj/item/clothing/head/helmet/sec
+ spawnWithHelmetCam = 1
+ canAttachCam = 1
+ can_flashlight = 1
/obj/item/clothing/head/helmet/alt
name = "bulletproof helmet"
@@ -115,3 +137,150 @@ obj/item/clothing/head/helmet/bluetaghelm
armor = list(melee = 30, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
+
+//LightToggle
+
+/obj/item/clothing/head/helmet/update_icon()
+
+ var/state = "[initial(icon_state)]"
+ if(helmetCam)
+ state += "-cam" //"helmet-cam"
+ if(F)
+ if(F.on)
+ state += "-flight-on" //"helmet-flight-on" // "helmet-cam-flight-on"
+ else
+ state += "-flight" //etc.
+
+ icon_state = state
+
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = loc
+ H.update_inv_head(0)
+
+ return
+
+/obj/item/clothing/head/helmet/ui_action_click()
+ toggle_helmlight()
+
+/obj/item/clothing/head/helmet/attackby(var/obj/item/A as obj, mob/user as mob, params)
+ if(istype(A, /obj/item/device/flashlight/seclite))
+ var/obj/item/device/flashlight/seclite/S = A
+ if(can_flashlight)
+ if(!F)
+ user.drop_item()
+ user << "You click [S] into place on [src]."
+ if(S.on)
+ SetLuminosity(0)
+ F = S
+ A.loc = src
+ update_icon()
+ update_helmlight(user)
+ verbs += /obj/item/clothing/head/helmet/proc/toggle_helmlight
+ return
+
+ if(istype(A, /obj/item/weapon/screwdriver))
+ if(F)
+ for(var/obj/item/device/flashlight/seclite/S in src)
+ user << "You unscrew the seclite from [src]."
+ F = null
+ S.loc = get_turf(user)
+ update_helmlight(user)
+ S.update_brightness(user)
+ update_icon()
+ usr.update_inv_head(0)
+ verbs -= /obj/item/clothing/head/helmet/proc/toggle_helmlight
+ return
+
+
+ if(istype(A, /obj/item/weapon/camera_assembly))
+ if(!canAttachCam)
+ user << "You can't attach [A] to [src]!"
+ return
+ if(helmetCam)
+ user << "[src] already has a mounted camera."
+ return
+ user.drop_item()
+ helmetCam = new /obj/machinery/camera/portable(src)
+ helmetCam.assembly = A
+ A.loc = helmetCam
+ helmetCam.c_tag = "Helmet-Mounted Camera (No User)([rand(1,999)])"
+ helmetCam.network = list("SS13")
+ update_icon()
+ user.visible_message("[user] attaches [A] to [src]","You attach [A] to [src]")
+ return
+
+ if(istype(A, /obj/item/weapon/crowbar))
+ if(!helmetCam)
+ ..()
+ return
+ user.visible_message("[user] removes [helmetCam] from [src]","You remove [helmetCam] from [src]")
+ helmetCam.assembly.loc = get_turf(src)
+ helmetCam.assembly = null
+ qdel(helmetCam)
+ helmetCam = null
+ update_icon()
+ return
+
+ ..()
+ return
+
+/obj/item/clothing/head/helmet/proc/toggle_helmlight()
+ set name = "Toggle Helmetlight"
+ set category = "Object"
+ set desc = "Click to toggle your helmet's attached flashlight."
+
+ if(!F)
+ return
+
+ var/mob/living/carbon/human/user = usr
+ if(!isturf(user.loc))
+ user << "You cannot turn the light on while in this [user.loc]."
+ F.on = !F.on
+ user << "You toggle the helmetlight [F.on ? "on":"off"]."
+
+ playsound(user, 'sound/weapons/empty.ogg', 100, 1)
+ update_helmlight(user)
+ return
+
+/obj/item/clothing/head/helmet/proc/update_helmlight(var/mob/user = null)
+ if(F)
+ action_button_name = "Toggle Helmetlight"
+ if(F.on)
+ if(loc == user)
+ user.AddLuminosity(F.brightness_on)
+ else if(isturf(loc))
+ SetLuminosity(F.brightness_on)
+ else
+ if(loc == user)
+ user.AddLuminosity(-F.brightness_on)
+ else if(isturf(loc))
+ SetLuminosity(0)
+ update_icon()
+ else
+ action_button_name = null
+ if(loc == user)
+ user.AddLuminosity(-5)
+ else if(isturf(loc))
+ SetLuminosity(0)
+ return
+
+/obj/item/clothing/head/helmet/pickup(mob/user)
+ if(F)
+ if(F.on)
+ user.AddLuminosity(F.brightness_on)
+ SetLuminosity(0)
+
+
+/obj/item/clothing/head/helmet/equipped(mob/user)
+ if(helmetCam)
+ spawn(10) //Gives time for the game to set a name (lol rhyme) to roundstart officers.
+ helmetCam.c_tag = "Helmet-Mounted Camera ([user.name])([rand(1,999)])"
+
+/obj/item/clothing/head/helmet/dropped(mob/user)
+ if(F)
+ if(F.on)
+ user.AddLuminosity(-F.brightness_on)
+ SetLuminosity(F.brightness_on)
+
+ if(helmetCam)
+ helmetCam.c_tag = "Helmet-Mounted Camera (No User)([rand(1,999)])"
\ No newline at end of file
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 2ac171d76de..266bfda4689 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -210,4 +210,9 @@
icon_state = "santahatnorm"
item_state = "that"
cold_protection = HEAD
- min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
\ No newline at end of file
+ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+
+/obj/item/clothing/head/jester
+ name = "jester hat"
+ desc = "A hat with bells, to add some merryness to the suit."
+ icon_state = "jester_hat"
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index c76fbd9c198..610f50c5642 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -11,6 +11,7 @@
action_button_name = "Toggle Helmet Light"
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
+
/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
@@ -57,6 +58,7 @@
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
+
/obj/item/clothing/suit/space/hardsuit/atmos
name = "atmospherics hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding."
@@ -79,6 +81,7 @@
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
+
/obj/item/clothing/suit/space/hardsuit/elite
icon_state = "hardsuit-white"
name = "advanced hardsuit"
@@ -100,6 +103,7 @@
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
brightness_on = 7
+
/obj/item/clothing/suit/space/hardsuit/mining
icon_state = "hardsuit-mining"
name = "mining hardsuit"
@@ -208,6 +212,7 @@
item_state = "s_helmet"
item_color = "owl"
+
/obj/item/clothing/suit/space/hardsuit/syndi/owl
name = "owl hardsuit"
desc = "A dual-mode advanced hardsuit designed for any crime-fighting situation. It is in travel mode."
@@ -231,6 +236,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
+
/obj/item/clothing/suit/space/hardsuit/wizard
icon_state = "hardsuit-wiz"
name = "gem-encrusted hardsuit"
@@ -258,6 +264,7 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
+
/obj/item/clothing/suit/space/hardsuit/medical
icon_state = "hardsuit-medical"
name = "medical hardsuit"
@@ -278,6 +285,7 @@
item_color = "sec"
armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+
/obj/item/clothing/suit/space/hardsuit/security
icon_state = "hardsuit-sec"
name = "security hardsuit"
@@ -294,6 +302,7 @@
item_color = "hos"
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
+
/obj/item/clothing/suit/space/hardsuit/security/hos
icon_state = "hardsuit-hos"
name = "head of security's hardsuit"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 0adae1c15a2..bd3c9d8368e 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -187,6 +187,15 @@
item_state = "ponchoshame"
flags = NODROP
+/obj/item/clothing/suit/whitedress
+ name = "white dress"
+ desc = "A fancy white dress."
+ icon_state = "white_dress"
+ item_state = "w_suit"
+ body_parts_covered = CHEST|GROIN|LEGS|FEET
+ flags_inv = HIDEJUMPSUIT|HIDESHOES
+
+
/*
* Misc
*/
@@ -306,4 +315,4 @@
name = "mining winter coat"
icon_state = "coatminer"
allowed = list(/obj/item/weapon/pickaxe,/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
- armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
\ No newline at end of file
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index a1faa5d6c6f..c0d55ed45e4 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -469,4 +469,11 @@
desc = "A preppy purple skirt with a white blouse."
icon_state = "plaid_purple"
item_state = "plaid_purple"
- item_color = "plaid_purple"
\ No newline at end of file
+ item_color = "plaid_purple"
+
+/obj/item/clothing/under/jester
+ name = "jester suit"
+ desc = "A jolly dress, well suited to entertain your master, nuncle."
+ icon_state = "jester"
+ item_color = "jester"
+ can_adjust = 0
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 1520f2cfcf7..17c224df9a3 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -277,3 +277,13 @@
name = "striped blue scarf"
icon_state = "stripedbluescarf"
item_color = "stripedbluescarf"
+
+/obj/item/clothing/tie/petcollar //don't really wear this though please c'mon seriously guys
+ name = "pet collar"
+ icon_state = "petcollar"
+ item_color = "petcollar"
+ var/tagname = null
+
+/obj/item/clothing/tie/petcollar/attack_self(mob/user as mob)
+ tagname = copytext(sanitize(input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot") as null|text),1,MAX_NAME_LEN)
+ name = "[initial(name)] - [tagname]"
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 177b23d1572..e9b2ab62b90 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -49,7 +49,7 @@
name = "Secbot"
result = /obj/machinery/bot/secbot
reqs = list(/obj/item/device/assembly/signaler = 1,
- /obj/item/clothing/head/helmet = 1,
+ /obj/item/clothing/head/helmet/sec = 1,
/obj/item/weapon/melee/baton = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm
index 6533f5945e5..684f3ec5eb2 100644
--- a/code/modules/crafting/table.dm
+++ b/code/modules/crafting/table.dm
@@ -12,10 +12,17 @@
check_table()
main_loop:
for(var/A in R.reqs)
+ var/needed_amount = R.reqs[A]
for(var/B in table_contents)
if(ispath(B, A))
if(table_contents[B] >= R.reqs[A])
continue main_loop
+ else
+ needed_amount -= table_contents[B]
+ if(needed_amount <= 0)
+ continue main_loop
+ else
+ continue
return 0
for(var/A in R.chem_catalysts)
if(table_contents[A] < R.chem_catalysts[A])
@@ -118,15 +125,18 @@
item_loop:
for(var/B in table_contents)
if(ispath(B, A))
- while(amt > 0)
+ var/item_amount = table_contents[B]
+ while(item_amount > 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--
+ item_amount--
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
+ if(amt <= 0)
+ break item_loop
else
var/datum/reagent/RG = new A
reagent_loop:
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index 5e8996a8c1d..d08eebb919e 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -17,7 +17,7 @@
else
hardset_dna(H, null, null, null, null, /datum/species/zombie)
- for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list)
+ for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in mob_list)
Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian))
/datum/round_event/spooky/announce()
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index 98d41c96b72..f7f3d202206 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -29,7 +29,7 @@
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
new /obj/item/weapon/a_gift(T)
- for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list)
+ for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in mob_list)
Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in machines)
Monitor.icon_state = "entertainment_xmas"
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 037b2f4101f..7703be7fc73 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -37,4 +37,4 @@
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- R.delete() //GC the reagents
\ No newline at end of file
+ qdel(R)
\ No newline at end of file
diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm
index 59707297095..0408f97169a 100644
--- a/code/modules/events/wizard/departmentrevolt.dm
+++ b/code/modules/events/wizard/departmentrevolt.dm
@@ -1,6 +1,6 @@
/datum/round_event_control/wizard/deprevolt //stationwide!
name = "Departmental Uprising"
- weight = 2
+ weight = 0 //An order that requires order in a round of chaos was maybe not the best idea. Requiescat in pace departmental uprising August 2014 - March 2015
typepath = /datum/round_event/wizard/deprevolt/
max_occurrences = 1
earliest_start = 0
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 42671e50a41..7b33f64ab76 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -148,7 +148,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/poppy/add_juice()
if(..())
reagents.add_reagent("nutriment", 1 + round((potency / 20), 1))
- reagents.add_reagent("hotline", 3 + round((potency / 10), 1))
+ reagents.add_reagent("salglu_solution", 1 + round((potency / 20), 1))
bitesize = 1 + round(reagents.total_volume / 3, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/poppy/lily
@@ -651,7 +651,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
seed = /obj/item/seeds/icepepperseed
- name = "ice-pepper"
+ name = "ice pepper"
desc = "It's a mutant strain of chili"
icon_state = "icepepper"
filling_color = "#0000CD"
@@ -666,7 +666,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
. = ..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "- Frostoil: [reagents.get_reagent_amount("frostoil")]%"
+ user << "- Frost Oil: [reagents.get_reagent_amount("frostoil")]%"
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili
@@ -1031,6 +1031,8 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
reagents.add_reagent("oculine", 3+round(potency / 5, 1))
bitesize = 1 + round(reagents.total_volume / 2, 1)
+/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
+ name = "mushroom"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi
seed = /obj/item/seeds/reishimycelium
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 6b642d03821..4c42141cd91 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -477,11 +477,11 @@
growthstages = 4
/obj/item/seeds/icepepperseed
- name = "pack of ice-pepper seeds"
- desc = "These seeds grow into ice-pepper plants."
+ name = "pack of ice pepper seeds"
+ desc = "These seeds grow into ice pepper plants."
icon_state = "seed-icepepper"
species = "chiliice"
- plantname = "Ice-Pepper Plants"
+ plantname = "Ice Pepper Plants"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
lifespan = 25
endurance = 15
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 2e10f1d241b..aaba77bd9e0 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -162,6 +162,9 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
name = "book inventory management console"
var/arcanecheckout = 0
screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
+ verb_say = "beeps"
+ verb_ask = "beeps"
+ verb_yell = "beeps"
var/buffer_book
var/buffer_mob
var/upload_category = "Fiction"
@@ -430,11 +433,6 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
src.updateUsrDialog()
return
-/obj/machinery/computer/libraryconsole/bookmanagement/say_quote(text)
- return "flashes, \"[text]\""
-
-
-
/*
* Library Scanner
*/
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index b8f160bf058..59845e2bff9 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -241,6 +241,7 @@
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 400),
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 500),
+ new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 039a69b6e9e..bab94a00cac 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -16,7 +16,7 @@
. = src.say_dead(message)
-/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
speaker = V.source
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index 243534fb3c8..c7d0cd73725 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -131,7 +131,7 @@
zone_sel.selecting = "chest"
if(prob(10)) //my x is augmented
//arms
- if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
var/obj/item/organ/limb/r_arm/R = locate(/obj/item/organ/limb/r_arm) in organs
del(R)
organs += new /obj/item/organ/limb/robot/r_arm
@@ -140,7 +140,7 @@
del(L)
organs += new /obj/item/organ/limb/robot/l_arm
//legs
- if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
var/obj/item/organ/limb/r_leg/R = locate(/obj/item/organ/limb/r_leg) in organs
del(R)
organs += new /obj/item/organ/limb/robot/r_leg
@@ -149,7 +149,7 @@
del(L)
organs += new /obj/item/organ/limb/robot/l_leg
//chest and head
- if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
var/obj/item/organ/limb/chest/R = locate(/obj/item/organ/limb/chest) in organs
del(R)
organs += new /obj/item/organ/limb/robot/chest
@@ -341,14 +341,14 @@
//---------TOOLS
if(istype(TARGET, /obj/item/weapon))
var/obj/item/weapon/W = TARGET
- if(W.force >= best_force || prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ if(W.force >= best_force || prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
if(!l_hand || !r_hand)
take_to_slot(W)
else
insert_into_backpack()
//---------FASHION
if(istype(TARGET,/obj/item/clothing))
- if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
if(!l_hand || !r_hand)
var/obj/item/clothing/C = TARGET
take_to_slot(C)
@@ -395,15 +395,15 @@
if(nearby.len > 4)
//i'm crowded, time to leave
TARGET = pick(target_filter(orange(MAX_RANGE_FIND,src)))
- else if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ else if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
//chance to chase an item
TARGET = locate(/obj/item) in orange(MIN_RANGE_FIND,src)
- else if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ else if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
//chance to leave
TARGET = locate(/obj/machinery/door) in orange(MIN_RANGE_FIND,src) // this is a sort of fix for the current pathing.
else
//else, target whatever, or go to our department
- if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
+ if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
TARGET = pick(target_filter(orange(MIN_RANGE_FIND,src)))
else
TARGET = pick(get_area_turfs(job2area(myjob)))
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 1cd79aff95d..6bff22c7fab 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -5,13 +5,13 @@
/mob/living/carbon/alien
name = "alien"
voice_name = "alien"
- say_message = "hisses"
icon = 'icons/mob/alien.dmi'
gender = NEUTER
dna = null
faction = list("alien")
ventcrawler = 2
languages = ALIEN
+ verb_say = "hisses"
var/nightvision = 1
var/storedPlasma = 250
var/max_plasma = 500
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 2a50fbf7b9f..c30b431f3ec 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -145,7 +145,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(!sterile) L.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
else if (iscorgi(M))
- var/mob/living/simple_animal/corgi/C = M
+ var/mob/living/simple_animal/pet/corgi/C = M
loc = C
C.facehugger = src
@@ -178,7 +178,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(iscorgi(target))
- var/mob/living/simple_animal/corgi/C = target
+ var/mob/living/simple_animal/pet/corgi/C = target
src.loc = get_turf(C)
C.facehugger = null
else
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index a5bb0a956d5..ac45baaf338 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -9,11 +9,11 @@
message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher
..()
-/mob/living/carbon/brain/radio(message, message_mode)
+/mob/living/carbon/brain/radio(message, message_mode, list/spans)
if(message_mode && istype(container, /obj/item/device/mmi/radio_enabled))
var/obj/item/device/mmi/radio_enabled/R = container
if(R.radio)
- R.radio.talk_into(src, message)
+ R.radio.talk_into(src, message, , spans)
return ITALICS | REDUCE_RANGE
/mob/living/carbon/brain/lingcheck()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 56dc2910adf..f0538cef695 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -86,6 +86,8 @@
"You feel a powerful shock coursing through your body!", \
"You hear a heavy electrical crack." \
)
+ if(prob(25) && heart_attack)
+ heart_attack = 0
jitteriness += 1000 //High numbers for violent convulsions
do_jitter_animation(jitteriness)
stuttering += 2
@@ -188,6 +190,12 @@
if(prob(20))
src << "Something bright flashes in the corner of your vision!"
+/mob/living/carbon/proc/eyecheck()
+ var/obj/item/cybernetic_implant/eyes/EFP = locate() in src
+ if(EFP)
+ return EFP.flash_protect
+ return 0
+
/mob/living/carbon/proc/tintcheck()
return 0
@@ -380,6 +388,12 @@ var/const/GALOSHES_DONT_HELP = 8
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
+
+/mob/living/carbon/revive()
+ heart_attack = 0
+ ..()
+ return
+
/mob/living/carbon/blob_act()
if (stat == DEAD)
return
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index c24bf2d75b4..7904c7cfb0f 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -15,8 +15,9 @@
var/obj/item/weapon/tank/internal = null
var/datum/dna/dna = null//Carbon
+ var/heart_attack = 0
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/co2overloadtime = null
- var/temperature_resistance = T0C+75
+ var/temperature_resistance = T0C+75
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 71327284c39..f20afceaaa3 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -266,7 +266,8 @@
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- if(istype(H.glasses, /obj/item/clothing/glasses/hud))
+ var/obj/item/cybernetic_implant/eyes/hud/CIH = locate(/obj/item/cybernetic_implant/eyes/hud) in internal_organs
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud) || CIH)
var/perpname = get_face_name(get_id_name(""))
if(perpname)
var/datum/data/record/R = find_record("name", perpname, data_core.general)
@@ -274,7 +275,7 @@
msg += "Rank: [R.fields["rank"]]
"
msg += "\[Front photo\] "
msg += "\[Side photo\]
"
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/medical))
if(R)
var/health = R.fields["p_stat"]
msg += "\[[health]\]"
@@ -284,7 +285,8 @@
if(R)
msg += "\[Medical evaluation\]
"
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/security))
if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
var/criminal = "None"
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index f622ed76642..902cce6896a 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -88,6 +88,9 @@
if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask
var/obj/item/clothing/mask/MFP = src.wear_mask
number += MFP.flash_protect
+ var/obj/item/cybernetic_implant/eyes/EFP = locate() in src
+ if(EFP)
+ number += EFP.flash_protect
return number
/mob/living/carbon/human/check_ear_prot()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index a8f4bc0f765..8aa7647ac50 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -359,4 +359,13 @@
I.loc = get_turf(src)
visible_message("\the [I] falls out of [name]'s [L.getDisplayName()]!","\the [I] falls out of your [L.getDisplayName()]!")
+/mob/living/carbon/human/handle_heart()
+ if(!heart_attack)
+ return
+ else
+ losebreath += 5
+ adjustOxyLoss(5)
+ adjustBruteLoss(1)
+ return
+
#undef HUMAN_MAX_OXYLOSS
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index c5b2f914a64..39603eaaeb9 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,26 +1,12 @@
-/mob/living/carbon/human/say_quote(text)
- if(!text)
- return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
- var/ending = copytext(text, length(text))
- if (src.stuttering)
- return "stammers, \"[text]\"";
+/mob/living/carbon/human/say_quote(input, spans)
+ if(!input)
+ return "says, \"...\"" //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
+ verb_say = dna.species.say_mod
if(src.slurring)
- return "slurs, \"[text]\"";
- if(isliving(src))
- var/mob/living/L = src
- if (L.getBrainLoss() >= 60)
- return "gibbers, \"[text]\"";
- if(ending == "?")
- return "asks, \"[text]\"";
- if(copytext(text, length(text) - 1) == "!!")
- return "yells, \"[text]\"";
- if(ending == "!")
- return "exclaims, \"[text]\"";
+ input = attach_spans(input, spans)
+ return "slurs, \"[input]\""
- if(dna)
- return "[dna.species.say_mod], \"[text]\"";
-
- return "says, \"[text]\"";
+ return ..()
/mob/living/carbon/human/treat_message(message)
if(dna)
@@ -43,6 +29,9 @@
message = dna.mutations_say_mods(message)
return message
+/mob/living/carbon/human/get_spans()
+ return ..() | dna.mutations_get_spans()
+
/mob/living/carbon/human/GetVoice()
if(istype(wear_mask, /obj/item/clothing/mask/gas/voice))
var/obj/item/clothing/mask/gas/voice/V = wear_mask
@@ -83,7 +72,7 @@
if(!istype(dongle)) return 0
if(dongle.translate_binary) return 1
-/mob/living/carbon/human/radio(message, message_mode)
+/mob/living/carbon/human/radio(message, message_mode, list/spans)
. = ..()
if(. != 0)
return .
@@ -91,22 +80,22 @@
switch(message_mode)
if(MODE_HEADSET)
if (ears)
- ears.talk_into(src, message)
+ ears.talk_into(src, message, , spans)
return ITALICS | REDUCE_RANGE
if(MODE_SECURE_HEADSET)
if (ears)
- ears.talk_into(src, message, 1)
+ ears.talk_into(src, message, 1, spans)
return ITALICS | REDUCE_RANGE
if(MODE_DEPARTMENT)
if (ears)
- ears.talk_into(src, message, message_mode)
+ ears.talk_into(src, message, message_mode, spans)
return ITALICS | REDUCE_RANGE
if(message_mode in radiochannels)
if(ears)
- ears.talk_into(src, message, message_mode)
+ ears.talk_into(src, message, message_mode, spans)
return ITALICS | REDUCE_RANGE
return 0
@@ -115,33 +104,7 @@
if(name != GetVoice())
return " (as [get_id_name("Unknown")])"
-/mob/living/carbon/human/proc/forcesay(list/append) //this proc is at the bottom of the file because quote fuckery makes notepad++ cri
- if(stat == CONSCIOUS)
- if(client)
- var/virgin = 1 //has the text been modified yet?
- var/temp = winget(client, "input", "text")
- if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //"case sensitive means
-
- temp = replacetext(temp, ";", "") //general radio
-
- if(findtext(trim_left(temp), ":", 6, 7)) //dept radio
- temp = copytext(trim_left(temp), 8)
- virgin = 0
-
- if(virgin)
- temp = copytext(trim_left(temp), 6) //normal speech
- virgin = 0
-
- while(findtext(trim_left(temp), ":", 1, 2)) //dept radio again (necessary)
- temp = copytext(trim_left(temp), 3)
-
- if(findtext(temp, "*", 1, 2)) //emotes
- return
-
- var/trimmed = trim_left(temp)
- if(length(trimmed))
- if(append)
- temp += pick(append)
-
- say(temp)
- winset(client, "input", "text=[null]")
+/mob/living/carbon/human/proc/forcesay(list/append)
+ var/temp = winget(client, "input", "text")
+ say(temp)
+ winset(client, "input", "text=[null]")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 1db023ee37a..c25f6048a27 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -510,10 +510,16 @@
H.see_in_dark = 8
if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
else
- H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
+ if(!(SEE_TURFS & H.permanent_sight_flags))
+ H.sight &= ~SEE_TURFS
+ if(!(SEE_MOBS & H.permanent_sight_flags))
+ H.sight &= ~SEE_MOBS
+ if(!(SEE_OBJS & H.permanent_sight_flags))
+ H.sight &= ~SEE_OBJS
+
+ H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : darksight
var/see_temp = H.see_invisible
H.see_invisible = invis_sight
- H.see_in_dark = darksight
if(H.seer)
H.see_invisible = SEE_INVISIBLE_OBSERVER
@@ -1000,10 +1006,8 @@
var/datum/gas_mixture/environment = H.loc.return_air()
var/datum/gas_mixture/breath
- // HACK NEED CHANGING LATER
if(H.health <= config.health_threshold_crit)
H.losebreath++
-
if(H.losebreath>0) //Suffocating so do not take a breath
H.losebreath--
if (prob(10)) //Gasp per 10 ticks? Sounds about right.
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index 1d1de70648c..68db5b14894 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -311,3 +311,9 @@
message_list.Insert(insertpos, "[pick("BRAINS", "Brains", "Braaaiinnnsss", "BRAAAIIINNSSS")]...")
return list2text(message_list, " ")
+
+/datum/species/cosmetic_zombie
+ name = "Human"
+ id = "zombie"
+ sexes = 0
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 24d98e205e7..23bb31ead56 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -63,15 +63,16 @@
for(var/mob/M in watching)
M.show_message(rendered, 2)
- rendered = "[GetVoice()][alt_name] [whispers], \"[message]\""
+ var/spans = list(SPAN_ITALICS)
+ rendered = "[GetVoice()][alt_name] [whispers], \"[attach_spans(message, spans)]\""
for(var/mob/M in listening)
- M.Hear(rendered, src, languages, message)
+ M.Hear(rendered, src, languages, message, , spans)
message = stars(message)
- rendered = "[GetVoice()][alt_name] [whispers], \"[message]\""
+ rendered = "[GetVoice()][alt_name] [whispers], \"[attach_spans(message, spans)]\""
for(var/mob/M in eavesdropping)
- M.Hear(rendered, src, languages, message)
+ M.Hear(rendered, src, languages, message, , spans)
if(critical) //Dying words.
succumb(1)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 053d9ffee27..7cfa8b72f96 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -10,6 +10,9 @@
if(..())
//Updates the number of stored chemicals for powers
handle_changeling()
+ //Heart Attacks, etc.
+ handle_heart()
+
. = 1
///////////////
@@ -241,8 +244,9 @@
/mob/living/carbon/handle_random_events()
return
-/mob/living/carbon/handle_environment(var/datum/gas_mixture/environment)
+/mob/living/carbon/proc/handle_heart()
return
+/mob/living/carbon/handle_environment(var/datum/gas_mixture/environment) return
/mob/living/carbon/handle_stomach()
spawn(0)
@@ -462,10 +466,14 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
else
- sight &= ~SEE_TURFS
- sight &= ~SEE_MOBS
- sight &= ~SEE_OBJS
- see_in_dark = 2
+ if(!(SEE_TURFS & permanent_sight_flags))
+ sight &= ~SEE_TURFS
+ if(!(SEE_MOBS & permanent_sight_flags))
+ sight &= ~SEE_MOBS
+ if(!(SEE_OBJS & permanent_sight_flags))
+ sight &= ~SEE_OBJS
+
+ see_in_dark = (sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : 2 //Xray flag combo
see_invisible = SEE_INVISIBLE_LIVING
if(see_override)
see_invisible = see_override
@@ -493,4 +501,4 @@
else
healths.icon_state = "health6"
else
- healths.icon_state = "health7"
\ No newline at end of file
+ healths.icon_state = "health7"
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 80191c09eea..d275d0744ba 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/monkey
name = "monkey"
voice_name = "monkey"
- say_message = "chimpers"
+ verb_say = "chimpers"
icon = 'icons/mob/monkey.dmi'
icon_state = "monkey1"
gender = NEUTER
diff --git a/code/modules/mob/living/carbon/monkey/say.dm b/code/modules/mob/living/carbon/monkey/say.dm
deleted file mode 100644
index 58cfe0e35f8..00000000000
--- a/code/modules/mob/living/carbon/monkey/say.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/mob/living/carbon/monkey/say_quote(var/text)
- return "[say_message], \"[text]\"";
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d158b3648c1..c7a13f69e26 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -1,22 +1,3 @@
-//bitflag #defines for radio return.
-#define ITALICS 1
-#define REDUCE_RANGE 2
-#define NOPASS 4
-
-//message modes. you're not supposed to mess with these.
-#define MODE_HEADSET "headset"
-#define MODE_ROBOT "robot"
-#define MODE_R_HAND "right hand"
-#define MODE_L_HAND "left hand"
-#define MODE_INTERCOM "intercom"
-#define MODE_BINARY "binary"
-#define MODE_WHISPER "whisper"
-#define MODE_SECURE_HEADSET "secure headset"
-#define MODE_DEPARTMENT "department"
-#define MODE_ALIEN "alientalk"
-#define MODE_HOLOPAD "holopad"
-#define MODE_CHANGELING "changeling"
-
var/list/department_radio_keys = list(
":r" = "right hand", "#r" = "right hand", ".r" = "right hand",
":l" = "left hand", "#l" = "left hand", ".l" = "left hand",
@@ -73,10 +54,7 @@ var/list/department_radio_keys = list(
":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling"
)
-/mob/proc/binarycheck()
- return 0
-
-/mob/living/say(message, bubble_type)
+/mob/living/say(message, bubble_type,)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(stat == DEAD)
@@ -108,17 +86,18 @@ var/list/department_radio_keys = list(
return
message = treat_message(message)
+ var/spans = list()
+ spans += get_spans()
if(!message || message == "")
return
- var/italics = 0
var/message_range = 7
- var/radio_return = radio(message, message_mode)
+ var/radio_return = radio(message, message_mode, spans)
if(radio_return & NOPASS) //There's a whisper() message_mode, no need to continue the proc if that is called
return
if(radio_return & ITALICS)
- italics = 1
+ spans |= SPAN_ITALICS
if(radio_return & REDUCE_RANGE)
message_range = 1
@@ -130,64 +109,50 @@ var/list/department_radio_keys = list(
message_range = 1
if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message
- italics = 1
+ spans |= SPAN_ITALICS
- if(italics)
- message = "[message]"
-
- send_speech(message, message_range, src, bubble_type)
+ send_speech(message, message_range, src, bubble_type, spans)
log_say("[name]/[key] : [message]")
return 1
-/mob/living/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+/mob/living/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(!client)
return
var/deaf_message
var/deaf_type
if(speaker != src)
if(!radio_freq) //These checks have to be seperate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf.
- deaf_message = "[speaker] talks but you cannot hear them."
+ deaf_message = "[speaker] [speaker.verb_say] something but you cannot hear them."
deaf_type = 1
else
deaf_message = "You can't hear yourself!"
deaf_type = 2 // Since you should be able to hear yourself without looking
if(!(message_langs & languages) || force_compose) //force_compose is so AIs don't end up without their hrefs.
- message = compose_message(speaker, message_langs, raw_message, radio_freq)
+ message = compose_message(speaker, message_langs, raw_message, radio_freq, spans)
show_message(message, 2, deaf_message, deaf_type)
return message
-/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type)
+/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type, list/spans)
var/list/listening = get_hearers_in_view(message_range, source)
- var/list/listening_dead = list()
for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && ((M.client.prefs.chat_toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7)) && client) // client is so that ghosts don't have to listen to mice
- listening_dead |= M
+ listening |= M
- listening -= listening_dead //so ghosts dont hear stuff twice
-
- var/rendered = compose_message(src, languages, message)
+ var/rendered = compose_message(src, languages, message, , spans)
for(var/atom/movable/AM in listening)
- AM.Hear(rendered, src, languages, message)
-
- for(var/mob/M in listening_dead)
- M.Hear(rendered, src, languages, message)
+ AM.Hear(rendered, src, languages, message, , spans)
//speech bubble
var/list/speech_bubble_recipients = list()
- for(var/mob/M in (listening + listening_dead))
+ for(var/mob/M in listening)
if(M.client)
speech_bubble_recipients.Add(M.client)
spawn(0)
flick_overlay(image('icons/mob/talk.dmi', src, "h[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
-/mob/living/proc/say_test(var/text)
- var/ending = copytext(text, length(text))
- if (ending == "?")
- return "1"
- else if (ending == "!")
- return "2"
- return "0"
+/mob/proc/binarycheck()
+ return 0
/mob/living/can_speak(message) //For use outside of Say()
if(can_speak_basic(message) && can_speak_vocal(message))
@@ -268,21 +233,21 @@ var/list/department_radio_keys = list(
return message
-/mob/living/proc/radio(message, message_mode, steps)
+/mob/living/proc/radio(message, message_mode, list/spans)
switch(message_mode)
if(MODE_R_HAND)
if (r_hand)
- r_hand.talk_into(src, message)
+ r_hand.talk_into(src, message, , spans)
return ITALICS | REDUCE_RANGE
if(MODE_L_HAND)
if (l_hand)
- l_hand.talk_into(src, message)
+ l_hand.talk_into(src, message, , spans)
return ITALICS | REDUCE_RANGE
if(MODE_INTERCOM)
for (var/obj/item/device/radio/intercom/I in view(1, null))
- I.talk_into(src, message)
+ I.talk_into(src, message, , spans)
return ITALICS | REDUCE_RANGE
if(MODE_BINARY)
@@ -302,9 +267,10 @@ var/list/department_radio_keys = list(
return 1
return 0
-/mob/living/say_quote()
+/mob/living/say_quote(input, list/spans)
+ var/tempinput = attach_spans(input, spans)
if (stuttering)
- return "stammers, \"[text]\""
+ return "stammers, \"[tempinput]\""
if (getBrainLoss() >= 60)
- return "gibbers, \"[text]\""
+ return "gibbers, \"[tempinput]\""
return ..()
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index e10b6e59fc4..f448d22680b 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -19,26 +19,14 @@
//Also includes the for AI hrefs, for convenience.
return " [radio_freq ? "(" + speaker.GetJob() + ")" : ""]" + "[speaker.GetSource() ? "" : ""]"
-/mob/living/silicon/ai/say_quote(var/text)
- var/ending = copytext(text, length(text))
-
- if(ending == "?")
- return "queries, \"[text]\"";
- else if(copytext(text, length(text) - 1) == "!!")
- return "alarms, \"[text]\"";
- else if(ending == "!")
- return "declares, \"[text]\"";
-
- return "states, \"[text]\"";
-
/mob/living/silicon/ai/IsVocal()
return !config.silent_ai
-/mob/living/silicon/ai/radio(message, message_mode)
+/mob/living/silicon/ai/radio(message, message_mode, list/spans)
if(!radio_enabled || aiRestorePowerRoutine || stat) //AI cannot speak if radio is disabled (via intellicard) or depowered.
src << "Your radio transmitter is offline!"
return 0
- ..(message,message_mode)
+ ..()
/mob/living/silicon/ai/get_message_mode(message)
if(copytext(message, 1, 3) in list(":h", ":H", ".h", ".H", "#h", "#H"))
diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm
index 81b1840e879..6e93366f713 100644
--- a/code/modules/mob/living/silicon/pai/say.dm
+++ b/code/modules/mob/living/silicon/pai/say.dm
@@ -1,15 +1,3 @@
-/mob/living/silicon/pai/say_quote(var/text)
- var/ending = copytext(text, length(text))
-
- if (ending == "?")
- return "[src.speakQuery], \"[text]\"";
- else if(copytext(text, length(text) - 1) == "!!")
- return "[src.speakDoubleExclamation], \"[text]\"";
- else if (ending == "!")
- return "[src.speakExclamation], \"[text]\"";
-
- return "[src.speakStatement], \"[text]\"";
-
/mob/living/silicon/pai/say(var/msg)
if(silence_time)
src << "Communication circuits remain unitialized."
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 949e1df5b5b..c7e6135380f 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -109,7 +109,7 @@