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 @@
[right_part]
- "} + "} //" usr << browse(dat, "window=pai;size=640x480;border=0;can_close=1;can_resize=1;can_minimize=1;titlebar=1") onclose(usr, "pai") temp = null @@ -252,7 +252,7 @@ add_med_hud() if("translator") if(href_list["toggle"]) - languages = languages == ALL ? HUMAN & ROBOT : ALL + languages = (languages == ALL) ? (HUMAN | ROBOT) : ALL if("doorjack") if(href_list["jack"]) if(src.cable && src.cable.machine) diff --git a/code/modules/mob/living/silicon/robot/say.dm b/code/modules/mob/living/silicon/robot/say.dm index 8cf1cd3fc2e..e28efe10f32 100644 --- a/code/modules/mob/living/silicon/robot/say.dm +++ b/code/modules/mob/living/silicon/robot/say.dm @@ -1,14 +1,2 @@ -/mob/living/silicon/robot/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/robot/IsVocal() return !config.silent_borg diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 9dd1325113a..7fe05e7dce4 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,6 +1,17 @@ /mob/living/silicon/say(var/message) return ..(message, "R") +/mob/living/silicon/say_quote(input, spans) + if(copytext(input, length(input) - 1) == "!!") + spans |= SPAN_YELL + input = attach_spans(input, spans) + return "alarms, \"[input]\"" + + return ..() + +/mob/living/silicon/get_spans() + return ..() | SPAN_ROBOT + /mob/living/proc/robot_talk(var/message) log_say("[key_name(src)] : [message]") var/desig = "Default Cyborg" //ezmode for taters @@ -23,19 +34,19 @@ /mob/living/silicon/lingcheck() return 0 //Borged or AI'd lings can't speak on the ling channel. -/mob/living/silicon/radio(message, message_mode) +/mob/living/silicon/radio(message, message_mode, list/spans) . = ..() if(. != 0) return . if(message_mode == "robot") if (radio) - radio.talk_into(src, message) + radio.talk_into(src, message, , spans) return REDUCE_RANGE else if(message_mode in radiochannels) if(radio) - radio.talk_into(src, message, message_mode) + radio.talk_into(src, message, message_mode, spans) return ITALICS | REDUCE_RANGE return 0 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b5032345500..0256aaa0a9f 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -3,6 +3,9 @@ voice_name = "synthesized voice" languages = ROBOT | HUMAN has_unlimited_silicon_privilege = 1 + verb_say = "states" + verb_ask = "queries" + verb_yell = "declares" var/syndicate = 0 var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/list/alarms_to_show = list() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 0725fe6a4ee..16d35c5a486 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -1,7 +1,8 @@ //Cat -/mob/living/simple_animal/cat +/mob/living/simple_animal/pet/cat name = "cat" desc = "Kitty!!" + icon = 'icons/mob/pets.dmi' icon_state = "cat2" icon_living = "cat2" icon_dead = "cat2_dead" @@ -13,8 +14,8 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - species = /mob/living/simple_animal/cat - childtype = /mob/living/simple_animal/cat/kitten + species = /mob/living/simple_animal/pet/cat + childtype = /mob/living/simple_animal/pet/cat/kitten meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat meat_amount = 3 response_help = "pets" @@ -22,7 +23,7 @@ response_harm = "kicks" //RUNTIME IS ALIVE! SQUEEEEEEEE~ -/mob/living/simple_animal/cat/Runtime +/mob/living/simple_animal/pet/cat/Runtime name = "Runtime" desc = "GCAT" icon_state = "cat" @@ -31,8 +32,9 @@ gender = FEMALE var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target + pcollar = /obj/item/clothing/tie/petcollar -/mob/living/simple_animal/cat/Runtime/Life() +/mob/living/simple_animal/pet/cat/Runtime/Life() //MICE! if((src.loc) && isturf(src.loc)) if(!stat && !resting && !buckled) @@ -67,10 +69,10 @@ stop_automated_movement = 1 walk_to(src,movement_target,0,3) -/mob/living/simple_animal/cat/Proc +/mob/living/simple_animal/pet/cat/Proc name = "Proc" -/mob/living/simple_animal/cat/kitten +/mob/living/simple_animal/pet/cat/kitten name = "kitten" desc = "D'aaawwww" icon_state = "kitten" diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index cdfd044225b..57b67ba5993 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -1,5 +1,42 @@ //Corgi -/mob/living/simple_animal/corgi +/mob/living/simple_animal/pet + icon = 'icons/mob/pets.dmi' + var/obj/item/clothing/tie/petcollar/pcollar = null + var/image/collar = null + var/image/pettag = null + var/accept_collar = 1 + +/mob/living/simple_animal/pet/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + if(istype(O, /obj/item/clothing/tie/petcollar) && accept_collar && !pcollar) + var/obj/item/clothing/tie/petcollar/P = O + pcollar = P + update_collar() + if(P.tagname) + name = P.tagname + user << "You put the [P] around [src]'s neck." + qdel(P) + else + ..() + +/mob/living/simple_animal/pet/New() + ..() + if(pcollar) + pcollar = new(src) + update_collar() + +/mob/living/simple_animal/pet/Die() + ..() + update_collar() + +/mob/living/simple_animal/pet/proc/update_collar() + overlays.Cut() + collar = image('icons/mob/pets.dmi', src, "[icon_state]collar") + pettag = image('icons/mob/pets.dmi', src, "[icon_state]tag") + overlays += collar + overlays += pettag + + +/mob/living/simple_animal/pet/corgi name = "\improper corgi" real_name = "corgi" desc = "It's a corgi." @@ -19,31 +56,31 @@ response_disarm = "bops" response_harm = "kicks" see_in_dark = 5 - childtype = /mob/living/simple_animal/corgi/puppy - species = /mob/living/simple_animal/corgi + childtype = /mob/living/simple_animal/pet/corgi/puppy + species = /mob/living/simple_animal/pet/corgi var/obj/item/inventory_head var/obj/item/inventory_back var/facehugger + accept_collar = 0 //corgis have their own item handling -/mob/living/simple_animal/corgi/New() +/mob/living/simple_animal/pet/corgi/New() ..() regenerate_icons() -/mob/living/simple_animal/corgi/death(gibbed) - ..(gibbed) - regenerate_icons() +/mob/living/simple_animal/pet/corgi/death(gibbed) + ..(gibbed) regenerate_icons() -/mob/living/simple_animal/corgi/revive() +/mob/living/simple_animal/pet/corgi/revive() ..() regenerate_icons() -/mob/living/simple_animal/corgi/sac_act(var/obj/effect/rune/R, victim) +/mob/living/simple_animal/pet/corgi/sac_act(var/obj/effect/rune/R, victim) usr << "Even dark gods from another plane have standards, sicko." usr.reagents.add_reagent("hell_water", 2) R.stone_or_gib(victim) -/mob/living/simple_animal/corgi/show_inv(mob/user as mob) +/mob/living/simple_animal/pet/corgi/show_inv(mob/user as mob) user.set_machine(src) if(user.stat) return @@ -61,7 +98,7 @@ onclose(user, "mob[real_name]") return -/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob, params) +/mob/living/simple_animal/pet/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(inventory_head && inventory_back) //helmet and armor = 100% protection if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) ) @@ -86,7 +123,7 @@ ..() -/mob/living/simple_animal/corgi/Topic(href, href_list) +/mob/living/simple_animal/pet/corgi/Topic(href, href_list) if(usr.stat) return //Removing from inventory @@ -156,7 +193,8 @@ /obj/item/clothing/suit/cardborg, /obj/item/weapon/tank/internals/oxygen, /obj/item/weapon/tank/internals/air, - /obj/item/weapon/extinguisher + /obj/item/weapon/extinguisher, + /obj/item/clothing/tie/petcollar ) if( ! ( item_to_add.type in allowed_types ) ) @@ -184,7 +222,7 @@ //Corgis are supposed to be simpler, so only a select few objects can actually be put //to be compatible with them. The objects are below. //Many hats added, Some will probably be removed, just want to see which ones are popular. -/mob/living/simple_animal/corgi/proc/place_on_head(obj/item/item_to_add, var/mob/user as mob) +/mob/living/simple_animal/pet/corgi/proc/place_on_head(obj/item/item_to_add, var/mob/user as mob) if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess item_to_add.afterattack(src,user,1) @@ -361,7 +399,7 @@ //IAN! SQUEEEEEEEEE~ -/mob/living/simple_animal/corgi/Ian +/mob/living/simple_animal/pet/corgi/Ian name = "Ian" real_name = "Ian" //Intended to hold the name without altering it. gender = MALE @@ -372,7 +410,7 @@ response_disarm = "bops" response_harm = "kicks" -/mob/living/simple_animal/corgi/Ian/Life() +/mob/living/simple_animal/pet/corgi/Ian/Life() ..() //Feeding, chasing food, FOOOOODDDD @@ -428,7 +466,7 @@ -/mob/living/simple_animal/corgi/regenerate_icons() +/mob/living/simple_animal/pet/corgi/regenerate_icons() overlays.Cut() if(inventory_head) @@ -452,7 +490,7 @@ overlays += back_icon if(facehugger) - if(istype(src, /mob/living/simple_animal/corgi/puppy)) + if(istype(src, /mob/living/simple_animal/pet/corgi/puppy)) overlays += image('icons/mob/mask.dmi',"facehugger_corgipuppy") else overlays += image('icons/mob/mask.dmi',"facehugger_corgi") @@ -461,7 +499,7 @@ -/mob/living/simple_animal/corgi/puppy +/mob/living/simple_animal/pet/corgi/puppy name = "\improper corgi puppy" real_name = "corgi" desc = "It's a corgi puppy." @@ -469,9 +507,10 @@ icon_living = "puppy" icon_dead = "puppy_dead" mob_size = MOB_SIZE_SMALL + accept_collar = 1 //puppies cannot wear anything. -/mob/living/simple_animal/corgi/puppy/Topic(href, href_list) +/mob/living/simple_animal/pet/corgi/puppy/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) usr << "You can't fit this on [src]" return @@ -479,7 +518,7 @@ //LISA! SQUEEEEEEEEE~ -/mob/living/simple_animal/corgi/Lisa +/mob/living/simple_animal/pet/corgi/Lisa name = "Lisa" real_name = "Lisa" gender = FEMALE @@ -492,15 +531,16 @@ response_harm = "kicks" var/turns_since_scan = 0 var/puppies = 0 + accept_collar = 1 //Lisa already has a cute bow! -/mob/living/simple_animal/corgi/Lisa/Topic(href, href_list) +/mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) usr << "[src] already has a cute bow!" return ..() -/mob/living/simple_animal/corgi/Lisa/Life() +/mob/living/simple_animal/pet/corgi/Lisa/Life() ..() make_babies() @@ -513,13 +553,13 @@ dir = i sleep(1) -/mob/living/simple_animal/corgi/attack_hand(mob/living/carbon/human/M) +/mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M) . = ..() switch(M.a_intent) if("help") wuv(1,M) if("harm") wuv(-1,M) -/mob/living/simple_animal/corgi/proc/wuv(change, mob/M) +/mob/living/simple_animal/pet/corgi/proc/wuv(change, mob/M) if(change) if(change > 0) if(M && stat != DEAD) // Added check to see if this mob (the corgi) is dead to fix issue 2454 diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index dc614d5665c..d9322aa283d 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -1,7 +1,8 @@ //Foxxy -/mob/living/simple_animal/fox +/mob/living/simple_animal/pet/fox name = "fox" desc = "It's a fox. I wonder what it says?" + icon = 'icons/mob/pets.dmi' icon_state = "fox" icon_living = "fox" icon_dead = "fox_dead" @@ -18,6 +19,7 @@ response_harm = "kicks" //Captain fox -/mob/living/simple_animal/fox/Renault +/mob/living/simple_animal/pet/fox/Renault name = "Renault" - desc = "Renault, the Captain's trustworthy fox. I wonder what it says?" \ No newline at end of file + desc = "Renault, the Captain's trustworthy fox. I wonder what it says?" + pcollar = /obj/item/clothing/tie/petcollar \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index f685428fa4d..5d0359f7478 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -1,8 +1,8 @@ -//Corgi //best comment 2014 -/mob/living/simple_animal/pug +/mob/living/simple_animal/pet/pug name = "\improper pug" real_name = "pug" desc = "It's a pug." + icon = 'icons/mob/pets.dmi' icon_state = "pug" icon_living = "pug" icon_dead = "pug_dead" @@ -19,7 +19,7 @@ response_harm = "kicks" see_in_dark = 5 -/mob/living/simple_animal/pug/Life() +/mob/living/simple_animal/pet/pug/Life() ..() if(!stat && !resting && !buckled) @@ -30,7 +30,7 @@ dir = i sleep(1) -/mob/living/simple_animal/pug/attackby(var/obj/item/O as obj, var/mob/user as mob, params) //Marker -Agouri +/mob/living/simple_animal/pet/pug/attackby(var/obj/item/O as obj, var/mob/user as mob, params) //Marker -Agouri if(istype(O, /obj/item/weapon/newspaper)) if(!stat) user.visible_message("[user] baps [name] on the nose with the rolled up [O]") diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 5a97ddb8bb4..bc1e35d3b6a 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -126,14 +126,14 @@ stat("Held Item", held_item) stat("Mode",a_intent) -/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) +/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) if(speaker != src && prob(20)) //Dont imitate ourselves if(speech_buffer.len >= 20) speech_buffer -= pick(speech_buffer) speech_buffer |= html_decode(raw_message) ..() -/mob/living/simple_animal/parrot/radio(message, message_mode) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. +/mob/living/simple_animal/parrot/radio(message, message_mode, list/spans) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. . = ..() if(. != 0) return . @@ -141,22 +141,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 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 9bb92b61506..0e394e56fe1 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -223,12 +223,13 @@ adjustBruteLoss(20) return -/mob/living/simple_animal/say_quote(var/text) - if(speak_emote && speak_emote.len) +/mob/living/simple_animal/say_quote(input) + var/ending = copytext(input, length(input)) + if(speak_emote && speak_emote.len && ending != "?" && ending != "!") var/emote = pick(speak_emote) if(emote) - return "[emote], \"[text]\"" - return "says, \"[text]\""; + return "[emote], \"[input]\"" + return ..() /mob/living/simple_animal/emote(var/act, var/m_type=1, var/message = null) if(stat) diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm index d4de87b04e8..97e4b7f8f7c 100644 --- a/code/modules/mob/living/simple_animal/slime/say.dm +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -1,6 +1,3 @@ -/mob/living/simple_animal/slime/say(var/message) - ..() - /mob/living/simple_animal/slime/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -11,8 +8,7 @@ return "telepathically chirps, \"[text]\""; -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) - if(speaker != src && !radio_freq) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) if(speaker != src && !radio_freq) if (speaker in Friends) speech_buffer = list() speech_buffer += speaker diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 292206ab56b..e3781e4bc3a 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -111,7 +111,6 @@ //see: setup.dm for list of mutations var/voice_name = "unidentifiable voice" - var/say_message = null // When you are understood by others. Currently only used by aliens and monkeys in their say_quote procs var/list/faction = list("neutral") //A list of factions that this mob is currently in, for hostile mob targetting, amongst other things var/move_on_shuttle = 1 // Can move on the shuttle. @@ -149,4 +148,7 @@ var/obj/control_object //Used by admins to possess objects. All mobs should have this var var/atom/movable/remote_control //Calls relaymove() to whatever it is - var/turf/listed_turf = null //the current turf being examined in the stat panel \ No newline at end of file + var/turf/listed_turf = null //the current turf being examined in the stat panel + + var/list/permanent_huds = list() + var/permanent_sight_flags = 0 \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index f10ce78279d..5b9be5c61c9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -46,7 +46,7 @@ return 0 /proc/iscorgi(A) - if(istype(A, /mob/living/simple_animal/corgi)) + if(istype(A, /mob/living/simple_animal/pet/corgi)) return 1 return 0 @@ -56,7 +56,7 @@ return 0 /proc/iscat(A) - if(istype(A, /mob/living/simple_animal/cat)) + if(istype(A, /mob/living/simple_animal/pet/cat)) return 1 return 0 diff --git a/code/modules/mob/say_readme.dm b/code/modules/mob/say_readme.dm index f57b4249549..150f58c865d 100644 --- a/code/modules/mob/say_readme.dm +++ b/code/modules/mob/say_readme.dm @@ -32,6 +32,15 @@ global procs get_hear(range, atom/source) Like view(), but ignores luminosity. + + message_spans_start(spans) + Turns each element of spans into a span class. + + message_spans_end(length) + Returns lenght times "
" + + attach_spans(input, spans) + Attaches span classes around input. /atom/movable flags @@ -42,34 +51,37 @@ global procs Bitmask variable. What languages this object speaks/understands. If the languages of the speaker don't match the languages of the hearer, the message will be modified in the hearer's lang_treat(). + + verb_say/verb_ask/verb_yell + These determine what the verb is for their respective action. Used in say_quote(). say(message) Say() is the "mother-proc". It calls all the other procs required for speaking, but does little itself. At the atom/movable level, say() just calls send_speech. - Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) This proc handles hearing. What it does varies. For mobs, it treats the message with hearer-specific things like language and deafness, then outputs it to the hearer. IMPORTANT NOTE: If radio_freq is not null, the code will assume that the speaker is virtual! (more info on this in the Radios section below) - send_speech(message, range) + send_speech(message, range, source, bubble_type, spans) This proc composes a list of hearers (things with the HEAR flag + dead people) and calls Hear() on them. Message treatment or composition of output are not done by this proc, these are handled by the rest of say() and the hearer respectively. - lang_treat(message, atom/movable/speaker, message_langs, raw_message) + lang_treat(message, atom/movable/speaker, message_langs, raw_message, spans) Modifies the message by comparing the languages of the speaker with the languages of the hearer. Called on the hearer. - say_quote(text) - Adds a verb and quotes to a message, according to the type of mob. Called on the speaker. + say_quote(text, spans) + Adds a verb and quotes to a message. Also attaches span classes to a message. Verbs are determined by verb_say/verb_ask/verb_yell variables. Called on the speaker. /mob say_dead(message) Sends a message to all dead people. Does not use Hear(). - compose_message(message, atom/movable/speaker, message_langs, raw_message, radio_freq) + compose_message(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) Composes the message mobs see on their screen when they hear something. compose_track_href(message, atom/movable/speaker, message_langs, raw_message, radio_freq) @@ -118,7 +130,7 @@ global procs Please try to keep things in a logical order (e.g. don't have masks handled before mutations), even if that means you have to call ..() in the middle of the proc. - radio(message, message_mode) + radio(message, message_mode, spans) Handles talking into radios. Uses a switch to determine what radio to speak into and in which manner to do so. Return is a bitflag. diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e0c25efac08..a261287a103 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -420,7 +420,7 @@ for(var/t in organs) //this really should not be necessary qdel(t) - var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) + var/mob/living/simple_animal/pet/corgi/new_corgi = new /mob/living/simple_animal/pet/corgi (loc) new_corgi.a_intent = "harm" new_corgi.key = key @@ -494,9 +494,9 @@ return 0 //Verbs do not appear for players. //Good mobs! - if(ispath(MP, /mob/living/simple_animal/cat)) + if(ispath(MP, /mob/living/simple_animal/pet/cat)) return 1 - if(ispath(MP, /mob/living/simple_animal/corgi)) + if(ispath(MP, /mob/living/simple_animal/pet/corgi)) return 1 if(ispath(MP, /mob/living/simple_animal/crab)) return 1 diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index c5f2b3a0e7d..d130f56e32b 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -25,8 +25,7 @@ if(reagents && BB.reagents) reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets - reagents.delete() - return + qdel(reagents) /obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params) var/turf/curloc = user.loc diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 0586ab881db..d485784109c 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -203,15 +203,15 @@ proc/wabbajack(mob/living/M) var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick","fox","butterfly") switch(animal) if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc) - if("corgi") new_mob = new /mob/living/simple_animal/corgi(M.loc) + if("corgi") new_mob = new /mob/living/simple_animal/pet/corgi(M.loc) if("crab") new_mob = new /mob/living/simple_animal/crab(M.loc) - if("pug") new_mob = new /mob/living/simple_animal/pug(M.loc) - if("cat") new_mob = new /mob/living/simple_animal/cat(M.loc) + if("pug") new_mob = new /mob/living/simple_animal/pet/pug(M.loc) + if("cat") new_mob = new /mob/living/simple_animal/pet/cat(M.loc) if("mouse") new_mob = new /mob/living/simple_animal/mouse(M.loc) if("chicken") new_mob = new /mob/living/simple_animal/chicken(M.loc) if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc) if("lizard") new_mob = new /mob/living/simple_animal/lizard(M.loc) - if("fox") new_mob = new /mob/living/simple_animal/fox(M.loc) + if("fox") new_mob = new /mob/living/simple_animal/pet/fox(M.loc) if("butterfly") new_mob = new /mob/living/simple_animal/butterfly(M.loc) else new_mob = new /mob/living/simple_animal/chick(M.loc) new_mob.languages |= HUMAN diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm index 130cf6a2675..dacb964d7ab 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -7,7 +7,7 @@ datum/reagent/nicotine name = "Nicotine" id = "nicotine" - description = "Stun reduction per cycle, slight stamina regeneration buff. Overdoses become rapidly deadly." + description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 35 @@ -34,7 +34,7 @@ datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) datum/reagent/crank name = "Crank" id = "crank" - description = "2x stun reduction per cycle. Warms you up, makes you jittery as hell." + description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 @@ -87,7 +87,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) /datum/reagent/krokodil name = "Krokodil" id = "krokodil" - description = "Cools and calms you down, occasional BRAIN and TOX damage." + description = "Cools and calms you down. If overdosed it will deal significant Brain and Toxin damage. If addicted it will begin to deal fatal amounts of Brute damage as the subject's skin falls off." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 @@ -126,12 +126,16 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustBruteLoss(3*REM) ..() return + /datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - M << "Your skin sloughs off!" - M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF + if(!istype(M.dna.species, /datum/species/cosmetic_zombie)) + M << "Your skin falls off easily!" + M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF + hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie) + else + M.adjustBruteLoss(5*REM) ..() return - /datum/chemical_reaction/krokodil name = "Krokodil" id = "krokodil" @@ -144,7 +148,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) /datum/reagent/methamphetamine name = "Methamphetamine" id = "methamphetamine" - description = "3x stun reduction per cycle, significant stamina regeneration buff, makes you really jittery, dramatically increases movement speed." + description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 @@ -169,7 +173,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) if(prob(20)) @@ -199,7 +203,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return /datum/reagent/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) M.Jitter(15) @@ -209,7 +213,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return /datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) M.Jitter(20) @@ -228,59 +232,6 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) result_amount = 4 required_temp = 374 -/datum/chemical_reaction/methamphetamine_two - name = "methamphetamine_two" - id = "methamphetamine_two" - result = "methamphetamine" - required_reagents = list("muriatic_acid" = 1, "caustic_soda" = 1, "hydrogen_chloride" = 1) - result_amount = 3 - required_temp = 374 - -/datum/reagent/muriatic_acid - name = "Muriatic Acid" - id = "muriatic_acid" - description = "A chemical compound." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/reagent/caustic_soda - name = "Caustic Soda" - id = "caustic_soda" - description = "A chemical compound." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/reagent/hydrogen_chloride - name = "Hydrogen Chloride" - id = "hydrogen_chloride" - description = "A chemical compound." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/chemical_reaction/muriatic_acid - name = "muriatic_acid" - id = "muriatic_acid" - result = "muriatic_acid" - required_reagents = list("mutadone" = 1, "sacid" = 1) - result_amount = 2 - required_temp = 500 - -/datum/chemical_reaction/caustic_soda - name = "caustic_soda" - id = "caustic_soda" - result = "caustic_soda" - required_reagents = list("sacid" = 1, "cola" = 1) - result_amount = 2 - required_temp = 500 - -/datum/chemical_reaction/hydrogen_chloride - name = "hydrogen_chloride" - id = "hydrogen_chloride" - result = "hydrogen_chloride" - required_reagents = list("hydrogen" = 1, "chlorine" = 1) - result_amount = 2 - required_temp = 500 - /datum/chemical_reaction/saltpetre name = "saltpetre" id = "saltpetre" @@ -317,7 +268,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustBrainLoss(1) M.adjustToxLoss(0.1) M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) step(M, pick(cardinal)) step(M, pick(cardinal)) ..() @@ -333,7 +284,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) /datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob) M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) if(prob(20)) @@ -347,7 +298,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) /datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob) M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) M.Jitter(5) @@ -358,7 +309,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob) M.hallucination += 20 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) M.Jitter(10) @@ -370,7 +321,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob) M.hallucination += 30 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 12, i++) step(M, pick(cardinal)) M.Jitter(15) @@ -382,7 +333,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M.hallucination += 40 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 16, i++) step(M, pick(cardinal)) M.Jitter(50) @@ -404,7 +355,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) /datum/reagent/aranesp name = "Aranesp" id = "aranesp" - description = "Volatile." + description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage.." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 @@ -415,91 +366,8 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M << "[high_message]" M.adjustStaminaLoss(-35) M.adjustToxLoss(1) - if(prob(rand(1,100))) + if(prob(50)) M.losebreath++ M.adjustOxyLoss(20) ..() return - -/obj/item/weapon/reagent_containers/food/drinks/muriatic_acid - name = "jug of muriatic acid" - desc = "We needed those cooks." - icon_state = "chem_jug" - item_state = "carton" - list_reagents = list("muriatic_acid" = 50) - -/obj/item/weapon/reagent_containers/food/drinks/caustic_soda - name = "jug of caustic soda" - desc = "We needed those cooks." - icon_state = "chem_jug" - item_state = "carton" - list_reagents = list("caustic_soda" = 50) - -/obj/item/weapon/reagent_containers/food/drinks/hydrogen_chloride - name = "jug of hydrogen chloride" - desc = "We needed those cooks." - icon_state = "chem_jug" - item_state = "carton" - list_reagents = list("hydrogen_chloride" = 50) - -datum/reagent/hotline - name = "Hotline" - id = "hotline" - description = "It isn't just wrong. It's dead wrong." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 15 - addiction_threshold = 10 - -datum/reagent/hotline/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/high_message = pick("You feel alert.", "You feel like you can see everything more clearly.", "You feel like you need to relax and examine your surroundings.") - if(prob(5)) - M << "[high_message]" - M.druggy = max(M.druggy, 15) - M.hallucination += 10 - M.adjustBrainLoss(0.2) - M.adjustBruteLoss(-0.2) - M.adjustFireLoss(-0.2) - M.status_flags |= GOTTAGOFAST - M.adjustStaminaLoss(-3) - ..() - return -datum/reagent/hotline/overdose_process(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,20)*REM) - M.adjustToxLoss(rand(1,20)*REM) - M.adjustBruteLoss(rand(1,20)*REM) - M.druggy = max(M.druggy, 30) - M.hallucination += 30 - if(prob(5)) - M << pick("Your head feels like it's ripping apart!","You wonder why the fuck did you decide to take [src.name].","It hurts so bad!","Please, end it now!","Dear [ticker.Bible_deity_name] please no it hurts!") - ..() - return - -datum/reagent/hotline/addiction_act_stage1(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - ..() - return -datum/reagent/hotline/addiction_act_stage2(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,20)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - ..() - return -datum/reagent/hotline/addiction_act_stage3(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,30)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - ..() - return -datum/reagent/hotline/addiction_act_stage4(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,30)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - if(prob(1)) - M.visible_message("[M] clutches at their chest! It looks like they're having a heart attack!") - M.adjustBruteLoss(80) // don't do drugs kids - ..() - return diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index 88c54e46526..88860f358f5 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -7,9 +7,9 @@ datum/reagent/silver_sulfadiazine name = "Silver Sulfadiazine" id = "silver_sulfadiazine" - description = "100% chance per cycle of healing 2 points of BURN damage." + description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 2 datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) @@ -35,9 +35,9 @@ datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) datum/reagent/styptic_powder name = "Styptic Powder" id = "styptic_powder" - description = "100% chance per cycle of healing 2 points of BRUTE damage." + description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 2 datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) @@ -64,9 +64,9 @@ datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob) datum/reagent/salglu_solution name = "Saline-Glucose Solution" id = "salglu_solution" - description = "33% chance per cycle of healing 1 point each of BRUTE and BURN damage." + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -79,9 +79,9 @@ datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) datum/reagent/synthflesh name = "Synthflesh" id = "synthflesh" - description = "100% chance per cycle of healing 1 point each of BRUTE and BURN damage." + description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) if(!M) M = holder.my_atom @@ -97,9 +97,9 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo datum/reagent/charcoal name = "Charcoal" id = "charcoal" - description = "Heals 3 TOX damage per cycle and purges other chemicals slowly." + description = "Heals toxin damage, and will also slowly remove any other chemicals." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -151,9 +151,9 @@ datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) datum/reagent/omnizine name = "Omnizine" id = "omnizine" - description = "Heals one each of OXY, TOX, BRUTE and BURN per cycle." + description = "Heals 1 of each damage type a cycle. If overdosed it will deal significant amounts of each damage type." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.2 overdose_threshold = 30 @@ -177,9 +177,9 @@ datum/reagent/omnizine/overdose_process(var/mob/living/M as mob) datum/reagent/calomel name = "Calomel" id = "calomel" - description = "Increases all depletion rates by 5. +5 TOX damage while health > 20." + description = "Quickly purges the body of all chemicals. If your health is above 20, toxin damage is dealt. When you hit 20 health or lower, the damage will cease." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/calomel/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -202,9 +202,9 @@ datum/reagent/calomel/on_mob_life(var/mob/living/M as mob) datum/reagent/potass_iodide name = "Potassium Iodide" id = "potass_iodide" - description = "80% chance of removing 1 RAD. Radiation is cumulative and causes tox+burn." + description = "Reduces low radiation damage very effectively." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -226,9 +226,9 @@ datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob) datum/reagent/pen_acid name = "Pentetic Acid" id = "pen_acid" - description = "Reduces 7 RAD, heals 4 TOX damage, increases all depletion rates by 4. 33% chance of taking 1 unit brute damage" + description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -255,9 +255,9 @@ datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) datum/reagent/sal_acid name = "Salicyclic Acid" id = "sal_acid" - description = "If BRUTE damage is under 50, 50% chance to heal one unit." + description = "If you have less than 50 brute damage, there is a 50% chance to heal one unit. If overdosed it will have a 50% chance to deal 2 brute damage if the patient has less than 50 brute damage already." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" overdose_threshold = 25 datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) @@ -285,9 +285,9 @@ datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob) datum/reagent/salbutamol name = "Salbutamol" id = "salbutamol" - description = "Heals 6 OXY damage, reduces LOSEBREATH by 4." + description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!" reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.2 datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob) @@ -308,9 +308,9 @@ datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob) datum/reagent/perfluorodecalin name = "Perfluorodecalin" id = "perfluorodecalin" - description = "Heals 25 OXY damage, but you can't talk. 33% chance of healing 1 BRUTE and 1 BURN." + description = "Heals suffocation damage so quickly that you could have a spacewalk, but it mutes your voice. Has a 33% chance of healing brute and burn damage per cycle as well." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.2 datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) @@ -335,9 +335,9 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) datum/reagent/ephedrine name = "Ephedrine" id = "ephedrine" - description = "Stun reduction per cycle, increases run speed slightly, minor stamina regeneration buff, stabilizes crit." + description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.3 overdose_threshold = 45 addiction_threshold = 30 @@ -395,9 +395,9 @@ datum/reagent/ephedrine/addiction_act_stage4(var/mob/living/M as mob) datum/reagent/diphenhydramine name = "Diphenhydramine" id = "diphenhydramine" - description = "Causes a little bit of drowsiness, reduces jitteriness. Raises histamine depletion rates by 3" + description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.drowsyness += 1 @@ -417,9 +417,9 @@ datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob) datum/reagent/morphine name = "Morphine" id = "morphine" - description = "Dramatically counters movement reduction from severe injury. Reduces jitteriness if someone is shaking like crazy from whatever. Will knock you out within 36 cycles if any remains in you." + description = "Will allow you to ignore slowdown from equipment and damage. Will eventually knock you out if you take too much. If overdosed it will cause jitteriness, dizziness, force the victim to drop items in their hands and eventually deal toxin damage." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" var/cycle_count = 0 overdose_threshold = 30 addiction_threshold = 25 @@ -428,8 +428,8 @@ datum/reagent/morphine datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.status_flags |= IGNORESLOWDOWN - if(cycle_count == 36) - M.drowsyness += 1 + if(cycle_count >= 36) + M.sleeping += 3 cycle_count++ ..() return @@ -510,18 +510,18 @@ datum/reagent/oculine/on_mob_life(var/mob/living/M as mob) datum/reagent/oculine name = "Oculine" id = "oculine" - description = "30% chance to remove blindness, 80% chance to slightly reduce eye damage." + description = "Cures blindness and heals eye damage over time." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.4 var/cycle_amount = 0 datum/reagent/atropine name = "Atropine" id = "atropine" - description = "1 TOX damage if used over -60 health. Causes dizziness and confusion. If under -25 health, heals 3 BRUTE + 3 BURN. Attempts to cap OXY damage at 65 and LOSEBREATH at 5." + description = "If patients health is below -25 it will heal 3 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.2 overdose_threshold = 35 @@ -560,9 +560,9 @@ datum/reagent/atropine/overdose_process(var/mob/living/M as mob) datum/reagent/epinephrine name = "Epinephrine" id = "epinephrine" - description = "Reduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to cap OXY damage at 35 and LOSEBREATH at 10. If health is between -10 to -65, heals 1 TOX, 1 BRUTE, 1 BURN." + description = "mReduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to stop you taking too much oxygen damage. If the patient is in low to severe crit, heals toxins, brute, and burn very effectively. Will not heal patients who are almost dead. If overdosed will stun and deal toxin damage" reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.2 overdose_threshold = 30 @@ -574,8 +574,10 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) M.adjustFireLoss(-1*REM) if(M.oxyloss > 35) M.setOxyLoss(35) - if(M.losebreath >= 10) - M.losebreath = max(10, M.losebreath-5) + if(M.losebreath >= 4) + M.losebreath -= 4 + if(M.losebreath < 0) + M.losebreath = 0 M.adjustStaminaLoss(-1*REM) if(prob(30)) M.AdjustParalysis(-1) @@ -602,9 +604,9 @@ datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob) datum/reagent/strange_reagent name = "Strange Reagent" id = "strange_reagent" - description = "A miracle medical chem, this little beauty can bring the dead back to life!" + description = "A miracle drug that can bring a dead body back to life! If the corpse has suffered too much damage, however, no change will occur to the body. If used on a living person it will deal Brute and Burn damage." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume) if(M.stat == DEAD) @@ -625,7 +627,7 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, return datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - if(prob(rand(1,100))) + if(prob(50)) M.adjustBruteLoss(2*REM) M.adjustFireLoss(2*REM) ..() @@ -641,9 +643,9 @@ datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob) datum/reagent/life name = "Life" id = "life" - description = "" + description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" metabolization_rate = 0.2 /datum/chemical_reaction/life @@ -727,8 +729,8 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac /datum/reagent/mannitol name = "Mannitol" id = "mannitol" - description = "Heals 3 BRAIN damage." - color = "#C8A5DC" // rgb: 200, 165, 220 + description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone." + color = "#C8A5DC" /datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob) M.jitteriness = 0 @@ -748,14 +750,14 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac /datum/reagent/mutadone name = "Mutadone" id = "mutadone" - description = "Chance to remove genetic disabilities." - color = "#C8A5DC" // rgb: 200, 165, 220 + description = "Heals your genetic defects." + color = "#C8A5DC" datum/reagent/antihol name = "Antihol" id = "antihol" - description = "A powerful oxidizer that reacts with ethanol." - color = "#C8A5DC" // rgb: 200, 165, 220 + description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects." + color = "#C8A5DC" datum/reagent/antihol/on_mob_life(var/mob/living/M as mob) M.dizziness = 0 @@ -783,8 +785,8 @@ datum/reagent/antihol/on_mob_life(var/mob/living/M as mob) /datum/reagent/stimulants name = "Stimulants" id = "stimulants" - description = "Sets all stun-related vars to zero, gets you running really fast. Heals 5 OXY, TOX, BRUTE, and BURN damage if health is below 50. Reduces all stuns." - color = "#C8A5DC" // rgb: 200, 165, 220 + description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun." + color = "#C8A5DC" metabolization_rate = 0.4 overdose_threshold = 60 @@ -817,7 +819,7 @@ datum/reagent/insulin id = "insulin" description = "Increases sugar depletion rates." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/insulin/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.sleeping) diff --git a/code/modules/reagents/Chemistry-Goon-Other.dm b/code/modules/reagents/Chemistry-Goon-Other.dm index 13bb4cabef6..bda6a4441d8 100644 --- a/code/modules/reagents/Chemistry-Goon-Other.dm +++ b/code/modules/reagents/Chemistry-Goon-Other.dm @@ -8,42 +8,41 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d111 datum/reagent/oil name = "Oil" id = "oil" - description = "A slippery solution." + description = "Burns in a small smoky fire, mostly used to get Ash." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/stable_plasma name = "Stable Plasma" id = "stable_plasma" description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/iodine name = "Iodine" id = "iodine" description = "A slippery solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/fluorine name = "Fluorine" id = "fluorine" description = "A slippery solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/carpet name = "Carpet" id = "carpet" description = "A slippery solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume) if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel)) var/turf/simulated/floor/F = T - F.visible_message("[T] gets a layer of carpeting applied!") F.ChangeTurf(/turf/simulated/floor/fancy/carpet) ..() return @@ -53,28 +52,28 @@ datum/reagent/bromine id = "bromine" description = "A slippery solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/phenol name = "Phenol" id = "phenol" - description = "A slippery solution." + description = "Used for certain medical recipes." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/ash name = "Ash" id = "ash" - description = "A burnt solution." + description = "Basic ingredient in a couple of recipes." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/acetone name = "Acetone" id = "acetone" - description = "A solution." + description = "Common ingredient in other recipes." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/chemical_reaction/acetone name = "acetone" @@ -118,7 +117,7 @@ datum/reagent/colorful_reagent id = "colorful_reagent" description = "A solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/chemical_reaction/colorful_reagent name = "colorful_reagent" @@ -155,7 +154,7 @@ datum/reagent/triple_citrus id = "triple_citrus" description = "A solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/chemical_reaction/triple_citrus name = "triple_citrus" @@ -169,7 +168,7 @@ datum/reagent/corn_starch id = "corn_starch" description = "A slippery solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/chemical_reaction/corn_syrup name = "corn_syrup" @@ -184,7 +183,7 @@ datum/reagent/corn_syrup id = "corn_syrup" description = "Decays into sugar." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -206,11 +205,11 @@ datum/reagent/corgium id = "corgium" description = "Creates a corgi at the reaction location." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - new /mob/living/simple_animal/corgi(location) + new /mob/living/simple_animal/pet/corgi(location) ..() return @@ -219,7 +218,7 @@ datum/reagent/hair_dye id = "hair_dye" description = "A solution." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code /datum/chemical_reaction/hair_dye @@ -243,7 +242,7 @@ datum/reagent/barbers_aid id = "barbers_aid" description = "A solution to hair loss across the world." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/chemical_reaction/barbers_aid name = "barbers_aid" @@ -268,7 +267,7 @@ datum/reagent/concentrated_barbers_aid id = "concentrated_barbers_aid" description = "A concentrated solution to hair loss across the world." reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 + color = "#C8A5DC" /datum/chemical_reaction/concentrated_barbers_aid name = "concentrated_barbers_aid" diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index be724ae99ea..4c596f27033 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -4,12 +4,26 @@ #define REM REAGENTS_EFFECT_MULTIPLIER +/datum/reagent/stabilizing_agent + name = "Stabilizing Agent" + id = "stabilizing_agent" + description = "Keeps unstable chemicals stable. This does not work on everything." + reagent_state = LIQUID + color = "#FFFFFF" + +/datum/chemical_reaction/stabilizing_agent + name = "stabilizing_agent" + id = "stabilizing_agent" + result = "stabilizing_agent" + required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1) + result_amount = 3 + /datum/reagent/clf3 name = "Chlorine Trifluoride" id = "clf3" description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 + color = "#FF0000" metabolization_rate = 4 /datum/chemical_reaction/clf3 @@ -22,15 +36,14 @@ /datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.adjust_fire_stacks(5) - M.IgniteMob() - M.adjustFireLoss(5*REM) + M.adjust_fire_stacks(4) + M.adjustFireLoss(0.35*M.fire_stacks) ..() return /datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - for(var/turf/simulated/turf in range(1,T)) + var/turf/T = get_turf(holder.my_atom) + for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) holder.chem_temp = 1000 // hot as shit return @@ -53,7 +66,7 @@ return /datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(method == TOUCH && ishuman(M)) + if(method == TOUCH && isliving(M)) M.adjust_fire_stacks(5) M.IgniteMob() new /obj/effect/hotspot(M.loc) @@ -64,7 +77,7 @@ id = "sorium" description = "Sends everything flying from the detonation point." reagent_state = LIQUID - color = "#60A584" //rgb: 96, 165, 132 + color = "#FFA500" /datum/chemical_reaction/sorium name = "Sorium" @@ -72,20 +85,22 @@ result = "sorium" required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) result_amount = 4 + +/datum/chemical_reaction/sorium_vortex + name = "sorium_vortex" + id = "sorium_vortex" + result = null + required_reagents = list("sorium" = 1) required_temp = 474 -/datum/reagent/sorium/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/)) - goonchem_vortex(T, 1, 5, 3) -/datum/reagent/sorium/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 1, 5, 3) - +/datum/chemical_reaction/sorium_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 1, 5, 6) /datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("sorium", created_volume) var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 1, 5, 6) @@ -94,28 +109,30 @@ id = "liquid_dark_matter" description = "Sucks everything into the detonation point." reagent_state = LIQUID - color = "#60A584" //rgb: 96, 165, 132 + color = "#800080" /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" id = "liquid_dark_matter" result = "liquid_dark_matter" required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1) - result_amount = null + result_amount = 3 + +/datum/chemical_reaction/ldm_vortex + name = "LDM Vortex" + id = "ldm_vortex" + result = null + required_reagents = list("liquid_dark_matter" = 1) required_temp = 474 -/*/datum/reagent/liquid_dark_matter/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/)) - goonchem_vortex(T, 0, 5, 3) - return -/datum/reagent/liquid_dark_matter/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 0, 5, 3) - return*/ //o god what the fuck goof +/datum/chemical_reaction/ldm_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 0, 5, 6) + return /datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("liquid_dark_matter", created_volume) var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 0, 5, 6) return @@ -138,7 +155,7 @@ id = "blackpowder" description = "Explodes. Violently." reagent_state = LIQUID - color = "#000000" //rgb: 96, 165, 132 + color = "#000000" metabolization_rate = 0.05 /datum/chemical_reaction/blackpowder @@ -166,3 +183,280 @@ var/ex_flash = round(created_volume / 8) explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1) return + +/datum/reagent/flash_powder + name = "Flash Powder" + id = "flash_powder" + description = "Makes a very bright flash." + reagent_state = LIQUID + color = "#FFFF00" + +/datum/chemical_reaction/flash_powder + name = "Flash powder" + id = "flash_powder" + result = "flash_powder" + required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) + result_amount = 3 + +/datum/chemical_reaction/flash_powder_flash + name = "Flash powder activation" + id = "flash_powder_flash" + result = null + required_reagents = list("flash_powder" = 1) + required_temp = 374 + +/datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) + if(C.check_eye_prot()) + continue + flick("e_flash", C.flash) + if(get_dist(C, location) < 4) + C.Weaken(5) + continue + C.Stun(5) + +/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) + if(C.check_eye_prot()) + continue + flick("e_flash", C.flash) + if(get_dist(C, location) < 4) + C.Weaken(5) + continue + C.Stun(5) + holder.remove_reagent("flash_powder", created_volume) + +/datum/reagent/smoke_powder + name = "Smoke Powder" + id = "smoke_powder" + description = "Makes a large cloud of smoke that can carry reagents." + reagent_state = LIQUID + color = "#808080" + +/datum/chemical_reaction/smoke_powder + name = "smoke_powder" + id = "smoke_powder" + result = "smoke_powder" + required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) + result_amount = 3 + + +/datum/chemical_reaction/smoke_powder_smoke + name = "smoke_powder_smoke" + id = "smoke_powder_smoke" + result = null + required_reagents = list("smoke_powder" = 1) + required_temp = 374 + secondary = 1 + mob_react = 1 + +/datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + if(S) + S.set_up(holder, 10, 0, location) + S.start() + sleep(10) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() + return + +/datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("smoke_powder", created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + if(S) + S.set_up(holder, 10, 0, location) + S.start() + sleep(10) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() + return + +/datum/reagent/sonic_powder + name = "Sonic Powder" + id = "sonic_powder" + description = "Makes a deafening noise." + reagent_state = LIQUID + color = "#0000FF" + +/datum/chemical_reaction/sonic_powder + name = "sonic_powder" + id = "sonic_powder" + result = "sonic_powder" + required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) + result_amount = 3 + + +/datum/chemical_reaction/sonic_powder_deafen + name = "sonic_powder_deafen" + id = "sonic_powder_deafen" + result = null + required_reagents = list("sonic_powder" = 1) + required_temp = 374 + +/datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + continue + C.show_message("BANG", 2) + C.Stun(5) + C.Weaken(5) + C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) + if(C.ear_damage >= 15) + C << "Your ears start to ring badly!" + else if(C.ear_damage >= 5) + C << "Your ears start to ring!" + +/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("sonic_powder", created_volume) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + continue + C.show_message("BANG", 2) + C.Stun(5) + C.Weaken(5) + C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) + if(C.ear_damage >= 15) + C << "Your ears start to ring badly!" + else if(C.ear_damage >= 5) + C << "Your ears start to ring!" + +/datum/reagent/phlogiston + name = "Phlogiston" + id = "phlogiston" + description = "Catches you on fire and makes you ignite." + reagent_state = LIQUID + color = "#FF9999" + +/datum/chemical_reaction/phlogiston + name = "phlogiston" + id = "phlogiston" + result = "phlogiston" + required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1) + result_amount = 3 + +/datum/chemical_reaction/phlogiston/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/turf/simulated/T = get_turf(holder.my_atom) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) + return + +/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjust_fire_stacks(1) + M.IgniteMob() + M.adjustFireLoss(0.2*M.fire_stacks) + ..() + return + +/datum/reagent/napalm + name = "Napalm" + id = "napalm" + description = "Very flammable." + reagent_state = LIQUID + color = "#FF9999" + +/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjust_fire_stacks(1) + ..() + return + +/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH && isliving(M)) + M.adjust_fire_stacks(7) + return + +/datum/chemical_reaction/napalm + name = "Napalm" + id = "napalm" + result = null + required_reagents = list("aluminium" = 1, "plasma" = 1, "sacid" = 1 ) + result_amount = 1 + +datum/reagent/cryostylane + name = "Cryostylane" + id = "cryostylane" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." + color = "#B2B2FF" // rgb: 139, 166, 233 + +/datum/chemical_reaction/cryostylane + name = "cryostylane" + id = "cryostylane" + result = "cryostylane" + required_reagents = list("water" = 1, "stable_plasma" = 1, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/cryostylane/on_reaction(var/datum/reagents/holder, var/created_volume) + holder.chem_temp = 20 // cools the fuck down + return + + +datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 1) + M.bodytemperature -= 30 * TEMPERATURE_DAMAGE_COEFFICIENT + ..() + return + +datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) + if(volume >= 5) + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(15,30)) + +datum/reagent/pyrosium + name = "Pyrosium" + id = "pyrosium" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." + color = "#B20000" // rgb: 139, 166, 233 + +/datum/chemical_reaction/pyrosium + name = "pyrosium" + id = "pyrosium" + result = "pyrosium" + required_reagents = list("stable_plasma" = 1, "radium" = 1, "phosphorus" = 1) + result_amount = 3 + +/datum/chemical_reaction/pyrosium/on_reaction(var/datum/reagents/holder, var/created_volume) + holder.chem_temp = 20 // also cools the fuck down + return + +datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 1) + M.bodytemperature += 30 * TEMPERATURE_DAMAGE_COEFFICIENT + ..() + return diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm index d7066b8abd1..7693d241c0b 100644 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -7,9 +7,9 @@ datum/reagent/polonium name = "Polonium" id = "polonium" - description = "+8 RAD." + description = "Cause significant Radiation damage over time." reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" metabolization_rate = 0.1 datum/reagent/polonium/on_mob_life(var/mob/living/M as mob) @@ -24,7 +24,7 @@ datum/reagent/histamine id = "histamine" description = "A dose-dependent toxin, ranges from annoying to incredibly lethal." reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" metabolization_rate = 0.2 overdose_threshold = 30 @@ -54,9 +54,9 @@ datum/reagent/histamine/overdose_process(var/mob/living/M as mob) datum/reagent/formaldehyde name = "Formaldehyde" id = "formaldehyde" - description = "+1 TOX, 10% chance to decay into 5-15 units of histamine." + description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine." reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -78,9 +78,9 @@ datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob) datum/reagent/venom name = "Venom" id = "venom" - description = "Scaling TOX and BRUTE damage with dose. 25% chance to decay into 5-10 histamine." + description = "Will deal scaling amounts of Toxin and Brute damage over time. 25% chance to decay into 5-10 histamine." reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" metabolization_rate = 0.2 datum/reagent/venom/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -95,9 +95,9 @@ datum/reagent/venom/on_mob_life(var/mob/living/M as mob) datum/reagent/neurotoxin2 name = "Neurotoxin" id = "neurotoxin2" - description = "+1 TOX, +1 BRAIN up to 60 before it slows down, confusion, knockout after 17 elapsed cycles." + description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 17 elapsed cycles." reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" var/cycle_count = 0 metabolization_rate = 1 @@ -117,14 +117,14 @@ datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) result = "neurotoxin2" required_reagents = list("space_drugs" = 1) result_amount = 1 - required_temp = 370 + required_temp = 674 datum/reagent/cyanide name = "Cyanide" id = "cyanide" - description = "+1.5 TOX, 10% chance of +1 LOSEBREATH, 8% chance of stun and extra +2 TOX." + description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage." reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" metabolization_rate = 0.1 datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) @@ -152,7 +152,7 @@ datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) id = "????" description = "????" reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" metabolization_rate = 0.2 datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob) @@ -164,9 +164,9 @@ datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob) datum/reagent/itching_powder name = "Itching Powder" id = "itching_powder" - description = "Lots of annoying random effects, chances to do BRUTE damage from scratching. 6% chance to decay into 1-3 units of histamine." + description = "Lots of annoying random effects, chances to do some brute damage from scratching. 6% chance to decay into 1-3 units of histamine." reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 + color = "#CF3600" metabolization_rate = 0.3 /datum/reagent/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) @@ -176,13 +176,13 @@ datum/reagent/itching_powder datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - if(prob(rand(5,50))) + if(prob(27)) M << "You scratch at your head." M.adjustBruteLoss(0.2*REM) - if(prob(rand(5,50))) + if(prob(27)) M << "You scratch at your leg." M.adjustBruteLoss(0.2*REM) - if(prob(rand(5,50))) + if(prob(27)) M << "You scratch at your arm." M.adjustBruteLoss(0.2*REM) if(prob(6)) @@ -204,4 +204,166 @@ datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) result = "facid" required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) result_amount = 4 - required_temp = 380 \ No newline at end of file + required_temp = 380 + +datum/reagent/initropidril + name = "Initropidril" + id = "initropidril" + description = "33% chance to hit with a random amount of toxin damage, 5-10% chances to cause stunning, suffocation, or immediate heart failure." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.4 + +datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(33)) + M.adjustToxLoss(rand(5,25)) + if(prob(7)) + var/picked_option = rand(1,3) + switch(picked_option) + if(1) + M.Stun(3) + M.Weaken(3) + if(2) + M.losebreath += 10 + M.adjustOxyLoss(rand(5,25)) + if(3) + var/mob/living/carbon/human/H = M + if(!H.heart_attack) + H.visible_message("[H] clutches at their chest as if their heart stopped!") + H.heart_attack = 1 // rip in pepperoni + else + H.losebreath += 10 + H.adjustOxyLoss(rand(5,25)) + ..() + return + +datum/reagent/pancuronium + name = "Pancuronium" + id = "pancuronium" + description = "Knocks you out after 30 seconds, 7% chance to cause some oxygen loss." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.2 + +datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(current_cycle >= 10) + M.SetParalysis(3) + if(prob(7)) + M.losebreath += rand(3,5) + ..() + return + +datum/reagent/sodium_thiopental + name = "Sodium Thiopental" + id = "sodium_thiopental" + description = "Puts you to sleep after 30 seconds, along with some major stamina loss." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.7 + +datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(current_cycle >= 10) + M.sleeping += 3 + M.adjustStaminaLoss(10) + ..() + return + +datum/reagent/sulfonal + name = "Sulfonal" + id = "sulfonal" + description = "Deals some toxin damage, and puts you to sleep after 66 seconds." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.1 + +/datum/chemical_reaction/sulfonal + name = "sulfonal" + id = "sulfonal" + result = "sulfonal" + required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) + result_amount = 3 + +datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(current_cycle >= 22) + M.sleeping += 3 + M.adjustToxLoss(1) + ..() + return + +datum/reagent/amanitin + name = "Amanitin" + id = "amanitin" + description = "On the last second that it's in you, it hits you with a stack of toxin damage based on how long it's been in you. The more you use, the longer it takes before anything happens, but the harder it hits when it does." + reagent_state = LIQUID + color = "#CF3600" + +datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + ..() + return + +datum/reagent/amanitin/on_mob_delete(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(current_cycle*rand(2,4)) + ..() + +datum/reagent/lipolicide + name = "Lipolicide" + id = "lipolicide" + description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values." + reagent_state = LIQUID + color = "#CF3600" + +/datum/chemical_reaction/lipolicide + name = "lipolicide" + id = "lipolicide" + result = "lipolicide" + required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) + result_amount = 3 + +datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!holder.has_reagent("nutriment")) + M.adjustToxLoss(1) + M.nutrition -= 10 * REAGENTS_METABOLISM + M.overeatduration = 0 + if(M.nutrition < 0)//Prevent from going into negatives. + M.nutrition = 0 + ..() + return + +datum/reagent/coniine + name = "Coniine" + id = "coniine" + description = "Does moderate toxin damage and oxygen loss." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.05 + +datum/reagent/coniine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.losebreath += 5 + M.adjustToxLoss(2) + ..() + return + +datum/reagent/curare + name = "Curare" + id = "curare" + description = "Does some oxygen and toxin damage, weakens you after 33 seconds." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.1 + +datum/reagent/curare/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(current_cycle >= 11) + M.Weaken(3) + M.adjustToxLoss(1) + M.adjustOxyLoss(1) + ..() + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 6041066d737..48ddea37276 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -51,6 +51,15 @@ datum/reagents/New(maximum=100) chemical_reactions_list[id] += D break // Don't bother adding ourselves to other reagent ids, it is redundant. +datum/reagents/Destroy() + ..() + for(var/datum/reagent/R in reagent_list) + qdel(R) + reagent_list.Cut() + reagent_list = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + datum/reagents/proc/remove_any(var/amount=1) var/total_transfered = 0 var/current_list_element = 1 @@ -356,19 +365,18 @@ datum/reagents/proc/isolate_reagent(var/reagent) update_total() datum/reagents/proc/del_reagent(var/reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A + for(var/datum/reagent/R in reagent_list) if (R.id == reagent) - reagent_list -= A - del(A) + if(istype(my_atom, /mob/living)) + var/mob/living/M = my_atom + R.on_mob_delete(M) + qdel(R) + reagent_list -= R update_total() my_atom.on_reagent_change() check_ignoreslow(my_atom) check_gofast(my_atom) check_goreallyfast(my_atom) - return 0 - - return 1 datum/reagents/proc/check_ignoreslow(var/mob/M) @@ -380,7 +388,7 @@ datum/reagents/proc/check_ignoreslow(var/mob/M) datum/reagents/proc/check_gofast(var/mob/M) if(istype(M, /mob)) - if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("hotline")) + if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")) return 1 else M.status_flags &= ~GOTTAGOFAST @@ -532,12 +540,6 @@ datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0 return has_removed_reagent -datum/reagents/proc/delete() - for(var/datum/reagent/R in reagent_list) - R.holder = null - if(my_atom) - my_atom.reagents = null - //two helper functions to preserve data across reactions (needed for xenoarch) datum/reagents/proc/get_data(var/reagent_id) for(var/datum/reagent/D in reagent_list) @@ -578,6 +580,6 @@ datum/reagents/proc/copy_data(var/datum/reagent/current_reagent) // Max vol is maximum volume of holder atom/proc/create_reagents(var/max_vol) if(reagents) - reagents.delete() + qdel(reagents) reagents = new/datum/reagents(max_vol) reagents.my_atom = src diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm index 59c478f1484..85bc7b597ff 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm @@ -19,9 +19,9 @@ datum/reagent var/datum/reagents/holder = null var/reagent_state = LIQUID var/list/data + var/current_cycle = 0 var/volume = 0 - //var/list/viruses = list() - var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) + var/color = "#000000" // rgb: 0, 0, 0 var/can_synth = 1 var/metabolization_rate = REAGENTS_METABOLISM var/overrides_metab = 0 @@ -30,6 +30,10 @@ datum/reagent var/addiction_stage = 0 var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. +datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references + ..() + holder = null + datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some if(!istype(M, /mob/living)) return 0 @@ -74,11 +78,16 @@ datum/reagent/proc/reaction_turf(var/turf/T, var/volume) return datum/reagent/proc/on_mob_life(var/mob/living/M as mob) + current_cycle++ if(!istype(M, /mob/living)) return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. return +// Called when this reagent is removed while inside a mob +datum/reagent/proc/on_mob_delete(mob/M) + return + datum/reagent/proc/on_move(var/mob/M) return @@ -208,14 +217,6 @@ datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the newVirus.holder = blood_prop return -/* Must check the transfering of reagents and their data first. They all can point to one disease datum. - - Del() - if(src.data["virus"]) - var/datum/disease/D = src.data["virus"] - D.cure(0) - ..() -*/ datum/reagent/vaccine //data must contain virus type name = "Vaccine" @@ -261,12 +262,10 @@ datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0) G.react() qdel(hotspot) - T.color = initial(T.color) return datum/reagent/water/reaction_obj(var/obj/O, var/volume) src = null - O.color = initial(O.color) if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O if(!cube.wrapped) @@ -276,7 +275,6 @@ datum/reagent/water/reaction_obj(var/obj/O, var/volume) datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with water can help put them out! if(!istype(M, /mob/living)) return - M.color = initial(M.color) if(method == TOUCH) M.adjust_fire_stacks(-(volume / 10)) if(M.fire_stacks <= 0) @@ -676,12 +674,10 @@ datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume) else if(O) O.clean_blood() - O.color = initial(O.color) datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume) if(volume >= 1) T.clean_blood() - T.color = initial(T.color) for(var/obj/effect/decal/cleanable/C in T) qdel(C) @@ -695,7 +691,6 @@ datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume) datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(iscarbon(M)) var/mob/living/carbon/C = M - C.color = initial(C.color) if(C.r_hand) C.r_hand.clean_blood() if(C.l_hand) diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm index 600de7a525c..f494d01b409 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm @@ -22,18 +22,16 @@ datum/reagent/consumable/ethanol var/boozepwr = 10 //lower numbers mean the booze will have an effect faster. datum/reagent/consumable/ethanol/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ + current_cycle++ M.jitteriness = max(M.jitteriness-5,0) - if(data >= boozepwr) + if(current_cycle >= boozepwr) if (!M.slurring) M.slurring = 1 M.slurring += 4 M.Dizzy(5) - if(data >= boozepwr*2.5 && prob(33)) + if(current_cycle >= boozepwr*2.5 && prob(33)) if (!M.confused) M.confused = 1 M.confused += 3 - if(data >= boozepwr*10 && prob(33)) + if(current_cycle >= boozepwr*10 && prob(33)) M.adjustToxLoss(2) ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm index 3e5ddf8d0dc..87496ff1a82 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm @@ -53,15 +53,13 @@ datum/reagent/consumable/carrotjuice datum/reagent/consumable/carrotjuice/on_mob_life(var/mob/living/M as mob) M.eye_blurry = max(M.eye_blurry-1 , 0) M.eye_blind = max(M.eye_blind-1 , 0) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 20) //nothing if(21 to INFINITY) - if (prob(data-10)) + if (prob(current_cycle-10)) M.disabilities &= ~NEARSIGHT - data++ + current_cycle++ ..() return @@ -418,10 +416,8 @@ datum/reagent/consumable/atomicbomb/on_mob_life(var/mob/living/M as mob) if (!M.slurring) M.slurring = 1 M.slurring += 3 - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(51 to 200) M.sleeping += 1 if(201 to INFINITY) @@ -437,19 +433,17 @@ datum/reagent/consumable/gargle_blaster color = "#664300" // rgb: 102, 67, 0 datum/reagent/consumable/gargle_blaster/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ + current_cycle++ M.dizziness +=6 - if(data >= 15 && data <45) + if(current_cycle >= 15 && current_cycle <45) if (!M.slurring) M.slurring = 1 M.slurring += 3 - else if(data >= 45 && prob(50) && data <55) + else if(current_cycle >= 45 && prob(50) && current_cycle <55) M.confused = max(M.confused+3,0) - else if(data >=55) + else if(current_cycle >=55) M.druggy = max(M.druggy, 55) - else if(data >=200) + else if(current_cycle >=200) M.adjustToxLoss(2) ..() return @@ -462,19 +456,17 @@ datum/reagent/consumable/neurotoxin datum/reagent/consumable/neurotoxin/on_mob_life(var/mob/living/carbon/M as mob) M.weakened = max(M.weakened, 3) - if(!data) - data = 1 - data++ + current_cycle++ M.dizziness +=6 - if(data >= 15 && data <45) + if(current_cycle >= 15 && current_cycle <45) if (!M.slurring) M.slurring = 1 M.slurring += 3 - else if(data >= 45 && prob(50) && data <55) + else if(current_cycle >= 45 && prob(50) && current_cycle <55) M.confused = max(M.confused+3,0) - else if(data >=55) + else if(current_cycle >=55) M.druggy = max(M.druggy, 55) - else if(data >=200) + else if(current_cycle >=200) M.adjustToxLoss(2) ..() return @@ -489,10 +481,8 @@ datum/reagent/consumable/hippies_delight datum/reagent/consumable/hippies_delight/on_mob_life(var/mob/living/M as mob) M.druggy = max(M.druggy, 50) - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(1 to 5) if (!M.slurring) M.slurring = 1 M.Dizzy(10) diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm index 7b530de3fa9..b01b5234b98 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm @@ -95,13 +95,11 @@ datum/reagent/consumable/capsaicin color = "#B31008" // rgb: 179, 16, 8 datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 15) M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) + if(holder.has_reagent("cryostylane")) + holder.remove_reagent("cryostylane", 5) if(istype(M, /mob/living/simple_animal/slime)) M.bodytemperature += rand(5,20) if(15 to 25) @@ -112,10 +110,43 @@ datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob) M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT if(istype(M, /mob/living/simple_animal/slime)) M.bodytemperature += rand(15,20) - data++ ..() return +datum/reagent/consumable/frostoil + name = "Frost Oil" + id = "frostoil" + description = "A special oil that noticably chills the body. Extraced from Icepeppers." + color = "#B31008" // rgb: 139, 166, 233 + +datum/reagent/consumable/frostoil/on_mob_life(var/mob/living/M as mob) + switch(current_cycle) + if(1 to 15) + M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT + if(holder.has_reagent("capsaicin")) + holder.remove_reagent("capsaicin", 5) + if(istype(M, /mob/living/simple_animal/slime)) + M.bodytemperature -= rand(5,20) + if(15 to 25) + M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT + if(istype(M, /mob/living/simple_animal/slime)) + M.bodytemperature -= rand(10,20) + if(25 to INFINITY) + M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT + if(prob(1)) + M.emote("shiver") + if(istype(M, /mob/living/simple_animal/slime)) + M.bodytemperature -= rand(15,20) + ..() + return + +datum/reagent/consumable/frostoil/reaction_turf(var/turf/simulated/T, var/volume) + if(volume >= 5) + for(var/mob/living/simple_animal/slime/M in T) + M.adjustToxLoss(rand(15,30)) + //if(istype(T)) + // T.atmos_spawn_air(SPAWN_COLD) + datum/reagent/consumable/condensedcapsaicin name = "Condensed Capsaicin" id = "condensedcapsaicin" @@ -190,42 +221,6 @@ datum/reagent/consumable/condensedcapsaicin/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/consumable/frostoil - name = "Frost Oil" - id = "frostoil" - description = "A special oil that noticably chills the body. Extraced from Icepeppers." - color = "#B31008" // rgb: 139, 166, 233 - -datum/reagent/consumable/frostoil/on_mob_life(var/mob/living/M as mob) - if(!data) data = 1 - switch(data) - if(1 to 15) - M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 5) - if(istype(M, /mob/living/simple_animal/slime)) - M.bodytemperature -= rand(5,20) - if(15 to 25) - M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/simple_animal/slime)) - M.bodytemperature -= rand(10,20) - if(25 to INFINITY) - M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(prob(1)) - M.emote("shiver") - if(istype(M, /mob/living/simple_animal/slime)) - M.bodytemperature -= rand(15,20) - data++ - ..() - return - -datum/reagent/consumable/frostoil/reaction_turf(var/turf/simulated/T, var/volume) - if(volume >= 5) - for(var/mob/living/simple_animal/slime/M in T) - M.adjustToxLoss(rand(15,30)) - //if(istype(T)) - // T.atmos_spawn_air(SPAWN_COLD) - datum/reagent/consumable/sodiumchloride name = "Table Salt" id = "sodiumchloride" @@ -270,9 +265,7 @@ datum/reagent/mushroomhallucinogen datum/reagent/mushroomhallucinogen/on_mob_life(var/mob/living/M as mob) M.druggy = max(M.druggy, 30) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 5) if (!M.slurring) M.slurring = 1 @@ -295,7 +288,7 @@ datum/reagent/mushroomhallucinogen/on_mob_life(var/mob/living/M as mob) M.druggy = max(M.druggy, 40) if(prob(30)) M.emote(pick("twitch","giggle")) - data++ + current_cycle++ ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 2fc73900f9a..1765a0929af 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -14,20 +14,6 @@ datum/reagent/medicine datum/reagent/medicine/on_mob_life(var/mob/living/M as mob) holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism -datum/reagent/medicine/lipozine - name = "Lipozine" // The anti-nutriment. - id = "lipozine" - description = "A chemical compound that causes a powerful fat-burning reaction." - color = "#BBEDA4" // rgb: 187, 237, 164 - -datum/reagent/medicine/lipozine/on_mob_life(var/mob/living/M as mob) - M.nutrition -= 10 * REAGENTS_METABOLISM - M.overeatduration = 0 - if(M.nutrition < 0)//Prevent from going into negatives. - M.nutrition = 0 - ..() - return - datum/reagent/medicine/leporazine name = "Leporazine" id = "leporazine" @@ -141,10 +127,8 @@ datum/reagent/medicine/rezadone color = "#669900" // rgb: 102, 153, 0 datum/reagent/medicine/rezadone/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(1 to 15) M.adjustCloneLoss(-1) M.heal_organ_damage(1,1) diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index 1fd89e8ac39..96a1095694e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -158,10 +158,8 @@ datum/reagent/toxin/zombiepowder/on_mob_life(var/mob/living/carbon/M as mob) ..() return -datum/reagent/toxin/zombiepowder/Del() - if(holder && ismob(holder.my_atom)) - var/mob/M = holder.my_atom - M.status_flags &= ~FAKEDEATH +datum/reagent/toxin/zombiepowder/on_mob_delete(mob/M) + M.status_flags &= ~FAKEDEATH ..() datum/reagent/toxin/mindbreaker @@ -258,10 +256,8 @@ datum/reagent/toxin/chloralhydrate metabolization_rate = 1.5 * REAGENTS_METABOLISM datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(1 to 10) M.confused += 2 M.drowsyness += 2 @@ -269,7 +265,7 @@ datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob) M.sleeping += 1 if(51 to INFINITY) M.sleeping += 1 - M.adjustToxLoss((data - 50)*REM) + M.adjustToxLoss((current_cycle - 50)*REM) ..() return @@ -281,15 +277,13 @@ datum/reagent/toxin/beer2 //disguised as normal beer for use by emagged brobots metabolization_rate = 1.5 * REAGENTS_METABOLISM datum/reagent/toxin/beer2/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 50) M.sleeping += 1 if(51 to INFINITY) M.sleeping += 1 - M.adjustToxLoss((data - 50)*REM) - data++ + M.adjustToxLoss((current_cycle - 50)*REM) + current_cycle++ ..() return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 40c269ce7e6..0f99675d8e2 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -58,12 +58,6 @@ silicate required_reagents = list("aluminium" = 1, "silicon" = 1, "oxygen" = 1) result_amount = 3 */ -/datum/chemical_reaction/stoxin - name = "Sleep Toxin" - id = "stoxin" - result = "stoxin" - required_reagents = list("chloralhydrate" = 1, "sugar" = 4) - result_amount = 5 /datum/chemical_reaction/sterilizine name = "Sterilizine" @@ -186,90 +180,6 @@ silicate required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) result_amount = 3 -/datum/chemical_reaction/flash_powder - name = "Flash powder" - id = "flash_powder" - result = null - required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) - result_amount = null -/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - for(var/mob/living/carbon/C in get_hearers_in_view(5, location)) - if(C.check_eye_prot()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - -/datum/chemical_reaction/napalm - name = "Napalm" - id = "napalm" - result = null - required_reagents = list("aluminium" = 1, "plasma" = 1, "sacid" = 1 ) - result_amount = 1 -/datum/chemical_reaction/napalm/on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) - holder.del_reagent(id) - return - -/* -/datum/chemical_reaction/smoke - name = "Smoke" - id = "smoke" - result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1 ) - result_amount = null - secondary = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/system/bad_smoke_spread/S = new /datum/effect/system/bad_smoke_spread - S.attach(location) - S.set_up(10, 0, location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - holder.clear_reagents() - return */ - -/datum/chemical_reaction/chemsmoke - name = "Chemsmoke" - id = "chemsmoke" - result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) - result_amount = null - secondary = 1 - mob_react = 1 - -/datum/chemical_reaction/chemsmoke/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread - S.attach(location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return - /datum/chemical_reaction/chloralhydrate name = "Chloral Hydrate" id = "chloralhydrate" @@ -288,7 +198,7 @@ silicate name = "Zombie Powder" id = "zombiepowder" result = "zombiepowder" - required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) + required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5) result_amount = 2 /datum/chemical_reaction/rezadone @@ -305,13 +215,6 @@ silicate required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1) result_amount = 5 -/datum/chemical_reaction/lipozine - name = "Lipozine" - id = "Lipozine" - result = "lipozine" - required_reagents = list("sodiumchloride" = 1, "ethanol" = 1, "radium" = 1) - result_amount = 3 - /datum/chemical_reaction/plasmasolidification name = "Solid Plasma" id = "solidplasma" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 239782e0faa..9532a1a95b1 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -141,6 +141,42 @@ icon_state = "bottle16" list_reagents = list("formaldehyde" = 30) +/obj/item/weapon/reagent_containers/glass/bottle/initropidril + name = "initropidril bottle" + desc = "A small bottle. Contains initropidril." + icon_state = "bottle16" + list_reagents = list("initropidril" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/pancuronium + name = "pancuronium bottle" + desc = "A small bottle. Contains pancuronium." + icon_state = "bottle16" + list_reagents = list("pancuronium" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental + name = "sodium_thiopental bottle" + desc = "A small bottle. Contains sodium thiopental." + icon_state = "bottle16" + list_reagents = list("formaldehyde" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/coniine + name = "coniine bottle" + desc = "A small bottle. Contains coniine." + icon_state = "bottle16" + list_reagents = list("coniine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/curare + name = "curare bottle" + desc = "A small bottle. Contains curare." + icon_state = "bottle16" + list_reagents = list("curare" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/amanitin + name = "amanitin bottle" + desc = "A small bottle. Contains amanitin." + icon_state = "bottle16" + list_reagents = list("amanitin" = 30) + /obj/item/weapon/reagent_containers/glass/bottle/histamine name = "histamine bottle" desc = "A small bottle. Contains Histamine." diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index f1c55d5a383..43484c7cc4b 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -68,7 +68,8 @@ reagents.trans_to(D, amount_per_transfer_from_this, 1/range) D.color = mix_color_from_reagents(D.reagents.reagent_list) var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed - var/wait_step = max(round(9/range),2) + var/wait_step = max(round(2+3/range), 2) + spawn(0) for(var/i=0, i[src]'s chemical chamber has sprung a leak!") @@ -337,7 +337,7 @@ smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() - R.delete() + qdel(R) ejectItem(TRUE) warn_admins(usr, "[chosenchem] smoke") investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor") @@ -424,7 +424,7 @@ smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() - R.delete() + qdel(R) ejectItem(TRUE) if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!.") @@ -510,7 +510,7 @@ trackedIan.loc = src.loc investigate_log("Experimentor has stolen Ian!", "experimentor") //...if anyone ever fixes it... else - new /mob/living/simple_animal/corgi(src.loc) + new /mob/living/simple_animal/pet/corgi(src.loc) investigate_log("Experimentor has spawned a new corgi.", "experimentor") ejectItem(TRUE) if(globalMalf > 36 && globalMalf < 50) @@ -532,7 +532,7 @@ trackedRuntime.loc = src.loc investigate_log("Experimentor has stolen Runtime!", "experimentor") else - new /mob/living/simple_animal/cat(src.loc) + new /mob/living/simple_animal/pet/cat(src.loc) investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", "experimentor") ejectItem(TRUE) if(globalMalf > 76) @@ -656,7 +656,7 @@ /obj/item/weapon/relic/proc/corgicannon(var/mob/user) playsound(src.loc, "sparks", rand(25,50), 1) - var/mob/living/simple_animal/corgi/C = new/mob/living/simple_animal/corgi(get_turf(user)) + var/mob/living/simple_animal/pet/corgi/C = new/mob/living/simple_animal/pet/corgi(get_turf(user)) C.throw_at(pick(oview(10,user)),10,rand(3,8)) throwSmoke(get_turf(C)) warn_admins(user, "Corgi Cannon", 0) @@ -679,7 +679,7 @@ user << message var/animals = rand(1,25) var/counter - var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cat,/mob/living/simple_animal/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp) + var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/pet/cat,/mob/living/simple_animal/pet/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/pet/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp) for(counter = 1; counter < animals; counter++) var/mobType = pick(valid_animals) new mobType(get_turf(src)) @@ -736,4 +736,4 @@ if(priority) //For truly dangerous relics that may need an admin's attention. BWOINK! message_admins("[RelicType] relic activated by [key_name(user, user.client)](?) in ([T.x],[T.y],[T.z] - JMP)",0,1) log_game(log_msg) - investigate_log(log_msg, "experimentor") \ No newline at end of file + investigate_log(log_msg, "experimentor") diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm new file mode 100644 index 00000000000..6d289144127 --- /dev/null +++ b/code/modules/surgery/cybernetic_implants.dm @@ -0,0 +1,56 @@ +#define MAX_BRAIN_IMPLANT 2 + +/datum/surgery/eye_cybernetic_implant/eyes + name = "eye cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant/eyes, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) + location = "eyes" + +/datum/surgery/eye_cybernetic_implant/brain + name = "brain cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close) + location = "head" + +/datum/surgery_step/cybernetic_implant/eyes + implements = list(/obj/item/cybernetic_implant/eyes = 100) + time = 32 + +/datum/surgery_step/cybernetic_implant/brain + implements = list(/obj/item/cybernetic_implant/brain = 100) + time = 32 + +/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) + user.visible_message("[user] begins to implant [target] with [implant].") + +/datum/surgery_step/cybernetic_implant/eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/eyes/implant, datum/surgery/surgery) + if(implant) + var/full = 0 + if(locate(/obj/item/cybernetic_implant/eyes,target.internal_organs)) + full = 1 + + insert(user,target,implant,target_zone,full) + return 1 + +/datum/surgery_step/cybernetic_implant/brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/brain/implant, datum/surgery/surgery) + if(implant) + var/full = 0 + for(var/obj/item/I in target.contents) + if(istype(I,/obj/item/cybernetic_implant/brain)) + full++ + + if(full < MAX_BRAIN_IMPLANT) + full = 0 + + insert(user,target,implant,target_zone,full) + return 1 + + +/datum/surgery_step/cybernetic_implant/proc/insert(mob/user, mob/living/carbon/target, obj/item/cybernetic_implant/implant,target_zone,full) + if(full) + user.visible_message("[user] can't seem to implant anything else into the [target]'s [target_zone].") + else + user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!") + implant.owner = target + implant.function() + user.drop_item() + implant.loc = target + target.internal_organs |= implant \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm new file mode 100644 index 00000000000..5b5a928148b --- /dev/null +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -0,0 +1,236 @@ +#define STUN_SET_AMOUNT 2 + +/obj/item/cybernetic_implant + name = "cybernetic implant" + desc = "a state-of-the-art implant that improves a baseline's functionality" + icon = 'icons/obj/surgery.dmi' + var/mob/living/carbon/owner = null + var/implant_color = "#FFFFFF" + +/obj/item/cybernetic_implant/New(var/mob/M = null) + if(M) + owner = M + return ..() + +/obj/item/cybernetic_implant/proc/function() + return + + +//[[[[EYES]]]] + +/obj/item/cybernetic_implant/eyes + name = "cybernetic eyes" + desc = "artificial photoreceptors with specialized functionality" + icon_state = "eye_implant" + var/eye_color = "fff" + var/flash_protect = 0 + +/obj/item/cybernetic_implant/eyes/New() + var/icon/overlay = new /icon('icons/obj/surgery.dmi',"eye_implant_overlay") + overlay.ColorTone(implant_color) + overlays |= overlay + ..() + +/obj/item/cybernetic_implant/eyes/proc/update_eye_color(fluff_message) + if(istype(owner,/mob/living/carbon/human)) + var/mob/living/carbon/human/HMN = owner + HMN.eye_color = eye_color + HMN.regenerate_icons() + if(fluff_message) + owner << "[fluff_message]" + +/obj/item/cybernetic_implant/eyes/hud/medical + name = "medical hud implant" + desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." + eye_color = "0ff" + implant_color = "#00FFFF" + +/obj/item/cybernetic_implant/eyes/hud/medical/function() + if(!owner) + return + + var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED] + H.add_hud_to(owner) + owner.permanent_huds |= H + update_eye_color("You suddenly see health bars floating above people's heads...") + +/obj/item/cybernetic_implant/eyes/hud/security + name = "security hud implant" + desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." + eye_color = "d00" + implant_color = "#CC0000" + +/obj/item/cybernetic_implant/eyes/hud/security/function() + if(!owner) + return + + var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED] + H.add_hud_to(owner) + owner.permanent_huds |= H + update_eye_color("Job indicator icons pop up in your vision. That is not a certified surgeon...") + +/obj/item/cybernetic_implant/eyes/xray + name = "xray implant" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + eye_color = "000" + implant_color = "#000000" + +/obj/item/cybernetic_implant/eyes/xray/function() + if(!owner) + return + + owner.sight |= SEE_MOBS + owner.sight |= SEE_OBJS + owner.sight |= SEE_TURFS + owner.permanent_sight_flags |= SEE_MOBS + owner.permanent_sight_flags |= SEE_OBJS + owner.permanent_sight_flags |= SEE_TURFS + update_eye_color("Your vision is augmented!") + +/obj/item/cybernetic_implant/eyes/thermals + name = "thermals implant" + desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." + eye_color = "FC0" + implant_color = "#FFCC00" + flash_protect = -1 + +/obj/item/cybernetic_implant/eyes/thermals/function() + if(!owner) + return + + owner.sight |= SEE_MOBS + owner.permanent_sight_flags |= SEE_MOBS + update_eye_color("You see prey everywhere you look...") + +/obj/item/cybernetic_implant/eyes/emp_act(severity) + if(severity > 1) + if(prob(5)) + return + var/save_sight = owner.sight + owner.sight &= 0 + owner.disabilities |= BLIND + owner << "Static obfuscates your vision!" + spawn(50) + owner.sight |= save_sight + owner.disabilities ^= BLIND + + +//[[[[BRAIN]]]] + +/obj/item/cybernetic_implant/brain + name = "cybernetic brain implant" + desc = "injectors of extra sub-routines for the brain" + icon_state = "brain_implant" + +/obj/item/cybernetic_implant/brain/New() + var/icon/overlay = new /icon('icons/obj/surgery.dmi',"brain_implant_overlay") + overlay.ColorTone(implant_color) + overlays |= overlay + ..() + +/obj/item/cybernetic_implant/brain/emp_act(severity) + var/stun_amount = 5 + (severity-1 ? 0 : 5) + owner.Stun(stun_amount) + owner << "Your body seizes up!" + return stun_amount + +/obj/item/cybernetic_implant/brain/anti_drop + name = "anti-drop implant" + desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." + var/active = 0 + var/l_hand_ignore = 0 + var/r_hand_ignore = 0 + var/obj/item/l_hand_obj = null + var/obj/item/r_hand_obj = null + implant_color = "#DE7E00" + +/obj/item/cybernetic_implant/brain/anti_drop/function() + action_button_name = "Toggle Anti-Drop" + +/obj/item/cybernetic_implant/brain/anti_drop/ui_action_click() + active = !active + if(active) + l_hand_obj = owner.l_hand + r_hand_obj = owner.r_hand + if(l_hand_obj) + if(owner.l_hand.flags & NODROP) + l_hand_ignore = 1 + else + owner.l_hand.flags |= NODROP + l_hand_ignore = 0 + + if(r_hand_obj) + if(owner.r_hand.flags & NODROP) + r_hand_ignore = 1 + else + owner.r_hand.flags |= NODROP + r_hand_ignore = 0 + + if(!l_hand_obj && !r_hand_obj) + owner << "You are not holding any items, your hands relax..." + active = 0 + else + var/msg = 0 + msg += !l_hand_ignore && l_hand_obj ? 1 : 0 + msg += !r_hand_ignore && r_hand_obj ? 2 : 0 + switch(msg) + if(1) + owner << "Your left hand's grip tightens." + if(2) + owner << "Your right hand's grip tightens." + if(3) + owner << "Both of your hand's grips tighten." + else + release_items() + owner << "Your hands relax..." + l_hand_obj = null + r_hand_obj = null + +/obj/item/cybernetic_implant/brain/anti_drop/emp_act(severity) + var/range = severity ? 10 : 5 + var/atom/A + var/obj/item/L_item = owner.l_hand + var/obj/item/R_item = owner.r_hand + + release_items() + ..() + if(L_item) + A = pick(oview(range)) + L_item.throw_at(A, range, 2) + owner << "Your left arm spasms and throws the [L_item.name]!" + if(R_item) + A = pick(oview(range)) + R_item.throw_at(A, range, 2) + owner << "Your right arm spasms and throws the [R_item.name]!" + +/obj/item/cybernetic_implant/brain/anti_drop/proc/release_items() + if(!l_hand_ignore && l_hand_obj in owner.contents) + l_hand_obj.flags ^= NODROP + if(!r_hand_ignore && r_hand_obj in owner.contents) + r_hand_obj.flags ^= NODROP + +/obj/item/cybernetic_implant/brain/anti_stun + name = "CNS Rebooter implant" + desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." + implant_color = "#FFFF00" + +/obj/item/cybernetic_implant/brain/anti_stun/function() + SSobj.processing |= src + +/obj/item/cybernetic_implant/brain/anti_stun/process() + if(!owner) + SSobj.processing.Remove(src) + qdel(src) + return + if(owner.stat == DEAD) + return + + if(owner.stunned > STUN_SET_AMOUNT) + owner.stunned = STUN_SET_AMOUNT + if(owner.weakened > STUN_SET_AMOUNT) + owner.weakened = STUN_SET_AMOUNT + +/obj/item/cybernetic_implant/brain/anti_stun/emp_act(severity) + SSobj.processing.Remove(src) + spawn(..() * 10) + SSobj.processing |= src \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 035f14cd328..bb859cc9c03 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,82 @@ -->
+

22 March 2015

+

Iamgoofball updated:

+
    +
  • Fixes Morphine not knocking you out.
  • +
  • Hotline no longer exists. Poppies now have Saline-Glucose Solution.
  • +
  • Muriatic Acid, Caustic Soda, and Hydrogen Chloride have been removed, along with the secondary meth recipe. The original recipe still works.
  • +
  • Foam now produces more bang for your buck when mixed. Your foam grenades should be larger now to account for the slowdown.
  • +
  • Adds Stabilizing Agent. This chemical will prevent the effects of certain reactions from taking place in the container it is in, such as Smoke Powder and Flash Powder, allowing you to get the raw forms of the powders for heating up later.
  • +
  • Smoke Powder and Flash Powder can now be mixed along with Stabilizing Agent in order to produce a powder version of the effects. You can then heat these powders to 374K to get the effects.
  • +
  • Mixing them without Stabilizing Agent gives the default effects.
  • +
  • Adds Sonic Powder, a chemical that deafens and stuns within 5 tiles of the reaction. It also follows the reaction rules of the other 2 powders.
  • +
  • Liquid Dark Matter and Sorium also now work like the powders do.
  • +
  • CLF3 now has a higher chance of making plating tiles, and the burn damage caused by it scales based on your fire stacks.
  • +
  • Adds Pyrosium. This reagent heats up mobs by 30 degrees every 3 seconds if it has oxygen to react with. Useful for when you want a delayed mix inside of someone.
  • +
  • Adds Cryostylane. This reagent does the opposite of Pyrosium, but it still requires oxygen to react with.
  • +
  • Adds Phlogiston. This reagent ignites you and gives you a single fire stack every 3 seconds. Burn damage from this chemical scales up with the fire stacks you have. Counter this with literally any chemical that purges other chems.
  • +
  • Smoke now transfers reagents to the mob, and applies touch reactions on them. This means smoke can run out of reagents, no more infinite acid smoke. It also only works on mobs, use the new Reagent Foam(tm) for your hellfoam needs. I suggest a CLF3 Fluoroacid Black Powder mix.
  • +
  • Added a derelict medibot to the code, will place a few on the derelict when this PR is merged as to prevent mapping conflicts.
  • +
  • Adds Initropidril. 33% chance to hit with 5-25 TOX damage every 3 seconds, and a 5-10% chance to either stun, cause lots of oxygen damage, or cause your heart to stop. Get it from the traitor Poison Kit.
  • +
  • Adds Pancuronium. Paralyses you after 30 seconds, with a 7% chance to cause 3-5 loss of breath. Get it from the traitor Poison Kit.
  • +
  • Adds Sodium Thiopental. Knocks you out after 30 seconds, and destroys your stamina. Get it from the traitor Poison Kit.
  • +
  • Adds Sulfonal. +1 TOX per 3 seconds, knocks you out in 66 seconds. Mix it with Acetone, Diethylamine, and Sulfur.
  • +
  • Adds Amantin. On the last second it is in you, it hits you with a stack of TOX damage based on how long it's been in you. Get it from the traitor Poison Kit.
  • +
  • Adds Lipolicide. +1 TOX unless you have nutriment in you. Mix it with Mercury, Diethylamine, and Ephedrine.
  • +
  • Adds Coiine. +2 TOX and +5 loss of breath every 3 seconds. Get it from the traitor Poison Kit.
  • +
  • Adds Curare. +1 TOX, +1 OXY, paralyzes after 33 seconds. Get it from the traitor Poison Kit.
  • +
  • Adds a reagent_deleted() proc to reagents for effects upon the last time it processes in you, like with Amantin.
  • +
  • Neurotoxin required temperature for mixing has been set to 674K, it was 370K for some reason.
  • +
+

xxalpha updated:

+
    +
  • Added Cybernetic Implants: Security HUD, Medical HUD, X-Ray, Thermals, Anti-Drop, Anti-Stun. All implants are researchable and producible by R&D and Robotics.
  • +
+ +

21 March 2015

+

Chocobro updated:

+
    +
  • Checkered skirts can be adjusted to be worn shorter.
  • +
+

Incoming5643 updated:

+
    +
  • Player controller uplifted mobs will be attacked by gold core mobs of different species.
  • +
+

Jordie0608 updated:

+
    +
  • The backup shuttle will no longer be called if the emergency shuttle is coming.
  • +
+

MMMiracles updated:

+
    +
  • Adds 3 new bear-based foods.
  • +
  • Beary Pie -1 Plain Pie, 1 berry, 1 bear steak
  • +
  • Filet Migrawr - 5u of Manlydorf, 1 bear steak, 1 lighter(not used in crafting)
  • +
  • Bearger - 1 bun, 1 bear steak
  • +
+

Phil235 updated:

+
    +
  • Silicons are no longer blinded by welding.
  • +
+

Xhuis updated:

+
    +
  • A new software update has given the Orion Trail game a cheat code menu. While you can't access this normally (that's for a later software update), maybe an emag could do it...?
  • +
+

Zelacks updated:

+
    +
  • The chemical implant action button should now correctly inject all chemicals when pressed.
  • +
+

pudl updated:

+
    +
  • Adds normal security headsets to security lockers.
  • +
+

xxalpha updated:

+
    +
  • Fixed cables on catwalks being destroyed when creating plating floor.
  • +
  • Portable machines can be mounted on any turf that could hold a cable.
  • +
+

19 March 2015

Dannno updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 546d38fbd07..9a320786cf6 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1811,3 +1811,93 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. closets. xxalpha: - bugfix: Fixed jetpack trail animation. +2015-03-21: + Chocobro: + - rscadd: Checkered skirts can be adjusted to be worn shorter. + Incoming5643: + - tweak: Player controller uplifted mobs will be attacked by gold core mobs of different + species. + Jordie0608: + - bugfix: The backup shuttle will no longer be called if the emergency shuttle is + coming. + MMMiracles: + - rscadd: Adds 3 new bear-based foods. + - rscadd: Beary Pie -1 Plain Pie, 1 berry, 1 bear steak + - rscadd: Filet Migrawr - 5u of Manlydorf, 1 bear steak, 1 lighter(not used in crafting) + - rscadd: 'Bearger - 1 bun, 1 bear steak ' + Phil235: + - bugfix: Silicons are no longer blinded by welding. + Xhuis: + - rscadd: A new software update has given the Orion Trail game a cheat code menu. + While you can't access this normally (that's for a later software update), maybe + an emag could do it...? + Zelacks: + - bugfix: The chemical implant action button should now correctly inject all chemicals + when pressed. + pudl: + - rscadd: Adds normal security headsets to security lockers. + xxalpha: + - bugfix: Fixed cables on catwalks being destroyed when creating plating floor. + - rscadd: Portable machines can be mounted on any turf that could hold a cable. +2015-03-22: + Iamgoofball: + - bugfix: Fixes Morphine not knocking you out. + - rscdel: Hotline no longer exists. Poppies now have Saline-Glucose Solution. + - rscdel: Muriatic Acid, Caustic Soda, and Hydrogen Chloride have been removed, + along with the secondary meth recipe. The original recipe still works. + - experiment: Foam now produces more bang for your buck when mixed. Your foam grenades + should be larger now to account for the slowdown. + - rscadd: Adds Stabilizing Agent. This chemical will prevent the effects of certain + reactions from taking place in the container it is in, such as Smoke Powder + and Flash Powder, allowing you to get the raw forms of the powders for heating + up later. + - rscadd: Smoke Powder and Flash Powder can now be mixed along with Stabilizing + Agent in order to produce a powder version of the effects. You can then heat + these powders to 374K to get the effects. + - rscadd: Mixing them without Stabilizing Agent gives the default effects. + - rscadd: Adds Sonic Powder, a chemical that deafens and stuns within 5 tiles of + the reaction. It also follows the reaction rules of the other 2 powders. + - tweak: Liquid Dark Matter and Sorium also now work like the powders do. + - tweak: CLF3 now has a higher chance of making plating tiles, and the burn damage + caused by it scales based on your fire stacks. + - rscadd: Adds Pyrosium. This reagent heats up mobs by 30 degrees every 3 seconds + if it has oxygen to react with. Useful for when you want a delayed mix inside + of someone. + - rscadd: Adds Cryostylane. This reagent does the opposite of Pyrosium, but it + still requires oxygen to react with. + - rscadd: Adds Phlogiston. This reagent ignites you and gives you a single fire + stack every 3 seconds. Burn damage from this chemical scales up with the fire + stacks you have. Counter this with literally any chemical that purges other + chems. + - experiment: Smoke now transfers reagents to the mob, and applies touch reactions + on them. This means smoke can run out of reagents, no more infinite acid smoke. + It also only works on mobs, use the new Reagent Foam(tm) for your hellfoam needs. + I suggest a CLF3 Fluoroacid Black Powder mix. + - experiment: Added a derelict medibot to the code, will place a few on the derelict + when this PR is merged as to prevent mapping conflicts. + - rscadd: Adds Initropidril. 33% chance to hit with 5-25 TOX damage every 3 seconds, + and a 5-10% chance to either stun, cause lots of oxygen damage, or cause your + heart to stop. Get it from the traitor Poison Kit. + - rscadd: Adds Pancuronium. Paralyses you after 30 seconds, with a 7% chance to + cause 3-5 loss of breath. Get it from the traitor Poison Kit. + - rscadd: Adds Sodium Thiopental. Knocks you out after 30 seconds, and destroys + your stamina. Get it from the traitor Poison Kit. + - rscadd: Adds Sulfonal. +1 TOX per 3 seconds, knocks you out in 66 seconds. Mix + it with Acetone, Diethylamine, and Sulfur. + - rscadd: Adds Amantin. On the last second it is in you, it hits you with a stack + of TOX damage based on how long it's been in you. Get it from the traitor Poison + Kit. + - rscadd: Adds Lipolicide. +1 TOX unless you have nutriment in you. Mix it with + Mercury, Diethylamine, and Ephedrine. + - rscadd: Adds Coiine. +2 TOX and +5 loss of breath every 3 seconds. Get it from + the traitor Poison Kit. + - rscadd: Adds Curare. +1 TOX, +1 OXY, paralyzes after 33 seconds. Get it from the + traitor Poison Kit. + - rscadd: Adds a reagent_deleted() proc to reagents for effects upon the last time + it processes in you, like with Amantin. + - bugfix: Neurotoxin required temperature for mixing has been set to 674K, it was + 370K for some reason. + xxalpha: + - rscadd: 'Added Cybernetic Implants: Security HUD, Medical HUD, X-Ray, Thermals, + Anti-Drop, Anti-Stun. All implants are researchable and producible by R&D and + Robotics.' diff --git a/html/changelogs/Gun_Hog-RR-Steelpoint-PR-8439.yml b/html/changelogs/Gun_Hog-RR-Steelpoint-PR-8439.yml new file mode 100644 index 00000000000..049a26b1027 --- /dev/null +++ b/html/changelogs/Gun_Hog-RR-Steelpoint-PR-8439.yml @@ -0,0 +1,11 @@ + +# Your name. +author: Steelpoint, RemieRichards, and Gun Hog + + +delete-after: True + + +changes: + - rscadd: "Nanotrasen Security has authorized modifications to the standard issue helmets for officers. These helmets are now issued with a mounted camera, automatically synced to your assigned station's camera network. In addition, the helmets also include mounting points for the Seclite model of flashlights, found in your station's security vendors." + - rscadd: "Nanotrasen Security helmets are designed for easy repairs in the field. Officers may remove their Seclite attachment with any screwdriver, and the camera's assembly may be pried off with a crowbar. The assembly is also compatible with analyzer upgrades for scanning through the station's structure, and EMP shielding is possible by applying a sheet of plasma. diff --git a/html/changelogs/Incoming5643-Summon-Events.yml b/html/changelogs/Incoming5643-Summon-Events.yml new file mode 100644 index 00000000000..33faee565f7 --- /dev/null +++ b/html/changelogs/Incoming5643-Summon-Events.yml @@ -0,0 +1,9 @@ + author: Incoming5643 + + delete-after: True + + changes: + - bugfix: "Summon Events has been reworked to be a bit less manic." + - rscadd: "Summon Events will turn off if the wizard and all apprentices die. Any lingering effects are not reversed however." + - rscadd: "Improving Summon Events will reduce the average time between events, but not the minimum time between events." + - rscdel: "Departmental Uprising has been made admin only for being an RP heavy event that creates antags in an enviroment that doesn't really support that." diff --git a/html/changelogs/MMMiracles-Unbearable.yml b/html/changelogs/MMMiracles-Unbearable.yml deleted file mode 100644 index 9e90969e6e1..00000000000 --- a/html/changelogs/MMMiracles-Unbearable.yml +++ /dev/null @@ -1,9 +0,0 @@ - author: MMMiracles - - delete-after: True - - changes: - - rscadd: "Adds 3 new bear-based foods." - - rscadd: "Beary Pie -1 Plain Pie, 1 berry, 1 bear steak" - - rscadd: "Filet Migrawr - 5u of Manlydorf, 1 bear steak, 1 lighter(not used in crafting)" - - rscadd: "Bearger - 1 bun, 1 bear steak " diff --git a/html/changelogs/Miauw1.yml b/html/changelogs/Miauw1.yml new file mode 100644 index 00000000000..e069d822baa --- /dev/null +++ b/html/changelogs/Miauw1.yml @@ -0,0 +1,7 @@ +author: Miauw + +delete-after: True + +changes: + - imageadd: "Added a fancy white dress and a jester outfit. Sprites by Nienhaus." + \ No newline at end of file diff --git a/html/changelogs/dannno-gar.yml b/html/changelogs/dannno-gar.yml new file mode 100644 index 00000000000..0492c9ba7b7 --- /dev/null +++ b/html/changelogs/dannno-gar.yml @@ -0,0 +1,6 @@ +author: Dannno + +delete-after: True + +changes: + - rscadd: "GAR glasses return. Yes, I got permission. Just who the hell do you think I am?" diff --git a/html/changelogs/xxalpha-cablefix.yml b/html/changelogs/xxalpha-cablefix.yml deleted file mode 100644 index 3a1a5290701..00000000000 --- a/html/changelogs/xxalpha-cablefix.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: xxalpha - -delete-after: True - -changes: - - bugfix: "Fixed cables on catwalks being destroyed when creating plating floor." - diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 29d459c6260..43e9e41da87 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/corgi_back.dmi b/icons/mob/corgi_back.dmi index c3a34d66566..657a7c01a54 100644 Binary files a/icons/mob/corgi_back.dmi and b/icons/mob/corgi_back.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index fb5701beda5..e3229507a35 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index b8eedb8f334..9c6a3ea0254 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index df394b37f25..269ec744d08 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 0ad3c2436b7..00f5e23eb0e 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi new file mode 100644 index 00000000000..8179f08d362 Binary files /dev/null and b/icons/mob/pets.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index ead9c0f14ba..ecb9091597f 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index bab5533b140..51baed09306 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index d0166151807..00fdce1a431 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index add817f4c74..86209503cd1 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 276aaa7e525..312f4a40f50 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index d94332944a2..76792769010 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index 7be081f9579..c3a27ecee84 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index dcdb7691b5c..28247e78c06 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 28390abff25..93ebade829d 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 5c62c63a925..428dd8df22f 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 76572b7f7cf..98df3b72e06 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -11,6 +11,8 @@ em {font-style: normal; font-weight: bold;} .motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} +.italics { font-style: italic;} + .prefix { font-weight: bold;} .ooc { font-weight: bold;} diff --git a/tgstation.dme b/tgstation.dme index 39a1eaefec5..be8ee37583e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -28,6 +28,7 @@ #include "code\__DEFINES\math.dm" #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\preferences.dm" +#include "code\__DEFINES\say.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\stat.dm" #include "code\__HELPERS\_logging.dm" @@ -1120,7 +1121,6 @@ #include "code\modules\mob\living\carbon\monkey\life.dm" #include "code\modules\mob\living\carbon\monkey\login.dm" #include "code\modules\mob\living\carbon\monkey\monkey.dm" -#include "code\modules\mob\living\carbon\monkey\say.dm" #include "code\modules\mob\living\carbon\monkey\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\laws.dm" @@ -1413,6 +1413,7 @@ #include "code\modules\surgery\brain_removal.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" +#include "code\modules\surgery\cybernetic_implants.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gender_reassignment.dm" #include "code\modules\surgery\generic_steps.dm" @@ -1427,6 +1428,7 @@ #include "code\modules\surgery\tools.dm" #include "code\modules\surgery\xenomorph_removal.dm" #include "code\modules\surgery\organs\augments.dm" +#include "code\modules\surgery\organs\cybernetic_implants.dm" #include "code\modules\surgery\organs\helpers.dm" #include "code\modules\surgery\organs\organ.dm" #include "code\modules\telesci\bscrystal.dm"