diff --git a/.travis.yml b/.travis.yml index cf5ae30ab5a..052a53f7ccc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,10 @@ env: before_install: - sudo apt-get update -qq - sudo apt-get install libc6:i386 libgcc1:i386 libstdc++6:i386 -qq + - sudo apt-get install python -qq + - sudo apt-get install python-pip -qq + - sudo pip install PyYaml -q + - sudo pip install beautifulsoup4 -q install: - curl "http://www.byond.com/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip" -o byond.zip @@ -23,3 +27,4 @@ install: script: - bash dm.sh -M${DM_MAPFILE} tgstation.dme + - python tools/ss13_genchangelog.py html/changelog.html html/changelogs diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm similarity index 93% rename from _maps/map_files/MetaStation/MetaStation.v41A.dmm rename to _maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 40e03729f8e..888b8d56a83 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -30,9 +30,9 @@ "aaD" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/space) "aaE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/space) "aaF" = (/obj/machinery/seed_extractor,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"aaG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/flora/kirbyplants{tag = "icon-plant-17"; icon_state = "plant-17"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"aaG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/flora/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "aaH" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/security/prison) -"aaI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/flora/kirbyplants{tag = "icon-plant-15"; icon_state = "plant-15"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"aaI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/flora/kirbyplants{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "aaJ" = (/obj/machinery/biogenerator,/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Prison Hydroponics"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "aaK" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/space) "aaL" = (/obj/structure/stool/bed/chair{dir = 1},/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/shuttle/floor,/area/space) @@ -55,17 +55,17 @@ "abc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abd" = (/obj/machinery/hydroponics/constructable,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abe" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/security/prison) -"abf" = (/obj/machinery/light/small,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/security/prison) +"abf" = (/obj/machinery/door/poddoor{density = 1; icon_state = "closed"; id = "SecJusticeChamber"; name = "Justice Vent"; opacity = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/prison/solitary{name = "Prisoner Education Chamber"}) "abg" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/security/prison) "abh" = (/obj/machinery/door/airlock/external{name = "Security External Airlock"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/security/prison) -"abi" = (/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/security/prison) +"abi" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-warndark (NORTH)"; icon_state = "warndark"; dir = 1},/area/prison/solitary{name = "Prisoner Education Chamber"}) "abj" = (/obj/structure/lattice/catwalk,/turf/space,/area/space) "abk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) "abl" = (/obj/machinery/door/airlock/glass{id_tag = "permahydro"; name = "Hydroponics Module"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abm" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/security/prison) "abn" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/prison) "abo" = (/turf/simulated/wall/r_wall,/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abp" = (/obj/structure/table,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/computer/libraryconsole/bookmanagement,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"abp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{tag = "icon-warndark (NORTHWEST)"; icon_state = "warndark"; dir = 9},/area/prison/solitary{name = "Prisoner Education Chamber"}) "abq" = (/obj/machinery/computer/arcade,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abr" = (/obj/machinery/camera{c_tag = "Prison Chamber"; network = list("SS13","Prison")},/obj/item/device/radio/intercom{desc = "Talk through this. It looks like it has been modified to not broadcast."; dir = 2; name = "Prison Intercom (General)"; pixel_x = 0; pixel_y = 24; prison_radio = 1},/turf/simulated/floor/plasteel,/area/security/prison) "abs" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) @@ -73,28 +73,28 @@ "abu" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/security/prison) "abv" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/prison) "abw" = (/obj/machinery/washing_machine,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/prison) -"abx" = (/obj/structure/sign/pods{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/security/prison) -"aby" = (/obj/structure/table,/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Prisoner Education Chamber APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = -4; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate{name = "chloral hydrate bottle"},/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = 5; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/facid{name = "fluorosulfuric acid bottle"; pixel_x = -3; pixel_y = 6},/obj/item/weapon/reagent_containers/syringe{pixel_y = 5},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abz" = (/obj/structure/closet/secure_closet/injection,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 26},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abA" = (/obj/structure/table,/obj/item/device/electropack,/obj/item/weapon/storage/box/bodybags,/obj/item/device/assembly/signaler,/obj/machinery/light/small{dir = 1},/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"abx" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"aby" = (/obj/item/weapon/soap/nanotrasen,/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/shower{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"abz" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/paper/hydroponics,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"abA" = (/obj/structure/table,/obj/machinery/computer/libraryconsole/bookmanagement,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abB" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "forestarboard"; name = "Fore-Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxstarboard) "abC" = (/obj/structure/cable,/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) -"abD" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abE" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison) -"abF" = (/obj/structure/stool,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"abD" = (/obj/structure/stool/bed,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/muzzle,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"abE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light/small{dir = 8},/obj/machinery/sparker{dir = 2; id = "executionburn"; pixel_x = -25},/turf/simulated/floor/plasteel{tag = "icon-warndark (WEST)"; icon_state = "warndark"; dir = 8},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"abF" = (/obj/machinery/flasher{id = "justiceflash"; name = "mounted justice flash"; pixel_x = 28},/turf/simulated/floor/plasteel{tag = "icon-warndark (EAST)"; icon_state = "warndark"; dir = 4},/area/prison/solitary{name = "Prisoner Education Chamber"}) "abG" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abH" = (/obj/structure/table,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel,/area/security/prison) -"abI" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/security/prison) +"abI" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Unisex Showers"; req_access_txt = "0"},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) "abJ" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abK" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "abL" = (/obj/structure/window/reinforced,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/prison) "abM" = (/obj/structure/table,/obj/structure/bedsheetbin,/obj/structure/window/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/prison) -"abN" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/security/prison) -"abO" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{dir = 6},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abP" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Atmos Control"; req_access_txt = "3"},/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abQ" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/prison/solitary{name = "Prisoner Education Chamber"}) -"abS" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"abN" = (/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"abO" = (/obj/structure/table,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/security/prison) +"abP" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/security/prison) +"abQ" = (/turf/simulated/floor/plating,/area/security/prison) +"abR" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{tag = "icon-warndark"; icon_state = "warndark"; dir = 2},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"abS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-warndark (SOUTHWEST)"; icon_state = "warndark"; dir = 10},/area/prison/solitary{name = "Prisoner Education Chamber"}) "abT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) "abU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) "abV" = (/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) @@ -103,43 +103,43 @@ "abY" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) "abZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) "aca" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport) -"acb" = (/obj/machinery/door/airlock/security{name = "Prisoner Education Chamber"; req_access = null; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acc" = (/obj/structure/table,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/item/weapon/book/manual/chef_recipes{pixel_x = 2; pixel_y = 6},/obj/item/clothing/head/chefhat,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison) +"acb" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 2; name = "justice injector"},/turf/simulated/floor/plasteel{tag = "icon-warndark (SOUTHEAST)"; icon_state = "warndark"; dir = 6},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acc" = (/obj/machinery/door/airlock{name = "Unisex Restroom"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"acd" = (/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes{pixel_x = 2; pixel_y = 6},/obj/item/clothing/head/chefhat,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "ace" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acf" = (/obj/structure/table,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/folder,/obj/item/weapon/paper/hydroponics,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/security/prison) +"acf" = (/obj/structure/table,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/toy/cards/deck,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel,/area/security/prison) "acg" = (/obj/structure/table,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/plasteel,/area/security/prison) "ach" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/prison) "aci" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acj" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "ack" = (/obj/machinery/vending/sustenance{desc = "A vending machine normally reserved for work camps."; name = "\improper sustenance vendor"; product_slogans = "Enjoy your meal.;Enough calories to support any worker."},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/security/prison) -"acm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acl" = (/obj/machinery/light/small,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison) +"acm" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/security/prison) "acn" = (/obj/machinery/atmospherics/pipe/simple/general/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"aco" = (/obj/structure/rack,/obj/item/weapon/tank/internals/oxygen/red{pixel_x = -4; pixel_y = -1},/obj/item/weapon/tank/internals/oxygen/red{pixel_x = 4; pixel_y = -1},/obj/item/weapon/tank/internals/anesthetic{pixel_x = 2},/obj/item/weapon/wrench,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"aco" = (/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/security/prison) "acp" = (/obj/structure/cable,/obj/machinery/power/solar{id = "forestarboard"; name = "Fore-Starboard Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxstarboard) -"acq" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 6},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acr" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acs" = (/obj/item/weapon/soap/nanotrasen,/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/shower{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) -"act" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison) -"acu" = (/obj/machinery/light/small{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"acq" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "executionfireblast"; layer = 2.9; name = "blast door"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredfull"; tag = "icon-whitehall (WEST)"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acr" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/poddoor/preopen{id = "executionfireblast"; layer = 2.9; name = "blast door"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredfull"; tag = "icon-whitehall (WEST)"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acs" = (/obj/machinery/door/window/brigdoor{dir = 2; name = "Justice Chamber"; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/general/hidden,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor{dir = 1; name = "Justice Chamber"; req_access_txt = "3"},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/preopen{id = "executionfireblast"; layer = 2.9; name = "blast door"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredfull"; tag = "icon-whitehall (WEST)"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"act" = (/obj/machinery/light/small{dir = 4},/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"acu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/flora/kirbyplants{tag = "icon-plant-13"; icon_state = "plant-13"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/security/prison) +"acw" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 2; pixel_y = 1},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison) "acx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/security/prison) "acy" = (/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/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acz" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acC" = (/obj/structure/stool/bed/chair,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acD" = (/obj/machinery/atmospherics/pipe/simple/general/hidden,/obj/machinery/flasher_button{id = "justiceflash"; name = "Justice Flash Control"; pixel_x = -26; pixel_y = 5; req_access_txt = "1"},/obj/machinery/door_control{dir = 2; id = "SecJusticeChamber"; layer = 4; name = "Justice Vent Control"; pixel_x = -26; pixel_y = -5; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acE" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acF" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"acD" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/device/taperecorder{pixel_x = -3; pixel_y = 0},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/device/flash/handheld,/obj/item/weapon/reagent_containers/spray/pepper,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acE" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = -4; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate{name = "chloral hydrate bottle"},/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = 5; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/facid{name = "fluorosulfuric acid bottle"; pixel_x = -3; pixel_y = 6},/obj/item/weapon/reagent_containers/syringe{pixel_y = 5},/obj/item/weapon/reagent_containers/dropper,/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 4; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = -24; req_access = "0"; req_one_access = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/ignition_switch{id = "executionburn"; name = "Justice Ignition Switch"; pixel_x = -25; pixel_y = 36},/obj/machinery/door_control{id = "executionfireblast"; name = "Justice Area Lockdown"; pixel_x = -25; pixel_y = 26; req_access_txt = "2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acF" = (/obj/machinery/door_control{dir = 2; id = "SecJusticeChamber"; layer = 4; name = "Justice Vent Control"; pixel_x = 26; pixel_y = 25; req_access_txt = "3"},/obj/machinery/flasher_button{id = "justiceflash"; name = "Justice Flash Control"; pixel_x = 25; pixel_y = 36; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/general/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) "acG" = (/obj/item/stack/cable_coil,/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) -"acH" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acH" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/security/prison) "acI" = (/obj/machinery/camera/motion{c_tag = "Armory - External"; dir = 4; network = list("SS13")},/turf/space,/area/space) -"acJ" = (/obj/machinery/shower{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) -"acK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/prison) -"acL" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Unisex Showers"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"acJ" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/security/prison) +"acK" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) +"acL" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 4; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = -5; pixel_y = 6},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/prison) "acM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/security/prison) "acN" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) @@ -147,31 +147,31 @@ "acQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison) "acR" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "acS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acT" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"acU" = (/obj/structure/window/reinforced,/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/device/taperecorder{pixel_x = -3; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/device/flash/handheld,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acV" = (/obj/machinery/door/window/brigdoor{dir = 2; name = "Justice Chamber"; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/general/hidden,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor{dir = 1; name = "Justice Chamber"; req_access_txt = "3"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"acW" = (/obj/structure/table,/obj/structure/window/reinforced,/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 8; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = 24; req_access = "0"; req_one_access = "0"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/suit/apron/surgical,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/circular_saw,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acT" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/prison) +"acU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acV" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/structure/reagent_dispensers/peppertank{pixel_x = -29; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"acW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "acX" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "acY" = (/turf/simulated/wall,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "acZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport) "ada" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport) "adb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport) -"adc" = (/obj/machinery/door/airlock{name = "Unisex Restroom"; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) -"add" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/prison) +"adc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/security/prison) +"add" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Prisoner Education Chamber APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/item/weapon/storage/backpack/dufflebag/sec{contents = newlist(/obj/item/weapon/scalpel,/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/item/weapon/surgical_drapes,/obj/item/clothing/mask/surgical); desc = "A large dufflebag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools."; name = "dufflebag"; pixel_y = 5},/obj/item/clothing/mask/balaclava,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "ade" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "permacell3"; name = "Cell Shutters"; opacity = 0},/obj/machinery/door/airlock/glass{id_tag = "permabolt3"; name = "Cell 3"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "adf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/security/prison) "adg" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "permacell2"; name = "Cell Shutters"; opacity = 0},/obj/machinery/door/airlock/glass{id_tag = "permabolt2"; name = "Cell 2"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "adh" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "permacell1"; name = "Cell Shutters"; opacity = 0},/obj/machinery/door/airlock/glass{id_tag = "permabolt1"; name = "Cell 1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"adi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{tag = "icon-warndark (NORTH)"; icon_state = "warndark"; dir = 1},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"adj" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-warndark (NORTHWEST)"; icon_state = "warndark"; dir = 9},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"adk" = (/obj/machinery/door/poddoor{density = 1; icon_state = "closed"; id = "SecJusticeChamber"; name = "Justice Vent"; opacity = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"adi" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/security/prison) +"adj" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) +"adk" = (/obj/structure/stool/bed,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/muzzle,/obj/machinery/camera{c_tag = "Prison Sanitatium"; dir = 4; network = list("SS13","Prison"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) "adl" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warndark (NORTHEAST)"; icon_state = "warndark"; dir = 5},/area/prison/solitary{name = "Prisoner Education Chamber"}) "adm" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space) "adn" = (/obj/structure/closet/emcloset,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "ado" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/space) "adp" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/space) -"adq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) -"adr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/security/prison) +"adq" = (/obj/structure/stool/bed,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/muzzle,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) +"adr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) "ads" = (/obj/structure/stool/bed,/obj/machinery/camera{c_tag = "Prison Cell 3"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "adt" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/obj/machinery/door_control{id = "permabolt3"; name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "adu" = (/obj/structure/stool/bed,/obj/machinery/camera{c_tag = "Prison Cell 2"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) @@ -179,15 +179,15 @@ "adw" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/obj/machinery/door_control{id = "permabolt2"; name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/security/prison) "adx" = (/obj/structure/stool/bed,/obj/machinery/camera{c_tag = "Prison Cell 1"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "ady" = (/obj/structure/stool,/obj/machinery/light/small{dir = 1},/obj/machinery/door_control{id = "permabolt1"; name = "Cell Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"adz" = (/obj/structure/stool/bed,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/muzzle,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"adA" = (/obj/machinery/flasher{id = "justiceflash"; name = "mounted justice flash"; pixel_x = -28},/turf/simulated/floor/plasteel{tag = "icon-warndark (WEST)"; icon_state = "warndark"; dir = 8},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"adB" = (/turf/simulated/floor/plasteel{tag = "icon-warndark (EAST)"; icon_state = "warndark"; dir = 4},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"adz" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/structure/table,/obj/item/device/electropack,/obj/item/device/assembly/signaler{pixel_x = -3; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"adA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"adB" = (/obj/machinery/atmospherics/pipe/simple/general/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) "adC" = (/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "adD" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/obj/docking_port/mobile/pod{dir = 4; id = "pod3"; name = "escape pod 3"},/turf/simulated/shuttle/floor,/area/space) "adE" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/space) "adF" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/shuttle/floor,/area/space) -"adG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/security/prison) -"adH" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison) +"adG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkred"; tag = "icon-darkblue"; temperature = 273.15},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"adH" = (/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/security/prison) "adI" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/flasher{id = "PCell 3"; pixel_x = -28},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/security/prison) "adJ" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "adK" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/wall,/area/security/prison) @@ -195,15 +195,15 @@ "adM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "adN" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "adO" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/flasher{id = "PCell 1"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) -"adP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-warndark"; icon_state = "warndark"; dir = 2},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"adQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/door_control{id = "prisonereducation"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{tag = "icon-warndark (SOUTHWEST)"; icon_state = "warndark"; dir = 10},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"adP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) +"adQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) "adR" = (/turf/simulated/wall/r_wall,/area/security/warden) "adS" = (/turf/simulated/wall/r_wall,/area/security/hos) -"adT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{tag = "icon-warndark (SOUTHEAST)"; icon_state = "warndark"; dir = 6},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"adU" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/hos) -"adV" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/hos) +"adT" = (/obj/machinery/flasher{id = "insaneflash"; pixel_x = 26},/obj/machinery/atmospherics/unary/vent_pump{dir = 7; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) +"adU" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/obj/machinery/meter,/obj/machinery/door/window/westleft{base_state = "left"; dir = 1; icon_state = "left"; name = "gas ports"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"adV" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "adW" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/crew_quarters/fitness{name = "\improper Recreation Area"}) -"adX" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/hos) +"adX" = (/obj/machinery/door_control{id = "prisonereducation"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; specialfunctions = 4},/obj/structure/closet/secure_closet/injection{name = "educational injections"; pixel_x = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredfull"; tag = "icon-whitehall (WEST)"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "adY" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space) "adZ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/space) "aea" = (/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) @@ -213,16 +213,16 @@ "aee" = (/obj/machinery/door/airlock/glass_security{name = "Long-Term Cell 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison) "aef" = (/obj/machinery/door/airlock/external{name = "Escape Pod Two"},/turf/simulated/floor/plating,/area/security/prison) "aeg" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) -"aeh" = (/obj/machinery/door/airlock/external{name = "Escape Pod Two"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/security/prison) +"aeh" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "justice gas pump"},/obj/machinery/door/window/westleft{base_state = "right"; dir = 1; icon_state = "right"; name = "gas ports"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "aei" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/prison/solitary{name = "Prisoner Education Chamber"}) -"aej" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{aiControlDisabled = 1; id_tag = "prisonereducation"; name = "Prisoner Education Chamber"; req_access = null; req_access_txt = "3"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/prison/solitary{name = "Prisoner Education Chamber"}) -"aek" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/wall/r_wall,/area/prison/solitary{name = "Prisoner Education Chamber"}) +"aej" = (/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredfull"; tag = "icon-whitehall (WEST)"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"aek" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitered"},/area/security/prison) "ael" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/clothing/suit/armor/laserproof,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) -"aem" = (/obj/structure/closet/secure_closet{name = "contraband locker"; req_access_txt = "3"},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/effect/spawner/lootdrop/armory_contraband,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) +"aem" = (/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitered"},/area/security/prison) "aen" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "aeo" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "aep" = (/obj/machinery/computer/secure_data,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"aeq" = (/obj/structure/table/wood,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/structure/reagent_dispensers/peppertank{pixel_x = -30; pixel_y = 0},/obj/item/weapon/folder/red,/obj/machinery/keycard_auth{pixel_x = -26; pixel_y = 26},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) +"aeq" = (/obj/structure/stool/bed/roller,/obj/structure/stool/bed/roller,/obj/machinery/iv_drip{density = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitered"},/area/security/prison) "aer" = (/turf/simulated/wall,/area/security/range) "aes" = (/obj/structure/closet/ammunitionlocker,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "aet" = (/obj/structure/table/wood,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/machinery/computer/med_data/laptop,/obj/item/weapon/storage/secure/safe/HoS{pixel_x = 36; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) @@ -233,13 +233,13 @@ "aey" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/effect/landmark{name = "Syndicate Breach Area"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aez" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aeA" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard) -"aeB" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) -"aeC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) +"aeB" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "hosspace"; name = "space shutters"},/turf/simulated/floor/plating,/area/security/hos) +"aeC" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "hosspace"; name = "space shutters"},/turf/simulated/floor/plating,/area/security/hos) "aeD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarport) -"aeE" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/processing) -"aeF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/flora/kirbyplants{tag = "icon-plant-02"; icon_state = "plant-02"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) -"aeG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) -"aeH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) +"aeE" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "hosspace"; name = "space shutters"},/turf/simulated/floor/plating,/area/security/hos) +"aeF" = (/obj/item/weapon/tank/internals/oxygen/red{pixel_x = -4; pixel_y = -1},/obj/item/weapon/tank/internals/oxygen/red{pixel_x = 4; pixel_y = -1},/obj/item/weapon/tank/internals/anesthetic{pixel_x = 2},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/item/weapon/wrench,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"aeG" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"aeH" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 9},/obj/machinery/space_heater,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/prison/solitary{name = "Prisoner Education Chamber"}) "aeI" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) "aeJ" = (/obj/machinery/door_control{id = "permacell3"; name = "Cell 3 Lockdown"; pixel_x = -4; pixel_y = 25; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/flasher_button{id = "PCell 3"; pixel_x = 6; pixel_y = 24},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) "aeK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/machinery/camera{c_tag = "Prison Hallway Port"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) @@ -252,9 +252,9 @@ "aeR" = (/obj/machinery/door_control{id = "permacell1"; name = "Cell 1 Lockdown"; pixel_x = -4; pixel_y = 25; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/flasher_button{id = "PCell 1"; pixel_x = 6; pixel_y = 24},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) "aeS" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Prison Wing APC"; pixel_x = 1; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/camera{c_tag = "Prison Hallway Starboard"; dir = 2; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) "aeT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/sign/pods{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) -"aeU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/processing) -"aeV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/processing) -"aeW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/flora/kirbyplants{tag = "icon-plant-05"; icon_state = "plant-05"},/turf/simulated/floor/plasteel,/area/security/processing) +"aeU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{aiControlDisabled = 1; id_tag = "prisonereducation"; name = "Prisoner Education Chamber"; req_access = null; req_access_txt = "3"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/prison/solitary{name = "Prisoner Education Chamber"}) +"aeV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Insanity Ward"; req_access_txt = "2"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prison) +"aeW" = (/obj/structure/closet/secure_closet{name = "contraband locker"; req_access_txt = "3"},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/obj/effect/spawner/lootdrop/armory_contraband{loot = list(/obj/item/weapon/gun/projectile/automatic/pistol = 5, /obj/item/weapon/gun/projectile/shotgun/combat = 5, /obj/item/weapon/gun/projectile/revolver/mateba, /obj/item/weapon/gun/projectile/automatic/pistol/deagle, /obj/item/weapon/storage/box/throwing_stars = 3)},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "aeX" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) "aeY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/secure/safe{name = "armory safe A"; pixel_x = 6; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "aeZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) @@ -266,7 +266,7 @@ "aff" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "afg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "afh" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"afi" = (/obj/machinery/light{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) +"afi" = (/obj/structure/table/wood,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/machinery/keycard_auth{pixel_x = -26; pixel_y = 23},/obj/machinery/door_control{id = "hosspace"; name = "Space Shutters Control"; pixel_x = -26; pixel_y = 34},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "afj" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/security/range) "afk" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/security/range) "afl" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/security/range) @@ -290,10 +290,10 @@ "afD" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos) "afE" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/prison) "afF" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) -"afG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) -"afH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) -"afI" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) -"afJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) +"afG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/sign/securearea{desc = "A warning sign which reads 'WARNING: Do Not Enter When Red Light Shows', detailing the penalties that any NanoTrasen employee or silicon will suffer if violating this rule."; name = "WARNING: Do Not Enter When Red Light Shows"; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) +"afH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) +"afI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) +"afJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) "afK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) "afL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) "afM" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) @@ -305,14 +305,14 @@ "afS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) "afT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) "afU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) -"afV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) +"afV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) "afW" = (/obj/machinery/flasher/portable,/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/obj/machinery/flasher/portable,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/security/warden) "afX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "afY" = (/obj/machinery/bot/secbot{health = 35; name = "Securitron #359"; on = 0},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "afZ" = (/obj/machinery/syndicatebomb/training,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "aga" = (/obj/structure/rack,/obj/item/weapon/gun/energy/laser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/security/warden) "agb" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) -"agc" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/security/warden) +"agc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/flasher_button{id = "insaneflash"; pixel_y = 26},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison) "agd" = (/obj/structure/rack,/obj/item/clothing/suit/armor/bulletproof,/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof,/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof,/obj/item/clothing/head/helmet/alt,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "age" = (/obj/structure/table/wood,/obj/item/weapon/storage/secure/briefcase{pixel_x = -2},/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/cartridge/detective,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "agf" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) @@ -400,7 +400,7 @@ "ahJ" = (/turf/simulated/wall,/area/security/warden) "ahK" = (/obj/item/stack/sheet/cardboard,/obj/machinery/light_construct/small{dir = 1},/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/watertank,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "ahL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHEAST)"; icon_state = "vault"; dir = 6},/area/security/warden) -"ahM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden) +"ahM" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) "ahN" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Armory APC"; pixel_x = 1; pixel_y = -24},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/light,/obj/machinery/camera/motion{c_tag = "Armory - Internal"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden) "ahO" = (/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden) "ahP" = (/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/security/warden) @@ -453,7 +453,7 @@ "aiK" = (/obj/structure/closet{name = "Evidence Closet 2"},/obj/item/weapon/storage/backpack{name = "Evidence Bag 2"},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/security/warden) "aiL" = (/obj/structure/closet/secure_closet{anchored = 1; name = "Secure Evidence Closet"; req_access_txt = "0"; req_one_access_txt = "3,4"},/obj/item/weapon/storage/secure/briefcase{name = "Secure Evidence Briefcase"; pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/security/warden) "aiM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Armory"; req_access = null; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/warden) -"aiN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/security/warden) +"aiN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'WARNING: Criminally Insane Inmates', describing the possible hazards of those contained within."; name = "WARNING: Criminally Insane Inmates"; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prison) "aiO" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/lattice/catwalk,/turf/space,/area/maintenance/auxsolarstarboard) "aiP" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/security/brig) "aiQ" = (/obj/structure/table,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 26},/obj/machinery/light/small{dir = 1},/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/brig) @@ -556,7 +556,7 @@ "akJ" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitered"},/area/security/brig) "akK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/brig) "akL" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) -"akM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/brig) +"akM" = (/obj/machinery/light{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 29},/obj/machinery/suit_storage_unit/hos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "akN" = (/obj/structure/closet{name = "Evidence Closet 4"},/obj/item/weapon/storage/backpack{name = "Evidence Bag 4"},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/security/warden) "akO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet/security/sec,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/warden) "akP" = (/obj/machinery/deployable/barrier,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/camera{c_tag = "Security - Secure Gear Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/security/warden) @@ -681,9 +681,9 @@ "ane" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "anf" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "ang" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space) -"anh" = (/obj/structure/table/reinforced,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c20{pixel_y = 6},/obj/structure/window/reinforced,/obj/item/weapon/stock_parts/cell/crap,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"anh" = (/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison) "ani" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/machinery/door/window/westleft{base_state = "right"; dir = 2; icon_state = "right"; name = "windoor"; req_access_txt = "0"},/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/device/tape/random,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"anj" = (/obj/structure/table/reinforced,/obj/item/stack/spacecash/c100,/obj/structure/window/reinforced,/obj/item/weapon/firealarm_electronics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"anj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) "ank" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "anl" = (/obj/structure/rack{dir = 1},/obj/item/clothing/under/rank/mailman,/obj/item/clothing/under/rank/vice{pixel_x = 4; pixel_y = -3},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "anm" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_f10"; layer = 2},/area/space) @@ -1051,7 +1051,7 @@ "auk" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aul" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aum" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/brig) -"aun" = (/obj/structure/rack,/obj/item/weapon/book/manual/wiki/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) +"aun" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) "auo" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Brig Control"; req_access_txt = "3"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/warden) "aup" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/space) "auq" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/space) @@ -1060,10 +1060,10 @@ "aut" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Gear Room"; req_access_txt = "0"; req_one_access_txt = "1;4"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/warden) "auu" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/color/yellow,/obj/item/clothing/gloves/color/yellow,/obj/item/clothing/gloves/color/yellow,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "auv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"auw" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "0"; req_one_access_txt = "1;4"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main) -"aux" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "0"; req_one_access_txt = "1;4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main) +"auw" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) +"aux" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison) "auy" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/space) -"auz" = (/obj/machinery/door/airlock/shuttle{name = "Labor Shuttle Airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; travelDir = 90; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 5; id = "laborcamp_home"; name = "fore bay 1"; width = 9},/turf/simulated/shuttle/floor,/area/space) +"auz" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/security/prison) "auA" = (/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Labor Shuttle Dock"; dir = 8; network = list("SS13")},/obj/machinery/flasher{id = "PRelease"; pixel_x = 24; pixel_y = 20},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/fore) "auB" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/security/main) "auC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fore) @@ -1106,7 +1106,7 @@ "avn" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (NORTH)"; icon_state = "pipe-j2"; dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "avo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "avp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"avq" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/flora/kirbyplants{icon_state = "plant-20"; pixel_y = 3; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) +"avq" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'WARNING: Dangerous Inmates'."; name = "\improper WARNING: Dangerous Inmates"},/turf/simulated/wall,/area/security/prison) "avr" = (/obj/item/stack/sheet/plasteel{amount = 10; pixel_x = -2; pixel_y = 2},/obj/structure/table,/obj/item/stack/sheet/rglass{amount = 30; pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "avs" = (/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/engine/engineering) "avt" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/camera{c_tag = "Mining Office"; dir = 8; network = list("SS13")},/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) @@ -1295,7 +1295,7 @@ "ayU" = (/turf/simulated/wall,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "ayV" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) "ayW" = (/turf/simulated/wall,/area/quartermaster/sorting{name = "\improper Warehouse"}) -"ayX" = (/obj/structure/closet/secure_closet/freezer/money,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) +"ayX" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/riot{pixel_x = 2; pixel_y = -1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/security/warden) "ayY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fore) "ayZ" = (/obj/machinery/power/apc{dir = 1; name = "Vault APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) "aza" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; luminosity = 2},/area/security/nuke_storage) @@ -1417,7 +1417,7 @@ "aBm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/engineering) "aBn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{sortType = 4},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/plasteel,/area/engine/engineering) "aBo" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) -"aBp" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/device/gps,/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/storage/primary) +"aBp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/warden) "aBq" = (/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/engine/engineering) "aBr" = (/obj/item/device/radio/off,/turf/simulated/floor/plating/airless,/area/engine/engineering) "aBs" = (/obj/machinery/camera/emp_proof{c_tag = "Fore Arm - Far"; dir = 8; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -1505,7 +1505,7 @@ "aCW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/nuke_storage) "aCX" = (/obj/machinery/camera/motion{c_tag = "Vault"; dir = 1; network = list("MiniSat")},/obj/machinery/light,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 10},/area/security/nuke_storage) "aCY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "vault"},/area/security/nuke_storage) -"aCZ" = (/obj/structure/safe,/obj/item/clothing/head/bearpelt,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/gun/projectile/revolver/russian,/obj/item/ammo_box/a357,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka/badminka,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage) +"aCZ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/security/warden) "aDa" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/security/nuke_storage) "aDb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/security/nuke_storage) "aDc" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/lawoffice) @@ -1642,7 +1642,7 @@ "aFD" = (/obj/item/clothing/glasses/meson,/obj/structure/closet/crate,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) "aFE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aFF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "50"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) -"aFG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/sheet/cardboard,/obj/item/stack/rods{amount = 50},/obj/item/weapon/paper,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) +"aFG" = (/obj/item/weapon/beach_ball{icon = 'icons/obj/basketball.dmi'; icon_state = "basketball"; item_state = "basketball"; name = "basket ball"},/turf/simulated/floor/plating,/area/maintenance/fore) "aFH" = (/obj/structure/closet,/obj/item/weapon/contraband/poster,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aFI" = (/obj/machinery/power/apc{dir = 4; name = "Warehouse APC"; pixel_x = 27; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aFJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/construction/Storage{name = "Storage Wing"}) @@ -1780,8 +1780,8 @@ "aIl" = (/obj/structure/table,/obj/machinery/light_switch{pixel_x = 23},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "aIm" = (/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "aIn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage) -"aIo" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/light/small{dir = 1},/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) -"aIp" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/color/yellow,/obj/item/device/t_scanner,/obj/item/device/multitool,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) +"aIo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sign/pods{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/brig) +"aIp" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/stock_parts/cell/crap,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aIq" = (/obj/item/weapon/wirecutters,/obj/structure/lattice,/turf/space,/area/space) "aIr" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/construction) "aIs" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel,/area/construction) @@ -1878,7 +1878,7 @@ "aKf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore) "aKg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "aKh" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore) -"aKi" = (/obj/structure/closet/secure_closet/courtroom,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel,/area/crew_quarters/courtroom) +"aKi" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/firealarm_electronics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aKj" = (/obj/structure/stool/bed/chair{name = "Bailiff"},/turf/simulated/floor/plasteel,/area/crew_quarters/courtroom) "aKk" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/plasteel,/area/crew_quarters/courtroom) "aKl" = (/obj/structure/stool/bed/chair{name = "Judge"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/crew_quarters/courtroom) @@ -1890,7 +1890,7 @@ "aKr" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/requests_console{department = "Law office"; pixel_x = 0; pixel_y = 32},/obj/machinery/newscaster{pixel_x = -31; pixel_y = 0},/turf/simulated/floor/wood,/area/lawoffice) "aKs" = (/obj/structure/table/wood,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/pen/red,/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/turf/simulated/floor/wood,/area/lawoffice) "aKt" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -3; pixel_y = 2},/obj/item/weapon/storage/secure/briefcase{pixel_x = 2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/wood,/area/lawoffice) -"aKu" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Law Office APC"; pixel_y = 24},/obj/structure/flora/kirbyplants{tag = "icon-plant-11"; icon_state = "plant-11"},/turf/simulated/floor/wood,/area/lawoffice) +"aKu" = (/obj/structure/rack,/obj/item/weapon/book/manual/wiki/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/starboard) "aKv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/lawoffice) "aKw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore) "aKx" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/effect/landmark{name = "blobstart"},/obj/machinery/door_control{id = "Toilet1"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"}) @@ -1922,7 +1922,7 @@ "aKX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "aKY" = (/obj/structure/rack,/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/wrapping_paper,/obj/item/stack/wrapping_paper,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/quartermaster/storage) "aKZ" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"aLa" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aLa" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "0"; req_one_access_txt = "1;4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/main) "aLb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage) "aLc" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/conveyor{dir = 2; id = "QMLoad2"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage) "aLd" = (/obj/machinery/conveyor_switch/oneway{convdir = 1; id = "QMLoad2"; pixel_x = 6},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage) @@ -1948,7 +1948,7 @@ "aLx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/crew_quarters/courtroom) "aLy" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/crew_quarters/courtroom) "aLz" = (/obj/structure/table/wood,/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; listening = 0; name = "Station Intercom (Court)"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom) -"aLA" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom) +"aLA" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "0"; req_one_access_txt = "1;4"},/turf/simulated/floor/plasteel,/area/security/main) "aLB" = (/obj/structure/table/wood,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom) "aLC" = (/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 5},/area/crew_quarters/courtroom) "aLD" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/crew_quarters/courtroom) @@ -2255,9 +2255,9 @@ "aRs" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/secondary/construction{name = "\improper Garden"}) "aRt" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/fancy/grass,/area/hallway/secondary/construction{name = "\improper Garden"}) "aRu" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/fancy/grass,/area/hallway/secondary/construction{name = "\improper Garden"}) -"aRv" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/engine/chiefs_office) +"aRv" = (/obj/structure/closet/secure_closet/freezer/money,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka/badminka,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/clothing/head/bearpelt,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/nuke_storage) "aRw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard) -"aRx" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/engine/chiefs_office) +"aRx" = (/obj/machinery/door/airlock/shuttle{id_tag = "prisonshuttle"; name = "Labor Shuttle Airlock"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; travelDir = 90; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 5; id = "laborcamp_home"; name = "fore bay 1"; width = 9},/turf/simulated/shuttle/floor,/area/space) "aRy" = (/obj/machinery/computer/station_alert,/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/engine/engineering) "aRz" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/security/checkpoint/engineering) "aRA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/security/checkpoint/engineering) @@ -2306,7 +2306,7 @@ "aSr" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "aSs" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "aSt" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) -"aSu" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{tag = "icon-plant-03"; icon_state = "plant-03"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) +"aSu" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/flora/kirbyplants{icon_state = "plant-20"; layer = 4.1; pixel_y = 3; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "aSv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aSw" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aSx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) @@ -2368,7 +2368,7 @@ "aTB" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/qm) "aTC" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/qm) "aTD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/qm) -"aTE" = (/obj/structure/table,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/qm) +"aTE" = (/obj/structure/safe,/obj/item/weapon/storage/secure/briefcase{contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/suppressor,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/weapon/soap/nanotrasen)},/obj/item/weapon/storage/backpack/dufflebag{contents = newlist(/obj/item/clothing/under/lawyer/blacksuit,/obj/item/clothing/tie/waistcoat,/obj/item/clothing/suit/toggle/lawyer/black,/obj/item/clothing/shoes/laceup,/obj/item/clothing/gloves/color/black,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/head/fedora); desc = "A large dufflebag for holding extra things. There is a NanoTrasen logo on the back."; icon_state = "duffle-syndieammo"; item_state = "duffle-syndieammo"},/obj/item/weapon/card/id/silver{access = list(12); assignment = "Reaper"; name = "Thirteen's ID Card (Reaper)"; registered_name = "Thirteen"},/obj/item/weapon/lazarus_injector,/obj/item/weapon/gun/energy/gun/advtaser,/obj/item/weapon/gun/projectile/revolver/russian,/obj/item/ammo_box/a357,/obj/item/clothing/tie/stethoscope,/obj/item/weapon/book{desc = "An undeniably handy book."; icon_state = "bookknock"; name = "A Simpleton's Guide to Safe-cracking with Stethoscopes"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/nuke_storage) "aTF" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/disposal/deliveryChute{dir = 4; name = "Crate Disposal Chute"; pixel_x = -5; pixel_y = 2},/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Crate Disposal Chute"; req_access_txt = "0"},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/storage/primary) "aTG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/storage/primary) "aTH" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/storage/primary) @@ -2501,8 +2501,8 @@ "aWe" = (/obj/machinery/power/apc{dir = 1; name = "Security Post - Cargo APC"; pixel_x = 1; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "aWf" = (/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/radio/off,/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) "aWg" = (/obj/structure/filingcabinet,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint/supply{name = "Security Post - Cargo"}) -"aWh" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/obj/machinery/power/apc{dir = 2; name = "Tool Storage APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/storage/primary) -"aWi" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary) +"aWh" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"aWi" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/stack/sheet/cardboard,/obj/item/stack/rods{amount = 50},/obj/item/weapon/paper,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) "aWj" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary) "aWk" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary) "aWl" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary) @@ -2547,7 +2547,7 @@ "aWY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/engineering) "aWZ" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/engine/engineering) "aXa" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge) -"aXb" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-13"; icon_state = "plant-13"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) +"aXb" = (/obj/structure/closet/secure_closet/courtroom,/obj/machinery/light_switch{pixel_y = 28},/obj/item/weapon/gavelblock,/obj/item/weapon/gavelhammer,/turf/simulated/floor/plasteel,/area/crew_quarters/courtroom) "aXc" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "aXd" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "aXe" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) @@ -2583,7 +2583,7 @@ "aXI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload_foyer) "aXJ" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Network Access"; req_access_txt = "19"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/turret_protected/ai_upload_foyer) "aXK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload_foyer) -"aXL" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/flora/kirbyplants{tag = "icon-applebush"; icon_state = "applebush"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/hallway/primary/central) +"aXL" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Law Office APC"; pixel_y = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-21"; layer = 4.1; tag = "icon-plant-21"},/turf/simulated/floor/wood,/area/lawoffice) "aXM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) "aXN" = (/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) "aXO" = (/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/obj/machinery/camera{c_tag = "Central Primary Hallway - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/central) @@ -2593,7 +2593,7 @@ "aXS" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/central) "aXT" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) "aXU" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) -"aXV" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/flora/kirbyplants{tag = "icon-plant-16"; icon_state = "plant-16"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/hallway/primary/central) +"aXV" = (/obj/structure/table/wood,/obj/item/weapon/gavelblock,/obj/item/weapon/gavelhammer,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom) "aXW" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/crew_quarters/courtroom) "aXX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Courtroom"; opacity = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom) "aXY" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/port) @@ -2665,11 +2665,11 @@ "aZm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "aZn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) "aZo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) -"aZp" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/machinery/camera{c_tag = "Central Primary Hallway - Fore - AI Upload"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central) +"aZp" = (/obj/structure/table,/obj/item/clothing/gloves/color/fyellow,/obj/item/device/gps{gpstag = "AUX0"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/storage/primary) "aZq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/central) "aZr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/central) "aZs" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/primary/central) -"aZt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/primary/central) +"aZt" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker) "aZu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "L1"},/area/hallway/primary/central) "aZv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L3"},/area/hallway/primary/central) "aZw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "L5"},/area/hallway/primary/central) @@ -2727,7 +2727,7 @@ "baw" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"}) "bax" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bay" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) -"baz" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-05"; icon_state = "plant-05"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) +"baz" = (/obj/structure/table,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/item/device/gps{gpstag = "QM0"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/qm) "baA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "baB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry{name = "Arrivals"}) "baC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) @@ -2799,12 +2799,12 @@ "bbQ" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/light/small,/turf/simulated/floor/plasteel{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/turret_protected/ai) "bbR" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bbS" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/grille,/turf/space,/area/space) -"bbT" = (/obj/machinery/power/apc{cell_type = 10000; dir = 1; name = "Bridge APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/filingcabinet/chestdrawer{pixel_y = 3},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) +"bbT" = (/obj/structure/table,/obj/item/device/analyzer,/obj/machinery/power/apc{dir = 2; name = "Tool Storage APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow,/obj/item/weapon/wrench,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/storage/primary) "bbU" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/hallway/secondary/entry{name = "Arrivals"}) "bbV" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/entry{name = "Arrivals"}) "bbW" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/entry{name = "Arrivals"}) "bbX" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bbY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "darkblue"},/area/bridge) +"bbY" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary) "bbZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bca" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bcb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;48;50;1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -2864,12 +2864,12 @@ "bdd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard) "bde" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/borgupload{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/aiupload{pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/storage/tech) "bdf" = (/obj/machinery/camera{c_tag = "Secure Tech Storage"; dir = 8},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) -"bdg" = (/obj/structure/table,/obj/item/weapon/module/power_control,/obj/item/weapon/airlock_electronics,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) +"bdg" = (/obj/structure/flora/kirbyplants{icon_state = "plant-13"; layer = 4.1; tag = "icon-plant-13"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bdh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/message_monitor{pixel_y = -5},/obj/item/weapon/circuitboard/arcade/battle{pixel_x = -4; pixel_y = 2},/obj/item/weapon/circuitboard/arcade/orion_trail{pixel_x = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bdi" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/mining,/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bdj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/pandemic{pixel_x = -3; pixel_y = 3},/obj/item/weapon/circuitboard/rdconsole,/obj/item/weapon/circuitboard/rdserver{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bdk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech) -"bdl" = (/obj/structure/table,/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/wirecutters,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) +"bdl" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/hallway/primary/central) "bdm" = (/obj/machinery/door_control{id = "transittube"; name = "Transit Tube Lockdown"; pixel_x = -24; pixel_y = -5; req_access_txt = "24"},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = -24; pixel_y = 5; req_access_txt = "11"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) "bdn" = (/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/structure/table/reinforced,/obj/item/weapon/cartridge/atmos,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/engine/chiefs_office) "bdo" = (/obj/effect/landmark/start{name = "Chief Engineer"},/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) @@ -2950,18 +2950,18 @@ "beL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech) "beM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech) "beN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech) -"beO" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech) +"beO" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/hallway/primary/central) "beP" = (/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office) "beQ" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/secure/briefcase,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/heads) "beR" = (/obj/machinery/door/airlock{name = "Central Emergency Storage"; req_access_txt = "0"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) "beS" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_x = 32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkblue"},/area/bridge) -"beT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) +"beT" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/machinery/camera{c_tag = "Central Primary Hallway - Fore - AI Upload"; dir = 2; network = list("SS13")},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH-POWER TURRETS AHEAD'."; name = "\improper HIGH-POWER TURRETS AHEAD"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central) "beU" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "beV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering) "beW" = (/obj/machinery/power/apc{dir = 8; name = "Engineering Security APC"; pixel_x = -24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint/engineering) "beX" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/security/checkpoint/engineering) "beY" = (/obj/machinery/computer/secure_data,/obj/machinery/computer/security/telescreen{desc = "Used for monitoring the singularity engine safely."; dir = 8; name = "Singularity Monitor"; network = list("Singulo"); pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/engineering) -"beZ" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -26; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/camera{c_tag = "Bridge - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) +"beZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/primary/central) "bfa" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "bfb" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/lattice,/turf/space,/area/space) "bfc" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) @@ -3010,7 +3010,7 @@ "bfT" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/storage/art) "bfU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central) "bfV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 22},/turf/simulated/floor/plasteel,/area/hallway/primary/central) -"bfW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) +"bfW" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/color/yellow,/obj/item/device/t_scanner,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bfX" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light_switch{pixel_x = 8; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor) "bfY" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor) "bfZ" = (/obj/structure/closet/l3closet/janitor,/obj/machinery/alarm{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor) @@ -3071,7 +3071,7 @@ "bhc" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/space) "bhd" = (/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/heads) "bhe" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "hop"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/crew_quarters/heads) -"bhf" = (/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 0},/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/heads) +"bhf" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/light/small{dir = 1},/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bhg" = (/obj/effect/landmark/start{name = "Head of Personnel"},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/wood,/area/crew_quarters/heads) "bhh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "Bridge - Starboard"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bhi" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint2{name = "Customs"}) @@ -3107,7 +3107,7 @@ "bhM" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/checkpoint2{name = "Customs"}) "bhN" = (/obj/machinery/door/airlock/maintenance{name = "Mailroom Maintenance"; req_access_txt = "50"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"}) "bhO" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/obj/structure/disposalpipe/segment{dir = 4},/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/janitor) -"bhP" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) +"bhP" = (/obj/structure/flora/kirbyplants{icon_state = "plant-05"; layer = 4.1; tag = "icon-plant-05"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bhQ" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bhR" = (/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/bridge) "bhS" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/recharger,/obj/item/weapon/restraints/handcuffs,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) @@ -3195,7 +3195,7 @@ "bjw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage) "bjx" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "browncorner"},/area/hallway/primary/port) "bjy" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/hallway/primary/port) -"bjz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) +"bjz" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bjA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) "bjB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/lizard{name = "Wags-His-Tail"; real_name = "Wags-His-Tail"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor) "bjC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/landmark/start{name = "Janitor"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/janitor) @@ -3360,11 +3360,11 @@ "bmF" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/port) "bmG" = (/obj/structure/extinguisher_cabinet{pixel_x = 30; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/hallway/primary/port) "bmH" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/turretid{control_area = "\improper MiniSat West Wing"; enabled = 0; icon_state = "control_stun"; name = "MiniSat West Wing turret control"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomfoyer{name = "\improper MiniSat Teleporter Foyer"}) -"bmI" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) +"bmI" = (/obj/structure/table,/obj/item/weapon/module/power_control,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech) "bmJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) "bmK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) "bmL" = (/obj/structure/filingcabinet/filingcabinet,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/camera{c_tag = "Cargo - Mailroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) -"bmM" = (/obj/structure/table,/obj/item/stack/wrapping_paper,/obj/item/stack/wrapping_paper,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_y = -30},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) +"bmM" = (/obj/item/stack/sheet/cardboard,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bmN" = (/obj/item/weapon/storage/box,/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/quartermaster/office{name = "\improper Cargo Office"}) "bmO" = (/obj/structure/table,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/obj/machinery/power/apc{dir = 2; name = "Cargo Office APC"; pixel_x = 1; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"}) "bmP" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"}) @@ -3380,7 +3380,7 @@ "bmZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bna" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads) "bnb" = (/obj/item/device/radio/off,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/maintcentral{name = "Central Maintenance"}) -"bnc" = (/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) +"bnc" = (/obj/structure/table,/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/wirecutters,/obj/item/device/multitool,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech) "bnd" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Bridge"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/maintcentral{name = "Central Maintenance"}) "bne" = (/obj/machinery/door/window/westleft{dir = 4; name = "Bridge Deliveries"; req_access_txt = "19"},/obj/machinery/door/poddoor/preopen{id = "bridge blast"; name = "bridge blast door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/bridge) "bnf" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) @@ -3449,7 +3449,7 @@ "boq" = (/obj/structure/rack,/obj/item/weapon/module/power_control,/obj/item/weapon/airlock_electronics,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellow"},/area/storage/tools) "bor" = (/obj/structure/stool/bed/chair/comfy/brown{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bos" = (/obj/structure/stool/bed/chair/comfy/brown{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) -"bot" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/storage) +"bot" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bou" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"}) "bov" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bow" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -3469,8 +3469,8 @@ "boK" = (/obj/structure/table/wood,/obj/item/weapon/book/manual/wiki/security_space_law{pixel_y = 3},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "boL" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/hallway/primary/port) "boM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 4; icon_state = "brown"},/area/hallway/primary/port) -"boN" = (/obj/structure/sign/directions/security{desc = "A direction sign, pointing out which way the security department is."; dir = 1; icon_state = "direction_sec"; pixel_x = 0; pixel_y = 8; tag = "icon-direction_sec (NORTH)"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the engineering department is."; dir = 4; icon_state = "direction_eng"; pixel_y = -8; tag = "icon-direction_eng (EAST)"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the bridge is."; dir = 4; icon_state = "direction_bridge"; name = "bridge"; tag = "icon-direction_bridge (EAST)"},/turf/simulated/wall/r_wall,/area/hallway/primary/port) -"boO" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/maintenance/storage) +"boN" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "ceprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/engine/chiefs_office) +"boO" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "ceprivacy"; name = "privacy shutter"},/turf/simulated/floor/plating,/area/engine/chiefs_office) "boP" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/junction{dir = 2; icon_state = "pipe-j1"},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "boQ" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"}) "boR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/light/small,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/obj/structure/stool/bed/chair/janicart,/obj/item/key/janitor,/turf/simulated/floor/plating,/area/janitor) @@ -3478,7 +3478,7 @@ "boT" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "boU" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "boV" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) -"boW" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) +"boW" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) "boX" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) "boY" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/hallway/primary/port) "boZ" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) @@ -3489,15 +3489,15 @@ "bpe" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "council blast"; layer = 2.9; name = "Council Blast Doors"; opacity = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/bridge) "bpf" = (/obj/structure/table/wood,/obj/item/weapon/folder/yellow,/obj/machinery/firealarm{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "bpg" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/engine/break_room) -"bph" = (/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/theatre) -"bpi" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) +"bph" = (/obj/structure/table,/obj/item/stack/wrapping_paper,/obj/item/stack/wrapping_paper,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_y = -30},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/stack/packageWrap{pixel_x = 2; pixel_y = -3},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/quartermaster/office{name = "\improper Cargo Office"}) +"bpi" = (/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) "bpj" = (/turf/simulated/wall,/area/crew_quarters/bar) "bpk" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bpl" = (/obj/structure/sign/pods,/turf/simulated/wall,/area/engine/break_room) "bpm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central) "bpn" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/central) "bpo" = (/turf/simulated/wall,/area/storage/art) -"bpp" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/maintenance/storage) +"bpp" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"}) "bpq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Art Storage"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/storage/art) "bpr" = (/obj/structure/table/wood,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/machinery/camera{c_tag = "Maltese Falcon - Backroom"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bps" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -3574,12 +3574,12 @@ "bqL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{dir = 1; name = "Delivery Desk"; req_access_txt = "50"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/office{name = "\improper Cargo Office"}) "bqM" = (/obj/machinery/reagentgrinder,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bqN" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Bar Delivery"; req_access_txt = "25"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/crew_quarters/bar) -"bqO" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/maintenance/storage) +"bqO" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 29},/obj/machinery/computer/teleporter,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bqP" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bqQ" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bqR" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/light/small{dir = 4},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bqS" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=1"; freq = 1400; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/crew_quarters/bar) -"bqT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/goonplaque{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of sentient postcards in a realm of darkness. The station model number is MSv40D:150223"},/area/hallway/primary/port) +"bqT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/filingcabinet/chestdrawer{pixel_y = 3},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "darkblue"},/area/bridge) "bqU" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/vending_refill/cigarette,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bqV" = (/turf/simulated/floor/fancy/carpet,/area/bridge) "bqW" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -3620,7 +3620,7 @@ "brF" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard) "brG" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard) "brH" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "cautioncorner"},/area/hallway/primary/starboard) -"brI" = (/obj/item/device/violin,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"brI" = (/obj/item/device/instrument/violin,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "brJ" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/engine/break_room) "brK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/engine/break_room) "brL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/engine/break_room) @@ -3723,7 +3723,7 @@ "btE" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/crew_quarters/bar) "btF" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "btG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"btH" = (/obj/structure/closet/gmcloset{desc = "It's a storage unit."; name = "spare gear"},/obj/item/weapon/wrench,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"btH" = (/obj/structure/sign/directions/security{desc = "A direction sign, pointing out which way the security department is."; dir = 1; icon_state = "direction_sec"; pixel_x = 0; pixel_y = 8; tag = "icon-direction_sec (NORTH)"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the engineering department is."; dir = 4; icon_state = "direction_eng"; pixel_y = 0; tag = "icon-direction_eng (EAST)"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the bridge is."; dir = 2; icon_state = "direction_bridge"; name = "bridge"; pixel_y = -8; tag = "icon-direction_bridge (EAST)"},/turf/simulated/wall/r_wall,/area/hallway/primary/port) "btI" = (/obj/machinery/door/airlock/maintenance{name = "Engineering Foyer Maintenance"; req_access_txt = "0"; req_one_access_txt = "32;19"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/engine/break_room) "btJ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/gateway) "btK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/starboard) @@ -3818,7 +3818,7 @@ "bvv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/door_control{id = "evashutter"; name = "E.V.A. Storage Shutter Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "19"},/obj/machinery/door_control{id = "gateshutter"; name = "Gateway Shutter Control"; pixel_x = 0; pixel_y = -34; req_access_txt = "19"},/turf/simulated/floor/fancy/carpet,/area/bridge) "bvw" = (/obj/item/clothing/mask/fakemoustache,/obj/item/clothing/mask/cigarette/pipe,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/camera{c_tag = "Theatre - Backstage"; dir = 1; network = list("SS13")},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bvx" = (/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/camera,/obj/item/device/radio/intercom{pixel_y = -25},/obj/structure/table/wood,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/library) -"bvy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/stack/cable_coil,/obj/item/device/mmi{name = "man-machine interface"},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) +"bvy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "bvz" = (/obj/structure/table/wood,/obj/structure/window/reinforced,/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/item/weapon/storage/secure/briefcase{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/lockbox/medal{pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bvA" = (/obj/machinery/door/window{name = "Captain's Desk"; req_access_txt = "20"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bvB" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) @@ -3847,7 +3847,7 @@ "bvY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "caution"},/area/engine/break_room) "bvZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/computer/security/telescreen{dir = 8; name = "MiniSat Monitor"; network = list("MiniSat","tcomm"); pixel_x = 29; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "caution"},/area/engine/break_room) "bwa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/break_room) -"bwb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/surgical_drapes,/obj/item/weapon/retractor{desc = "A handy surgical tool which allows the user to peel back their victim's flesh. The label warns users to 'Aim away from face.'"; name = "retractor"; pixel_y = 3},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) +"bwb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bwc" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space) "bwd" = (/obj/structure/transit_tube{tag = "icon-N-SW"; icon_state = "N-SW"},/obj/structure/lattice,/turf/space,/area/space) "bwe" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/space,/area/space) @@ -3870,12 +3870,12 @@ "bwv" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bww" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bwx" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bwy" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-18"; icon_state = "plant-18"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) +"bwy" = (/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 0},/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/structure/table/wood,/obj/item/weapon/storage/box/silver_ids,/obj/item/weapon/storage/box/ids,/turf/simulated/floor/wood,/area/crew_quarters/heads) "bwz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bwA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry{name = "Arrivals"}) -"bwB" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-08"; icon_state = "plant-08"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port) +"bwB" = (/obj/machinery/power/apc{cell_type = 10000; dir = 8; name = "Bridge APC"; pixel_x = -27; pixel_y = 0},/obj/structure/cable/yellow,/obj/machinery/camera{c_tag = "Bridge - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bwC" = (/obj/machinery/computer/arcade,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bwD" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-03"; icon_state = "plant-03"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port) +"bwD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/goonplaque{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of sentient postcards in a realm of darkness. The station model number is MSv41AII:150412"},/area/hallway/primary/port) "bwE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/camera{c_tag = "Port Primary Hallway - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/port) "bwF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/primary/port) "bwG" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/primary/port) @@ -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/pet/corgi/Ian,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads) +"bwY" = (/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"}) @@ -3907,8 +3907,8 @@ "bxg" = (/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Access Blast Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "19"},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/door_control{id = "council blast"; name = "Council Chamber Blast Door Control"; pixel_x = -1; pixel_y = -34; req_access_txt = "19"},/obj/machinery/camera{c_tag = "Bridge - Command Chair"; dir = 1; network = list("SS13")},/turf/simulated/floor/fancy/carpet,/area/bridge) "bxh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/bridge) "bxi" = (/obj/structure/bookcase,/turf/simulated/floor/wood,/area/bridge) -"bxj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/weapon/folder/blue,/obj/item/weapon/disk/data,/obj/item/weapon/disk/tech_disk{name = "technology disk"; pixel_x = 3; pixel_y = -1},/obj/item/weapon/disk/design_disk{name = "component design disk"; pixel_x = 1; pixel_y = -2},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) -"bxk" = (/obj/item/weapon/book/manual/wiki/security_space_law{name = "space law"; pixel_y = 2},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/toy/gun{name = "cap gun"},/obj/item/weapon/restraints/handcuffs{name = "handcuffs"},/obj/item/clothing/head/HoS,/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) +"bxj" = (/obj/structure/closet/gmcloset{desc = "It's a storage unit."; icon_state = "black"; name = "spare gear"},/obj/item/weapon/wrench,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bxk" = (/obj/structure/flora/kirbyplants{icon_state = "plant-18"; layer = 4.1; tag = "icon-plant-18"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bxl" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/vending/snack{pixel_x = -2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "bxm" = (/obj/item/weapon/storage/toolbox/emergency,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/starboard) "bxn" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the escape arm is."; icon_state = "direction_evac"; name = "escape arm"; tag = "icon-direction_evac"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the medical department is."; icon_state = "direction_med"; name = "medical department"; pixel_y = 8; tag = "icon-direction_med"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the research department is."; icon_state = "direction_sci"; name = "research department"; pixel_y = -8; tag = "icon-direction_sci"},/turf/simulated/wall,/area/library) @@ -3921,7 +3921,7 @@ "bxu" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/obj/machinery/chem_dispenser/drinks,/obj/structure/sign/barsign{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bxv" = (/turf/simulated/floor/fancy/carpet{tag = "icon-carpet14-10"; icon_state = "carpet14-10"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bxw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/fancy/carpet{tag = "icon-carpet14-10"; icon_state = "carpet14-10"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) -"bxx" = (/obj/machinery/camera{c_tag = "Maltese Falcon - Bar"; dir = 2; network = list("SS13")},/obj/machinery/requests_console{department = "Bar"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes{pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/reagent_containers/glass/rag{pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"bxx" = (/obj/structure/flora/kirbyplants{icon_state = "plant-08"; layer = 4.1; tag = "icon-plant-08"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port) "bxy" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bxz" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bxA" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -3963,7 +3963,7 @@ "byk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/head/welding,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"}) "byl" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -3},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"}) "bym" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"}) -"byn" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-20"; icon_state = "plant-20"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) +"byn" = (/obj/structure/flora/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port) "byo" = (/obj/structure/stool/bed/chair,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "byp" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "byq" = (/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry{name = "Arrivals"}) @@ -4026,7 +4026,7 @@ "bzv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bzw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bzx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/fancy/carpet{tag = "icon-carpet11-12"; icon_state = "carpet11-12"},/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) -"bzy" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Maltese Falcon - Gambling Den Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bzy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/heads) "bzz" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bzA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bzB" = (/turf/simulated/wall/r_wall,/area/atmos) @@ -4040,7 +4040,7 @@ "bzJ" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/hallway/primary/starboard) "bzK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard) "bzL" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/hallway/primary/starboard) -"bzM" = (/turf/simulated/wall/r_wall,/area/maintenance/storage) +"bzM" = (/obj/structure/flora/kirbyplants{icon_state = "plant-20"; layer = 4.1; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bzN" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/wall/r_wall,/area/atmos) "bzO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"; tag = "icon-darkbluecorners"; temperature = 273.15},/area/bridge) "bzP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/atmos) @@ -4105,7 +4105,7 @@ "bAW" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bAX" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/deck{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bAY" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bAZ" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"bAZ" = (/obj/machinery/camera{c_tag = "Bar"; dir = 2; network = list("SS13")},/obj/machinery/requests_console{department = "Bar"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/barman_recipes{pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/reagent_containers/glass/rag{pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bBa" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access_txt = "57"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/window/northleft{dir = 2; icon_state = "left"; name = "Reception Window"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "hop"; layer = 3.1; name = "privacy shutters"; opacity = 0},/turf/simulated/floor/plasteel,/area/crew_quarters/heads) "bBb" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/security/checkpoint/medical) "bBc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/fancy/carpet,/area/bridge) @@ -4283,7 +4283,7 @@ "bEs" = (/obj/machinery/vending/coffee,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/library) "bEt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/library) "bEu" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor/wood,/area/library) -"bEv" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Atmospherics Desk"; req_access_txt = "24"},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/atmos) +"bEv" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Club - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bEw" = (/obj/machinery/door/poddoor/shutters/preopen{id = "hopqueue"; name = "HoP Queue Shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bEx" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/atmos) "bEy" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "aftport"; name = "Aft-Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/port) @@ -4334,9 +4334,9 @@ "bFr" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/port) "bFs" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/space,/area/space) "bFt" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/lattice/catwalk,/turf/space,/area/solar/port) -"bFu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) -"bFv" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) -"bFw" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood/poker,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c10,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bFu" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/atmos) +"bFv" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) +"bFw" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the bridge is."; dir = 1; icon_state = "direction_bridge"; name = "bridge"; pixel_y = -8; tag = "icon-direction_bridge (NORTH)"},/turf/simulated/wall/r_wall,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bFx" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bFy" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"}) "bFz" = (/obj/structure/filingcabinet{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"}) @@ -4399,9 +4399,9 @@ "bGE" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/atmos) "bGF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/atmos) "bGG" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos) -"bGH" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the bridge is."; dir = 1; icon_state = "direction_bridge"; name = "bridge"; pixel_y = 0; tag = "icon-direction_bridge (NORTH)"},/turf/simulated/wall/r_wall,/area/bridge/meeting_room{name = "\improper Command Hallway"}) +"bGH" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the bridge is."; dir = 1; icon_state = "direction_bridge"; name = "bridge"; pixel_y = -8; tag = "icon-direction_bridge (NORTH)"},/turf/simulated/wall/r_wall,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) "bGI" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/theatre) -"bGJ" = (/obj/structure/table/wood,/obj/item/weapon/lipstick,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/camera{c_tag = "Theatre - Stage"; dir = 8; network = list("SS13")},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"bGJ" = (/obj/structure/table/wood,/obj/item/weapon/lipstick{pixel_y = 5},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/camera{c_tag = "Theatre - Stage"; dir = 8; network = list("SS13")},/obj/machinery/light/small{dir = 4},/obj/item/device/instrument/guitar,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "bGK" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "escape"},/area/hallway/primary/starboard) "bGL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard) "bGM" = (/obj/machinery/atmospherics/pipe/manifold/yellow/visible{tag = "icon-manifold-y (EAST)"; dir = 4},/turf/simulated/floor/plasteel,/area/atmos) @@ -4422,8 +4422,8 @@ "bHb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/table/wood/poker,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bHc" = (/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/obj/item/trash/raisins{pixel_y = 7},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "bHd" = (/turf/simulated/floor/engine,/area/toxins/explab) -"bHe" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) -"bHf" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) +"bHe" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pie/cream,/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"bHf" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "Atmospherics Desk"; req_access_txt = "24"},/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/atmos) "bHg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bHh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/tcommsat/server) "bHi" = (/turf/simulated/wall/r_wall,/area/tcommsat/server) @@ -4488,14 +4488,14 @@ "bIp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bIq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/toy/cards/deck{pixel_y = 4},/obj/structure/table/wood/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bIr" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Theatre Stage"; req_access_txt = "0"; req_one_access_txt = "12;46"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre) -"bIs" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "atmos"; name = "Atmos Blast Door"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Atmospherics"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/atmos) +"bIs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bIt" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/atmos) "bIu" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/atmos) "bIv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "blackcorner"},/area/atmos) "bIw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/atmos) "bIx" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/engine,/area/toxins/explab) "bIy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 26; pixel_y = -26; req_access_txt = "24"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/atmos) -"bIz" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/maintenance/storage) +"bIz" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) "bIA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/theatre) "bIB" = (/obj/structure/stool/bed/chair/wood/wings{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/theatre) "bIC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/fancy/carpet,/area/crew_quarters/theatre) @@ -4512,7 +4512,7 @@ "bIN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 9},/turf/simulated/floor/plasteel,/area/atmos) "bIO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/machinery/door/airlock/glass_atmos{name = "Distribution Loop"; req_access_txt = "24"},/turf/simulated/floor/plasteel,/area/atmos) "bIP" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 9; tag = "icon-intact-y (NORTHWEST)"},/turf/simulated/floor/plasteel,/area/atmos) -"bIQ" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/maintenance/storage) +"bIQ" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bIR" = (/obj/machinery/atmospherics/pipe/simple/green/visible{tag = "icon-intact-g (NORTHEAST)"; dir = 5; initialize_directions = 12},/turf/simulated/floor/plasteel,/area/atmos) "bIS" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Pure to Mix"; on = 0},/turf/simulated/floor/plasteel,/area/atmos) "bIT" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/atmos) @@ -4524,11 +4524,11 @@ "bIZ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bJa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bJb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"bJc" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/maintenance/storage) +"bJc" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood/poker,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bJd" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/space,/area/space) "bJe" = (/obj/structure/cable,/obj/machinery/power/solar{id = "aftport"; name = "Aft-Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/port) -"bJf" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "waste_in"; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) -"bJg" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Mix"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage) +"bJf" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) +"bJg" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bJh" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/space) "bJi" = (/obj/machinery/telecomms/processor/preset_one,/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bJj" = (/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Telecoms)"; pixel_x = 0; pixel_y = 29},/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Telecoms - Server Room - Fore-Port"; dir = 2; network = list("SS13","tcomm")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -4539,7 +4539,7 @@ "bJo" = (/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Telecoms)"; pixel_x = 0; pixel_y = 29},/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Telecoms - Server Room - Fore-Starboard"; dir = 2; network = list("SS13","tcomm")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bJp" = (/obj/machinery/telecomms/processor/preset_three,/turf/simulated/floor/bluegrid{icon_state = "gcircuit"; name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bJq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bJr" = (/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the bridge is."; dir = 1; icon_state = "direction_bridge"; name = "bridge"; pixel_y = 0; tag = "icon-direction_bridge (NORTH)"},/turf/simulated/wall/r_wall,/area/crew_quarters/captain{name = "\improper Captain's Quarters"}) +"bJr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Atmospherics"},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id = "atmos"; name = "Atmos Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/atmos) "bJs" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bJt" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27;37"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bJu" = (/obj/structure/table/wood,/obj/item/weapon/folder,/turf/simulated/floor/wood,/area/security/vacantoffice) @@ -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/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) +"bKG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "waste_in"; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "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) @@ -4652,7 +4652,7 @@ "bLx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bLy" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bLz" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 4; pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 6},/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plating,/area/maintenance/starboard) -"bLA" = (/obj/structure/closet/secure_closet/exile,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) +"bLA" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) "bLB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/gateway) "bLC" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/gateway) "bLD" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight,/obj/machinery/power/apc{cell_type = 5000; dir = 4; name = "Gateway APC"; pixel_x = 28; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) @@ -4660,7 +4660,7 @@ "bLF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "bLG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bLH" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"bLI" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Maltese Falcon - Hatch"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"bLI" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Mix"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bLJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bLK" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bLL" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -4690,8 +4690,8 @@ "bMj" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "bMk" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "N2O to Pure"; on = 0},/obj/machinery/atmospherics/pipe/simple/green/visible,/turf/simulated/floor/plasteel{dir = 5; icon_state = "escape"},/area/atmos) "bMl" = (/obj/item/weapon/reagent_containers/glass/rag,/obj/structure/table/wood,/turf/simulated/floor/wood{tag = "icon-wood-broken4"; icon_state = "wood-broken4"},/area/maintenance/aft{name = "Aft Maintenance"}) -"bMm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/n20,/area/maintenance/storage) -"bMn" = (/turf/simulated/floor/engine/n20,/area/maintenance/storage) +"bMm" = (/obj/structure/closet/secure_closet/exile,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) +"bMn" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Kitchen Hatch"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "bMo" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/obj/structure/lattice,/turf/simulated/wall/r_wall,/area/space) "bMp" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/simulated/wall/r_wall,/area/space) "bMq" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 0},/obj/structure/lattice,/turf/space,/area/space) @@ -4749,11 +4749,11 @@ "bNq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central) "bNr" = (/turf/simulated/wall,/area/crew_quarters/kitchen) "bNs" = (/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "Serving Hatch"},/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bNt" = (/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "Serving Hatch"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"bNt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/n20,/area/atmos) "bNu" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "Serving Hatch"},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bNv" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"}) "bNw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"bNx" = (/obj/machinery/camera{c_tag = "Maltese Falcon - Gambling Den Aft"; dir = 1; network = list("SS13")},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/item/clothing/mask/cigarette/pipe,/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/bar) +"bNx" = (/turf/simulated/floor/engine/n20,/area/atmos) "bNy" = (/obj/machinery/vending/coffee,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/bar) "bNz" = (/obj/machinery/vending/cola,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/bar) "bNA" = (/obj/structure/table/wood,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/wood,/area/library) @@ -4775,9 +4775,9 @@ "bNQ" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Mix to Port"; on = 0},/turf/simulated/floor/plasteel,/area/atmos) "bNR" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/floor/plasteel,/area/atmos) "bNS" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) -"bNT" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine/n20,/area/maintenance/storage) -"bNU" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{valve_open = 1},/turf/simulated/floor/engine/n20,/area/maintenance/storage) -"bNV" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine/n20,/area/maintenance/storage) +"bNT" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "Serving Hatch"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/reagent_containers/food/snacks/pie/cream,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"bNU" = (/obj/machinery/camera{c_tag = "Club - Aft"; dir = 1; network = list("SS13")},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/item/clothing/mask/cigarette/pipe,/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/crew_quarters/bar) +"bNV" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine/n20,/area/atmos) "bNW" = (/obj/structure/grille,/obj/structure/lattice,/obj/structure/lattice,/turf/simulated/wall/r_wall,/area/space) "bNX" = (/obj/machinery/message_server,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bNY" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/telecomms/bus/preset_two,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -4786,7 +4786,7 @@ "bOb" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/telecomms/processor/preset_four,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bOc" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/telecomms/bus/preset_four,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bOd" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) -"bOe" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-06"; icon_state = "plant-06"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) +"bOe" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine/n20,/area/atmos) "bOf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bOg" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) "bOh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Arrivals - Aft Arm"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) @@ -4817,7 +4817,7 @@ "bOG" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery) "bOH" = (/turf/simulated/wall/r_wall,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bOI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) -"bOJ" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) +"bOJ" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{valve_open = 1},/turf/simulated/floor/engine/n20,/area/atmos) "bOK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/gateway) "bOL" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/gateway) "bOM" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) @@ -4856,8 +4856,8 @@ "bPt" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos) "bPu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos) "bPv" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) -"bPw" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2o_in"; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/maintenance/storage) -"bPx" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2O"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine/n20,/area/maintenance/storage) +"bPw" = (/obj/structure/flora/kirbyplants{icon_state = "plant-06"; level = 4.1; tag = "icon-plant-06"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"}) +"bPx" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 0},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) "bPy" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "MiniSat Exterior Aft-Port"; dir = 8; network = list("MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bPz" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/wall/r_wall,/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bPA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/telecomms/server/presets/common,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -4873,7 +4873,7 @@ "bPK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "bluecorner"},/area/hallway/secondary/entry{name = "Arrivals"}) "bPL" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) "bPM" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"}) -"bPN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = -32},/obj/structure/flora/kirbyplants{tag = "icon-plant-03"; icon_state = "plant-03"},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/hallway/secondary/entry{name = "Arrivals"}) +"bPN" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2o_in"; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos) "bPO" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/wood,/area/security/vacantoffice) "bPP" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/wood,/area/security/vacantoffice) "bPQ" = (/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/lipstick/black,/obj/item/weapon/lipstick/jade{pixel_x = 2; pixel_y = 2},/obj/item/weapon/lipstick/purple{pixel_x = -2; pixel_y = -2},/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -4906,12 +4906,12 @@ "bQr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bQs" = (/obj/machinery/light_switch{pixel_x = -8; pixel_y = 30},/obj/machinery/light/small{dir = 1},/obj/structure/table/wood,/obj/item/clothing/shoes/laceup,/obj/item/clothing/under/suit_jacket/really_black,/obj/item/clothing/glasses/sunglasses,/obj/machinery/camera{c_tag = "Corporate Showroom"; dir = 2; network = list("SS13")},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bQt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/bookcase{name = "bookcase"},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) -"bQu" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced,/obj/structure/showcase{desc = "A flimsy model of NanoTrasen's revolutionary genetic modifier. Novel features include a locking system to protect scientists from test subjects, and a built-in suction system to remove vomit."; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "scanner"; name = "DNA modifier exhibit"; pixel_y = 3},/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) +"bQu" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2O"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine/n20,/area/atmos) "bQv" = (/obj/structure/showcase{desc = "A stand with a model of the perfect Nanotrasen Employee bolted to it. Signs indicate it is robustly genetically engineered, as well as being ruthlessly loyal."; name = "'Perfect Man' employee exhibit"},/obj/structure/sign/atmosplaque{desc = "A guide to the exhibit, explaining how recent developments in genetic modification and cloning technologies by the Nanotrasen Corporation have led to development and the effective immortality of the 'perfect man', the loyal Nanotrasen Employee."; icon_state = "kiddieplaque"; name = "\improper 'Perfect Man' sign"; pixel_x = 0; pixel_y = 32},/obj/structure/window/reinforced,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bQw" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced,/obj/structure/showcase{desc = "Signs describe how cloning pods like these ensure that every Nanotrasen employee can carry out their contracts in full, even in the unlikely event of their catastrophic death. Hopefully they aren't all made of cardboard, like this one."; icon = 'icons/obj/cloning.dmi'; icon_state = "pod_0"; name = "cloning pod exhibit"},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) -"bQx" = (/obj/machinery/chem_heater,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"bQx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = -32},/obj/structure/flora/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/hallway/secondary/entry{name = "Arrivals"}) "bQy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/gateway) -"bQz" = (/obj/structure/dispenser/oxygen{pixel_x = -1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) +"bQz" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced,/obj/structure/showcase{desc = "A flimsy model of NanoTrasen's revolutionary genetic modifier. Novel features include a locking system to protect scientists from test subjects, and a built-in suction system to remove vomit."; icon = 'icons/obj/Cryogenic2.dmi'; icon_state = "sleeper"; name = "DNA modifier exhibit"; pixel_y = 3},/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bQA" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/gateway) "bQB" = (/obj/machinery/gateway,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/gateway) "bQC" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/gateway) @@ -4989,7 +4989,7 @@ "bRW" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/gateway) "bRX" = (/obj/structure/closet/secure_closet/atmospherics,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/atmos) "bRY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central) -"bRZ" = (/obj/machinery/iv_drip,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"bRZ" = (/obj/structure/dispenser/oxygen{pixel_x = -1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) "bSa" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "bSb" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/lattice/catwalk,/turf/space,/area/solar/port) "bSc" = (/obj/item/device/flashlight/lamp,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5021,9 +5021,9 @@ "bSC" = (/obj/machinery/door/airlock/maintenance{name = "Vacant Office Maintenance"; req_access_txt = "32"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/security/vacantoffice) "bSD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/maintcentral{name = "Central Maintenance"}) "bSE" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/atmos) -"bSF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "tox_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) -"bSG" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) -"bSH" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) +"bSF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "tox_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) +"bSG" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) +"bSH" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "bSI" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bSJ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/telecomms/server/presets/command,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bSK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/telecomms/server/presets/security,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5031,7 +5031,7 @@ "bSM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/telecomms/server/presets/service,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bSN" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/telecomms/server/presets/supply,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bSO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"bSP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) +"bSP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bSQ" = (/obj/item/weapon/reagent_containers/food/drinks/beer,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "bSR" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bSS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -5070,7 +5070,7 @@ "bTz" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bTA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bTB" = (/obj/structure/table/wood,/obj/machinery/light/small{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/storage/lockbox/clusterbang{desc = "An inpenetrable lockbox, designed for transporting the most dangerous of items. You have a bad feeling about opening this."; name = "Lockbox Exhibit"; pixel_y = 3},/obj/item/device/paicard{desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; name = "Nanotrasen Personal AI Device Exhibit"},/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) -"bTC" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) +"bTC" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/head/hardhat/orange{name = "protective hat"},/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) "bTD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/gateway) "bTE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/gateway) "bTF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/gateway) @@ -5105,9 +5105,9 @@ "bUi" = (/obj/structure/lattice,/turf/space,/area/hallway/secondary/entry{name = "Arrivals"}) "bUj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/maintcentral{name = "Central Maintenance"}) "bUk" = (/obj/structure/closet/fireaxecabinet{pixel_x = -32; pixel_y = 0},/obj/machinery/camera{c_tag = "Atmospherics - Port"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "caution"},/area/atmos) -"bUl" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) -"bUm" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) -"bUn" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) +"bUl" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) +"bUm" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) +"bUn" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "bUo" = (/obj/machinery/light/small,/obj/machinery/telecomms/broadcaster/preset_left,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bUp" = (/obj/structure/table,/obj/item/weapon/folder/blue,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "bUq" = (/obj/machinery/light/small,/obj/machinery/power/terminal{dir = 4},/obj/structure/cable,/obj/machinery/camera{c_tag = "Telecoms - Server Room - Aft"; dir = 1; network = list("SS13","tcomm")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5142,10 +5142,10 @@ "bUT" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "bUU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bUV" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/explab) -"bUW" = (/obj/docking_port/stationary{dir = 2; dwidth = 11; height = 22; id = "whiteship_ss13"; name = "SS13 Arrival Docking"; width = 35},/obj/structure/lattice,/turf/space,/area/space) -"bUX" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"bUY" = (/obj/structure/table,/obj/machinery/recharger,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) -"bUZ" = (/obj/structure/stool/bed,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"bUW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/surgical_drapes,/obj/item/weapon/retractor{desc = "A handy surgical tool which allows the user to peel back their victim's flesh. The label warns users to 'Aim away from face.'"; name = "retractor"; pixel_y = 3},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) +"bUX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/wood,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/folder/blue,/obj/item/clothing/head/collectable/HoS{desc = "It's your turn to demand excessive paperwork, signatures, stamps, and hire more clowns! Papers, please!"; icon_state = "hopcap"; name = "novelty HoP hat"},/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) +"bUY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/weapon/disk/data,/obj/item/weapon/disk/tech_disk{name = "technology disk"; pixel_x = 3; pixel_y = -1},/obj/item/weapon/disk/design_disk{name = "component design disk"; pixel_x = 1; pixel_y = -2},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) +"bUZ" = (/obj/item/weapon/book/manual/wiki/security_space_law{name = "space law"; pixel_y = 2},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/toy/gun{name = "cap gun"},/obj/item/weapon/restraints/handcuffs{name = "handcuffs"},/obj/structure/table/wood,/obj/item/clothing/head/collectable/HoS{name = "novelty HoS hat"},/turf/simulated/floor/fancy/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"}) "bVa" = (/obj/item/weapon/storage/belt/utility,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/door_control{id = "gateshutter"; name = "Gateway Shutter Control"; pixel_x = 0; pixel_y = -26; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) "bVb" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/clothing/suit/apron/surgical,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/surgery) "bVc" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/gateway) @@ -5175,8 +5175,8 @@ "bVA" = (/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor/plasteel,/area/atmos) "bVB" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Port to Filter"; on = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Atmospherics - Starboard"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/atmos) "bVC" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/atmos) -"bVD" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "tox_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) -"bVE" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Toxins"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/maintenance/storage) +"bVD" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) +"bVE" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "tox_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "bVF" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bVG" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "bVH" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) @@ -5299,8 +5299,8 @@ "bXU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "caution"},/area/atmos) "bXV" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{dir = 2},/obj/machinery/meter,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/atmos) "bXW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blackcorner"},/area/atmos) -"bXX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) -"bXY" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) +"bXX" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Toxins"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) +"bXY" = (/obj/docking_port/stationary{dir = 2; dwidth = 11; height = 15; id = "whiteship_ss13"; name = "SS13: Auxiliary Dock, Station-Port"; width = 27},/turf/space,/area/space) "bXZ" = (/obj/machinery/power/apc{dir = 8; name = "Aft Port Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/portsolar) "bYa" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/portsolar) "bYb" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) @@ -5353,9 +5353,9 @@ "bYW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/atmos) "bYX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/atmos) "bYY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/atmos) -"bYZ" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) -"bZa" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) -"bZb" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) +"bYZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) +"bZa" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) +"bZb" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "bZc" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "MiniSat Walkway Access"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bZd" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 0},/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "MiniSat Exterior Aft"; dir = 2; network = list("MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bZe" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/door/window{dir = 1; name = "MiniSat Walkway Access"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) @@ -5434,8 +5434,8 @@ "caz" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel,/area/atmos) "caA" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "caB" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable,/obj/structure/lattice/catwalk,/turf/space,/area/solar/port) -"caC" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) -"caD" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - CO2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/maintenance/storage) +"caC" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) +"caD" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "caE" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1; pixel_y = 0},/turf/space,/area/space) "caF" = (/obj/machinery/power/solar_control{id = "aftport"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) "caG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/portsolar) @@ -5453,7 +5453,7 @@ "caS" = (/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/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "caT" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "caU" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/rack_parts,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"}) -"caV" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{tag = "icon-applebush"; icon_state = "applebush"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) +"caV" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "caW" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "caX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "caY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) @@ -5466,7 +5466,7 @@ "cbf" = (/obj/machinery/camera{c_tag = "Central Primary Hallway - Aft-Starboard"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) "cbg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) "cbh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) -"cbi" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/flora/kirbyplants{tag = "icon-plant-10"; icon_state = "plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) +"cbi" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - CO2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "cbj" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/machinery/newscaster{pixel_y = -29},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central) "cbk" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;7;35;8;47"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cbl" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "cmoprivacy"; name = "privacy shutter"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/cmo) @@ -5530,7 +5530,7 @@ "ccr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "ccs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/aft) "cct" = (/turf/simulated/wall,/area/medical/research{name = "Research Division"}) -"ccu" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/keycard_auth{pixel_x = 26; pixel_y = 0},/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) +"ccu" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"}) "ccv" = (/obj/structure/sign/science,/turf/simulated/wall,/area/medical/research{name = "Research Division"}) "ccw" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/research{name = "Research Division"}) "ccx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/research{name = "Research Division"}) @@ -5587,7 +5587,7 @@ "cdw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cdx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cdy" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) -"cdz" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"cdz" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) "cdA" = (/obj/structure/rack,/obj/item/weapon/hatchet,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cdB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/aft) "cdC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) @@ -5598,7 +5598,7 @@ "cdH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cdI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cdJ" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) -"cdK" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/device/assembly/igniter{pixel_x = -4; pixel_y = -4},/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/device/gps,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) +"cdK" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) "cdL" = (/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/airlock_electronics,/obj/item/device/assembly/timer{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cdM" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Research Division - Lobby"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cdN" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/light_switch{pixel_x = -27; pixel_y = 6},/obj/machinery/newscaster/security_unit{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/checkpoint/science{name = "Security Post - Research Division"}) @@ -5724,8 +5724,8 @@ "cgd" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/toxins/lab) "cge" = (/obj/machinery/door/airlock/maintenance{name = "Research Maintenance"; req_access_txt = "7"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"}) "cgf" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/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/medical/sleeper{name = "Sleepers"}) -"cgg" = (/obj/machinery/door/airlock/external{req_access_txt = "24"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/storage) -"cgh" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/storage) +"cgg" = (/obj/structure/table,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"cgh" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 3; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "cgi" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cgj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cgk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5782,8 +5782,8 @@ "chj" = (/obj/machinery/meter,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "chk" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8; name = "output gas connector port"},/obj/machinery/portable_atmospherics/canister,/obj/machinery/ignition_switch{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "incinerator_airlock_exterior"; id_tag = "incinerator_access_control"; interior_door_tag = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "chl" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/turf/simulated/floor/plating,/area/medical/surgery) -"chm" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/toxins/mineral_storeroom) -"chn" = (/obj/structure/closet/secure_closet/scientist,/obj/item/clothing/suit/hooded/wintercoat/science,/obj/item/weapon/storage/backpack/satchel_tox,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/mineral_storeroom) +"chm" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"chn" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/device/assembly/igniter{pixel_x = -4; pixel_y = -4},/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/device/gps{gpstag = "RD0"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cho" = (/obj/structure/stool/bed/roller,/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "chp" = (/obj/structure/grille,/obj/structure/window/fulltile{layer = 2.9},/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) "chq" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"}) @@ -5808,7 +5808,7 @@ "chJ" = (/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics) "chK" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 28},/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "chL" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 24; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) -"chM" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"chM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/atmos) "chN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "chO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) "chP" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) @@ -5817,7 +5817,7 @@ "chS" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"}) "chT" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-11"; icon_state = "plant-11"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"}) "chU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) -"chV" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) +"chV" = (/turf/simulated/floor/plating,/area/atmos) "chW" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "chX" = (/obj/structure/table,/obj/item/device/paicard,/obj/machinery/newscaster{pixel_x = -1; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "chY" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell/potato,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) @@ -5856,7 +5856,7 @@ "ciF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/lattice/catwalk,/turf/space,/area/space) "ciG" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/lattice/catwalk,/turf/space,/area/space) "ciH" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/vending/wallmed{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/exam_room{name = "Patient Room B"}) -"ciI" = (/obj/structure/table/reinforced,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"ciI" = (/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "glass door"; req_access_txt = "24"},/obj/machinery/door/window/northleft{dir = 4; icon_state = "left"; name = "glass door"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/atmos) "ciJ" = (/obj/item/weapon/storage/box/disks{pixel_x = 2; pixel_y = 2},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/obj/machinery/camera{c_tag = "Genetics Desk"; dir = 4; network = list("SS13","Medbay")},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/genetics) "ciK" = (/obj/structure/sign/directions/evac{pixel_y = 6},/turf/simulated/wall,/area/medical/medbay{name = "Medbay Central"}) "ciL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5883,13 +5883,13 @@ "cjg" = (/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/hand_labeler,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cjh" = (/turf/simulated/wall,/area/medical/chemistry) "cji" = (/obj/structure/sign/chemistry,/turf/simulated/wall,/area/medical/chemistry) -"cjj" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/book/manual/experimentor,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"cjj" = (/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/lattice,/turf/space,/area/space) "cjk" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/machinery/door/window/northleft{dir = 2; name = "Chemistry Desk"; req_access_txt = "5; 33"},/obj/machinery/door/firedoor,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "cjl" = (/obj/structure/sign/bluecross,/turf/simulated/wall,/area/medical/chemistry) "cjm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cjn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) -"cjo" = (/obj/structure/sign/science,/turf/simulated/wall/r_wall,/area/toxins/mineral_storeroom) -"cjp" = (/turf/simulated/wall/r_wall,/area/toxins/mineral_storeroom) +"cjo" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/space,/area/space) +"cjp" = (/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) "cjq" = (/turf/simulated/wall/r_wall,/area/toxins/lab) "cjr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) "cjs" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor/shutters/preopen{id = "rndshuttersup"; name = "research and development lab shutters"},/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{dir = 2; name = "Research and Development Desk"; req_access_txt = "7"},/turf/simulated/floor/plating,/area/toxins/lab) @@ -5901,7 +5901,7 @@ "cjy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cjz" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"}) "cjA" = (/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"}) -"cjB" = (/obj/machinery/door_control{id = "telelab"; name = "Test Chamber Blast Doors"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/dropper,/obj/item/stack/medical/bruise_pack{pixel_x = -2; pixel_y = 6},/obj/item/stack/medical/ointment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"cjB" = (/obj/machinery/autolathe{icon_state = "autolathe"; name = "public autolathe"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cjC" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/lab) "cjD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cjE" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5917,7 +5917,7 @@ "cjO" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 9},/turf/space,/area/space) "cjP" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/space,/area/space) "cjQ" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{pixel_y = 24},/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/medical/medbay3{name = "Medbay Aft"}) -"cjR" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/device/multitool{pixel_x = 3},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"cjR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -30},/obj/structure/flora/kirbyplants{icon_state = "plant-08"; layer = 4.1; tag = "icon-plant-08"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cjS" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/toxins/test_area) "cjT" = (/obj/item/weapon/storage/box/rxglasses{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning) "cjU" = (/obj/item/weapon/book/manual/medical_cloning{pixel_y = 6},/obj/item/weapon/paper,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning) @@ -5949,13 +5949,13 @@ "cku" = (/obj/structure/closet/secure_closet/chemical,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/chemistry) "ckv" = (/obj/machinery/chem_dispenser,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "ckw" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) -"ckx" = (/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 0},/obj/machinery/chem_master,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"ckx" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/space) "cky" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "ckz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "ckA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) -"ckB" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/mineral_storeroom) -"ckC" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/mineral_storeroom) -"ckD" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/mineral_storeroom) +"ckB" = (/obj/structure/sign/science,/turf/simulated/wall/r_wall,/area/toxins/lab) +"ckC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/atmos) +"ckD" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/atmos) "ckE" = (/obj/structure/noticeboard{desc = "A board for pinning important notices upon."; name = "notice board"; pixel_x = 0; pixel_y = 31},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab) "ckF" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab) "ckG" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/machinery/door_control{dir = 2; id = "rndshuttersup"; name = "Shutters Control Button"; pixel_x = 26; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"; tag = "icon-whitehall (WEST)"},/area/toxins/lab) @@ -5974,7 +5974,7 @@ "ckT" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -30},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay3{name = "Medbay Aft"}) "ckU" = (/obj/structure/closet/secure_closet/CMO,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 26},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/obj/item/weapon/screwdriver{pixel_y = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "ckV" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) -"ckW" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/item/weapon/reagent_containers/pill/patch/silver_sulf,/obj/item/weapon/reagent_containers/pill/patch/styptic,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"}) +"ckW" = (/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 0},/obj/machinery/chem_master{pixel_x = -2},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "ckX" = (/obj/structure/rack,/obj/item/stack/sheet/cardboard,/obj/item/device/radio/off,/obj/machinery/light_construct{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "ckY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboard) "ckZ" = (/obj/structure/closet,/obj/item/stack/sheet/metal{amount = 34},/obj/item/weapon/extinguisher/mini,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -5985,7 +5985,7 @@ "cle" = (/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/wall/r_wall,/area/maintenance/incinerator) "clf" = (/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay3{name = "Medbay Aft"}) "clg" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) -"clh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) +"clh" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/lab) "cli" = (/obj/machinery/light/small{dir = 8},/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "clj" = (/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/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "clk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) @@ -6017,10 +6017,10 @@ "clK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "clL" = (/obj/structure/closet,/obj/item/stack/sheet/glass{amount = 12},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "clM" = (/obj/structure/table,/obj/machinery/power/apc{dir = 4; name = "Morgue APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/item/weapon/folder/white,/obj/item/clothing/gloves/color/latex,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) -"clN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/mineral_storeroom) -"clO" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mineral_storeroom) -"clP" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"clQ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"clN" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/clothing/mask/gas,/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/lab) +"clO" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) +"clP" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) +"clQ" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) "clR" = (/obj/machinery/disposal{pixel_x = 5},/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/lab) "clS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) "clT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/research{name = "Research Division"}) @@ -6044,20 +6044,20 @@ "cml" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "cmm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "cmn" = (/obj/machinery/door/poddoor{id = "auxincineratorvent"; name = "Auxiliary Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"cmo" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "n2_in"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) -"cmp" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) -"cmq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) -"cmr" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "o2_in"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) -"cms" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) -"cmt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) -"cmu" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) -"cmv" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) -"cmw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) +"cmo" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/atmos) +"cmp" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/portables_connector/visible,/turf/simulated/floor/plating,/area/atmos) +"cmq" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) +"cmr" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/toxins/lab) +"cms" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"cmt" = (/mob/living/simple_animal/pet/pug{desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; name = "Pugley IV"; real_name = "Pugley IV"},/turf/simulated/floor/engine,/area/toxins/explab) +"cmu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor/engine,/area/toxins/explab) +"cmv" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "n2_in"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) +"cmw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) "cmx" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cmy" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "cmz" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/wood{tag = "icon-wood-broken3"; icon_state = "wood-broken3"},/area/maintenance/aft{name = "Aft Maintenance"}) "cmA" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = 3; pixel_y = 2},/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth{pixel_x = -4; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) -"cmB" = (/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 4; pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 6},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -5; pixel_y = 2},/obj/structure/table/wood,/obj/machinery/light_construct/small{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) +"cmB" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) "cmC" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "cmD" = (/obj/item/weapon/storage/box/bodybags{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/rxglasses{pixel_x = 1; pixel_y = 1},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay2{name = "Medbay Storage"}) "cmE" = (/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/clothing/tie/stethoscope,/obj/item/clothing/tie/stethoscope,/obj/item/weapon/gun/syringe,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) @@ -6092,12 +6092,12 @@ "cnh" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "cni" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "cnj" = (/obj/machinery/door/airlock/maintenance{name = "Experimentation Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/toxins/explab) -"cnk" = (/obj/machinery/r_n_d/destructive_analyzer,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) +"cnk" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "o2_in"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) "cnl" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "cnm" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "cnn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/toxins/lab) -"cno" = (/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) -"cnp" = (/obj/structure/table,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) +"cno" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; id_tag = "o2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) +"cnp" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) "cnq" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/storage/box/lights/mixed,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/starboard) "cnr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) "cns" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -6112,7 +6112,7 @@ "cnB" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "cnC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"}) "cnD" = (/obj/machinery/vending/coffee,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) -"cnE" = (/obj/structure/grille,/obj/machinery/door/poddoor/shutters/preopen{id = "robotics2"; name = "robotics lab shutters"},/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/assembly/robotics) +"cnE" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cnF" = (/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/obj/item/target,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/toxins/test_area) "cnG" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_virology{name = "Containment Cells"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology) "cnH" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/starboard) @@ -6125,15 +6125,15 @@ "cnO" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/turf/simulated/floor/plating,/area/medical/virology) "cnP" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/binary/pump{dir = 2; name = "Gas Pump"; on = 1},/turf/space,/area/space) "cnQ" = (/obj/machinery/power/compressor{comp_id = "incineratorturbine"; dir = 1; luminosity = 2},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"cnR" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) -"cnS" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) -"cnT" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) -"cnU" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) -"cnV" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) -"cnW" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - O2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) -"cnX" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) -"cnY" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) -"cnZ" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Air"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) +"cnR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) +"cnS" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) +"cnT" = (/obj/machinery/door/airlock/glass_atmos{name = "Auxiliary Chamber"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/atmos) +"cnU" = (/obj/machinery/atmospherics/binary/pump{dir = 2},/turf/simulated/wall/r_wall,/area/atmos) +"cnV" = (/obj/structure/girder/reinforced,/turf/simulated/floor/plating,/area/atmos) +"cnW" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/wall/r_wall,/area/atmos) +"cnX" = (/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 4; pixel_y = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = -1},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 6},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -5; pixel_y = 2},/obj/structure/table/wood,/obj/machinery/light_construct/small{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) +"cnY" = (/obj/machinery/computer/rdconsole/core,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab) +"cnZ" = (/obj/structure/table,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/clothing/glasses/science,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "coa" = (/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) "cob" = (/obj/structure/closet/secure_closet/bar{pixel_x = -3; pixel_y = -1; req_access_txt = "25"},/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "coc" = (/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6164,20 +6164,20 @@ "coB" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "coC" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellowcorner"},/area/medical/medbay{name = "Medbay Central"}) "coD" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/medbay{name = "Medbay Central"}) -"coE" = (/obj/structure/grille,/obj/machinery/door/poddoor/shutters/preopen{id = "robotics2"; name = "robotics lab shutters"},/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/assembly/robotics) +"coE" = (/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) "coF" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry) -"coG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) +"coG" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) "coH" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/plating,/area/toxins/server{name = "\improper Research Division Server Room"}) "coI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "coJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera{c_tag = "Aft Primary Hallway - Fore"; dir = 8; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) -"coK" = (/obj/machinery/computer/rdconsole/core,/obj/structure/sign/nosmoking_2{pixel_x = -29; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab) +"coK" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - N2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) "coL" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab) "coM" = (/obj/machinery/r_n_d/circuit_imprinter{pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab) "coN" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) -"coO" = (/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/toxins/lab) -"coP" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) +"coO" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) +"coP" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) "coQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"}) -"coR" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) +"coR" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - O2"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) "coS" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"}) "coT" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Research Division"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/maintenance/aft{name = "Aft Maintenance"}) "coU" = (/turf/simulated/wall/r_wall,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6202,10 +6202,10 @@ "cpn" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/insulated{dir = 5},/turf/space,/area/space) "cpo" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8},/turf/simulated/floor/plating/airless,/area/space) "cpp" = (/obj/machinery/power/turbine{luminosity = 2},/obj/structure/cable,/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"cpq" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/maintenance/storage) -"cpr" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/maintenance/storage) -"cps" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) -"cpt" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/maintenance/storage) +"cpq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) +"cpr" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) +"cps" = (/obj/machinery/camera{c_tag = "Atmospherics Tank - Air"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) +"cpt" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cpu" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/virology{name = "Break Romm"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology) "cpv" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "cpw" = (/obj/item/weapon/reagent_containers/food/drinks/ale,/obj/structure/table/wood,/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6218,7 +6218,7 @@ "cpD" = (/obj/structure/rack,/obj/item/stack/rods{amount = 23},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cpE" = (/obj/structure/bodycontainer/crematorium,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cpF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Observation"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel,/area/medical/surgery) -"cpG" = (/obj/structure/table/wood,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book of "},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/organ/heart,/obj/item/device/soulstone,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office) +"cpG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "cpH" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/sleeper{name = "Sleepers"}) "cpI" = (/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/medical/surgery) "cpJ" = (/obj/machinery/door/firedoor,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) @@ -6230,15 +6230,15 @@ "cpP" = (/obj/item/trash/cheesie{pixel_y = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) "cpQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{name = "CMO Maintenance"; req_access_txt = "40"},/turf/simulated/floor/plating,/area/medical/cmo) "cpR" = (/obj/machinery/reagentgrinder,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/requests_console{department = "Chemistry"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry) -"cpS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) +"cpS" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/atmos) "cpT" = (/obj/item/device/flashlight/lamp,/obj/machinery/newscaster{pixel_x = -30},/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cpU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/sign/chemistry{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cpV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/sign/science{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/aft) -"cpW" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) -"cpX" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"cpY" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"cpZ" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) -"cqa" = (/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/dropper,/obj/structure/table,/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/camera{c_tag = "Research and Development"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/plasteel,/area/toxins/lab) +"cpW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) +"cpX" = (/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"cpY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) +"cpZ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) +"cqa" = (/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/structure/table,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/lab) "cqb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"}) "cqc" = (/obj/machinery/door/window/westleft{dir = 2; name = "Research Division Deliveries"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/maintenance/aft{name = "Aft Maintenance"}) "cqd" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/explab) @@ -6248,7 +6248,7 @@ "cqh" = (/obj/item/candle,/obj/machinery/light_switch{pixel_x = -27},/obj/effect/decal/cleanable/cobweb,/obj/structure/table/wood,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cqi" = (/obj/item/weapon/storage/book/bible,/obj/machinery/light/small{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/camera{c_tag = "Chapel - Fore"; dir = 2; network = list("SS13")},/obj/structure/table/wood,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cqj" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/fire{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -3; pixel_y = -3},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) -"cqk" = (/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/machinery/light/small{dir = 1},/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/structure/table/wood,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) +"cqk" = (/obj/structure/disposalpipe/segment,/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "cql" = (/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -3; pixel_y = -3},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay2{name = "Medbay Storage"}) "cqm" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cqn" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) @@ -6264,7 +6264,7 @@ "cqx" = (/obj/item/weapon/storage/fancy/crayons,/obj/machinery/light/small{dir = 8},/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cqy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/storage/fancy/candle_box{pixel_x = 0; pixel_y = 5},/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cqz" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cqA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cqA" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "cqB" = (/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/maintenance/aft{name = "Aft Maintenance"}) "cqC" = (/obj/structure/mineral_door/wood{name = "The Gobbetting Barmaid"},/turf/simulated/floor/wood,/area/maintenance/aft{name = "Aft Maintenance"}) "cqD" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel,/area/medical/surgery) @@ -6279,28 +6279,28 @@ "cqM" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/obj/structure/closet/secure_closet/medical1{pixel_x = -3},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/cryo) "cqN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/medical/cryo) "cqO" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/medical/cryo) -"cqP" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/machinery/light_switch{pixel_x = 24; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/cryo) +"cqP" = (/obj/structure/table,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/scanning_module,/obj/item/weapon/stock_parts/scanning_module,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/sign/nosmoking_2{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/toxins/lab) "cqQ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cqR" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "cqS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) -"cqT" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door_control{id = "cmoprivacy"; name = "Privacy Shutters Control"; pixel_x = -22; pixel_y = 22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) +"cqT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) "cqU" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cqV" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cqW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/starboard) "cqX" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/genetics) "cqY" = (/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 4},/obj/item/clothing/glasses/science,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/machinery/camera{c_tag = "Chemistry"; dir = 4; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry) -"cqZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) -"cra" = (/obj/structure/stool/bed/roller,/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cqZ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) +"cra" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) "crb" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowfull"; tag = "icon-whitehall (WEST)"},/area/hallway/primary/aft) "crc" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/hallway/primary/aft) "crd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cre" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "purple"},/area/hallway/primary/aft) "crf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/hallway/primary/aft) "crg" = (/obj/structure/noticeboard{desc = "A memorial wall for pinning up momentos"; name = "memorial board"; pixel_y = 32},/obj/item/weapon/storage/fancy/candle_box,/obj/item/weapon/storage/fancy/candle_box{pixel_x = -2; pixel_y = 2},/obj/effect/decal/cleanable/cobweb,/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/chapel/main) -"crh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) -"cri" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"crj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) -"crk" = (/obj/item/weapon/stock_parts/console_screen,/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/scanning_module,/obj/item/weapon/stock_parts/scanning_module,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab) +"crh" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) +"cri" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) +"crj" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) +"crk" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "crl" = (/obj/structure/noticeboard{desc = "A memorial wall for pinning up momentos"; name = "memorial board"; pixel_y = 32},/obj/item/weapon/storage/book/bible,/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/chapel/main) "crm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "crn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) @@ -6323,7 +6323,7 @@ "crE" = (/obj/item/device/flashlight/lantern{pixel_y = 7},/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "crF" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "crG" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 0; pixel_y = 6},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"crH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -30},/obj/structure/flora/kirbyplants{tag = "icon-plant-08"; icon_state = "plant-08"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) +"crH" = (/obj/item/stack/rods{amount = 25},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "crI" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "crJ" = (/obj/structure/cable,/obj/structure/lattice/catwalk,/turf/space,/area/solar/starboard) "crK" = (/obj/machinery/door/airlock/maintenance{name = "Chemistry Lab Maintenance"; req_access_txt = "5; 33"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/medical/chemistry) @@ -6352,19 +6352,19 @@ "csh" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "csi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "csj" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) -"csk" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) +"csk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "csl" = (/obj/machinery/power/apc{dir = 4; name = "CMO's Office APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/camera{c_tag = "CMO's Office"; dir = 8; network = list("SS13","Medbay")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "csm" = (/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry) -"csn" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) -"cso" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) +"csn" = (/obj/structure/table/glass,/obj/item/weapon/folder/white{pixel_y = 2},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"cso" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "csp" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chemist"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "csq" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/machinery/door/firedoor,/obj/machinery/door/window/eastright{dir = 8; name = "Chemistry Desk"; req_access_txt = "5; 33"},/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellowfull"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "csr" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowfull"; tag = "icon-whitehall (WEST)"},/area/hallway/primary/aft) "css" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/hallway/primary/aft) "cst" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "purple"},/area/hallway/primary/aft) "csu" = (/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/hallway/primary/aft) -"csv" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/obj/machinery/door/window/eastright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor/shutters/preopen{id = "rndshutters"; name = "research and development lab shutters"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/toxins/lab) -"csw" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Scientist"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) +"csv" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) +"csw" = (/obj/structure/table,/obj/structure/disposalpipe/segment,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "csx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "csy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "csz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) @@ -6423,19 +6423,19 @@ "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/pet/cat/Runtime,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) +"ctD" = (/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "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) +"ctG" = (/obj/machinery/camera{c_tag = "Research and Development"; dir = 8; network = list("SS13","RD")},/obj/machinery/light_switch{pixel_x = 27},/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module,/turf/simulated/floor/plasteel,/area/toxins/lab) "ctH" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "ctI" = (/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/screwdriver{pixel_x = -2; pixel_y = 6},/obj/machinery/power/apc{dir = 8; name = "Chemistry APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/item/device/radio/headset/headset_med,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteyellow"},/area/medical/chemistry) -"ctJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/glass,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) -"ctK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) -"ctL" = (/obj/machinery/chem_master,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; dir = 1; name = "requests board"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"ctJ" = (/obj/structure/table/reinforced,/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"ctK" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"ctL" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/book/manual/experimentor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) "ctM" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/hallway/primary/aft) -"ctN" = (/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/power/apc{dir = 2; name = "Research Lab APC"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow,/obj/machinery/door_control{dir = 2; id = "rndshutters"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -25},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) -"ctO" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) -"ctP" = (/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/structure/table/reinforced,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) +"ctN" = (/obj/machinery/door_control{id = "telelab"; name = "Test Chamber Blast Doors"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/dropper,/obj/item/stack/medical/bruise_pack{pixel_x = -2; pixel_y = 6},/obj/item/stack/medical/ointment,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"ctO" = (/obj/machinery/chem_heater,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"ctP" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/medical/cryo) "ctQ" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/door/window/eastleft{dir = 1; name = "Research and Development Deliveries"; req_access_txt = "7"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/lab) "ctR" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "ctS" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) @@ -6474,19 +6474,19 @@ "cuz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/medical/surgery) "cuA" = (/obj/structure/stool/bed/roller,/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/surgery) "cuB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) -"cuC" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cuC" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cuD" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/cryo) "cuE" = (/obj/machinery/light{dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 5},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay3{name = "Medbay Aft"}) "cuF" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 1},/obj/item/device/radio/intercom{broadcasting = 1; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/cryo) "cuG" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/cryo) -"cuH" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/cryo) +"cuH" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "cuI" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "cuJ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "cuK" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cuL" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cuM" = (/obj/structure/table/glass,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/weapon/storage/secure/briefcase,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cuN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) -"cuO" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cuO" = (/obj/machinery/disposal{pixel_x = 5},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "cuP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cuQ" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/medical/cryo) "cuR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -6497,13 +6497,13 @@ "cuW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/aft{name = "Aft Maintenance"}) "cuX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cuY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cuZ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cva" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cvb" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cuZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) +"cva" = (/obj/structure/disposalpipe/segment,/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) +"cvb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) "cvc" = (/turf/simulated/wall,/area/crew_quarters/hor) "cvd" = (/turf/simulated/wall/r_wall,/area/toxins/storage) "cve" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/storage) -"cvf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor/preopen{id = "toxins_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/storage) +"cvf" = (/obj/structure/table,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/lab) "cvg" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_sw"; name = "southwest of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) "cvh" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) "cvi" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) @@ -6537,7 +6537,7 @@ "cvK" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cvL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cvM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cvN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cvN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/lab) "cvO" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 11},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cvP" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 23},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cvQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;9"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6572,23 +6572,23 @@ "cwt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) "cwu" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft{name = "Aft Maintenance"}) "cwv" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/empty{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/blood/empty{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/dropper,/obj/structure/sign/biohazard{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cww" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cww" = (/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "cwx" = (/obj/item/clothing/gloves/color/latex/nitrile,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/toggle/labcoat,/obj/item/clothing/suit/apron/surgical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/breath/medical,/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) "cwy" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cwz" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cwA" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cwB" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/patients_rooms{name = "Patient Room A"}) "cwC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cwD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/light_switch{pixel_x = 24; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/patients_rooms{name = "Patient Room A"}) +"cwD" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cwE" = (/obj/machinery/door/airlock/medical{name = "Patient Room A"; req_access_txt = "5"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/patients_rooms{name = "Patient Room A"}) "cwF" = (/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 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cwG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) -"cwH" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) +"cwH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/science,/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cwI" = (/obj/machinery/suit_storage_unit/cmo,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cwJ" = (/obj/structure/table/glass,/obj/item/weapon/pen,/obj/item/clothing/tie/stethoscope,/obj/structure/extinguisher_cabinet{pixel_x = 6; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cwK" = (/turf/simulated/wall/r_wall,/area/medical/genetics) "cwL" = (/turf/simulated/wall,/area/medical/genetics) -"cwM" = (/obj/machinery/door/airlock/maintenance{name = "Research Firing Range Maintenance"; req_access_txt = "0"; req_one_access_txt = "7;47;29"},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cwM" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cwN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/aft) "cwO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cwP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) @@ -6599,7 +6599,7 @@ "cwU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cwV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cwW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cwX" = (/obj/machinery/door_control{id = "xeno_blastdoor"; name = "Xenobiology Shutter Control"; pixel_x = -5; pixel_y = -5; req_access_txt = "47"},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "rdprivacy"; name = "Privacy Shutters Control"; pixel_x = 5; pixel_y = 5},/obj/machinery/door_control{id = "Biohazard"; name = "Entrance Shutter Control"; pixel_x = -5; pixel_y = 5; req_access_txt = "47"},/obj/machinery/door_control{id = "toxins_blastdoor"; name = "Toxins Shutter Control"; pixel_x = 5; pixel_y = -5; req_access_txt = "47"},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) +"cwX" = (/obj/structure/stool/bed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cwY" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "cwZ" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) "cxa" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor) @@ -6612,7 +6612,7 @@ "cxh" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/toxins/storage) "cxi" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cxk" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-10"; icon_state = "plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) +"cxk" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cxl" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/research{name = "Experimentation Lab"; req_access_txt = "8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/explab) "cxm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Medical Surplus Storeroom"; req_access_txt = "12"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxn" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor/preopen{id = "isola"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/medical/patients_rooms{name = "Patient Room A"}) @@ -6625,8 +6625,8 @@ "cxu" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "cxv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) "cxw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) -"cxx" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Xenobiology Lab - Aft-Port"; dir = 4; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cxy" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Xenobiology Lab - Aft-Starboard"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology) +"cxx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) +"cxy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "cxz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/power/apc{dir = 2; name = "Experimentation Lab APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab) "cxA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"}) "cxB" = (/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/obj/structure/table/wood,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6641,9 +6641,9 @@ "cxK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cxL" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cxM" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/storage/box/lights/mixed,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cxN" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cxO" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cxP" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cxN" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab) +"cxO" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 4; name = "Research and Development Desk"; req_access_txt = "7"},/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor/shutters/preopen{id = "rndshutters"; name = "research and development lab shutters"},/obj/machinery/door/firedoor,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/toxins/lab) +"cxP" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cxQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cxR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cxS" = (/obj/structure/sign/directions/evac{pixel_y = 0},/turf/simulated/wall,/area/medical/genetics) @@ -6690,8 +6690,8 @@ "cyH" = (/turf/simulated/floor/plasteel{icon_state = "bluefull"},/area/medical/genetics) "cyI" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "cyJ" = (/obj/machinery/door/airlock/maintenance{name = "Mech Bay Maintenance"; req_access_txt = "29"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/assembly/chargebay) -"cyK" = (/obj/structure/sign/nosmoking_2{pixel_x = -29; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cyL" = (/obj/machinery/magnetic_module,/obj/effect/landmark{name = "blobstart"},/obj/structure/target_stake,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cyK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) +"cyL" = (/obj/machinery/chem_master{pixel_x = -2},/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; dir = 1; name = "requests board"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "cyM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cyN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/research{name = "Research Division"}) "cyO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Research Director's Office"; req_access_txt = "30"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) @@ -6738,15 +6738,15 @@ "czD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/aft) "czE" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) "czF" = (/obj/machinery/door/poddoor/shutters{id = "Skynet_launch"; name = "Mech Bay"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay) -"czG" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "researchrangeshutters"; name = "blast door"},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"czG" = (/obj/machinery/chem_heater{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "czH" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/assembly/chargebay) "czI" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/poddoor/preopen{id = "isolb"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/medical/exam_room{name = "Patient Room B"}) "czJ" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "isolb"; name = "Privacy Shutters"; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/exam_room{name = "Patient Room B"}) "czK" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/obj/structure/sign/nosmoking_2{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "czL" = (/obj/machinery/computer/mech_bay_power_console,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid{icon_state = "gcircuit"},/area/assembly/chargebay) "czM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 31},/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay) -"czN" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"czO" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"czN" = (/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/power/apc{dir = 2; name = "Research Lab APC"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow,/obj/machinery/door_control{dir = 2; id = "rndshutters"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -25},/obj/structure/table,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) +"czO" = (/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/obj/structure/table,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "czP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "czQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "czR" = (/obj/machinery/power/apc{dir = 2; name = "RD Office APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/flora/kirbyplants/dead,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) @@ -6802,7 +6802,7 @@ "cAP" = (/obj/machinery/reagentgrinder{pixel_y = 8},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitegreen"},/area/medical/virology) "cAQ" = (/obj/item/latexballon,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cAR" = (/obj/item/clothing/suit/ianshirt,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cAS" = (/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cAS" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/structure/table,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "cAT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay3{name = "Medbay Aft"}) "cAU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cAV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/medbay3{name = "Medbay Aft"}) @@ -6822,13 +6822,13 @@ "cBj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/medical/genetics) "cBk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{icon_state = "door_closed"; id_tag = "AuxGenetics"; locked = 0; name = "Genetics Access"; req_access_txt = "9"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/medical/genetics) "cBl" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) -"cBm" = (/obj/machinery/camera{c_tag = "Research Firing Range"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cBm" = (/obj/structure/stool/bed/roller,/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) "cBn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "cBo" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/landmark/start{name = "Roboticist"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"cBp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cBq" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cBp" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery) +"cBq" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1; name = "Connector Port (Air Supply)"},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/medical/cryo) "cBr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cBs" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/obj/item/weapon/storage/backpack/satchel_tox,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cBs" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/keycard_auth{pixel_x = 26; pixel_y = -7},/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/machinery/door_control{id = "cmoprivacy"; name = "Privacy Shutters Control"; pixel_x = 26; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cBt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cBu" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cBv" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -6867,7 +6867,7 @@ "cCc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/genetics) "cCd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -26},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cCe" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) -"cCf" = (/obj/structure/closet/secure_closet/scientist,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/backpack/satchel_tox,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cCf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access_txt = "8"},/obj/machinery/door/poddoor/shutters/preopen{id = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/storage) "cCg" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/obj/machinery/door_control{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 26; pixel_y = 6; req_one_access_txt = "29"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cCh" = (/obj/machinery/door_control{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = -26; pixel_y = 6},/obj/machinery/light_switch{pixel_x = -23; pixel_y = -2},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/assembly/chargebay) "cCi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -6902,7 +6902,7 @@ "cCL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay3{name = "Medbay Aft"}) "cCM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cCN" = (/obj/machinery/power/apc{dir = 4; name = "Medbay Aft APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) -"cCO" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21"; pixel_x = -3; pixel_y = 3; tag = "icon-plant-21"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"cCO" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab) "cCP" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen/red,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cCQ" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning) "cCR" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/closet/wardrobe/genetics_white,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics) @@ -6914,15 +6914,15 @@ "cCX" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics) "cCY" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay) "cCZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/aft) -"cDa" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/folder/white,/obj/item/weapon/paper/range{pixel_x = 2; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cDb" = (/obj/structure/table/reinforced,/obj/machinery/magnetic_controller{autolink = 1; pixel_y = 3},/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/clothing/ears/earmuffs,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cDa" = (/obj/machinery/iv_drip{density = 0},/obj/item/roller,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cDb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cDc" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"cDd" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 1; icon_state = "right"; name = "Firing Post"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cDd" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/patients_rooms{name = "Patient Room A"}) "cDe" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/poddoor/preopen{id = "toxins_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plating,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cDf" = (/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/medical/medbay3{name = "Medbay Aft"}) "cDg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cDh" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) -"cDi" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/poddoor/preopen{id = "toxins_blastdoor"; name = "biohazard containment door"},/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cDi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo) "cDj" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cDk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cDl" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -6974,7 +6974,7 @@ "cEf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cEg" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cEh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"}) -"cEi" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access_txt = "8"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cEi" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cEj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cEk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cEl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -6986,7 +6986,7 @@ "cEr" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/driver_button{dir = 2; id = "toxinsdriver"; pixel_x = 24; pixel_y = -24},/obj/machinery/computer/security/telescreen{desc = "Used for watching the test chamber."; dir = 8; layer = 4; name = "Test Chamber Telescreen"; network = list("Toxins"); pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cEs" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/crate,/obj/item/clothing/gloves/color/fyellow,/obj/item/weapon/wrench,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cEt" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/toxins/test_area) -"cEu" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-10"; icon_state = "plant-10"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) +"cEu" = (/obj/machinery/door/airlock/maintenance{name = "Research Testing Range Maintenance"; req_access_txt = "0"; req_one_access_txt = "7;47;29"},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cEv" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating/airless{dir = 9; icon_state = "warnplate"},/area/toxins/test_area) "cEw" = (/obj/structure/rack,/obj/effect/landmark/costume,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/aft{name = "Aft Maintenance"}) "cEx" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating/airless{dir = 5; icon_state = "warnplate"},/area/toxins/test_area) @@ -7013,9 +7013,9 @@ "cES" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "cET" = (/obj/machinery/power/apc{dir = 4; name = "Mech Bay APC"; pixel_x = 28; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "cEU" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay) -"cEV" = (/obj/structure/rack,/obj/item/target,/obj/item/target,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cEW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cEX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cEV" = (/obj/machinery/door_control{id = "xeno_blastdoor"; name = "Secure Lab Shutter Control"; pixel_x = -5; pixel_y = -5; req_access_txt = "47"},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "rdprivacy"; name = "Privacy Shutters Control"; pixel_x = 5; pixel_y = 5},/obj/machinery/door_control{id = "Biohazard"; name = "Entrance Shutter Control"; pixel_x = -5; pixel_y = 5; req_access_txt = "47"},/obj/machinery/door_control{id = "toxins_blastdoor"; name = "Toxins Shutter Control"; pixel_x = 5; pixel_y = -5; req_access_txt = "47"},/obj/item/device/radio/off,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor) +"cEW" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cEX" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cEY" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cEZ" = (/turf/simulated/wall,/area/assembly/robotics) "cFa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -7059,12 +7059,12 @@ "cFM" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/pen,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cFN" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/aft) "cFO" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/obj/machinery/door/window/eastright{dir = 4; name = "Robotics Desk"; req_access_txt = "29"},/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/door/poddoor/shutters/preopen{id = "robotics"; name = "robotics lab shutters"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/assembly/robotics) -"cFP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Firing Range"; req_access_txt = "0"; req_one_access_txt = "7;47;29"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cFP" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cFQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cFR" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cFS" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/chargebay) -"cFT" = (/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/assembly/robotics) -"cFU" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 20; pixel_x = -3; pixel_y = 6},/obj/item/stack/sheet/glass{amount = 20; pixel_x = -3; pixel_y = 6},/obj/item/stack/sheet/plasteel{amount = 10},/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cFT" = (/obj/structure/sign/nosmoking_2{pixel_x = -29; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cFU" = (/obj/machinery/magnetic_module,/obj/effect/landmark{name = "blobstart"},/obj/structure/target_stake,/turf/simulated/floor/plasteel{dir = 2; icon_state = "bot"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cFV" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cFW" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cFX" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (EAST)"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -7087,10 +7087,10 @@ "cGo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/carbon/monkey,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cGp" = (/obj/machinery/light/small,/obj/machinery/door_control{id = "chapelspaceshutters"; name = "Space Window Shutter Control"; pixel_x = -6; pixel_y = -25; req_access_txt = "0"},/obj/machinery/light_switch{pixel_x = 6; pixel_y = -25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main) "cGq" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "chapelspaceshutters"; name = "chapel shutters"},/turf/simulated/floor/plating,/area/chapel/main) -"cGr" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio3"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cGr" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "researchrangeshutters"; name = "blast door"},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cGs" = (/obj/machinery/smartfridge/chemistry/virology,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "whitegreenfull"},/area/medical/virology) -"cGt" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cGu" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "xenobio3"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cGt" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cGu" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cGv" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cGw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cGx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7109,7 +7109,7 @@ "cGK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cGL" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cGM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) -"cGN" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cGN" = (/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cGO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/morgue) "cGP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/hallway/primary/aft) "cGQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft) @@ -7117,10 +7117,10 @@ "cGS" = (/turf/simulated/wall/r_wall,/area/assembly/robotics) "cGT" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/chargebay) "cGU" = (/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cGV" = (/obj/structure/table,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/item/clothing/glasses/science,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cGW" = (/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/power/apc{dir = 2; name = "Research Firing Range APC"; pixel_x = 0; pixel_y = -28},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) -"cGX" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/assembly/robotics) -"cGY" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door_control{id = "researchrangeshutters"; name = "Blast Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "0"},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cGV" = (/obj/machinery/camera{c_tag = "Research Testing Range"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cGW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cGX" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cGY" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cGZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "cHa" = (/obj/structure/lattice,/turf/space,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHb" = (/obj/machinery/door/poddoor{id = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -7132,26 +7132,26 @@ "cHh" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual outlet valve"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHi" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHj" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cHk" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cHk" = (/obj/structure/closet/secure_closet/scientist,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHl" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area) "cHm" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "cHn" = (/turf/simulated/wall,/area/medical/virology) -"cHo" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cHp" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cHq" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cHr" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cHo" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/folder/white,/obj/item/weapon/paper/range{pixel_x = 2; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cHp" = (/obj/structure/table/reinforced,/obj/machinery/magnetic_controller{autolink = 1; pixel_y = 3},/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/clothing/ears/earmuffs,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cHq" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 1; icon_state = "right"; name = "door"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cHr" = (/obj/structure/rack,/obj/item/target,/obj/item/target,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cHs" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology) "cHt" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cHu" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology) -"cHv" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cHv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cHw" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;6"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cHx" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"}) "cHy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cHz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitehall"},/area/medical/medbay3{name = "Medbay Aft"}) "cHA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/medical/medbay3{name = "Medbay Aft"}) -"cHB" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cHB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cHC" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/medical/medbay3{name = "Medbay Aft"}) -"cHD" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology) +"cHD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research Testing Range"; req_access_txt = "0"; req_one_access_txt = "7;47;29"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cHE" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2"; icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cHF" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "cHG" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) @@ -7160,7 +7160,7 @@ "cHJ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cHK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cHL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) -"cHM" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "researchrangeshutters"; name = "blast door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Firing Range"}) +"cHM" = (/obj/machinery/door/firedoor,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/poddoor/preopen{id = "toxins_blastdoor"; name = "biohazard containment door"},/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "8"},/obj/machinery/door/poddoor/shutters/preopen{id = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/assembly/robotics) "cHO" = (/turf/simulated/floor/plasteel,/area/assembly/robotics) "cHP" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) @@ -7181,26 +7181,26 @@ "cIe" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "cIf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/aft) "cIg" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/assembly/chargebay) -"cIh" = (/obj/structure/filingcabinet/chestdrawer{pixel_x = -2; pixel_y = 2},/obj/machinery/door_control{dir = 2; id = "robotics"; name = "Shutter Control"; pixel_x = -26; pixel_y = 26},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cIh" = (/obj/structure/table,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/obj/item/clothing/glasses/science,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cIi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cIj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cIk" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/item/weapon/wrench,/obj/item/weapon/restraints/handcuffs,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreen"},/area/medical/virology) "cIl" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/assembly/robotics) -"cIm" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/light_switch{pixel_x = 27},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cIm" = (/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/power/apc{dir = 2; name = "Research Firing Range APC"; pixel_x = 0; pixel_y = -28},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cIn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cIo" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cIp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cIq" = (/obj/machinery/computer/pandemic{layer = 2.5; pixel_x = -4},/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/virology) "cIr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/virology) "cIs" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cIt" = (/obj/structure/table,/obj/machinery/power/apc{dir = 1; name = "Robotics Lab APC"; pixel_x = 0; pixel_y = 25},/obj/item/weapon/crowbar,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/obj/item/device/multitool{pixel_x = 3},/obj/item/stack/cable_coil,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cIu" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cIt" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door_control{id = "researchrangeshutters"; name = "Blast Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "0"},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) +"cIu" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "researchrangeshutters"; name = "blast door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cIv" = (/obj/structure/sign/biohazard{pixel_y = 32},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cIw" = (/obj/structure/sink{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/virology) "cIx" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/machinery/shower{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/virology) -"cIy" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cIy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/research{name = "Toxins Launch Room Access"; req_access_txt = "8"},/obj/machinery/door/poddoor/shutters/preopen{id = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cIz" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/medbay3{name = "Medbay Aft"}) -"cIA" = (/obj/structure/table,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/machinery/camera{c_tag = "Robotics - Fore"; dir = 2; network = list("SS13","RD")},/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cIA" = (/obj/structure/filingcabinet/chestdrawer{pixel_x = -2; pixel_y = 2},/obj/machinery/door_control{dir = 2; id = "robotics"; name = "Shutter Control"; pixel_x = -26; pixel_y = 26},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cIB" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cIC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cID" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/medical/medbay3{name = "Medbay Aft"}) @@ -7211,12 +7211,12 @@ "cII" = (/obj/structure/closet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/aft) "cIJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cIK" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cIL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/assembly/robotics) -"cIM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics) +"cIL" = (/obj/machinery/mecha_part_fabricator{dir = 2},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cIM" = (/obj/machinery/mecha_part_fabricator{dir = 2},/obj/machinery/camera{c_tag = "Robotics - Fore"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cIN" = (/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/assembly/robotics) "cIO" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "purple"},/area/hallway/primary/aft) -"cIP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/assembly/robotics) -"cIQ" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cIP" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/rack,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cIQ" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 20; pixel_x = -3; pixel_y = 6},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cIR" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/stool/bed/chair/office/light{dir = 8},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/assembly/robotics) "cIS" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "cIT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -7228,9 +7228,9 @@ "cIZ" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cJa" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cJb" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cJc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics) -"cJd" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics) -"cJe" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics) +"cJc" = (/obj/machinery/power/apc{dir = 1; name = "Robotics Lab APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cJd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics) +"cJe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics) "cJf" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cJg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cJh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -7245,28 +7245,28 @@ "cJq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/virology) "cJr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cJs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "virology_airlock_exterior"; id_tag = "virology_airlock_control"; interior_door_tag = "virology_airlock_interior"; name = "Virology Access Console"; pixel_x = 26; pixel_y = 26; req_access_txt = "39"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/virology) -"cJt" = (/obj/machinery/mecha_part_fabricator{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cJt" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cJu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -26; pixel_y = 28; req_access_txt = "39"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) "cJv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) -"cJw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) -"cJx" = (/obj/structure/rack,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/machinery/firealarm{dir = 4; pixel_x = 28; pixel_y = 5},/obj/item/stack/packageWrap,/obj/item/borg/upgrade/rename,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) +"cJw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/assembly/robotics) +"cJx" = (/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) "cJy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/medbay3{name = "Medbay Aft"}) "cJz" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) "cJA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"}) "cJB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cJC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cJD" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics RC"; pixel_x = -31; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cJE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/assembly/robotics) +"cJE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/assembly/robotics) "cJF" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/airlock/maintenance{name = "Morgue Maintenance"; req_access_txt = "6"},/turf/simulated/floor/plating,/area/medical/morgue) "cJG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/aft) -"cJH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cJH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 28; pixel_y = 5},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/obj/item/device/multitool{pixel_x = 3},/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cJI" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"}) "cJJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/assembly/robotics) -"cJK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cJL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/assembly/robotics) -"cJM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) +"cJK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/assembly/robotics) +"cJL" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21"; layer = 4.1; pixel_x = -3; pixel_y = 3; tag = "icon-plant-21"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"}) +"cJM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/assembly/robotics) "cJN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cJO" = (/obj/machinery/door/airlock/maintenance{name = "Toxins Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/toxins/mixing{name = "\improper Toxins Lab"}) +"cJO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/assembly/robotics) "cJP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"}) "cJQ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"}) "cJR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -7292,13 +7292,13 @@ "cKl" = (/obj/structure/closet/l3closet,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cKm" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1; name = "virology air connector port"},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) "cKn" = (/obj/machinery/camera{c_tag = "Virology - Entrance"; dir = 8; network = list("SS13","Medbay")},/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/medbay3{name = "Medbay Aft"}) -"cKo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"cKp" = (/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"cKo" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cKp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/assembly/robotics) "cKq" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/door/poddoor/preopen{id = "chapelparlourshutters"; name = "chapel shutters"},/turf/simulated/floor/plating,/area/chapel/main) -"cKr" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology) -"cKs" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 7},/obj/item/weapon/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"cKr" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"cKs" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) "cKt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cKu" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 2; name = "xenobiology air connector port"},/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"cKu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/rack,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer{pixel_x = 4; pixel_y = -4},/obj/item/device/healthanalyzer{pixel_x = 4; pixel_y = -4},/obj/item/device/healthanalyzer{pixel_x = 4; pixel_y = -4},/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cKv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cKw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"}) "cKx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7306,21 +7306,21 @@ "cKz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;5;39;6"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cKA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/aft) "cKB" = (/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,/area/hallway/primary/aft) -"cKC" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 8},/obj/machinery/power/apc{dir = 1; name = "Xenobiology APC"; pixel_x = 0; pixel_y = 27},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"cKC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "cKD" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/assembly/robotics) "cKE" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/assembly/robotics) "cKF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/assembly/robotics) "cKG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/assembly/robotics) "cKH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cKI" = (/obj/structure/table/glass,/obj/item/weapon/folder/white{pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"cKJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) +"cKI" = (/obj/structure/grille,/obj/structure/window/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/assembly/robotics) +"cKJ" = (/obj/machinery/door/airlock/maintenance{name = "Toxins Lab Maintenance"; req_access_txt = "8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/poddoor/shutters/preopen{id = "toxins_blastdoor"; name = "biohazard containment shutters"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cKK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cKL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/medical/research{name = "Research Division"}) "cKM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "Research Division Server Room"; req_access = null; req_access_txt = "30"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) "cKN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) "cKO" = (/obj/machinery/camera{c_tag = "Research Division - Server Room"; dir = 2; network = list("SS13","RD"); pixel_x = 22},/obj/machinery/power/apc{dir = 1; name = "Research Division Server Room APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) "cKP" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) -"cKQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Xenobiology Internal Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"cKQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cKR" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"}) "cKS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 140; on = 1; pressure_checks = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"}) "cKT" = (/turf/simulated/wall/r_wall,/area/toxins/server{name = "\improper Research Division Server Room"}) @@ -7331,10 +7331,10 @@ "cKY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cKZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cLa" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cLb" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes{pixel_x = 3; pixel_y = 5},/obj/item/weapon/storage/box/monkeycubes{pixel_x = -3; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"cLc" = (/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/structure/table/glass,/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"cLd" = (/obj/structure/table/glass,/obj/item/weapon/folder/white{pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) -"cLe" = (/obj/machinery/smartfridge/extract,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"cLb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "purplefull"},/area/assembly/robotics) +"cLc" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 2; pixel_y = 2},/obj/item/borg/upgrade/rename,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cLd" = (/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cLe" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -1; pixel_y = 4},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = -1},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/obj/item/device/multitool{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cLf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/virology) "cLg" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = -30; pixel_y = 0},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) "cLh" = (/obj/structure/closet/wardrobe/virology_white,/obj/item/weapon/storage/backpack/satchel_vir,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) @@ -7350,16 +7350,16 @@ "cLr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/primary/aft) "cLs" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/primary/aft) "cLt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera{c_tag = "Aft Primary Hallway - Aft"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/primary/aft) -"cLu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cLv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cLu" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) +"cLv" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/assembly/robotics) "cLw" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) "cLx" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics) -"cLy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cLz" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cLA" = (/obj/structure/closet/wardrobe/robotics_black,/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cLB" = (/obj/machinery/door/window/eastleft{dir = 1; name = "Robotics Deliveries"; req_access_txt = "29"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cLy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/weapon/ore/slag,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cLz" = (/obj/structure/closet/wardrobe/robotics_black{pixel_x = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cLA" = (/obj/machinery/door/window/eastleft{dir = 1; name = "Robotics Deliveries"; req_access_txt = "29"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) +"cLB" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/crowbar,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics) "cLC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cLD" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cLD" = (/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "cLE" = (/turf/simulated/wall,/area/toxins/server{name = "\improper Research Division Server Room"}) "cLF" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) "cLG" = (/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) @@ -7371,21 +7371,21 @@ "cLM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/aft{name = "Aft Maintenance"}) "cLN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "cLO" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) -"cLP" = (/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "xeno_airlock_exterior"; id_tag = "xeno_airlock_control"; interior_door_tag = "xeno_airlock_interior"; name = "Xenobiology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cLP" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"}) "cLQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/bedsheet/medical,/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cLR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cLS" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cLT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/medical/virology) -"cLU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cLU" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Secure Lab"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/medical/research{name = "Research Division"}) "cLV" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) "cLW" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cLX" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) -"cLY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/weapon/ore/slag,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cLY" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cLZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cMa" = (/obj/machinery/camera{c_tag = "Xenobiology Lab - Fore"; dir = 2; network = list("SS13","RD")},/obj/machinery/firealarm{dir = 2; pixel_y = 26},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cMa" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Research Division Hallway - Secure Lab Access"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMb" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cMc" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cMd" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cMc" = (/obj/machinery/light/small{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cMd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMe" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/aft{name = "Aft Maintenance"}) "cMf" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cMg" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) @@ -7396,37 +7396,37 @@ "cMl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Departure Lounge"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cMm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Departure Lounge"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cMn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Departure Lounge"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cMo" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology) +"cMo" = (/obj/structure/table/wood,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book of "},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/organ/heart,/obj/item/device/soulstone/anybody,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office) "cMp" = (/obj/structure/optable{name = "Robotics Operating Table"},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/camera{c_tag = "Robotics - Aft"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/assembly/robotics) "cMq" = (/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitehall"},/area/assembly/robotics) "cMr" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/door_control{id = "chapelparlourshutters"; name = "Window Shutter Control"; pixel_x = 0; pixel_y = -25; req_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) -"cMs" = (/obj/structure/rack,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/robotics) -"cMt" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; tag = "icon-sink (WEST)"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cMs" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Departure Lounge - Port Fore"; dir = 4; network = list("SS13")},/obj/structure/flora/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cMt" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Fore"; dir = 8; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-14"; layer = 4.1; tag = "icon-plant-14"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cMu" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "cMv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) -"cMw" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cMw" = (/obj/machinery/door/poddoor/preopen{id = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) "cMy" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) "cMz" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server{name = "\improper Research Division Server Room"}) -"cMA" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cMA" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/door/poddoor/preopen{id = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMB" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"}) "cMC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 120; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server{name = "\improper Research Division Server Room"}) "cMD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cME" = (/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 3},/obj/item/weapon/extinguisher,/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/toxins/xenobiology) +"cME" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/preopen{id = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMF" = (/obj/effect/decal/cleanable/dirt,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cMG" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = -32},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cMG" = (/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/machinery/light/small{dir = 1},/obj/structure/table/wood,/obj/structure/noticeboard{pixel_y = 29},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cMH" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cMI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cMJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) +"cMJ" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cML" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cMM" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) "cMN" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) -"cMO" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology) +"cMO" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMP" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/machinery/light{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 29},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cMQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) -"cMR" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cMS" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/xenobiology) +"cMR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Secure Lab"; req_access_txt = "47"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cMS" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cMT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cMU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"}) "cMV" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7446,9 +7446,9 @@ "cNj" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cNk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cNl" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cNm" = (/obj/machinery/processor{desc = "A machine used to process slimes and retrieve their extract."; name = "Slime Processor"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cNn" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"}) -"cNo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Access"; req_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/medical/research{name = "Research Division"}) +"cNm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cNn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cNo" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cNp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/aft{name = "Aft Maintenance"}) "cNq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{icon_state = "door_closed"; locked = 0; name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cNr" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7457,10 +7457,10 @@ "cNu" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "cNv" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cNw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) -"cNx" = (/obj/machinery/monkey_recycler,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cNy" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cNx" = (/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cNy" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cNz" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/wall,/area/medical/virology) -"cNA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology) +"cNA" = (/obj/machinery/access_button{command = "cycle_exterior"; master_tag = "xeno_airlock_control"; name = "Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "0"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Secure Lab External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cNB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cNC" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cND" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -7490,15 +7490,15 @@ "cOb" = (/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{icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"}) "cOc" = (/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{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"}) "cOd" = (/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{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) -"cOe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) +"cOe" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cOf" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "7;12;47"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cOg" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Research Division Hallway - Xenobiology Access"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cOh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cOi" = (/obj/machinery/light/small{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cOg" = (/obj/machinery/camera{c_tag = "Departure Lounge - Port Aft"; dir = 4; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-04"; layer = 4.1; tag = "icon-plant-04"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cOh" = (/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Aft"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cOi" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cOj" = (/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{dir = 8; icon_state = "warnplate"; tag = ""},/area/maintenance/aft{name = "Aft Maintenance"}) "cOk" = (/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{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/aft{name = "Aft Maintenance"}) "cOl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cOm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology) +"cOm" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cOn" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cOo" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cOp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/starboardsolar) @@ -7509,55 +7509,55 @@ "cOu" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "whitegreen"},/area/medical/virology) "cOv" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "whitegreen"},/area/medical/virology) "cOw" = (/obj/structure/stool,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitegreen"},/area/medical/virology) -"cOx" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology) +"cOx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cOy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cOz" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/effect/decal/cleanable/cobweb,/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cOA" = (/obj/machinery/requests_console{department = "Chapel"; departmentType = 2; pixel_y = 30},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cOB" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cOC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cOD" = (/obj/machinery/door/morgue{name = "Relic Closet"; req_access_txt = "22"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office) -"cOE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology) +"cOE" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/centcom{name = "Funeral Parlour"; opacity = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cOF" = (/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance Access "; req_access_txt = "0"; req_one_access_txt = "12;27"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cOG" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Departure Lounge - Port Fore"; dir = 4; network = list("SS13")},/obj/structure/flora/kirbyplants{tag = "icon-plant-24"; icon_state = "plant-24"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cOG" = (/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cOH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cOI" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cOJ" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cOK" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cOL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cOM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cON" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Fore"; dir = 8; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/flora/kirbyplants{tag = "icon-plant-14"; icon_state = "plant-14"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cON" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/camera{c_tag = "Secure Lab - Airlock"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cOO" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Aft Maintenance APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cOP" = (/obj/machinery/door/poddoor/preopen{id = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/xenobiology) -"cOQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/preopen{id = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/xenobiology) -"cOR" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/machinery/door/poddoor/preopen{id = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/toxins/xenobiology) +"cOP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cOQ" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; pixel_y = 1},/turf/simulated/floor/plating/airless,/area/space) +"cOR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cOS" = (/obj/structure/stool/bed/chair,/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cOT" = (/obj/structure/stool,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "Aft Starboard Solar Maintenance"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cOU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cOV" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cOW" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area/space) "cOX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"cOY" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology) -"cOZ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology) +"cOY" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Funeral Parlour"; opacity = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) +"cOZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "xeno_airlock_control"; name = "Access Button"; pixel_x = 8; pixel_y = -28; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPa" = (/obj/machinery/atmospherics/unary/tank/air{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/virology) -"cPb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/xenobiology) -"cPc" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology) -"cPd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cPe" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera{c_tag = "Xenobiology Lab - Central"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) +"cPb" = (/obj/structure/closet/l3closet/scientist,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPd" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/structure/table/glass,/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/stack/sheet/mineral/plasma{layer = 2.9; pixel_y = 4},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 8; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/beaker/large{pixel_x = -3; pixel_y = 3},/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPe" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 7},/obj/item/weapon/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/crema_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cPg" = (/obj/machinery/light/small{dir = 4},/obj/effect/landmark/start{name = "Chaplain"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) -"cPh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/xenobiology) +"cPh" = (/obj/machinery/chem_master{pixel_x = -2; pixel_y = 1},/obj/structure/noticeboard{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPi" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Chaplain"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) -"cPj" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner (WEST)"; icon_state = "warnwhitecorner"; dir = 8},/area/toxins/xenobiology) +"cPj" = (/obj/machinery/chem_dispenser,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPk" = (/obj/machinery/light/small{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cPl" = (/turf/simulated/wall,/area/chapel/main) -"cPm" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology) -"cPn" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) +"cPm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "xeno_airlock_interior"; locked = 1; name = "Secure Lab Internal Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPo" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/obj/item/weapon/reagent_containers/food/snacks/grown/poppy{pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cPp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cPq" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) -"cPr" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cPs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/xenobiology) -"cPt" = (/obj/machinery/light{dir = 1},/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = -24; pixel_y = 24; req_access_txt = "55"},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology) +"cPr" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/monkeycubes{pixel_x = 3; pixel_y = 5},/obj/item/weapon/storage/box/monkeycubes{pixel_x = -3; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPs" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 8},/obj/machinery/power/apc{dir = 1; name = "Xenobiology APC"; pixel_x = 0; pixel_y = 27},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPt" = (/obj/structure/table/glass,/obj/item/weapon/folder/white{pixel_y = 4},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPu" = (/obj/structure/table,/obj/item/candle,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cPv" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cPw" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) @@ -7572,9 +7572,9 @@ "cPF" = (/obj/structure/stool/bed/chair,/obj/structure/sign/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cPG" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; icon_state = "map-right-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cPH" = (/obj/machinery/door/airlock/external{name = "Auxiliary Escape Airlock"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cPI" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/toxins/xenobiology) -"cPJ" = (/obj/structure/window/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 24; pixel_y = 24; req_access_txt = "55"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) -"cPK" = (/turf/simulated/wall,/area/toxins/xenobiology) +"cPI" = (/obj/machinery/smartfridge/extract,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/machinery/chem_heater{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPL" = (/obj/machinery/biogenerator,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cPM" = (/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/wheat,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/grapes,/obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod,/obj/structure/rack{layer = 2.8},/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/grapeseed,/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) "cPN" = (/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/rack{layer = 2.8},/obj/item/seeds/cornseed,/obj/item/seeds/cabbageseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/seeds/grassseed,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -7585,7 +7585,11 @@ "cPS" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar) "cPT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/starboardsolar) "cPU" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/space) +"cPV" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cPW" = (/obj/machinery/camera{c_tag = "Chapel Office - Backroom"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) +"cPX" = (/obj/structure/stool/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPY" = (/obj/machinery/embedded_controller/radio/access_controller{exterior_door_tag = "xeno_airlock_exterior"; id_tag = "xeno_airlock_control"; interior_door_tag = "xeno_airlock_interior"; name = "Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cPZ" = (/obj/machinery/camera{c_tag = "Secure Lab - Fore"; dir = 2; network = list("SS13","RD")},/obj/machinery/firealarm{dir = 2; pixel_y = 26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cQa" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) "cQb" = (/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1480; name = "Confessional Intercom"; pixel_x = -25},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cQc" = (/obj/machinery/door/morgue{name = "Confession Booth"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) @@ -7601,16 +7605,20 @@ "cQm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cQn" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cQo" = (/obj/structure/flora/ausbushes/fernybush,/obj/structure/flora/ausbushes/fullgrass,/obj/structure/flora/ausbushes/ppflowers,/obj/structure/flora/ausbushes/palebush,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/fancy/grass,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cQp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cQq" = (/obj/machinery/computer/secure_data,/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cQr" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cQs" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/weapon/restraints/handcuffs,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/device/radio/off,/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cQt" = (/obj/structure/sign/vacuum{pixel_x = 32},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"}) -"cQv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cQu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cQv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cQw" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/aft{name = "Aft Maintenance"}) "cQx" = (/obj/item/seeds/watermelonseed,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cQy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cQz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cQA" = (/obj/structure/stool/bed/chair/office/light{dir = 1; pixel_y = 3},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cQB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cQC" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitepurple"; tag = "icon-whitehall (WEST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cQD" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cQE" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cQF" = (/obj/machinery/door/airlock/centcom{layer = 2.7; name = "Crematorium"; opacity = 1; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) @@ -7638,11 +7646,13 @@ "cRb" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cRc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "red"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cRd" = (/obj/structure/table,/obj/machinery/newscaster/security_unit{pixel_x = 29; pixel_y = 1},/obj/machinery/camera{c_tag = "Departure Lounge - Security Post"; dir = 1; network = list("SS13")},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4; pixel_y = 4},/obj/item/device/taperecorder{pixel_x = 4; pixel_y = 0},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cRf" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cRe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cRf" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; tag = "icon-sink (WEST)"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cRg" = (/obj/item/seeds/moonflowerseed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cRh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cRi" = (/obj/item/seeds/berryseed,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cRj" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cRk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cRl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar) "cRm" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cRn" = (/obj/structure/closet/wardrobe/chaplain_black,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office) @@ -7667,12 +7677,16 @@ "cRG" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cRH" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/sign/electricshock{pixel_x = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cRI" = (/turf/simulated/wall,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cRM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology) +"cRJ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cRK" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cRL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cRM" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cRN" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/glowshroom,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRO" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/weapon/minihoe,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRP" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/ambrosiavulgarisseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRQ" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/watermelonseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) "cRR" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/seeds/berryseed,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/aft{name = "Aft Maintenance"}) +"cRS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cRT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/chapel/office) "cRU" = (/obj/machinery/door/airlock/centcom{name = "Chapel Office"; opacity = 1; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office) "cRV" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) @@ -7684,34 +7698,44 @@ "cSb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSd" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cSf" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/toxins/xenobiology) -"cSg" = (/turf/simulated/wall/r_wall,/area/toxins/xenobiology) +"cSe" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSf" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 3},/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSg" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1; name = "xenobiology air connector port"},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHWEST)"; icon_state = "whitepurple"; dir = 10},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSi" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = -32},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cSk" = (/obj/structure/closet/coffin,/obj/machinery/light/small{dir = 1},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/chapel/main) "cSl" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/chapel/main) +"cSm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSn" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSo" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cSp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/chapel/main) "cSq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) +"cSr" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cSs" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main) "cSt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "cSu" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main) "cSv" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "cSw" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) -"cSx" = (/obj/machinery/camera{c_tag = "Departure Lounge - Port Aft"; dir = 4; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{tag = "icon-plant-04"; icon_state = "plant-04"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) +"cSx" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cSy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSD" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=9.5-Escape2"; location = "9-Escape"},/obj/machinery/bot/secbot{auto_patrol = 1; health = 35; maxhealth = 35; name = "Inspector Johnson"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cSE" = (/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Aft"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/flora/kirbyplants{tag = "icon-plant-16"; icon_state = "plant-16"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cSG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology) -"cSH" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology) +"cSE" = (/obj/machinery/processor{desc = "A machine used to process slimes and retrieve their extract."; name = "Slime Processor"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSF" = (/obj/machinery/monkey_recycler,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSG" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSH" = (/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cSI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cSJ" = (/obj/structure/closet/coffin,/turf/simulated/floor/plating,/area/chapel/main) "cSK" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cSL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cSM" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cSN" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cSO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) -"cSP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Mortuary"; opacity = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) +"cSP" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cSQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) "cSR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) "cSS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) @@ -7722,20 +7746,24 @@ "cSX" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cSZ" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cTa" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cTb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cTc" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/camera{c_tag = "Xenobiology - Airlock"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cTd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology) +"cTa" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTc" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTd" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio3"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTg" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTh" = (/obj/machinery/door/window/eastleft{dir = 4; name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plating,/area/chapel/main) "cTi" = (/obj/structure/stool/bed/chair{pixel_y = -2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cTj" = (/obj/structure/stool/bed/chair{pixel_y = -2},/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cTk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cTl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cTm" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) -"cTn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Mortuary"; opacity = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) +"cTn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main) "cTp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "cTq" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) +"cTr" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTs" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main) "cTt" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/camera{c_tag = "Chapel - Starboard"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "cTu" = (/obj/structure/sign/vacuum{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) @@ -7745,15 +7773,34 @@ "cTy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cTz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cTA" = (/obj/structure/sign/vacuum{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cTB" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/access_button{command = "cycle_interior"; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = 8; pixel_y = -28; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology) -"cTC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cTD" = (/obj/structure/closet/l3closet/scientist,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology) +"cTB" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio8"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTC" = (/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTD" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #1"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio3"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTF" = (/obj/structure/closet/coffin,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/chapel/main) "cTG" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Chapel - Funeral Parlour"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) +"cTH" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #1"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTI" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTJ" = (/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cTK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) +"cTL" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cTM" = (/obj/machinery/door/airlock/external{name = "Departure Lounge Airlock"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cTX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/toxins/xenobiology) +"cTN" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #2"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTO" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #2"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTP" = (/mob/living/simple_animal/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTQ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "xenobio3"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTS" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTU" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTV" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTW" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTX" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTY" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cTZ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUa" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera{c_tag = "Secure Lab - Central"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUc" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cUd" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cUe" = (/mob/living/simple_animal/hostile/retaliate/bat{name = "Orlocke"; real_name = "Orlocke"; turns_per_move = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "cUf" = (/obj/machinery/door/window{dir = 4; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) @@ -7762,103 +7809,94 @@ "cUi" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main) "cUj" = (/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cUk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) -"cUr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/xenobiology) -"cUt" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cUl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUm" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner (WEST)"; icon_state = "warnwhitecorner"; dir = 8},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUn" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUo" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio7"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUp" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #3"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUq" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #3"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUr" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUs" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #4"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUt" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #4"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUu" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUv" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cUw" = (/obj/machinery/hydroponics/soil{pixel_y = 8},/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/main) "cUx" = (/obj/machinery/door/morgue{name = "Chapel Garden"; req_access_txt = "0"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/main) +"cUy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-warnwhitecorner"; icon_state = "warnwhitecorner"; dir = 2},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cUz" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) "cUA" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main) +"cUB" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cUC" = (/turf/simulated/floor/plating{icon_state = "warnplate"},/area/chapel/main) -"cUI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cUJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cUK" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cUL" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cUM" = (/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cUN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cUP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cUD" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUE" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUF" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUG" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUI" = (/obj/machinery/light{dir = 1},/obj/machinery/door_control{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = -24; pixel_y = 24; req_access_txt = "55"},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUJ" = (/obj/structure/window/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 24; pixel_y = 24; req_access_txt = "55"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUL" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUM" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #5"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUN" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #5"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUP" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #6"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUQ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUR" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #6"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cUS" = (/obj/machinery/door/poddoor{id = "chapelgun"; name = "Chapel Launcher Door"},/turf/simulated/floor/plating,/area/chapel/main) -"cUY" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/xenobiology) -"cVb" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/toxins/xenobiology) -"cVr" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology) -"cVv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cVw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cVx" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio8"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) -"cVz" = (/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVA" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #1"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio3"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVB" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #1"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cVC" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #2"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology) -"cVD" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #2"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio8"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVE" = (/mob/living/simple_animal/slime,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVG" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology) -"cVI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cVK" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/xenobiology) -"cVM" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVN" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/toxins/xenobiology) -"cVP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cVS" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio7"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) -"cVV" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #3"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio2"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cVW" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #3"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cVX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cVY" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #4"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology) -"cVZ" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #4"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio7"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cWc" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology) -"cWd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cWo" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cWp" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #5"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cWq" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #5"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cWr" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Scientist"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cWs" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen #6"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology) -"cWt" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen #6"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cWu" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cWw" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology) -"cWx" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cWy" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cWz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cWA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cWB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cWC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/xenobiology) -"cWE" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/engine,/area/toxins/xenobiology) +"cUT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUU" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUX" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cUZ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVa" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVb" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVc" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVd" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera{c_tag = "Secure Lab - Aft-Port"; dir = 4; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVg" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera{c_tag = "Secure Lab - Aft-Starboard"; dir = 8; network = list("SS13","RD")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVj" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVk" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVl" = (/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVm" = (/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Test Chamber Maintenance"; req_access_txt = "47"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVn" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/structure/window/reinforced{dir = 4},/obj/machinery/ignition_switch{id = "Xenobio"; pixel_x = -6; pixel_y = -2},/obj/machinery/door_control{id = "Xenolab"; name = "Test Chamber Blast Doors"; pixel_x = 4; pixel_y = -2; req_access_txt = "55"},/obj/structure/table/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVo" = (/obj/machinery/computer/security/telescreen{dir = 1; name = "Test Chamber Monitor"; network = list("Xeno"); pixel_x = 0; pixel_y = 2},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVp" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVq" = (/obj/machinery/door/window/southleft{dir = 1; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVs" = (/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/structure/table,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVt" = (/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVu" = (/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Test Chamber Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVv" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVx" = (/obj/machinery/shieldwallgen{req_access = list(55)},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVy" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVz" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVB" = (/obj/machinery/door/window/southleft{dir = 2; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVC" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVD" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVF" = (/obj/structure/disposaloutlet{dir = 2},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVG" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 10},/obj/item/device/electropack,/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVH" = (/obj/machinery/sparker{id = "Xenobio"; pixel_x = -25},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVI" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; unacidable = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVJ" = (/obj/item/device/radio/beacon,/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVK" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 5},/obj/item/stack/cable_coil,/obj/item/device/multitool,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVL" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVM" = (/obj/machinery/light{dir = 2},/obj/machinery/camera{c_tag = "Secure Lab - Test Chamber"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVN" = (/obj/structure/table,/obj/item/device/assembly/igniter{pixel_x = -5; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = 6},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = -1},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVO" = (/obj/item/device/radio/intercom{pixel_y = -25},/turf/simulated/floor/engine,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVP" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVQ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair,/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"}) +"cVT" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/toxins/xenobiology{name = "\improper Secure Lab"}) "cWF" = (/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cWH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cWI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cWJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cWK" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cWL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/xenobiology) -"cWN" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cWO" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cWP" = (/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Test Chamber Maintenance"; req_access_txt = "47"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cWQ" = (/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology) -"cWR" = (/obj/machinery/computer/security/telescreen{dir = 1; name = "Test Chamber Monitor"; network = list("Xeno"); pixel_x = 0; pixel_y = 2},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology) -"cWS" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/structure/window/reinforced{dir = 4},/obj/machinery/ignition_switch{id = "Xenobio"; pixel_x = -6; pixel_y = -2},/obj/machinery/door_control{id = "Xenolab"; name = "Test Chamber Blast Doors"; pixel_x = 4; pixel_y = -2; req_access_txt = "55"},/obj/structure/table/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology) -"cWT" = (/obj/machinery/door/window/southleft{dir = 1; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology) -"cWU" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) -"cWV" = (/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/structure/table,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology) -"cWW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology) -"cWX" = (/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Test Chamber Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cWY" = (/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cWZ" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cXa" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cXb" = (/obj/machinery/shieldwallgen{req_access = list(55)},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cXe" = (/obj/machinery/door/window/southleft{dir = 2; name = "Maximum Security Test Chamber"; req_access_txt = "55"},/obj/machinery/door/poddoor/preopen{id = "Xenolab"; name = "test chamber blast door"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXh" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/toxins/xenobiology) -"cXi" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXj" = (/obj/structure/disposaloutlet{dir = 2},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXk" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 10},/obj/item/device/electropack,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXm" = (/obj/machinery/sparker{id = "Xenobio"; pixel_x = -25},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXn" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; unacidable = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXo" = (/obj/item/device/radio/beacon,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXp" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 5},/obj/item/stack/cable_coil,/obj/item/device/multitool,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXq" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXr" = (/obj/machinery/light{dir = 2},/obj/machinery/camera{c_tag = "Xenobiology Lab - Test Chamber"; dir = 1; network = list("SS13","RD")},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXs" = (/obj/item/device/radio/intercom{pixel_y = -25},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXt" = (/obj/structure/table,/obj/item/device/assembly/igniter{pixel_x = -5; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 5; pixel_y = -4},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = 6},/obj/item/device/assembly/igniter{pixel_x = 2; pixel_y = -1},/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cXu" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cXv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cXw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair,/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cXx" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology) -"cXz" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/toxins/xenobiology) "cXA" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless,/area/space) "cXB" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area/space) @@ -7907,182 +7945,182 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaeaafaagaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaahaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaagaahaajaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaafaagaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaahaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaagaahaajaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaafaaeaagaagaaaaaaaaaaakaaaaaaaaaaagaafaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaahaahaaaaaaaaaaakaahaahaaaaahaahaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaalaalaalaalaalaahaamaahaalaalaalaalaalaahaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaalaalaalaalaalaahaamaahaalaalaalaalaalaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaaoaanaanaanaanaapaaraaqaasaasaasaasaataahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaagaahaauaauaauaauaauaahaaraahaauaauaauaauaauaahaagaaaaaaaaaaahaafaaeaafaahaahaahaaaaahaahaahaaaaahaahaahaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaahaaaaaaaahaaraaaaaaaaaaahaaaaaaaaaaafaahaahaahaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaawaavaaxaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaalaalaalaalaalaahaayaahaalaalaalaalaalaahaaeaaaaahaaaaaaaaaaaaaaaaaaaahaaaaazaazaaAaazaaAaazaazaaaaaBaaDaaCaaDaaEaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaagaagaagaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaaoaanaanaanaanaapaaraaqaasaasaasaasaataahaagaaaaahaaaaahaaaaaaaaaaaaaahaahaazaaFaaGaaHaaIaaJaazaahaaKaaDaaLaaDaaKaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaauaauaauaauaauaahaaraahaauaauaauaauaauaahaagaaaaahaahaahaaaaaaaahaahaahaaaaaMaaNaaOaaPaaQaaRaaSaaaaaTaaVaaUaaWaaTaaTaaTaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaahaaXaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeaaaaaaaaaaahaaaaaaaaaaaYaaaaaaaaaaahaaaaaaaaaaagaaaaaaaaaaahaaaaahaahaaaaaaaaaaazaaZabaabbabcabdaazaaaaaTabeabfabgabhabiabhabjabjaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaagaagaagaagaagaagaagaaaabkaaaaaeaagaagaagaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaalaalaalaalaalaahaaraahaalaalaalaalaalaahaaeaaaaaaaaaaahaahaahaaaaaaaazaaAaazaazabmablabnaazaazaaAaazaefaboaboaboaboaboaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaahaahaahaaaaaaabkaahaahaaaaahaahaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaaoaanaanaanaanaapaaraaqaasaasaasaasaataahaafaahaahaahaaaaaaaahaaaaazaazabpabqabrabsaaPabtabuabvabwaazabxaboabzabyabAaboaboaboaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaabBabBabBabBabBaahabCaahabBabBabBabBabBaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaauaauaauaauaauaahaaraahaauaauaauaauaauaaaaagaaaaaaaahaaaaaaaahaaaaazabEabFabGabGabHabIabJabKabLabMaazabNaboabOabDabQabPabSabRaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahabTabUabUabUabUabWabVabYabXabXabXabXabZaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaagaaaaahaaaaahaahaaaaaaacaaaaaaaaahaaaaaaaahaaaaaaaaaaaaaahaaaaazaaAaazaazaccacdabGaceacfacgachaciacjackaazaclacbacnacmacoacqacraboaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahacpacpacpacpacpaahabVaahacpacpacpacpacpaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaaaaaaaahaahaahaakaaaaaaaahaahaahaagaaaaaaaaaaaaaaaaaaaazacsacuacvaaPacwaaPacxacyaczacAacBabGabGaazactaboacDacCacFacEacHaboacIaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaafaagaagaagaafaagaagaafaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaahaaaaaaaahacGaaaaaaaaaaahaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaaaaaaaahaaaaakaaaaaaaahaaaaahaaaaaaaaaaaaaaaaahaahaazacJacLabGabGacMacNacOacPacQacRacSabGacTaazacKaboacVacUacWaboaboaboaaaaahaaaaahaahaahaahaahaaaaaaaahaaaaaaaaaaaaaahaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaacYacXacYaaKaaEaafaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahabBabBabBabBabBaahabVaahabBabBabBabBabBaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahadaacZacZacZadbaahaahaahaahaahaahaagaaaaazadcaaTaaTadeaaTadfaaTadgaaTaaTaaTadhaaTaazaddaboadjadiadladkaaaaahaahaahaahaahaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaacYadnadmadoadoadpaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaabTabUabUabUabUabWabVabYabXabXabXabXabZaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaahaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaahaaaaaMadqaaTadsabGadtadfaduadvadwaaTadxabGadyaazadraboadAadzadBadkaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahacXadCadDadFadEaavaaaaafaagaafaahaahaaaaaaaaaaaaaaaaaaaaaaaaaagaahacpacpacpacpacpaahabVaahacpacpacpacpacpaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaahaaaaahaahaakaahaahaaaaaaaaaaaaaaaaaaaazadHaaTadIabGadJadKadLadMadNaaTadOabGadNaazadGaboadQadPadTadkaaaaahaahadRadRadRadRadRaaaaahaaaaaaadSadSadVadUadXadSadSaaaaahaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaaaacYadWadYadoadoadZaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaahaaaaaaaaaabVaaaaaaaaaaahaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaahaaaaahaaaaaaaegaeaaegaahaaaaaaaaaaaaaahaahaazaaTaaTaebaecaaTadfaaTaedadfaaTaebaeeadfaazaehaboaekaejaeiaboaahaahadRadRaesaelaemadRadRaahaahadSadSaeqaenaeoaepaetadSadSaahaeraeraeuaeraeraahaahaahaahacYacXacYacXacXacXacYacXacXacXacYacYaevacYaexaewaewaeyaewaewaezaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaagaaaabBabBabBabBabBaahaeAaahabBabBabBabBabBaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaaaaegaeDaegaahaahaahaahaahaahaaaaeBaeFaeGaeHaeIaeJaeKaeLaeMaeNaeOaePaeQaeRaeSaeCaeTaeUaeVaeWaeEaahadRadRaeYaeZafaafaafbadRadRaahadSafcafdafeaffafgafhafiadSaahaerafjafkaflaeraaaaaaaaaaahacYafmacYafnafoafpacYafqafrafsacYaftafuafvaeXafxafxafxafxafxaeXaahaahaahaahaahaaaaaaaaaaaaaaaaagaahabTabUabUabUabUabWabVabYabXabXabXabXabZaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaegaegafBaegaegaaaaahaaaaaaaahaaaafwabbafFafGafHafIafJafKafLafMafNafOafPafQafRafLafSafTafUafFafwaahadRafyafXafzafZagaagbafAadRaahafCageagfaggaghagiagjagkafDaahaeuagnagoagpaeuaaaaheaheaheacYagragsagtaguaguagvaguagwagxagyagzagzagzaeXafxafxafxafxafxaeXaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaagaahacpacpacpacpacpaahabVaahacpacpacpacpacpaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaahaahagBagCagDagEagBaaaaahaaaaaaaahaahaazaazagFagGagHaazagIagJagIagKagKagKagKagKagLafEagNaaTagOagPaazaahadRafWafVagcafYagTagbagdadRaahaglagWagXagYagZahaagXahbaglaahaeragnahdagpaeraheaheahfahgacYacYacYahhahiahjahjahkahlahmahnahnahoahpaeXafxafxafxafxafxahracYacYacYaaaaahaaaaaaaaaaaaaaaaafaaaaaaaaaaahaaaaaaaaaabVaaaaaaaahaaaaaaaahaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahahsahsagmagmagmagmagmagBahwahxahyagBahzagAahzahzaahaahaahaazaazafwaazaazaazafwaazahCahDahEahFagKahGahHahIahJahJahJadRadRadRagMahLahMahNahOahPagQadRaahadSahRahSahTahUahVahWahXadSaahaeragnahdagpaerahYaheahZaiaahtahqacYaidahiahjaieaifaifaifaigahnaihaiiaijafxafxafxafxafxaikailaimacXaaaaahaahaahaahaahaahaagaahaahaahaahaahaaaaaaabVaaaaaaaaaaaaaaaaahaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaioaipagmairaisaitahuagBaivaiwaixagBagRahKahvahzahzaahaahaahaahaahaahaahaahaahaahagSaiDaiEaiDaiFaiGaiHagUahJaibaicaiLadRadRadRaiMaiNadRadRadRadRadRagVadSadSaiuaizahcaiBaiAadSadSagVaiUaiVaiWaiXaeraheaheaiYaiYaiZajaacYajbahiajcajdajeajeajfajgajhajiajjacXafxafxafxafxafxacXajlajmacXaaaaahaaaaahaaaajoajoajoajoajoajoajoaahaahaahabVaahaahaahaahaahaagaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahahsajpahsajqajrajsajtagBagBajuajvagBaiIajxajyaiJahzaahaaaaaaaaaaaaaaaaahaahaahaahahCagKagKagKagKajAahAajCahJaiKajEajzadRajGajHajIajJahBajBajMajDadRajOajPajQahQainajTaiyaiqajQajWajXaiUajYajZakaaerajFaiYaiYaiYaiYaheacYakcakdaiCakfakgakgakhajgajmakiajjacXafxafxafxafxafxacXajLaklacXaahaahaahaahaahajoakmaknakoakpakmajoaahaaaakqaiOakqaaaaaaaahaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaagmaktaksakuakvakwakxakyakzakAakBahzakkakDakEakCagAaahaahaahaahaahaahaahaheaheaheahCaiPaiQakIakJakKakLakMahJakFajEakNadRakPakQakRakSaiRakOakVakWaiSakYakZalaalbalcaldalealfalgalhaliaiTalkallalmaeralnaloalpalqalrahealsaltahialuajdalvajealwajgalxajialyalzafxafxafxafxafxalAalBalCaocajVaocaaaaahaaaajoalEalFakmalFalGajoaahaaaajkalIajkaaaaaaaahaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaahsalJahsalKalLalMalNahsalOalPalQalRalSalTalUakUahzaahalWalWagAalWalWaahahealXalXahCajnalZamaambamcamdameamfamgamhamgamiamjamjamkamlammamnamoamoampamqamramsamtamuamvamwamxamyamzamAamBamCamDamEaeramFaiYaiYamGaiaaheamHaltahiagzamIamJamKamLamMamNajiamOajwafxafxafxafxafxamQacYamRaocanQakrabjabjaahajoamSamTamUamVamWajoaahakqajkamYajkakqaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahahsamZanaanaanaanbancahsandaneanfahzalVanianhanjahzalWalWankanlakBalWaheaheajKannahCajNanpanqanransantanuahJanvanwanxadRajRanzanAajUajSanDanEanFahJanGanHanIamtanJanKanLanManNanOanPaiUaiUaoEaeraeraheaheaheanRaheaheaheanSanTagzagzanUanVanWanXanXanYamOajwafxafxafxafxafxamQaoaaobaocakraocaocajVaocajoaoeaofakmaogaohajoaahajkajkalIajkajkaahaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaagaahaauaauaauaauaauaahaaraahaauaauaauaauaauaahaafaahaahaahaahaafaaeaafaahaahaahaaaaahaahaahaaaaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaahaaaaaaaahaaraaaaaaaahaaaaahaaaaaaaagaaaaaaaahaaaaaaaahaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaahaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaalaalaalaalaalaahaayaahaalaalaalaalaalaahaaeaahaaaaahaahaahaahaaaaaaaahaaaaazaazaaAaazaaAaazaazaaaaahaahaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaagaagaagaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaaoaanaanaanaanaapaaraaqaasaasaasaasaataaaaagaaaaahaahaaaaaaaaaaaaaaaaahaahaazaaFaaGaaHaaIaaJaazaahaahaaaaaaaaaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaauaauaauaauaauaahaaraahaauaauaauaauaauaahaafaaaaaaaahaaaaaaaaaaahaahaahaaaaaMaaNaaOaaPaaQaaRaaSaaaaaaaawaavaaxaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaahaaXaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaeaaaaaaaaaaahaaaaaaaaaaaYaaaaaaaaaaahaaaaaaaahaaeaboaahaahaahaazaahaahaaaaahaaaaazaaZabaabbabcabdaazaaaaaBaaDaaCaaDaaEaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaagaagaagaagaagaagaagaaaabkaaaaaeaagaagaagaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaalaalaalaalaalaahaaraahaalaalaalaalaalaahaaaaboabfabfabfaazaaAaazaazaaAaazaazaazabmablabnaazaazaaAaazaaDaaLaaDaaTaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaahaahaahaaaaaaabkaahaahaaaaahaahaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaaoaanaanaanaanaapaaraaqaasaasaasaasaataahaaaaboabpabiadlaazabyabxacvabzabAabqabrabsaaPabtabuabvabwaazaaVaaUaaWaaTaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaabBabBabBabBabBaahabCaahabBabBabBabBabBaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaauaauaauaauaauaahaaraahaauaauaauaauaauaahaahaboabEabDabFaazabNabIabbaciaceabGabGabHabOabJabKabLabMaazabQabPabgaaTaaTaaTaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahabTabUabUabUabUabWabVabYabXabXabXabXabZaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaagaaaaahaaaaahaahaaaaaaacaaaaaaaaaaaahaaaaaaaahaaaaboabSabRacbaazaccaaTacdaciabGabbaceacfacgachaciacjackaazabeaclacmabhacoabhabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahacpacpacpacpacpaahabVaahacpacpacpacpacpaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaaaaaaaahaahaahaakaaaaaaaaaaahaahaahaahaaaaboacracqacsaazactaaTacwacuaaPaaPacxacyaczacAacBabGacCaazaefaazaazaazaazaazaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaafaagaagaagaafaagaagaafaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaahaaaaaaaahacGaaaaaaaaaaahaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaaaaaaaahaaaaakaaaaaaaaaaahaaaaaaaahaahaboacEacDacFaazaazaazacJacHacMacNacOacPacQacRacSabGacKaaTabQaaTacTacLacTaazaaaaahaaaaaaaaaaahaahaahaahaahaaaaaaaahaaaaaaaaaaaaaahaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaacYacXacYaaKaaEaafaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahabBabBabBabBabBaahabVaahabBabBabBabBabBaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahadaacZacZacZadbaaaaaaaahaaaaboacVacUacnacWaddadcaaTadeaaTadfaaTadgaaTaaTaaTadhaaTaaTadiaaTadkadjadqaaSaahaahaahaahaahaahaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaacYadnadmadoadoadpaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaabTabUabUabUabUabWabVabYabXabXabXabXabZaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaahaaaaaaaaaaakaaaaaaaahaaaaboadzadradBadAadGaeiadsabGadtadfaduadvadwaaTadxabGadyaaTadHaaTadQadPadTaazacIaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahacXadCadDadFadEaavaaaaafaagaafaahaahaaaaaaaaaaaaaaaaaaaaaaaaaagaahacpacpacpacpacpaahabVaahacpacpacpacpacpaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaahaaaaahaahaakaahaahaahaahaboadVadUaehadXaejaeiadIabGadJadKadLadMadNaaTadOabGadNaaTabeaaTaemaekaeqaazaaaaahaahadRadRadRadRadRaaaaahaaaaaaadSadSaeCaeBaeEadSadSaaaaahaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaaaacYadWadYadoadoadZaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaahaaaaaaaaaabVaaaaaaaaaaahaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaahaaaaahaaaaahaegaeaaegaahaaaaaaaboaeGaeFaeHaboaeUaeiaebaecaaTadfaaTaedadfaaTaebaeeadfaaTaefaaTadfaeVaebaazaahaahadRadRaesaelaeWadRadRaahaahadSadSafiaeoaenaepaetadSadSaahaeraeraeuaeraeraahaahaahaahacYacXacYacXacXacXacYacXacXacXacYacYaevacYaexaewaewaeyaewaewaezaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaagaaaabBabBabBabBabBaahaeAaahabBabBabBabBabBaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaahaegaeDaegaahaahaaaaboaboaboaboaboafHafGafIaeIaeJaeKaeLaeMaeNaeOaePaeQaeRaeSafJaeTagcafVaiNahMaahadRadRaeYaeZafaafaafbadRadRaahadSafcafdafeaffafgafhakMadSaahaerafjafkaflaeraaaaaaaaaaahacYafmacYafnafoafpacYafqafrafsacYaftafuafvaeXafxafxafxafxafxaeXaahaahaahaahaahaaaaaaaaaaaaaaaaagaahabTabUabUabUabUabWabVabYabXabXabXabXabZaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaegaegafBaegaegaahaahaahaahaahaahaaManhafLaunanjauwafMafKafLauxafNafOafPafQafRafLafSafTafUafFafwaahadRafyafXafzafZagaagbafAadRaahafCageagfaggaghagiagjagkafDaahaeuagnagoagpaeuaaaaheaheaheacYagragsagtaguaguagvaguagwagxagyagzagzagzaeXafxafxafxafxafxaeXaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaagaahacpacpacpacpacpaahabVaahacpacpacpacpacpaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaahagBagCagDagEagBaaaaahaaaaaaaaaaahaazaazagFagGagHaazagIagJagIaaTaaTaaTaaTauzagLafEagNavqagOagPaazaahadRafWafXayXafYagTagbagdadRaahaglagWagXagYagZahaagXahbaglaahaeragnahdagpaeraheaheahfahgacYacYacYahhahiahjahjahkahlahmahnahnahoahpaeXafxafxafxafxafxahracYacYacYaaaaahaaaaaaaaaaaaaaaaafaaaaaaaaaaahaaaaaaaaaabVaaaaaaaahaaaaaaaahaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahahsahsagmagmagmagmagmagBahwahxahyagBahzagAahzahzaaaaahaaaaazaazafwaazaazaazafwaazaazahDahEahFagKahGahHahIahJahJahJadRadRadRagMahLaBpahNahOahPagQadRaahadSahRahSahTahUahVahWahXadSaahaeragnahdagpaerahYaheahZaiaahtahqacYaidahiahjaieaifaifaifaigahnaihaiiaijafxafxafxafxafxaikailaimacXaaaaahaahaahaahaahaahaagaahaahaahaahaahaaaaaaabVaaaaaaaaaaaaaaaaahaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaioaipagmairaisaitahuagBaivaiwaixagBagRahKahvahzahzaahaaaaaaaaaaahaaaaaaaaaaahaahagSaiDaiEaiDaiFaiGaiHagUahJaibaicaiLadRadRadRaiMaCZadRadRadRadRadRagVadSadSaiuaizahcaiBaiAadSadSagVaiUaiVaiWaiXaeraheaheaiYaiYaiZajaacYajbahiajcajdajeajeajfajgajhajiajjacXafxafxafxafxafxacXajlajmacXaaaaahaaaaahaaaajoajoajoajoajoajoajoaahaahaahabVaahaahaahaahaahaagaahaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahahsajpahsajqajrajsajtagBagBajuajvagBaiIajxajyaiJahzaahaahaahaahaahaahaahaahaahaahahCagKagKagKagKajAahAajCahJaiKajEajzadRajGajHajIajJahBajBajMajDadRajOajPajQahQainajTaiyaiqajQajWajXaiUajYajZakaaerajFaiYaiYaFGaiYaheacYakcakdaiCakfakgakgakhajgajmakiajjacXafxafxafxafxafxacXajLaklacXaahaahaahaahaahajoakmaknakoakpakmajoaahaaaakqaiOakqaaaaaaaahaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaagmaktaksakuakvakwakxakyakzakAakBahzakkakDakEakCagAaahaaaaaaaahaaaaaaaaaaheaheaheahCaiPaiQakIakJakKakLaIoahJakFajEakNadRakPakQakRakSaiRakOakVakWaiSakYakZalaalbalcaldalealfalgalhaliaiTalkallalmaeralnaloalpalqalrahealsaltahialuajdalvajealwajgalxajialyalzafxafxafxafxafxalAalBalCaocajVaocaaaaahaaaajoalEalFakmalFalGajoaahaaaajkalIajkaaaaaaaahaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaahsalJahsalKalLalMalNahsalOalPalQalRalSalTalUakUahzaahalWalWagAalWalWaaaahealXalXahCajnalZamaambamcamdameamfamgamhamgamiamjamjamkamlammamnamoamoampamqamramsamtamuamvamwamxamyamzamAamBamCamDamEaeramFaiYaiYamGaiaaheamHaltahiagzamIamJamKamLamMamNajiamOajwafxafxafxafxafxamQacYamRaocanQakrabjabjaahajoamSamTamUamVamWajoaahakqajkamYajkakqaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahahsamZanaanaanaanbancahsandaneanfahzalVaniaIpaKiahzalWalWankanlakBalWaheaheajKannahCajNanpanqanransantanuahJanvanwanxadRajRanzanAajUajSanDanEanFahJanGanHanIamtanJanKanLanManNanOanPaiUaiUaoEaeraeraheaheaheanRaheaheaheanSanTagzagzanUanVanWanXanXanYamOajwafxafxafxafxafxamQaoaaobaocakraocaocajVaocajoaoeaofakmaogaohajoaahajkajkalIajkajkaahaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJaQxaaaaaaatJaaaatJaaaaaaaahaahaahaaaaaaaaaaaaaaaaahaaaaahaaaaahaaaahsaomaonaopaooaoqaorahsaosaneaotalWaouaotaotaotaovalWaowaoxaoyaozalWakbaoBaoCaoDaoHaoFaoGapAaoIaoJaoKaoSadRahBaoNahBadRadRakeaoQakeadRaoRaoTapBakjaoVanHaoWaoXamtaoYaoZapaapbanOapcapdapeapfapgaphapgapiapjapkaplapjapmapnapoappappapqaprapsaptaptaptapuajwafxafxafxafxafxamQapwapxaocaobapNareauVaqLajoakHakGapEakTakXajoaahapHapIapJapKapHaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJatJaahaahatJatJatJaahaaaatJatJaraatJatJaaaaahalWalWagAalWaahaaaaahaahaahaahaahalWagAahsahsapMatzarcahsahsahsaotapOalQapPalSapQapRaotapSalWalOapTapUalWalWapVapWapXapYahCahCahCagKagKapZaqaaoLaljaqcaqdaqeaqfaqgalDanDaqiadRanDakVamPahJaqkanHaqlaqmaqnaqoaqpaqqaqranOaqsaqtaqtajQajQajQajQaquaheaheaheaheaheaqvaqwaqxaqyaqzaqAaqBaqCaqDaqEaqFaqGaqHaqHaqHaqHaqHaqIaqJaqKaocapxapxapxapxarpajoaqMaqNaqOaqPalHajoaahapHaqRaqSaqTapHaaaaahaahaahabjaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxcrMaahatJaahcrMaahatJatJaahatJatJatJatJatJaaaaaaaaaalWaqUaqValWaqWaqXaqXaqXaqXaqXaqYalWaowaqZalWarEasaalOardasbalWarfargarhalWaouapTariarjarkalWalYapRarmalWarnapWahfaroascahearqahCarrarsansaqaameartaruarvarwarxaryarzarAarBaqjanDarDasdahJarFarGarHarIarJarKarLarMarLarNarOarParQarQarRarSajQaquahearTarUarVarWarWarWarWarWarXarYarZarWarWarWarWarWaseaocashasCasBaocaocapxaocatTasfasgapxaunasiasjaskaslasmasnajoajVapHasoaspasqapHaaaaahaaaaaaabjaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxcrMaahatJaahcrMaahatJatJaahatJatJatJatJatJaaaaaaaaaalWaqUaqValWaqWaqXaqXaqXaqXaqXaqYalWaowaqZalWarEasaalOardasbalWarfargarhalWaouapTariarjarkalWalYapRarmalWarnapWahfaroascahearqahCarrarsansaqaameartaruarvarwarxaryarzarAarBaqjanDarDasdahJarFarGarHarIarJarKarLarMarLarNarOarParQarQarRarSajQaquahearTarUarVarWarWarWarWarWarXarYarZarWarWarWarWarWaseaocashasCasBaocaocapxaocatTasfasgapxaKuasiasjaskaslasmasnajoajVapHasoaspasqapHaaaaahaaaaaaabjaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJaahatJaahatJatJatJaraaahaahaahatJatJaahaaaaahaahagAasrassastasuasvasvasvasvasvaswasxasyaszasAauvauRasvasDasvasEasFasGaheaheaheaheaheaheaheaheaheaheasHaheasIaheaheaheaheaheaheahCamXasKansaqaaoLaljasLasMasNasOasPasQasRasSajSasTasUasVakjasWasXasYasZataatbatcatdateatfatgaqtathatiathatjajQatkatlatmatnaiYarWatoatpatqatratsattatuarWatvatwatxarWaocaocapxaqJasfapwaocapxaocasBapxatyapxaocatAatBajoajoatCatDajoatEapHapHatFatGapHatHajVatHatHatIatHaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJatJatJatJatJaahatJatJaahcrMatJatJaahaahaahaahalWalWatKalWalWatLatMatMatMatMatMatNalWalWalWalWatOavbatPatPatPatPatQatRaheatSavcatUatVatWatXatYatZauaaubaucaudaheangaavaavaavanmahAaukaulansaumavdavgajSauoadRadRanBanyanoakjadRautanBahJahJajQanCauwauxanCajQaodanZajQaoiaqtaqtauBauBauBajQajQauCaheaiYauDauEarWauFauGauHauIauJauKauLauMauNauOauParWauQaocaxqauSauTauUaocauVaocaocaocauWaocaocauXauYauZajoajoajoajoauVapwapxavaazvatHaBwaBjaveatHaobatHaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJatJatJatJatJaahatJatJaahcrMatJatJaahaahaahaahalWalWatKalWalWatLatMatMatMatMatMatNalWalWalWalWatOavbatPatPatPatPatQatRaheatSavcatUatVatWatXatYatZauaaubaucaudaheangaavaavaavanmahAaukaulansaumavdavgajSauoadRadRanBanyanoakjadRautanBahJahJajQanCaLAaLaanCajQaodanZajQaoiaqtaqtauBauBauBajQajQauCaheaiYauDauEarWauFauGauHauIauJauKauLauMauNauOauParWauQaocaxqauSauTauUaocauVaocaocaocauWaocaocauXauYauZajoajoajoajoauVapwapxavaazvatHaBwaBjaveatHaobatHaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahatJatJatJatJatJatJatJatJatJatJatJavfatJaahcrMalWalWalWaBFavhalWaahaahaahaahaahaahaahaahaahaahaahalWankaviaotalOavjalOavkavlavmavnavoavpaheaheaheaokaojaojaojaolaheaheaoAaoOaoMaoPaoAahAahAagKavzavAameavBavBavCavDavBavEavBavDavBavFavBavEavGavHavIavDavJavKavBavBavBavDavBavLahCavMavNavNavNavNagKaquaheauEaiYaiYarWarWarWarWarWavOavPavQavRavSarWarWarWavTaocapwavUatyapxaocapxaocavVaocavWavXavYavZawaawbawcawdaweawfawgawhaweawiapxapxavUapxawjatIawkatIabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaahatJaraatJatJatJatJawlaahatJatJatJatJatJatJawmawnawmawoawpalWalWaahaaaaaaaaaaaaaaaaaaaaaaaaaahalWalWalWapRalOawqalOawrawsawtawuawvawwaheaaaaahaaaaaaaaaaaaaaaaahaaaaoUapyapvapCapzawCavNapDawEawFawGawHawHawIawGawHawJawKawGawLawMawHawNawOawPawHawQawRawSawTawTawUawVawWawXawYawZaxaaxbaxcaxdagKaquaheaxeahfaxfarWaxgaxhaxiatratsattaxjarWaxkatpaxlarWaxmaocaocaocauWaocaocapxaocaqKaocaxnatHatHatAaxoajoatHatHatHatHatHatHatHatHatHaoaatHatHatHatHatHaxpatHaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJatJatJatJatJatJatJatJatJatJatJaahatJatJatJaahalWalWalWaBHawwaotalWaaaangadoaavadoanmaahaahaahaahalWapFalWaxwasvasvasvaxxaxyalWaxzaxAaxBaheaaaaxCaxCaxCaxCaxCaxCaxCaaaaoAapLapGaqbaoAahAahAagKaxHaxIaxJaxKaxLaxMaxJaxPaxLaxIaxOaxNaxQaxRaxSaxTaxUaxVaxWaxXaxYaxZayaaxYaybaycaydayeayfaygayhayiayjagKaquaykaykaykaykaykauPaylaymaynayoaypauLayqayraysauFarWaqhaytayuayvaywayvayxayvayyayvayvayzayAayBayCayDayEayFayGayFayHayIayJayIayKatHatHatHayHayIayKayLayLayFaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahatJatJatJatJatJatJatJayMatJaahaahaahaahalWalOawwaouagAaaaaoAarlaqQarlaoAarCarCarCayUayUayUayUaxFayUayUayWayWayWayWayTayWayYaheaahaxCayXayVazaayZazbaxCaaaaoAasJasJaueaoAaaaaaaazgaufaziaugagKaufazlaugagKaufazoaugagKavyahAawxagKahAauhazuahAahAazxazxauiazzaujazxazxazBagKagKagKagKagKaquaykazCazDazEaykarWarWarWarWazFazGazHavRavSarWarWarWaocazIapwaoaapxapwazJapxatHatHatHatHatHazKazLazMazNazOazPazOazQazRazSazRazTayIazUayIazVazRazSazRayLazWazXaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahatJatJatJatJatJatJatJayMatJaahaahaahaahalWalOawwaouagAaaaaoAarlaqQarlaoAarCarCarCayUayUayUayUaxFayUayUayWayWayWayWayTayWayYaheaahaxCaRvayVazaayZazbaxCaaaaoAasJasJaueaoAaaaaaaazgaufaziaugagKaufazlaugagKaufazoaugagKavyahAawxagKahAauhazuahAahAazxazxauiazzaujazxazxazBagKagKagKagKagKaquaykazCazDazEaykarWarWarWarWazFazGazHavRavSarWarWarWaocazIapwaoaapxapwazJapxatHatHatHatHatHazKazLazMazNazOazPazOazQazRazSazRazTayIazUayIazVazRazSazRayLazWazXaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahaahaahatJatJatJatJaraatJatJatJazYatJatJatJatJaahaaaaahagAaviawwanfalWaaaaavasJaupasJaavarCaAcaAdayUaAeaAfaAgaAhaAiayUaAjaAkaAlaAmaAnayWayYaheaaaaxCazdazcaAoazeaApaxCaaaaoUauqasJauraoAausausaboaAxaAyaAzagKaAAaAyaAzagKaABaAyaAzagKaACaADaAEagKaAFaAGaAHaAIawyazxaAKaALaAMaANaAOaAPazBaAQaARaARaASaARaATaykaAUaAVaAWaykaAXaAYaAXarWaAZaBaaBbaBcaBdaBeaBfaBgayvaBhatHatHatHatHatHatHatHaBiaBIauuaBkaBlaBmaBnaBoayFayFayFaahaahaJzaBqazRazRazRazRazRaBraJzazRaBsayFayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahatJatJatJatJatJatJatJaahatJaahaahatJatJaahaahalWalWardawwalWalWaaaaoAasJasJasJaBLaBuaBvaBvaCTaBxaByaBzaBAaBBaBCaBDaBEaCVaBGaDHayWayYaheaaaaxCaAraAqaBJaAsaBKaxCaaaaoAauyasJasJauzaBOauAaboaBQaAyaBRagKaBQaAyaBSagKaBQaAyaBTagKaBUaBVaBWagKaBXaBYaBZaCaaCbazxaCcaCdaCeaCfaCgaChazBaCiapjapjapjaCjaCkaykaClaCmaCnaykaCoaCpaCpaCqaCraCsaCtarWarWarWarWarWaocaCuatHavqaCwaCxaCyavraCAaCBaCCaCCaCCaCCaCDaCEaCFavsaCHayFaCIaahaahaaaaaaaaaaahaahaaaaaaaahaaaatJazRayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaatJatJatJatJatJaahaahaahatJatJatJaafaaaaahaahaahalWalWalOalOaCJagAaaaaaaaavaupaupaupaavarCaCLaCMaCNaBxaBvaCOaCPavtayUaCRaCSaEhaCUaEsayWayYaheaahaxCaCWaCzaCYaCXaCZaxCaaaaoAavuavuavuaoAausaDeaboavvavxavwahCavvavxavwahCavvavxavwahCaxDazqayPahCahCauhazrahCaDnazxaDoaDpaDqaDraDsaDtazBaDuaheaheaheaDvaheaykaDwaDxaykaykaDyaDzaDAaDBaDCaDDaDEavRaDFaDGatxarWaFDaDIatHaDJaDKaDLaDLaDMawzazLaDOaDPaDQaDQaDQaDRaDSawAaDUawBaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahatJatJatJatJatJatJatJaahatJaahaahatJatJaahaahalWalWardawwalWalWaaaaoAasJasJasJaBLaBuaBvaBvaCTaBxaByaBzaBAaBBaBCaBDaBEaCVaBGaDHayWayYaheaaaaxCaAraAqaBJaAsaBKaxCaaaaoAauyasJasJaRxaBOauAaboaBQaAyaBRagKaBQaAyaBSagKaBQaAyaBTagKaBUaBVaBWagKaBXaBYaBZaCaaCbazxaCcaCdaCeaCfaCgaChazBaCiapjapjapjaCjaCkaykaClaCmaCnaykaCoaCpaCpaCqaCraCsaCtarWarWarWarWarWaocaCuatHaSuaCwaCxaCyavraCAaCBaCCaCCaCCaCCaCDaCEaCFavsaCHayFaCIaahaahaaaaaaaaaaahaahaaaaaaaahaaaatJazRayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaatJatJatJatJatJaahaahaahatJatJatJaafaaaaahaahaahalWalWalOalOaCJagAaaaaaaaavaupaupaupaavarCaCLaCMaCNaBxaBvaCOaCPavtayUaCRaCSaEhaCUaEsayWayYaheaahaxCaCWaCzaCYaCXaTEaxCaaaaoAavuavuavuaoAausaDeaboavvavxavwahCavvavxavwahCavvavxavwahCaxDazqayPahCahCauhazrahCaDnazxaDoaDpaDqaDraDsaDtazBaDuaheaheaheaDvaheaykaDwaDxaykaykaDyaDzaDAaDBaDCaDDaDEavRaDFaDGatxarWaFDaDIatHaDJaDKaDLaDLaDMawzazLaDOaDPaDQaDQaDQaDRaDSawAaDUawBaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDWaDXaDWaagaaaaahaaaaahalWaHcaFHakBawwalWalWaaaaoAauyawDaxraoAarCarCarCayUaEdaBvaEeaCPaEfayUaEgaHFaEiaEjaEkayWayYaheaaaaxCaDbaDaaDTaEmaxCaxCaaaaxsaxtaxtaxtaxuaEraxvaEraEtaEuaEtaEvaEtaEuaEtaEwaEtaEuaExaEyaEzaEAaEBaxEaAJaEEaDmahCavNazBaEGaEHaEIaEJaEKaELazBaEMaykaENaEOaEPaEQaEQaERaESaETaEUaEVaEWaEXaEYaEZaFaauLaFbaFcaFdaFearWaqKaDIatHaFfaFgaFhaFiaFjaFkaFlaDVaFnaFoaFoaFoaFpaFqawAaDUawBaaaaahaahaahaahaahaahaahaahaahaahaahaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaaaaDWaFsaDWaahaahaahaahaahalWavjaotaotaFtaFualWaaaaxsadoaxGadoaxuaahaahaaharCaFzaFAaFBaFCaHIayUaFEaFFaFGaIfaFIayWayYaheaaaaahaaaaDYaFLayNaaaaahaaaaErausausausaEraErayOaFOaExaFPaFQaFRaFSaFTaFTaFUaFTaFVaFSaFWaFXaFYaFZaGbaEFaGdaGcahCavNazBazBayQaGfazBaDZazBazBaDuaykaykaykaGhaGiaGjaGkaGlaGmaGnaGoaGpaGqaGraGraGsaGtarWarWarWarWarWaqJaDIatHaGuaGvaGwaGxaGyayRaGAaGBaGCaGDaGEaGFaGGaGHawAaDUawBawBaahaGKaaaaaaaaaaaaaGKaaaaaaaGKaahaahaahayFaGLaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaaaaDWaFsaDWaahaahaahaahaahalWaWhaotaotaFtaFualWaaaaxsadoaxGadoaxuaahaahaaharCaFzaFAaFBaFCaHIayUaFEaFFaWiaIfaFIayWayYaheaaaaahaaaaDYaFLayNaaaaahaaaaErausausausaEraErayOaFOaExaFPaFQaFRaFSaFTaFTaFUaFTaFVaFSaFWaFXaFYaFZaGbaEFaGdaGcahCavNazBazBayQaGfazBaDZazBazBaDuaykaykaykaGhaGiaGjaGkaGlaGmaGnaGoaGpaGqaGraGraGsaGtarWarWarWarWarWaqJaDIatHaGuaGvaGwaGxaGyayRaGAaGBaGCaGDaGEaGFaGGaGHawAaDUawBawBaahaGKaaaaaaaaaaaaaGKaaaaaaaGKaahaahaahayFaGLaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaahaaaaDWaDXaDWaDWaySaySaySaDWaDWaDWaDWaDWaGQaGRalWaaaaaaaaaaaaaaaaaaaaaaaaaaharCaGTaGUaGVaGWaGXayUaGYaGZayWayWayWayWaEaaheaHbaElazfaEnaHfazhazkazjaHbaEraHjaHkaHkaHlaHmaHnaHoaHpaHqaHraHsaHtaHuaHvaHwaHuaHxaHyaHzaHAaHBaHCazmaGPaHEaGSahCavNaHHazBaznaHJazBaHKaHLaplaHMaykaHNaHOaHPaHQaykaHRaHSaHTaykaHUaHVaHWaHXaHWaHYaHZaIaaIbaIcaIdarWapxaDIatHaIeazpaIgaIhaIiaCAaIjaIkaGCaIlayFayFaImbbLayFawBawBawBaahaaaaaaaaaaaaaaaaIqaaaaaaaaaaahaahaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaahaDWaDWaIraIsaItaIuaIuaIvaIwaIxaIyaIzaDWaDWawwalWaaaaaaaaaaaaaaaaaaaaaaaaaahayUayUayUazsaICayUayUaIDaIEaIFaIGaIHaIIaIJaIKaILaFJaINaGgaIOaINaIPaIQaIRaEraISaITaIUaIVaIVaztaIVaIVaIVaIVaIVaIVaIVaIVaztaIVaIXaIYaIZaJaaJaaJaaJbaJbaJbaJbaJbaJaaJcaJaaJdaJdaJdaJdaGMaJdaDuaykaykaykaJfaJgaykaJhaykaJiaykaJjaJkaJlavRaIAaJnaJoavRaJpaJqaJrarWaJsaJtatHayFayFayFayFayFaCAaJuaJvaGCaJwayFaJxaJyaJzaJAaJzaJBawBaahaaaaaaaahaahaahaahaahaaaaaaaahaahatJayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaDWaJCaJCaJCaIuaIuaIuaIuaIuaIuaJCaJCaJDaDWawwagAaaaaaaaaaaaaaaaaaaaaaaaaaahaahazwaJGaLbaJHaJIaJJaJKaJLaJMaJNaJOaJPaJQaJRaIIaJSaJTaJUaJVaJWaJXaJYaJZaKaaKbaKcaKdazyaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaazAaKfaKgaKhaJaaKiaKjaKkaKlaKmaKnaKoaKpaKqaJaaKraKsaKtaKuaKvaJdaKwaykaKxaKyaGiaJgaykaKzaykaKAaykaKBaKCaKDaKEaKEaKEaKEaKEaKEaKEaKEaKEaocaKFatHaKGaKHaKIaKJayFaKKaFgaJvaKLaKMaKNaKOaKPaKQaKRaKSaKTawBaahaGKaahaahaAaazZaAbaahaKUaaaaahaaaaraayFazXaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaDWaKVaIuaIuaIuaIuaIuaIuaIuaIuaJCaJCaJCaHaaKXalWaaaaaaaaaaaaaaaaaaaaaaaaaAtazwazwaLcaLdaLeaLeaLfaLgaLhaLiaLjaLkalWaLlalWalWalWalWaLmaLnaAuaLpaLqaAuaLnaLnaLnaLnaLraaaaaaaLsaLsaLsaLsaLsaLsaLsaaaaaaaIVaLtaLuaLvaLwaLxaKoaLyaLzaLAaLBaLCaLDaLEaJaaLFaLGaLHaLIaLJaJdaLKaykaykaykaLLaLLaykaykaykaykaykaLMaLNaLOaKEaLPaLQaLRaLSaLTaLUaLVaKEaLWaDIatHaKHaKHaLXaKRaLYaDKaLZaMaaMbaMcayFaMdaMeaMfaMgaMhaMiawBaahaaaaaaaahaAvaMkaAwaahaaaaaaaahaahatJayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaahaDWaMlaIuaIuaIuaIuaMmaIuaMnaIuaIuaJCaMoaDWaCJalWaaaaaaaaaaaaaaaaaaaaaaaaaJeaIMaJeaMwaMsaMtaMuaMvaNjaMxaMyaMzaMAaMBaMCaMDaMDaMEaMDaMFaLnaBpaMHaMIaMJaMKaMLaMMaMNaMOaMPaMQaMQaMRaMSaMTaMUaMVaMWaMWaMXaMYaMZaHyaKhaJaaNaaKoaNbaKoaNcaKoaNdaKoaKoaJaaNeaNfaLHaNgaNhaJdaNiaNkaPjaNOaNlaNmaNnaNoaNpaNqaNraNsaNtaNuaKEaNvaNwaNwaNwaNxaNyaNzaKEaNAaDIatHaNBaNBaNCaKRaLYaGvaNDaNEaNFaNGaNHaNIaNJaNKaNLaNMaKTawBaahaaaaNNaahaBMaBtaBNaahaahaGKaahaahaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaDWaJCaJCaJCaIuaIuaIuaIuaIuaIuaJCaJCaJDaDWawwagAaaaaaaaaaaaaaaaaaaaaaaaaaahaahazwaJGaLbaJHaJIaJJaJKaJLaJMaJNaJOaJPaJQaJRaIIaJSaJTaJUaJVaJWaJXaJYaJZaKaaKbaKcaKdazyaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaazAaKfaKgaKhaJaaXbaKjaKkaKlaKmaKnaKoaKpaKqaJaaKraKsaKtaXLaKvaJdaKwaykaKxaKyaGiaJgaykaKzaykaKAaykaKBaKCaKDaKEaKEaKEaKEaKEaKEaKEaKEaKEaocaKFatHaKGaKHaKIaKJayFaKKaFgaJvaKLaKMaKNaKOaKPaKQaKRaKSaKTawBaahaGKaahaahaAaazZaAbaahaKUaaaaahaaaaraayFazXaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaDWaKVaIuaIuaIuaIuaIuaIuaIuaIuaJCaJCaJCaHaaKXalWaaaaaaaaaaaaaaaaaaaaaaaaaAtazwazwaLcaLdaLeaLeaLfaLgaLhaLiaLjaLkalWaLlalWalWalWalWaLmaLnaAuaLpaLqaAuaLnaLnaLnaLnaLraaaaaaaLsaLsaLsaLsaLsaLsaLsaaaaaaaIVaLtaLuaLvaLwaLxaKoaLyaLzaXVaLBaLCaLDaLEaJaaLFaLGaLHaLIaLJaJdaLKaykaykaykaLLaLLaykaykaykaykaykaLMaLNaLOaKEaLPaLQaLRaLSaLTaLUaLVaKEaLWaDIatHaKHaKHaLXaKRaLYaDKaLZaMaaMbaMcayFaMdaMeaMfaMgaMhaMiawBaahaaaaaaaahaAvaMkaAwaahaaaaaaaahaahatJayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaahaDWaMlaIuaIuaIuaIuaMmaIuaMnaIuaIuaJCaMoaDWaCJalWaaaaaaaaaaaaaaaaaaaaaaaaaJeaIMaJeaMwaMsaMtaMuaMvaNjaMxaMyaMzaMAaMBaMCaMDaMDaMEaMDaMFaLnaZpaMHaMIaMJaMKaMLaMMaMNaMOaMPaMQaMQaMRaMSaMTaMUaMVaMWaMWaMXaMYaMZaHyaKhaJaaNaaKoaNbaKoaNcaKoaNdaKoaKoaJaaNeaNfaLHaNgaNhaJdaNiaNkaPjaNOaNlaNmaNnaNoaNpaNqaNraNsaNtaNuaKEaNvaNwaNwaNwaNxaNyaNzaKEaNAaDIatHaNBaNBaNCaKRaLYaGvaNDaNEaNFaNGaNHaNIaNJaNKaNLaNMaKTawBaahaaaaNNaahaBMaBtaBNaahaahaGKaahaahaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaySaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaNPaDWaDWaNQalWaahaaaaaaaaaaaaaaaaaaaaaaNRaNSaNRaNTaMsaNUaNUaNVaNUaLhaNWaNXaNYalWalWalWalWalWalWawwaLnaNZaOaaObaOcaOdaOdaOdaOeaLraaaaLsaBPaOgaOgaOgaOgaOgaCvaLsaaaaIVaOiaIYaIZaJaaOjaOkaOlaKoaOmaKoaOnaOoaKoaOpaOqaOraOsaOtaOuaJdaOvaOwaOxaOxaOxaOyaOzaOzaOAaOAaOBaOCaODaOEaKWaOGaOHaOHaOHaOIaOJaOKaKEaOLaDIatHaNBaOMaONaOOayFaOPaFgaOQaGCaORayFaOSaOTaOUaOUaOUaOVawBaahaaaaaaaahaahaahaahaahaaaaaaaahaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaavaaxaaaaySaIuaIuaIuaIuaIraIuaPaaPbaPbaPcaPdaDWankawwalWaahaaaaaaaaaaaaaaaaaaaaaaAtazwazwaCGaMsaPhaPGaPiaRTaPkaPlaPmaPnaCKaPpaPqaPraPsalWaPtaLnaPuaOaaPvaPwaPxaPxaPyaPzaLraaaaCQaPBaOgaPCaPDaPEaOgaPFaCQaaaaIVaIXaIYaIZaJaaPHaPIaPJaPKaPLaPKaPMaPNaPOaJaaDdaDcaPRaPSaPTaJdaDfaPVaPWaPXaPYaPZaQaaQbaQcaQdaQeaQfaQgaQhaQiaQjaQkaQlaQmaQnaQoaQpaKEapwaDIatHayFayFayFayFayFaCAaQqaQraQsaQtayFayFaImbbLayFawBawBawBaQwaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaaDaaCaaDaaEaDWaIuaIuaIuaIuaIuaIuaIuaIuaIuaQAaDgaDWarfaQCalWaaaaaaaaaaaaaaaaaaaaaaDhaNRaQDaNRaNTaMsaNUaNUaNVaNUaLhaLiaQEaQFaQGaQHaQIaQJaQKalWaQLaQMaQNaOaaOaaQOaQPaOaaQQaQRaLraaaaDiaDjaQUaQVaQWaQVaQUaQXaDkaaaaIVaIXaQZaRaaJaaDlaDlaDlaDlaReaDlaDlaDNaDlaJaaJdaMpaRiaMqaJdaJdaRkaPVaPXaPYaRlaRmaPVaPWaPYaPYaPXaRnaRoaRpaTyaRraOHaOHaRsaOIaRtaRuaKEaRVaRwatHaEbaRyaEoaEcaRBaRCaFgaOQaGCaRDaGEaEpaRFaRGawAaDUawBawBaahaGKaaaaaaaGKaaaaaaaaaaaaaGKaahaahaahayFaGLaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaRIaRIaRIaRIaRJaRIaRIaRIaRIaRJaRIaRIaRIaRIaRJaRIaRIaRIaRIaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKaaDaaLaaDaaKaDWaMlaJCaIuaIuaIuaIuaIuaRLaIuaRMaEqaDWaROaxxalWaaaaaaaaaaaaaaaaaaaaaaaaaRPaRQaRPaTzaMsaNUaRSaUfaRUaURaRWaLhaECaRYaRZaSaaSbaScalWaSdaLnaSeaOaaOaaSfaEDaShaQQaFmaLraaaaLsaSjaSkaQUaSlaOgaSmaSnaLsaaaaIVaSoaLuaLvaSpaSqaSraSraSraKqaSraSraSsaStaJaaSuaSvaSwaSxaSyaSzaSxaSAaSBaSBaSCaSDaSEaSFaSGaSHaSIaSFaSJaSKaKEaSLaSMaSNaSOaSPaSQaSRaKEapxaSSatHaSTaSUaSVaFraSXaSYaSZaTaaTbaTcaTdaTdaTeaTfawAaFvawBaThaahaahaahaahaahaahaahaahaahaahaahaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaTiaTjaTkaTkaTkaTlaTkaTkaTkaTkaTmaTkaTkaTkaTkaTnaTkaTkaTkaToaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaTqaaVaFwaaWaTqaDWaIvaJCaTuaTvaTwaIuaIuaIuaIuaRMaRNaDWawwaotagAaaaaaaaaaaaaaaaaaaaaaaaaaAtazwazwaUSaMsaNUaNUaNVaNUaLhaRWaFxaFyaRYaTBaTCaTDaTEalWawpaLnaTFaTGaTGaTHaTIaOaaQQaTJaLraahaLsaLsaLsaTKaTLaTMaLsaLsaLsaahaIVaLtaTNaIZaTOaTPaSraSraSraTQaSraSraTRaKqaTOaNlaTSaTTaTUaPWaFKaPWaPVaPXaPWaTWaPWaTXaPXaPYaPWaPYaPXaTYaTZaKEaUaaUbaUcaUdaUeaLUaNzaKEaUTaDIatHaUgaUhaUiaUjaUkaUlaUmaUnaUoaUpaUqaUqaUraUsawAaDUawBaaaaaaaahaaaaaaaaaaaaaahaaaaaaaUuaaaaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUxaUyaUyaUzaUyaUyaUyaUyaUAaUyaUyaUyaUyaUzaUyaUyaUBaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKaaDaaLaaDaaKaDWaMlaJCaIuaIuaIuaIuaIuaRLaIuaRMaEqaDWaROaxxalWaaaaaaaaaaaaaaaaaaaaaaaaaRPaRQaRPaTzaMsaNUaRSaUfaRUaURaRWaLhaECaRYaRZaSaaSbaScalWaSdaLnaSeaOaaOaaSfaEDaShaQQaFmaLraaaaLsaSjaSkaQUaSlaOgaSmaSnaLsaaaaIVaSoaLuaLvaSpaSqaSraSraSraKqaSraSraSsaStaJaaZtaSvaSwaSxaSyaSzaSxaSAaSBaSBaSCaSDaSEaSFaSGaSHaSIaSFaSJaSKaKEaSLaSMaSNaSOaSPaSQaSRaKEapxaSSatHaSTaSUaSVaFraSXaSYaSZaTaaTbaTcaTdaTdaTeaTfawAaFvawBaThaahaahaahaahaahaahaahaahaahaahaahaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaTiaTjaTkaTkaTkaTlaTkaTkaTkaTkaTmaTkaTkaTkaTkaTnaTkaTkaTkaToaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaTqaaVaFwaaWaTqaDWaIvaJCaTuaTvaTwaIuaIuaIuaIuaRMaRNaDWawwaotagAaaaaaaaaaaaaaaaaaaaaaaaaaAtazwazwaUSaMsaNUaNUaNVaNUaLhaRWaFxaFyaRYaTBaTCaTDbazalWawpaLnaTFaTGaTGaTHaTIaOaaQQaTJaLraahaLsaLsaLsaTKaTLaTMaLsaLsaLsaahaIVaLtaTNaIZaTOaTPaSraSraSraTQaSraSraTRaKqaTOaNlaTSaTTaTUaPWaFKaPWaPVaPXaPWaTWaPWaTXaPXaPYaPWaPYaPXaTYaTZaKEaUaaUbaUcaUdaUeaLUaNzaKEaUTaDIatHaUgaUhaUiaUjaUkaUlaUmaUnaUoaUpaUqaUqaUraUsawAaDUawBaaaaaaaahaaaaaaaaaaaaaahaaaaaaaUuaaaaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUxaUyaUyaUzaUyaUyaUyaUyaUAaUyaUyaUyaUyaUzaUyaUyaUBaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaTqaUDaUEaUFaUGaDWaUHaJCaUIaFMaUKaJCaJCaJCaULaUMaUNaDWaUOaUPalWaahaaaaaaaaaaaaaaaaaaaaaaahaahazwaUSaWaaMtaMuaYQbaGaZJaUUaUVaUWaUXaUXaUXaUXaUXalWaUYaUZaVaaVbaVbaVcaVdaVeaVfaVgaFNaaaaaaaaaaLsaLsaViaLsaLsaaaaaaaaaazAaKfaVjaIZaXWaVkaVlaVmaVnaKqaKqaVoaVpaKqaXWaNlaVqaVraVsaVtaVuaVtaVvaVwaVxaVyaVtaVtaVtaVtaVtaVtaVzaVAaVBaKEaKEaKEaKEaVCaKEaKEaKEaKEaocaDIatHaVDaVEaVEaEcaVGaVHaVIaVJaVKaVLaVMaVNaVOaVPavsaVQayFaaaaahaahaaaaaaaaaaaaaahaaaaaaaahaahatJazRayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUCaaaaaaaUzaaaaaaaaaaaaaUAaaaaaaaaaaaaaUzaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaTqaTqaVSaVTaTqaTqaTqaVUaTqaTqaVVaVWaTqaTqaTqaVXaTqaTqaVYalWalWaahaaaaaaaaaaaaaaaaaaaaaaahaahaVZbaHaMsaNUaNUaNVaNUaLhaWbaLhaWcaUXaWdaWeaWfaWgalWawwaLnaWhaWiaWjaWkaWlaGaaWnaWoaLraWpaGeaWpaWraGzaWtaWuaWraWpaGeaWpaIVaWvaWwaWxbcgaJaaJaaJaaJaaWyaWzaWAaKqaWBaJaaNlaWCaPZaWDaWEaWEaWEaWEaocaocaocaWFaWGaWHaWIaWJaHGaWEaWKaWKaocaWLawgaweaWMaweaWNaweaWOaweawiatHaWPaWPaWPaWPaWQaWRaWSaWTaWUaGIaWWaFgaWXaWYayFayFayFaahaahaGJaWZazRazRazRazRazRazRaGJazRaGNayFayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUCaaaaaaaUzaUzaUzaUzaUzaUAaUzaUzaUzaUzaUzaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaGOaXbaXcaXdaXeaXfaXcaXgaXhaXiaXhaXjaXkaXhaXlaJmaTVaXoaXpalWaaaaaaaaaaaaaaaaaaaaaaaaaahaVZaHdaUSaMsaNUaNUaHeaHgaLhaXsaXtaXuaXvaXwaXxaXyaXzalWawwaLnaLnaLnaAuaAuaHhaLraXDaXEaLraXFaXGaXHaWraXIaXJaXKaWraXLaXMaXNaXOaXPaXQaXRaXSaXTaXUaXVaJaaJaaXWaXXaXWaJaaJaaFKaYaaYbaFKbcTaYcaYdaYeaYfaYgaocaocaocaocaYhaocaocaocaocaocaocaDIapwapxaYiaYiaYiaYiaYiaYiaYiaWPaYjaYkaYlaWPaHiaYnaWPaYoaYpaCAaCAaYqaYraYsazOaYtazOaYuazRaYvazRayHayIaYwayIayKazRaYvazRayLazWazXaahaahaagaagaafaahaafaagaagaafaafaagaagaagaafaahaahaahaahaahaQxaTiaYxaYyaYyaYyaYyaYyaYzaYzaYzaYAaYzaYzaYzaYyaYBaYyaYyaYyaYCaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaHDaYEaYFaYFaYGaYFaYFaYFaYHaYIaYJaYKaYLaYLaYLaYMaYNaYOaYPalWaaaaaaaahaahaaaaaaaahaahaahaVZbgqbgjbiRaYRaNUbjwaInaYUaYTaYVaYWaYXaYYaYZaZaaZbalWaZcaZdaZeaZfaZgaZhaZiaZjaZkaZlaZmaZnaZoaZnaZpaZqaZraZsaZtaZnaZuaZvaZwaZxaZyaZzaZAaZBaZCaZDaZDaZDaZEaZFaZDaZDaZGaZDaZHaZIaZDaZDaZDaZKaZLaocaZMaZNaZOaZPaZQaZRaZQaZSaZQaZTawhaWOawiaqJapxaYiaZUaZVaZWaIpaIoaZZaWPbaababbabbacbabbadaWPbaeaWUbafbagbagbagbagbagbahayFbaiayIbajayIazVayFayFayFbaiayIazVayLayLayFaahaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUCaaaaUzbakbakbalbambanbaobapbambaqbakbaraUzaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDbauaHDaTqaHDbawaHDaYEaYFbaxbayaHDbawaHDbazbaAbaBbaCalWalWalWalWagAagAagAalWalWalWaVZbkHbaJbaJbaJbaJbaKaNUbaLbaMbaNbaOaUXaUXaUXaUXaIBalWalWbaQalWalWbaRbaSbaTbaUbaVbaWbaXbaUbaVbaYbaZbaWbbabaUbaUbaUbbbbbcbbdbbebbfbbgbbhbbibaUbaUbaUbaUbbjbbkbaUbaUbaXbblbbmbaUbaUbaUbaUbbnbbobbpbbpbbpbcnbbpbbpbbpaocbbqaocaDIaocaocbbrbbrbbrbbrbbsbbtbbtbbubbvbbwaWPbbxbbyaIWbbAbbBbbCaWPbbDbbEbbFbagbbGbbHbbIbagbbJayFayFayFayFayFayFayFbbKayFayFayFayFayFbbLayFaahaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaQxaQxaQxaQxaTiaUwaUCaaaaUzbakbanbbMbbNbbObbPbbQbbNbbRbanbaraUzaaaaVRaUwaUCbbSbbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaahaaaaahaaaaHDbbUaHDbbVbbVbbWbbXaHDbbUaHDaHDaTqbbZbcabcbasuasvbccasvbcdasvbcebcfaswbeqbchaJEaJEaJFaKYaKebcmbkIbcobcpbcqbcobcrbcsblvbctbcubcvbcwbcxbcybczbcAbcBbcCbcCbcDbcEbcFbcGbcHbcIbcJbcKbcKbcKbcKbcKbcKbcKbcLbcMbcNbcNbcNbcNbcNbcNbcNbcNbcObcPbcQbcRbcNbcSbcObcNbcNbmTbcUbcVbbpbcWbcXbcYbcZbdabbpbdbbdcaocbddaocaaabbrbdebdfbbrbdgbdhbdibdjbdkbdlaWPbdmbdnbdobdpbdqbdraWPbdsbdtbdubagbdvbdwbdxbagbdyaKRaKRbdzaKRbdAaKRaKRaKRbdBaKRbdCbdDbdCbdDabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaRJbdEaUwaUCaaaaUzbakbdFbdGbakbdHaKZbdJbakbdKbdLbaraUzaaaaVRaUwbdMaaabbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaaaaHDbawaHDaHDaHDaHDaHDaHDbawaHDaaaaTqbdQbdRbdSbdSbdSbdSbdSbdSbdSbdSbdTaLabcobcoaLoaMraLobcobcobcobdYbcobdZbeabebbecbedbeebefbegbehbeibejbcybekbcAbelbembembenbembeobembgbbeRbgbaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGbeubeubevbeubeubeubeubeubeubewbcAbexbbpbnjbezbeAbeBbeCbbpbeDbeEaocaDIajVaaaaOfbeGbeHbeIbeJbeKbeLbeMbeNbeOaWPbePaOhaOFaOFaOXaOWaWPbeUbeVbeUbagbeWbeXbeYbagaOYayFayFayFayFayFayFayFayFayFawBayFayFbahayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaQxbfbbfcbfdbfeaUzaUzaUzbakbffbfgbfhbakbakbakbfibfjbfkbaraUzaUzaUzbflaToaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaOZaPeaOZaavaOZaOZaavaOZaPeaPfaaxaTqbdQbfsbftbfubfvbfwbfxbfybfzbdSbfAbfBbfCbfDbnsbfEbnsbfEbfGbfEbfHbcobfIbfJbfKbfLbfMaPgbfObfPbfQbfRbfSaPobfUbfVbfWbembfXbfYbfZbgabembhobgcbhraahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbeubgdbgebgfbggbghbgibnVbeubgkbglbgmbbpbgnbgobgpboqbgrbbpaocaocaocbgsaocaaabbrbgtbgubbrbgvbgwbgxbgybgzbgAaWPbgBaPAbgDbgEbgFbgGaWPaCAbgHaCAbagbgIbgJbgKbagbgLbgLbgLaaKaaEaaaaaaaaaaaaaahaaaaaaayFbdDayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaRIaRIbgMbgNaUwbgObgPaaaaaaaUzbgQbgRbgSbakbakbgTbakbakbdKbgUbgVaUzaaaaaabgWaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaOZaOZaPPboGasJaPQaQuaPUaQyaQvaQzasJaQSaQBaHDbdQbdRaQTbhibhjbhkbhlbhmbhnbhMbhpbhqbhNbhsbhsbhtbhubhvbcobcobcobcobhwbhxbhybhzbhAaLobhCbegbehbhDbhEbhFbhGbcAbhHbembhIbhJbhKbhLbhObiQbiqbjAaahaahaQYaRcaRbaRdbhUaRfaRcaRdbhUaRfaRbaRbaRgaahaahbeubhZaRhbibbicbibbidbiebeubifbcAbigboHbbpaRjbiiaRqbbpbbpbikbilaocbinaocbimbbrbbrbbrbbraYiaYiaYibiobipaYiaWPaWPaWPaWPaWPaRxaRvaWPbisbitbisbagaRzbivaRAbagbiyaRHaREaOZaOZaaxaaaaaaaaaaahaaaaaaaaaabjaaaaahaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahabjbiCbiDbiEbiDbiFaUCaaaaaaaaaaUzbiGbanbiHbiIbiJbiKaRKbiIbiMbanbaraUzaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoAaRRaRRaaDasJaSgaRXaSgaRXaSgaRXaSgasJaSWaSiaHDbdQbiUbdSaTgbiWbiXaTrbiZaTsbdSbjbbjcbjdaTtbjfbjgbjhbjibjjbjkbjlbjmbjnbjobjpbjqbjrbjsbjtbjubjvboPbjxbjybfUbcAbjzbemaTxbjBbjCbjDbemblnbjFbhraahaahaTAaUJaUtaVhaUQaWmaVFaWsaWqaXmaWVaYSaXaaahaahbeubjTbjUbjVbjWbjXbjYbjZbeubewbkabkbbkcbkdbkebkdbkfbkgbkhbkdbkdbkdbkibkdbkjbkkbklbkmbkdbkdbknbkjbkfbkibkobkpbknbkqbkrbksaXqaXnaXrbkwbkxbkybkzbkAbkBbkCaXAbkEbkEaXBadFadEaavaaaaaaaaaaahaaaaaaaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahabjbiCbiDbkJbiDbkKaUCaaaaaaaaaaUzbkLbkMbalbkNbkObkPbkQbkRbkSbakbaraUzaUzaUzaUzbkTaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavasJasJaPeasJaSgaRXaSgaXCaSgaRXaSgasJaSWaSiaHDbkWbkXboQbkYbkZaXZaXYaXZbftbftblcbldbdYbcobleblfblgblhblibljaYmbcobllblmblibhzblxbcobloblpblqblrblsaPobhGbcAbhHbembltbluboRblwbembmnblybhrbhUaYDbhUaZYaZXbatbasbatbavbatbasbatbaDbbzbhUaYDbhUbeublHblHblHblIblJblKblLbeublMblNblOblPblQblRblQblSblQblTblQblQblQblUblQblVblWblXblYblQblQblZbmabmbblUbmcblUbmdbmebmfbksbmgbmhbmhbmibmjbmhbmhbmkbmlbmmbaEbkEbkEbaFaOZaOZbaIaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbmqaaaaaaaaaaahbgPbgPbgMbmraUwaUCaaaaaaaaaaUzaUzbiGbakbakbakbmsbakbakbakbakbmtaYBbmuaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoAaupaupaaDasJaSgaRXaSgaRXaSgaRXaSgasJaSWaSiaHDbmwbmxbmybmzbmAbmBbmBbmCbmDbmzbmEbmFbmGbcobaPbmIbmJbmKbmLbmMbmNbcobmObmPbmQbmRbmSbcoboYbmUbmVbmWbmXbcybmYbglbmZbnabnabnabnabnabgbbncbnbbndbnebbYbbTbcibasbasbasbasbcjbasbasbasbasbclbckbeSbhUbnmbnnbnobnpbnqbnrbnrbntbeubnubnvbnwbnxbnybnzbnybnAbnybnBbnybnybnCbnybnybnDbnEbnybnFbnCbnGbnHbnDbnAbnybnIbnJbnKbnLbnMbdIbnObnPbnQbnRbmmbnSbnSbnTbnUbpgbplbksbksbksaaKbnWaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaabnXbnYbnZboabobbocbodboeaUwaUzaUzaUzaUzaUzbofbogbofbofbohboibohbojbojbokbolbomaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdNaOZaOZaPPbdOasJbdPasJbdUbdVasJbdWasJaQSbdXaHDbdQboubovbowboxboybozboAboBbowboCboDboEbcoberaLobqLbesbcobcobcobcobcoaLoboJbetbcobcoaPoboLboMaPoaPoboNbaRbcAbtbbnabeybeQbeFbnaboVboXboWbpibhUbeZbeTbfmbfabfobfnbfqbfpbfnbfnbfrbfabfNbfFbhhbhUbeublHblHblHbtdblHblHblHbeubpmbcAbpnbpobfTbpqbfTbpobpjbpjbpjbpjbpjbpjaocaocbpsaocaocaocbptbpuaocaocaocbpvaocbpwbpxbpybpzbpAbpBbpCbpDbnSbgCbgXbpGbnUbpHbgLbksbgZbgYbhabpKbpLbpLbpMbpNaahaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaabnXbpObpPaaaaahbpQbpRbpSbpTbpUbpVbofbpWbpXbpYbpZbqabqbbofbqcbqdbqebqfbqgbqhbqhbqiaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdNaOZbhbaOZaavaOZaOZaavaOZaPebhcbaIaTqbqkbqlbqmbcybqnbqobqpbqobqqbcybqrbqsbqtbqubqvbqwbqxbqybqzbqwbqAbqBbqwbqvbqvbqCbqvbqDbqEbqFbqGbqHbqvbqIbqJbqKbhHbhebhdbhgbhfbnabhrbhrbhrbhrbhUbhPbhBbhRbhQbhTbhSbasbhVbhXbhWbhYbhQbihbiabiPbiObeubrebrfbrgbrhbriblHbrjbeubrkbcAbrlbijbrnbrobrpbpobpkbqMbprbqQbqNbqSbtebrxbryaocbrzbrAbrBbrCbrDaocatEbrEaocbrFbrGbrHaXAbrJbrJbrJbrKbrLbnSbnSbrMbrNbrObrPbrQbrRbirbiubrTbrUbrUbrVbrWbrXbrXbrXbrYbrXbrXbrXbrXbrXbrXbrYbrXbrXbrXbrXbrXbrXbrYbrXbrZbsabrUbrUbrUbsbbscbsdbsebsebsfbsgbshbsibsjbskbslbsmbsnbsobspbsqbsrbssbstbsubsvbswaYyaYybsxaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaHDbawaHDaHDaHDaHDaHDaHDbawaHDaaaaTqbsAbsBbsCbcybsDbsEbsFbsEbsGbcybsHbsIbsJbsKbqTbsMbsNbsKbsKbsObsPbsQbsRbsKbsKbsSbsKbsKbsKbsTbsUbsVbsVbsWbsXbsYbsZbnabiwbizbixbnabiAbiLbiBbiNbthbhYbiSbhTbiTbiYbiVbqVbjabqVbjebjNbjMbjPbjObjRbjQbeubtubtvbtwbtxbtybeubeubeubewbtzbtAbpobtBbtCbtDbpobqUbqXbqWbrrbrqbrtbtKbtLbtMbtNbtObtPbtQbtRbtSbtTbtUbtVaocbpwbtWbtXbksbtYbtZbjGbjEbucbudbvebufbugbnUbuhbuibujbjHbjIaTpaaaaaabulbpPaahaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaabumbunbpNaaaaahaVRbuobupbuqburbjJbutbuubuvbuwbuxbuybjKbuAbuBbuCbjLbuEbuFbqhbuGbuHaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaahaaaaahaaaaHDbuIaHDbuJbuKbbVbuLaHDbuIaHDaHDaTqbdQbuMbuNbcybuObsEbuPbsEbuQbcybuRbuSbuTbuUbuVbuWbuXbuYbuZbvabvbbvcbuVbuVbuVbvdbuVbvtbvfbuXbvgbuVbuVbvhbvibvjbsZbnabvkbvlbvmbvnbvmbvobvmbvmbthbkGbkFbvrbvrbvrbvRbxgbvubvvbxlbvrbvrbvrblFblGbhUbeubvzbvAbvBbvCbvDbeubrubtkbvGbvHbtAbfTbvIbvJbvKbpobtEbtGbtFbtHbpjbpjaocaocbvPaocaocaocbvQbxmaocaocbvSbvTaocbvUbtWbvVbksbgLbgLbgLbgLbtIbgLbgLbvXbvYbvZbksbksbwabjSbktbwcaaabnXbwdaaaaahaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaabumbunbpNaahbwebwfbwgbwhbwibkubofbkvbwlbwmbwnbwobwpbofbwqbwrbwsbojbwtbwubqhbqiaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaHDbauaHDaTqaHDbawaHDbwvaXcbwwbwxaHDbawaHDbwybwzbwAbqlbqmbcybwBbuebqpbuebwDbcybwEbwFbwGbcybwHbwIbwJbcyalWbwKalWbwLbwLbkDbwNbwObkDbwLbwLbwLbwLbwLbwLbxnbwPbwQbwRbwSbwTbwUbwVbwWbwVbwXbwYbwZbmobnkbnfbxdbxebxdbxdbxfbnlbxhbvrbvrbxibvrbonboobeubxpbxobxwbxvbyMbyLbeubvEbgbbxraXQbxsbpobpobpobpobpobvFbvLbpjbpjbpjbvNbvMbpjbvWbxqbwCaocavVbxAaocbxBbxCbxDbxEbxFbxGbxHbxIbxJbxKbxLbxJbxMbxNbgLbxObxPbxQbxRbkUbxTbkVblabxVbpLbxWbxXaahaahaahaahaahaaaaahaaaaahaaaaahaaaaahaaaaaaaaaaaaaaaaaaaahbmqaaabumbxYboabxZbyabodbmraUwaUzbybbycbydbyebyfbygbofbofbyhbyibyjbojbojbykbylbymaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDbynaXcaXebyobypaXcaXcbyqbyraYIbysbytbytbytbyubyvbywbyxbyybyzbyAbyBbyCbyDbyEbyzbyFbyGbyHbyIbyIbyJbyIbyIaowbyKbzhbwLbzjblbbyObyPbyQbwLbzmbySbwLbzmbySbwLbwPbcAbhHbnablkblAblzbnablBblDblCblEbthboFbopbvrbznboKboIbasbasboobzqbpfboZbvrbrdbrsbeubzubzrbmpbzpbmvbzxbzsbxtbgbbewaXQbexbpjbxubxybxxbyRbxzbyZbyYbpjbzgbzvbztbzybzwbzAbzzaocaocaocaocaocaocbzIaocbzJbzKbzLbzBbzCbzCbzCbzCbzCbzBbzBbzCbzEbzDbzGbzFbzNbzHbzQbzPbzBbzBbzBaahaaaaaaaaaaahaaaaahaaaaahaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaQxbfbaUwaUCbzXaUzbzYbzZbmHbAbbAcbAdbAebAfbAgbAhbAibAjaYyaYybAkaUzaUzbkTaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaTqaTqaVSaVTaTqaTqaTqaVUaTqaTqaVVaVWaTqaTqaTqaVXaTqaTqaVYalWalWaahaaaaaaaaaaaaaaaaaaaaaaahaahaVZbaHaMsaNUaNUaNVaNUaLhaWbaLhaWcaUXaWdaWeaWfaWgalWawwaLnbbTbbYaWjaWkaWlaGaaWnaWoaLraWpaGeaWpaWraGzaWtaWuaWraWpaGeaWpaIVaWvaWwaWxbcgaJaaJaaJaaJaaWyaWzaWAaKqaWBaJaaNlaWCaPZaWDaWEaWEaWEaWEaocaocaocaWFaWGaWHaWIaWJaHGaWEaWKaWKaocaWLawgaweaWMaweaWNaweaWOaweawiatHaWPaWPaWPaWPaWQaWRaWSaWTaWUaGIaWWaFgaWXaWYayFayFayFaahaahaGJaWZazRazRazRazRazRazRaGJazRaGNayFayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUCaaaaaaaUzaUzaUzaUzaUzaUAaUzaUzaUzaUzaUzaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaGObdgaXcaXdaXeaXfaXcaXgaXhaXiaXhaXjaXkaXhaXlaJmaTVaXoaXpalWaaaaaaaaaaaaaaaaaaaaaaaaaahaVZaHdaUSaMsaNUaNUaHeaHgaLhaXsaXtaXuaXvaXwaXxaXyaXzalWawwaLnaLnaLnaAuaAuaHhaLraXDaXEaLraXFaXGaXHaWraXIaXJaXKaWrbdlaXMaXNaXOaXPaXQaXRaXSaXTaXUbeOaJaaJaaXWaXXaXWaJaaJaaFKaYaaYbaFKbcTaYcaYdaYeaYfaYgaocaocaocaocaYhaocaocaocaocaocaocaDIapwapxaYiaYiaYiaYiaYiaYiaYiaWPaYjaYkaYlaWPaHiaYnaWPaYoaYpaCAaCAaYqaYraYsazOaYtazOaYuazRaYvazRayHayIaYwayIayKazRaYvazRayLazWazXaahaahaagaagaafaahaafaagaagaafaafaagaagaagaafaahaahaahaahaahaQxaTiaYxaYyaYyaYyaYyaYyaYzaYzaYzaYAaYzaYzaYzaYyaYBaYyaYyaYyaYCaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaHDaYEaYFaYFaYGaYFaYFaYFaYHaYIaYJaYKaYLaYLaYLaYMaYNaYOaYPalWaaaaaaaahaahaaaaaaaahaahaahaVZbgqbgjbiRaYRaNUbjwaInaYUaYTaYVaYWaYXaYYaYZaZaaZbalWaZcaZdaZeaZfaZgaZhaZiaZjaZkaZlaZmaZnaZoaZnbeTaZqaZraZsbeZaZnaZuaZvaZwaZxaZyaZzaZAaZBaZCaZDaZDaZDaZEaZFaZDaZDaZGaZDaZHaZIaZDaZDaZDaZKaZLaocaZMaZNaZOaZPaZQaZRaZQaZSaZQaZTawhaWOawiaqJapxaYibfWaZUaZVaZWbhfaZZaWPbaababbabbacbabbadaWPbaeaWUbafbagbagbagbagbagbahayFbaiayIbajayIazVayFayFayFbaiayIazVayLayLayFaahaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUCaaaaUzbakbakbalbambanbaobapbambaqbakbaraUzaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDbauaHDaTqaHDbawaHDaYEaYFbaxbayaHDbawaHDbhPbaAbaBbaCalWalWalWalWagAagAagAalWalWalWaVZbkHbaJbaJbaJbaJbaKaNUbaLbaMbaNbaOaUXaUXaUXaUXaIBalWalWbaQalWalWbaRbaSbaTbaUbaVbaWbaXbaUbaVbaYbaZbaWbbabaUbaUbaUbbbbbcbbdbbebbfbbgbbhbbibaUbaUbaUbaUbbjbbkbaUbaUbaXbblbbmbaUbaUbaUbaUbbnbbobbpbbpbbpbcnbbpbbpbbpaocbbqaocaDIaocaocbbrbbrbbrbbrbbsbbtbbtbbubbvbbwaWPbbxbbyaIWbbAbbBbbCaWPbbDbbEbbFbagbbGbbHbbIbagbbJayFayFayFayFayFayFayFbbKayFayFayFayFayFbbLayFaahaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaQxaQxaQxaQxaTiaUwaUCaaaaUzbakbanbbMbbNbbObbPbbQbbNbbRbanbaraUzaaaaVRaUwaUCbbSbbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaahaaaaahaaaaHDbbUaHDbbVbbVbbWbbXaHDbbUaHDaHDaTqbbZbcabcbasuasvbccasvbcdasvbcebcfaswbeqbchaJEaJEaJFaKYaKebcmbkIbcobcpbcqbcobcrbcsblvbctbcubcvbcwbcxbcybczbcAbcBbcCbcCbcDbcEbcFbcGbcHbcIbcJbcKbcKbcKbcKbcKbcKbcKbcLbcMbcNbcNbcNbcNbcNbcNbcNbcNbcObcPbcQbcRbcNbcSbcObcNbcNbmTbcUbcVbbpbcWbcXbcYbcZbdabbpbdbbdcaocbddaocaaabbrbdebdfbbrbjzbdhbdibdjbdkbmIaWPbdmbdnbdobdpbdqbdraWPbdsbdtbdubagbdvbdwbdxbagbdyaKRaKRbdzaKRbdAaKRaKRaKRbdBaKRbdCbdDbdCbdDabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaRJbdEaUwaUCaaaaUzbakbdFbdGbakbdHaKZbdJbakbdKbdLbaraUzaaaaVRaUwbdMaaabbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaaaaHDbawaHDaHDaHDaHDaHDaHDbawaHDaaaaTqbdQbdRbdSbdSbdSbdSbdSbdSbdSbdSbdTbmMbcobcoaLoaMraLobcobcobcobdYbcobdZbeabebbecbedbeebefbegbehbeibejbcybekbcAbelbembembenbembeobembgbbeRbgbaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGbeubeubevbeubeubeubeubeubeubewbcAbexbbpbnjbezbeAbeBbeCbbpbeDbeEaocaDIajVaaaaOfbeGbeHbeIbeJbeKbeLbeMbeNbncaWPbePaOhaOFaOFaOXaOWaWPbeUbeVbeUbagbeWbeXbeYbagaOYayFayFayFayFayFayFayFayFayFawBayFayFbahayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaQxbfbbfcbfdbfeaUzaUzaUzbakbffbfgbfhbakbakbakbfibfjbfkbaraUzaUzaUzbflaToaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaOZaPeaOZaavaOZaOZaavaOZaPeaPfaaxaTqbdQbfsbftbfubfvbfwbfxbfybfzbdSbfAbfBbfCbfDbnsbfEbnsbfEbfGbfEbfHbcobfIbfJbfKbfLbfMaPgbfObfPbfQbfRbfSaPobfUbfVbotbembfXbfYbfZbgabembhobgcbhraahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbeubgdbgebgfbggbghbgibnVbeubgkbglbgmbbpbgnbgobgpboqbgrbbpaocaocaocbgsaocaaabbrbgtbgubbrbgvbgwbgxbgybgzbgAaWPbgBaPAbgDbgEbgFbgGaWPaCAbgHaCAbagbgIbgJbgKbagbgLbgLbgLaaKaaEaaaaaaaaaaaaaahaaaaaaayFbdDayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaRIaRIbgMbgNaUwbgObgPaaaaaaaUzbgQbgRbgSbakbakbgTbakbakbdKbgUbgVaUzaaaaaabgWaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawaOZaOZaPPboGasJaPQaQuaPUaQyaQvaQzasJaQSaQBaHDbdQbdRaQTbhibhjbhkbhlbhmbhnbhMbhpbhqbhNbhsbhsbhtbhubhvbcobcobcobcobhwbhxbhybhzbhAaLobhCbegbehbhDbhEbhFbhGbcAbhHbembhIbhJbhKbhLbhObiQbiqbjAaahaahaQYaRcaRbaRdbhUaRfaRcaRdbhUaRfaRbaRbaRgaahaahbeubhZaRhbibbicbibbidbiebeubifbcAbigboHbbpaRjbiiaRqbbpbbpbikbilaocbinaocbimbbrbbrbbrbbraYiaYiaYibiobipaYiaWPaWPaWPaWPaWPboOboNaWPbisbitbisbagaRzbivaRAbagbiyaRHaREaOZaOZaaxaaaaaaaaaaahaaaaaaaaaabjaaaaahaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahabjbiCbiDbiEbiDbiFaUCaaaaaaaaaaUzbiGbanbiHbiIbiJbiKaRKbiIbiMbanbaraUzaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoAaRRaRRaaDasJaSgaRXaSgaRXaSgaRXaSgasJaSWaSiaHDbdQbiUbdSaTgbiWbiXaTrbiZaTsbdSbjbbjcbjdaTtbjfbjgbjhbjibjjbjkbjlbjmbjnbjobjpbjqbjrbjsbjtbjubjvboPbjxbjybfUbcAbhHbemaTxbjBbjCbjDbemblnbjFbhraahaahaTAaUJaUtaVhaUQaWmaVFaWsaWqaXmaWVaYSaXaaahaahbeubjTbjUbjVbjWbjXbjYbjZbeubewbkabkbbkcbkdbkebkdbkfbkgbkhbkdbkdbkdbkibkdbkjbkkbklbkmbkdbkdbknbkjbkfbkibkobkpbknbkqbkrbksaXqaXnaXrbkwbkxbkybkzbkAbkBbkCaXAbkEbkEaXBadFadEaavaaaaaaaaaaahaaaaaaaaaabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahabjbiCbiDbkJbiDbkKaUCaaaaaaaaaaUzbkLbkMbalbkNbkObkPbkQbkRbkSbakbaraUzaUzaUzaUzbkTaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavasJasJaPeasJaSgaRXaSgaXCaSgaRXaSgasJaSWaSiaHDbkWbkXboQbkYbkZaXZaXYaXZbftbftblcbldbdYbcobleblfblgblhblibljaYmbcobllblmblibhzblxbcobloblpblqblrblsaPobhGbcAbhHbembltbluboRblwbembmnblybhrbhUaYDbhUaZYaZXbatbasbatbavbatbasbatbaDbbzbhUaYDbhUbeublHblHblHblIblJblLblKbeublMblNblOblPblQblRblQblSblQblTblQblQblQblUblQblVblWblXblYblQblQblZbmabmbblUbmcblUbmdbmebmfbksbmgbmhbmhbmibmjbmhbmhbmkbmlbmmbaEbkEbkEbaFaOZaOZbaIaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbmqaaaaaaaaaaahbgPbgPbgMbmraUwaUCaaaaaaaaaaUzaUzbiGbakbakbakbmsbakbakbakbakbmtaYBbmuaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoAaupaupaaDasJaSgaRXaSgaRXaSgaRXaSgasJaSWaSiaHDbmwbmxbmybmzbmAbmBbmBbmCbmDbmzbmEbmFbmGbcobaPboWbmJbmKbmLbphbmNbcobmObmPbmQbmRbmSbcoboYbmUbmVbmWbmXbcybmYbglbmZbnabnabnabnabnabgbbppbpibgbbhUbqTbqObcibasbasbasbasbcjbasbasbasbasbclbckbeSbhUbnmbnnbnobnpbnqbnrbnrbntbeubnubnvbnwbnxbnybnzbnybnAbnybnBbnybnybnCbnybnybnDbnEbnybnFbnCbnGbnHbnDbnAbnybnIbnJbnKbnLbnMbdIbnObnPbnQbnRbmmbnSbnSbnTbnUbpgbplbksbksbksaaKbnWaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaabnXbnYbnZboabobbocbodboeaUwaUzaUzaUzaUzaUzbofbogbofbofbohboibohbojbojbokbolbomaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdNaOZaOZaPPbdOasJbdPasJbdUbdVasJbdWasJaQSbdXaHDbdQboubovbowboxboybozboAboBbowboCboDboEbcoberaLobqLbesbcobcobcobcobcoaLoboJbetbcobcoaPoboLboMaPoaPobtHbaRbcAbtbbnabeybeQbeFbnaboVboXbnbbndbnebwbbvybfmbfabfobfnbfqbfpbfnbfnbfrbfabfNbfFbhhbhUbeublHblHblHbtdblHblHblHbeubpmbcAbpnbpobfTbpqbfTbpobpjbpjbpjbpjbpjbpjaocaocbpsaocaocaocbptbpuaocaocaocbpvaocbpwbpxbpybpzbpAbpBbpCbpDbnSbgCbgXbpGbnUbpHbgLbksbgZbgYbhabpKbpLbpLbpMbpNaahaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaabnXbpObpPaaaaahbpQbpRbpSbpTbpUbpVbofbpWbpXbpYbpZbqabqbbofbqcbqdbqebqfbqgbqhbqhbqiaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdNaOZbhbaOZaavaOZaOZaavaOZaPebhcbaIaTqbqkbqlbqmbcybqnbqobqpbqobqqbcybqrbqsbqtbqubqvbqwbqxbqybqzbqwbqAbqBbqwbqvbqvbqCbqvbqDbqEbqFbqGbqHbqvbqIbqJbqKbhHbhebhdbhgbwybnabhrbhrbhrbhrbhUbwBbhBbhRbhQbhTbhSbasbhVbhXbhWbhYbhQbihbiabiPbiObeubrebrfbrgbrhbriblHbrjbeubrkbcAbrlbijbrnbrobrpbpobpkbqMbprbqQbqNbqSbtebrxbryaocbrzbrAbrBbrCbrDaocatEbrEaocbrFbrGbrHaXAbrJbrJbrJbrKbrLbnSbnSbrMbrNbrObrPbrQbrRbirbiubrTbrUbrUbrVbrWbrXbrXbrXbrYbrXbrXbrXbrXbrXbrXbrYbrXbrXbrXbrXbrXbrXbrYbrXbrZbsabrUbrUbrUbsbbscbsdbsebsebsfbsgbshbsibsjbskbslbsmbsnbsobspbsqbsrbssbstbsubsvbswaYyaYybsxaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaHDbawaHDaHDaHDaHDaHDaHDbawaHDaaaaTqbsAbsBbsCbcybsDbsEbsFbsEbsGbcybsHbsIbsJbsKbwDbsMbsNbsKbsKbsObsPbsQbsRbsKbsKbsSbsKbsKbsKbsTbsUbsVbsVbsWbsXbsYbsZbnabiwbizbixbnabiAbiLbiBbiNbthbhYbiSbhTbiTbiYbiVbqVbjabqVbjebjNbjMbjPbjObjRbjQbeubtubtvbtwbtxbtybeubeubeubewbtzbtAbpobtBbtCbtDbpobqUbqXbqWbrrbrqbrtbtKbtLbtMbtNbtObtPbtQbtRbtSbtTbtUbtVaocbpwbtWbtXbksbtYbtZbjGbjEbucbudbvebufbugbnUbuhbuibujbjHbjIaTpaaaaaabulbpPaahaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaabumbunbpNaaaaahaVRbuobupbuqburbjJbutbuubuvbuwbuxbuybjKbuAbuBbuCbjLbuEbuFbqhbuGbuHaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaahaaaaahaaaaHDbuIaHDbuJbuKbbVbuLaHDbuIaHDaHDaTqbdQbuMbuNbcybuObsEbuPbsEbuQbcybuRbuSbuTbuUbuVbuWbuXbuYbuZbvabvbbvcbuVbuVbuVbvdbuVbvtbvfbuXbvgbuVbuVbvhbvibvjbsZbnabvkbvlbwYbvnbvmbvobvmbvmbthbkGbkFbvrbvrbvrbvRbxgbvubvvbxlbvrbvrbvrblFblGbhUbeubvzbvAbvBbvCbvDbeubrubtkbvGbvHbtAbfTbvIbvJbvKbpobtEbtGbtFbxjbpjbpjaocaocbvPaocaocaocbvQbxmaocaocbvSbvTaocbvUbtWbvVbksbgLbgLbgLbgLbtIbgLbgLbvXbvYbvZbksbksbwabjSbktbwcaaabnXbwdaaaaahaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaabumbunbpNaahbwebwfbwgbwhbwibkubofbkvbwlbwmbwnbwobwpbofbwqbwrbwsbojbwtbwubqhbqiaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaHDbauaHDaTqaHDbawaHDbwvaXcbwwbwxaHDbawaHDbxkbwzbwAbqlbqmbcybxxbuebqpbuebynbcybwEbwFbwGbcybwHbwIbwJbcyalWbwKalWbwLbwLbkDbwNbwObkDbwLbwLbwLbwLbwLbwLbxnbwPbwQbwRbwSbwTbwUbwVbwWbwVbwXbzybwZbmobnkbnfbxdbxebxdbxdbxfbnlbxhbvrbvrbxibvrbonboobeubxpbxobxwbxvbyMbyLbeubvEbgbbxraXQbxsbpobpobpobpobpobvFbvLbpjbpjbpjbvNbvMbpjbvWbxqbwCaocavVbxAaocbxBbxCbxDbxEbxFbxGbxHbxIbxJbxKbxLbxJbxMbxNbgLbxObxPbxQbxRbkUbxTbkVblabxVbpLbxWbxXaahaahaahaahaahaaaaahaaaaahaaaaahaaaaahaaaaaaaaaaaaaaaaaaaahbmqaaabumbxYboabxZbyabodbmraUwaUzbybbycbydbyebyfbygbofbofbyhbyibyjbojbojbykbylbymaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDbzMaXcaXebyobypaXcaXcbyqbyraYIbysbytbytbytbyubyvbywbyxbyybyzbyAbyBbyCbyDbyEbyzbyFbyGbyHbyIbyIbyJbyIbyIaowbyKbzhbwLbzjblbbyObyPbyQbwLbzmbySbwLbzmbySbwLbwPbcAbhHbnablkblAblzbnablBblDblCblEbthboFbopbvrbznboKboIbasbasboobzqbpfboZbvrbrdbrsbeubzubzrbmpbzpbmvbzxbzsbxtbgbbewaXQbexbpjbxubxybAZbyRbxzbyZbyYbpjbzgbzvbztbEvbzwbzAbzzaocaocaocaocaocaocbzIaocbzJbzKbzLbzBbzCbzCbzCbzCbzCbzBbzBbzCbzEbzDbzGbzFbzNbzHbzQbzPbzBbzBbzBaahaaaaaaaaaaahaaaaahaaaaahaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaQxbfbaUwaUCbzXaUzbzYbzZbmHbAbbAcbAdbAebAfbAgbAhbAibAjaYyaYybAkaUzaUzbkTaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaYEaYFaYFbAlaYFbAmbAnbAobAobApbAobAqbArbAsbAtbAubAvbAwbAxbmzbAybAzbAAbABbACbADbAEbAFbAGbAHbAIbAJbAKbyIbALbAMaosbwLbANbAObyObyPbyQbwLbAPbAQbwLbAPbAQbwLbARbcAbhHbnabnabngbnabnabnabnibnhbBabnabtmbsLbttbasbqVbqVbnNbvObxabBdbBcbBebzdbzcbzfbzebBibBgborbBmbosbBpbeubzRbgbbBoaXQbexbpjbzSbzTbxzbzUbxzbzVbxzbzWbDjbzzbAabAXbAWbBnbAYbBAbBBbBCbBDbBEbNDbBFaocbBGbtWbBHbzBbBrbBqbBtbBsbBubzBbBwbBvbBybBxbBIbBzbBKbBJbBMbBLbBObBNbzBaahaahaahaahaahaahaahaaaaafaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbaUCaaaaUzbCcbCdbCebAbbCfbCgbChbCibCjbCkbClbAbaUzaaaaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDaTqaHDbauaHDaTqaHDaHDaHDaTqaHDaTqaTqaTqbkWbkXalWbCoalWalWbCpbCqbCpbCrbCpbCpbCpbCpbyIbyIbCsbCtbyIbyIbyIbCualObwLbCvbCwbyObCxbwLbwLbCybwLbwLbCzbwLbwLbCAbcAbhHbCBbCCbCDbCEbCFbCGbCDbCDbCHbCIboobCQbxdbCUbCVbzibCMbCWbCObCPbCYbCXbvrbDabzObeubDgbDfbEmbDtbECbEBbeubBPbgbbewaXQbexbpjbBQbBTbBSbBTbBUbBWbBVbBXbDjbzzbBYbCNbzzbDjbCZbDlbDmbDnbDobDpbNDbvTaocbDqbDrbDsbBIbDcbDbbDebDdbDhbzBbDkbDibDwbDvbBIbDxbDycgpbDAbDzbDCbDBbzBaahboOboOboOboOboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbaUCaaaaUzbDLbDMbDNbAbbDObDPbDQbDRbDSbDTbDUbAbaUzaaaaaaaRIbgNaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaHDbDYbdQbDZalWbyKavibEabCpbEbbEcbEdbEebEfbEgbCpbEhbEhbEibEjbEkbElbyIbCubGdbwLbEnbEobyObyPbEpboSbCwbErbEsbEtbEubkDbwPbcAbhHbGrboTbEwboUboUboUboUboUbEAbGHbHRbHzbhUbhUbhUbpabpcbpbbpebpdbhUbhUbhUbIabHRbJrbeubzebeubeubeubevbeubDEbgbbEKbELbexbDGbDFbDFbDFbDHbDFbDIbDFbDJbDjbDjbDKbDjbDjbzzbEqbETbEUbEVbEWbphbNDbzIaocbEYbDrbEZbEvbExcgpbEEbEDbEIbEGbENbEJbEPbEObBIbEQbESbERbFcbFbbFebFdbFgbFsbppbFubFvbFvboOaahaaabCaaaabBZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbaUCaaaaUzaUzaUzaUzbAbbFibFhbFybCjbFzbFjbFkbAbaUzaaaaVRbFCaTkbFDaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpEaHDaHDbdQbFGalWbFHbFIbpFbCpbFKbEcbEdbFLbFMbFNbCpbFObFPbFQbFRbyIbyIbyIbCuapTbwLbFSbFTbyObyPbyObyObyObyObyObFUbyObwNbFVbFWbFXbFYbFZbGabFZbGbbFZbGabFZbGcbMabGebGfbGgbGhbGibGjbGjbGkbGlbGjbGmbGnbGobGpbGqbNvbGibGsbGtbGibGubGvbGibGwbGxbGybGzbtAbFlbxzbFmbxzbFnbxzbFobxzbFpbDjbDjbFqbDjbDjbFxbFwbETbGIbBBbEWbGJbNDbzIaocbGKbGLbvVbBIbFAcgpbFBcgpbGBbGAbGDbGCbGFbGEbBIbGGbGNbGMbGPbGObGRbGQbBIaahbotbHebFvbHfboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbaUCaaaaaaaaaaaabHgbHhbHibHibpIbHkbpIbHibHibHlbmuaUzaUzbkTbHmbHnaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpJbHobHpbHobdQbHqalWbHrbHsakBbCpbHtbEcbEdbHubEcbqjbCpbyIbHwbyIbEjbHxbHybyIbCuapRbwLbNAbEobHAbHBbHCbHCbHCbHCbHCbHDbHCbHEbvibHFbHGbHHbHIbHJbHIbHKbHLbHMbHNbHObHPbHQbOmbHSbHTbHSbHUbHUbHVbHWbHUbHXbHYbHZbOUbIbbIcbIdbIebIfbIgbIhbIibIbbIjbIkbIlbImbInbGTbGSbGWbGVbGVbGXbGYbGSbHabGZbIobHbbzzbIpbzzbIqbIAbIBbICbIDbIEbIrbIGaocbIHbIIbIJbIsbIubItbIwbIvbIybBIbIKbIFbIMbILbIObINbERbIPbISbIRbIUbITbIVbJdbqObJfbFvbJgboOaahaaabCaaaabBZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbbJhaRIaRIaaaaaaaUAbJibJjbJkbpIbJmbpIbJnbJobJpaUAaaaaVRaUwaUCbbSaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHDaHDaHDbdQbJsalWbJtalWalWbCpbJubJvbJwbEcbEcbEcbCpbJxbJybyIbJzbyIbyIbyIbJAbJBbJCbCwbCwbFUbJDbJEbCwbCwbCwbCwbJFbJGbkDbwPbJHbJIbJJbJJbJKbJLbJMbJJbJJbJNbJNbJObJPbJNbqPbCIbJRbJSbJTbJUbJVbJSbJWbCIbqPbJXbJYbJZbKabJXbJXbKbbKcbKdbJXbIWbgbbKfbKgbKhbIYbIXbIZbIXbJbbJabxzbxzbDJbDKbDjbJqbKjbKebKjbIobKqbKrbKsbKtbqRbNDbKvaocbKwbKxbKybzQbKlbKkbKnbKmbzQbzPbKpbKobDzbDybBIbKzbKBbKAbKBbKAbKDbKCbBIaahboOboOboOboOboOaahaaabCaaaabBZaaabCaaagaafaahaafaagaagaafaafaagaagaagaQxaQxaQxaQxbfbbKMaTkaTkbKNbodbodaUAbKObKPbKQbpIbHkbpIbKQbKPbKSaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaHDbKTbdQbKUalWbCuapTbKVbCpbqYbEdbKXbqZbqjbEcbCpbKZbLabyIbFObLbbLcbyIbCuaotbwLbLdbLdbFUbyPbLebLebLfbrbbrabrcbwLbwLbFVbLjbLkbJJbLlbLmbLnbLobLpbLqbLrbLsbLtbLubJNaahboTbLwbJSbJSbLxbJSbJSbLybrmaahbJXbLAbLBbLCbLDbJXbJXbJXbJXbJXbKEbgbbKfbLFbLGbpjbLEbLHbDFbLJbLIbDFbLKbpjbDKbLLbDjbDjbDjbDjbDjbrvbLNbLObLPbrIbNDbLRatHbLSbLTbLUbzGbLVbLMbLXbLWbLZbLYbMcbMbbMebMdbMdbMfbMhbMgbFcbMibMkbMjbFgbFsbppbMmbMnbMnboOaahaahbMoaahbMpaahbCaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaQxaaabMqaUyaUBaUwaUCaaaaUAbMrbKPbKPbKPbMsbKPbKPbKPbMtaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDaTqaHDbauaHDaTqaHDaHDaHDaTqaHDaTqaTqaTqbMvbMwbMxbMybMzbMAbCpbMBbMCbKXbrSbMEbMFbCpbyIbyIbyIbyIbyIbyIbyIbCuaosbwLbMGbMHbFUbyPbCwbCwbMIbCwbMJbsybwLbMLbwPbcAbMMbJJbMNbMObMPbMQbMRbLqbMSbMTbMUbMVbszaahboTbMYbMZbNabNbbMZbNabNcbrmaahbtabNfbNgbNhbVxbtcbNkbNlbNmbJXbMDbgbbNobNpbNqbNrbNrbNrbNsbNtbVybNubWcbNrbNwbNrbNnbNybNxbNIbNzbNDbNDbNEbNDbNDbNDbKvbNFbNGbNHbNFbzBbzBbzBbzBbzBbNJbzGbNLbNKbNMcgpbNObNNbNQbNPbESbNRbORbNSbBIaahbotbNTbNUbNVboOaahaaabCaaaabBZaaabNWaQxaQxaQxaQxaafaQxaQxaQxaQxaafaQxaahaafaQxaQxaQxaQxaQxaVRaUwaUCaaaaUAbNXbNYbNZbKPbOabKPbObbOcbOdaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDbOebwzaXebOTaXeaXcaXcbOfaXcbwzaXcbOgbwzaXcbwAbOhalWbOialOapUbCpbOjbOkbEcbEcbEcbOlbCpbYfbYObYjbOnbOobOpalWbCuarhbwLbOqbOrbFUbOsbOtbOtbOubCwbCwbOvbwLbOwbwPbcAbLkbJJbOxbOybOzbOAbOBbLqbOCbODbOEbOFbJNbtfbOHbtfbOHbOHbOIbOHbOHbtfbOHbtfbJXbOJbOKbOLbOMbtgbOObOPbOQbJXbOXbgbbOSaXQbLGbNrbticaIbOVbOWcaTbOYbOYbOZbPabNrbNrbNrbNrbNrbNrbNrbNDbPbbPcbtjbNDbPebNFbPfbPgbPhbNFbPibPjauVbrwbzBbPkbPmbPlbPobPnbPrbPqbPtbPsbPubNRbPSbPvbIVbJdbqObPwbMnbPxboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSbfbbPyaYyaYybPzbmubPAbPBbKPbPCbKPbPDbPEbHgbPzaYyaYybPFaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaYEaYFaYFaYFaYFaYFbPGbPHbPIbAobAobPJbPKbPLbPMbPNalWbdTardapUbCpbEebPObEcbEcbPObPPbCpbPQaovaoxbPRbMAbOoalWbCucaUbwLbPTbPUbPVbPWbCwbPXbtlbPZbQabQbbwLbQcbwPbcAbQdbJJbQebQfbQgbQhbLqbLqbQibQjbQkbQlbJNbQmbQnbQobQpbQqbQrbQsbQtbQubQvbQwbJXbtnbOKbQybQzbJXbQAbQBbQCbJXbQDbgbbQEaXQbQFbtobQHbQIbQJbQKbQLbOVbOVbQMbQNbNrbQObQPbQQbQPbQRbNrbtpbQTbQUbQVbNDbKvbNFbQWbQXbQYbNFasfapxapxbQZbzBbPkbRbbRabzCbzCbzCbRccgpbRdcgpbNRbRebNSbBIaahboOboOboOboOboOaahaaaaafaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaUAbRfbKPbKPbRgbRhbRibRjaUAaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDbRkbRkaHDaHDaHDaTqaHDaTqaHDaTqaTqalWbRmalWalWalWbdTarhapUbCpbPPbRnbRobEcbRobtqbCpbRqapRaotapTbRranfalWbCualObwLbwLbkDbRtbRubkDbwLbwLbwLbwLbRvbwLbwLbRwbglbRxbJJbRybRzbRAbRBbRCbLqbRDbREbRFbtrbJNbRHbRIbRJbRKbRLbRJbRMbRJbRNbRObRPbJXbtsbOKbRRbRSbtJbRUbRVbRWbJXbRlbgbbRYaXQbLGbubbuabusbukbSdbSebSabusbQMbSfbNrbSgbShbSibSjbQRbNrbSkbSlbSmbSnbRpbSpbNFbSqbSrbSsbNFbStbSubSvbSwbzBbRsbRTbRQbRXbzCbSobPscgpbPqbSybSxbSzbMjbFgbFsbppbSFbSGbSHboOaahaaabCaaaabBZaaabCaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaUAbSIbSJbSKbSLbSMbSNbSIaUAaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaHDbSAbbUaHDaaaaahbSBbSBbSBaahaaaaaaalWbSObSPbuzbSRbSSbSRbSTbCpbCpbCpbCpbSCbCpbCpbCpbSVardalOaotbSWbSXalWbSYbSZbwLbTabTbbTcbTdbTebTfbTgbwLbThbTibTjbwLbwPbcAbTkbJJbMNbQfbTlbTmbMNbLqbTnbTobTpbTqbJNbuDbTsbTtbTubvpbTwbTxbTybTzbTAbTBbJXbTCbTDbTEbTFbTGbTHbTIbTJbTKbSDbgbbTMaXQbLGbubbTObTPbTPbTQbTRbTSbTTbTUbTVbNrbTWbShbTXbTYbTZbNrbvqbvwbvsbUdbNDbKvbNFbNFbNFbNFbNFbUeapxapxbUfbzBbRsbRTbRQbSUbSEbSobTLbESbPqbUgbNRbUhbNSbBIaahbotbUlbUmbUnboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaUAbUobHibUpbUqbUrbHibUsaUAaaaaaaaVRaUwaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaHDbRkbRkaHDaahaahbUibUibUiaahaahaahalWbUtasvasvasvbAMapRapUalOankaviaosarbbUuarhalWalWalWalWalWbUvalWalWbCuapTbwLbUwbUxbUybUybTdbUzbUAbwLbUBbvxbUDbwLbARbcAbUEbJJbMNbUFbUGbUHbUIbLqbUJbUKbULbJNbJNbwbbvybUObwjbwMbwkbxcbxbbUUbxjbxkbJXbxSbUYbxUbVabtgbVcbVcbVdbJXbUjbgbbVfaXQbLGbNrbVgbVhbVibOVbVjbVkbQKbVlbVmbVnbVobVpbVqbVrbVsbNrbNDbNDbNDbNDbNDbVtaocbVubQZaqKapxbVvaqJbVwapxbzBbzBbUkbKobRXbzCbUQbUMcgpbURbSybNRbUSbPvbIVbJdbqObVDbSGbVEboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxbfbbVFaUzaUzaUzbmtaYyaYyaYyaYBaYyaYyaYybAkaUzaUzaUzbkTaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahbUWaahaahaaaaaaaaaaahaaaaaaaahaaaalWalWalWalWbSXbVGasvbVHbVIbVJbVKbVKbVKbVLbVMbVKbVIbVKbVNbVKbVObVKaMDbVPaotbwLbVQbVRbVSbyNbEobVUbVVbwLbwLbwLbwLbwLbVWbcAbLkcbLbJJbVXbVXbVXbJJbJJbJNbJNbVYbJNbJNbyTbyTbWbbyTbyTbyTbyTbyTbWdbyTbyTbJXbJXbJXbJXbJXbJXbWebWebWebJXbVebgbbWgaXQbWhbepbWibWibWibWjbWibWibWkbWlbWibWibWibWibNrbWmbWnbWobWpbWqbWrapxbWsbWtaocbSvbWubWvapxbVvapxapxaoabzBbVzbGDbVAbzCbzCbzCbVBcgpbVCbWfbNRbRebNSbBIaahboOboOboOboOboOaahaahbNWaahbMpaahaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaaaaaaaaaaaabWBaaaaaaaaaaaaaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaabWCbWCbWDbWEbWFalWbWGalWalWalWaUObWHbWHbWHbWHbWHbWHbWHaotbWIbWJcbZbwLbWLbWMbyUbWObEobTdbWPbWQbWRavialWbWSbwPbWTbWUbWVbWWbWXbWXbWXbWYbWZbXabXbbWXbXcbXdbWVbWVbXebXfbXfbXfbXgbXfbXhbXibXibXjbXkbXlbXmbXnbXobWXbWXbWXbXpbXqbXibXraXQbXsbXtbyVbXvbXwbXxbyWbyXbXAbXxbXBbXCbXDbXEbNrbXFbXGbWwbXIbXJbXKbXLbWtbXMaocaocaocaocaocbXNbXObzBbzBbzBbWxbGDbKobWzbWybWAbGGbXzbWKbXHbSxbXPbMjbFgbFsbppbXXbXYbXYboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwbJhaRIaRIaRIaRIaRIaRIbWBaRIaRIaRIaRIaRIaRIbgNaUwaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaaabWFbXZbYabYbbWFaotbYcbMAcesalWbYebWHceGbYgbYhbYiceIbWHaotalObWJalObwLbwLbwLbwLbwLbwLbwLbwLbwLatRalOalWbYkbwPbYlbYmbaUbaUbaUbaUbaUbaUbaXbaUbYnbYobYpbaWbaUbaUbYqbYrbYsbYtbYubYvbYwbYxbaUbaUbYybYzbaUbaUbaXbaUbaUbaUbaUbYAbaUbYnbYBbYCbYDbYEbYFbYGbYFbYHbYHbYIbYJbYKbYHbYGbYLbNrbNrbNrbNrbYMbYNapwaoaceWbYPapwbYPbYQbYRaocauWaocbzBbXQbXUbXTbXWbXVbYdbYdbYdbINcgpcgpcgpbNRbYSbNSbBIaahbotbYZbZabZbboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbZcaTkaTkaTkaTkaTkaTkaTkbZdaTkaTkaTkaTkaTkaTkaTkbZeaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFbZfbZgbZhbWFaotbZibZjalWalWbZkbWHbZlbZmbZnbZobZpbWHawqaotbZqbVKbVIbVKbVNbVKbZrbZsbZsbZsbZsbZtaZebZubZvbZwbZxbZybZzbZAbZBbZybZybZybZCbZybZDaZCbZEbZFaZCaZCbZGbZHbZIbZJbZKbZLbZMbZNaZCbZObZPbZQbZQbZRbZSbZRbZRbZRbZTbZUbZVbZWbZXbZYbZZcaacabcaccadcaecafcagcahcaicajcagcakbWicalcambWicanbYNapwapwapwapwapwcaocapcaqcarcascatbYUbYTbYWbYVbYYbYXcgpcgpcgpcgpcgpbEScgpbNRcaubPvbIVbJdbqOcaCbXYcaDboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaUyaUyaUyaUyaUyaUyaUyaUycaEaUyaUyaUyaUyaUyaUyaUyaUyaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahbWFcaFcaGcaHbWFcgvaotcaJalWcaKcaLbWHcaMcaNcaOcaPcaQbWHbWHbWHbWHbWHbWHcaRbWHbWHcaSchcchdalOardapRarhcklcklcklcklcklcklcklcchcchcchcchcchcaVcaWcaWcaXcaYcaWcaZcaWcbacbbaXQcbcchzcbecbfcbecbgcbhcbecbecbibepaXFaXHaXHcbjbepcbkbepbzacbmbzabWibzkbzbcahcbpcbqcagcahcbrcbscbtbzlbWichAcbwbWicbxcbycbzcaqcaqcaqcaqcbAcbBcbCcbDcbCcbEbzGcavcaxcawcgpcaybMdbMdbMdbMdbMdcazcgpbNRbRecaAbzBaahboOboOboOboOboOaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDaTqaHDbauaHDaTqaHDaHDaHDaTqaHDaTqaTqaTqbkWbkXalWbCoalWalWbCpbCqbCpbCrbCpbCpbCpbCpbyIbyIbCsbCtbyIbyIbyIbCualObwLbCvbCwbyObCxbwLbwLbCybwLbwLbCzbwLbwLbCAbcAbhHbCBbCCbCDbCEbCFbCGbCDbCDbCHbCIboobCQbxdbCUbCVbzibCMbCWbCObCPbCYbCXbvrbDabzObeubDgbDfbEmbDtbECbEBbeubBPbgbbewaXQbexbpjbBQbBTbBSbBTbBUbBWbBVbBXbDjbzzbBYbCNbzzbDjbCZbDlbDmbDnbDobDpbNDbvTaocbDqbDrbDsbFubDcbDbbDebDdbDhbzBbDkbDibDwbDvbBIbDxbDycgpbDAbDzbDCbDBbzBaahbFvbFvbFvbFvbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbaUCaaaaUzbDLbDMbDNbAbbDObDPbDQbDRbDSbDTbDUbAbaUzaaaaaaaRIbgNaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaHDbDYbdQbDZalWbyKavibEabCpbEbbEcbEdbEebEfbEgbCpbEhbEhbEibEjbEkbElbyIbCubGdbwLbEnbEobyObyPbEpboSbCwbErbEsbEtbEubkDbwPbcAbhHbGrboTbEwboUboUboUboUboUbEAbFwbHRbHzbhUbhUbhUbpabpcbpbbpebpdbhUbhUbhUbIabHRbGHbeubzebeubeubeubevbeubDEbgbbEKbELbexbDGbDFbDFbDFbDHbDFbDIbDFbDJbDjbDjbDKbDjbDjbzzbEqbETbEUbEVbEWbHebNDbzIaocbEYbDrbEZbHfbExcgpbEEbEDbEIbEGbENbEJbEPbEObBIbEQbESbERbFcbFbbFebFdbFgbFsbIzbIsbIQbIQbFvaahaaabCaaaabBZaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbaUCaaaaUzaUzaUzaUzbAbbFibFhbFybCjbFzbFjbFkbAbaUzaaaaVRbFCaTkbFDaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpEaHDaHDbdQbFGalWbFHbFIbpFbCpbFKbEcbEdbFLbFMbFNbCpbFObFPbFQbFRbyIbyIbyIbCuapTbwLbFSbFTbyObyPbyObyObyObyObyObFUbyObwNbFVbFWbFXbFYbFZbGabFZbGbbFZbGabFZbGcbMabGebGfbGgbGhbGibGjbGjbGkbGlbGjbGmbGnbGobGpbGqbNvbGibGsbGtbGibGubGvbGibGwbGxbGybGzbtAbFlbxzbFmbxzbFnbxzbFobxzbFpbDjbDjbFqbDjbDjbFxbJcbETbGIbBBbEWbGJbNDbzIaocbGKbGLbvVbFubFAcgpbFBcgpbGBbGAbGDbGCbGFbGEbBIbGGbGNbGMbGPbGObGRbGQbBIaahbBIbJfbIQbJgbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbaUCaaaaaaaaaaaabHgbHhbHibHibpIbHkbpIbHibHibHlbmuaUzaUzbkTbHmbHnaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpJbHobHpbHobdQbHqalWbHrbHsakBbCpbHtbEcbEdbHubEcbqjbCpbyIbHwbyIbEjbHxbHybyIbCuapRbwLbNAbEobHAbHBbHCbHCbHCbHCbHCbHDbHCbHEbvibHFbHGbHHbHIbHJbHIbHKbHLbHMbHNbHObHPbHQbOmbHSbHTbHSbHUbHUbHVbHWbHUbHXbHYbHZbOUbIbbIcbIdbIebIfbIgbIhbIibIbbIjbIkbIlbImbInbGTbGSbGWbGVbGVbGXbGYbGSbHabGZbIobHbbzzbIpbzzbIqbIAbIBbICbIDbIEbIrbIGaocbIHbIIbIJbJrbIubItbIwbIvbIybBIbIKbIFbIMbILbIObINbERbIPbISbIRbIUbITbIVbJdbLAbKGbIQbLIbFvaahaaabCaaaabBZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbCbbJhaRIaRIaaaaaaaUAbJibJjbJkbpIbJmbpIbJnbJobJpaUAaaaaVRaUwaUCbbSaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHDaHDaHDbdQbJsalWbJtalWalWbCpbJubJvbJwbEcbEcbEcbCpbJxbJybyIbJzbyIbyIbyIbJAbJBbJCbCwbCwbFUbJDbJEbCwbCwbCwbCwbJFbJGbkDbwPbJHbJIbJJbJJbJKbJLbJMbJJbJJbJNbJNbJObJPbJNbqPbCIbJRbJSbJTbJUbJVbJSbJWbCIbqPbJXbJYbJZbKabJXbJXbKbbKcbKdbJXbIWbgbbKfbKgbKhbIYbIXbIZbIXbJbbJabxzbxzbDJbDKbDjbJqbKjbKebKjbIobKqbKrbKsbKtbqRbNDbKvaocbKwbKxbKybzQbKlbKkbKnbKmbzQbzPbKpbKobDzbDybBIbKzbKBbKAbKBbKAbKDbKCbBIaahbFvbFvbFvbFvbFvaahaaabCaaaabBZaaabCaaagaafaahaafaagaagaafaafaagaagaagaQxaQxaQxaQxbfbbKMaTkaTkbKNbodbodaUAbKObKPbKQbpIbHkbpIbKQbKPbKSaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaHDbKTbdQbKUalWbCuapTbKVbCpbqYbEdbKXbqZbqjbEcbCpbKZbLabyIbFObLbbLcbyIbCuaotbwLbLdbLdbFUbyPbLebLebLfbrbbrabrcbwLbwLbFVbLjbLkbJJbLlbLmbLnbLobLpbLqbLrbLsbLtbLubJNaahboTbLwbJSbJSbLxbJSbJSbLybrmaahbJXbMmbLBbLCbLDbJXbJXbJXbJXbJXbKEbgbbKfbLFbLGbpjbLEbLHbDFbLJbMnbDFbLKbpjbDKbLLbDjbDjbDjbDjbDjbrvbLNbLObLPbrIbNDbLRatHbLSbLTbLUbzGbLVbLMbLXbLWbLZbLYbMcbMbbMebMdbMdbMfbMhbMgbFcbMibMkbMjbFgbFsbIzbNtbNxbNxbFvaahaahbMoaahbMpaahbCaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaQxaaabMqaUyaUBaUwaUCaaaaUAbMrbKPbKPbKPbMsbKPbKPbKPbMtaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDaTqaHDbauaHDaTqaHDaHDaHDaTqaHDaTqaTqaTqbMvbMwbMxbMybMzbMAbCpbMBbMCbKXbrSbMEbMFbCpbyIbyIbyIbyIbyIbyIbyIbCuaosbwLbMGbMHbFUbyPbCwbCwbMIbCwbMJbsybwLbMLbwPbcAbMMbJJbMNbMObMPbMQbMRbLqbMSbMTbMUbMVbszaahboTbMYbMZbNabNbbMZbNabNcbrmaahbtabNfbNgbNhbVxbtcbNkbNlbNmbJXbMDbgbbNobNpbNqbNrbNrbNrbNsbNTbVybNubWcbNrbNwbNrbNnbNybNUbNIbNzbNDbNDbNEbNDbNDbNDbKvbNFbNGbNHbNFbzBbzBbzBbzBbzBbNJbzGbNLbNKbNMcgpbNObNNbNQbNPbESbNRbORbNSbBIaahbBIbNVbOJbOebFvaahaaabCaaaabBZaaabNWaQxaQxaQxaQxaafaQxaQxaQxaQxaafaQxaahaafaQxaQxaQxaQxaQxaVRaUwaUCaaaaUAbNXbNYbNZbKPbOabKPbObbOcbOdaUAaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDbPwbwzaXebOTaXeaXcaXcbOfaXcbwzaXcbOgbwzaXcbwAbOhalWbOialOapUbCpbOjbOkbEcbEcbEcbOlbCpbYfbYObYjbOnbOobOpalWbCuarhbwLbOqbOrbFUbOsbOtbOtbOubCwbCwbOvbwLbOwbwPbcAbLkbJJbOxbOybOzbOAbOBbLqbOCbODbOEbOFbJNbtfbOHbtfbOHbOHbOIbOHbOHbtfbOHbtfbJXbPxbOKbOLbOMbtgbOObOPbOQbJXbOXbgbbOSaXQbLGbNrbticaIbOVbOWcaTbOYbOYbOZbPabNrbNrbNrbNrbNrbNrbNrbNDbPbbPcbtjbNDbPebNFbPfbPgbPhbNFbPibPjauVbrwbzBbPkbPmbPlbPobPnbPrbPqbPtbPsbPubNRbPSbPvbIVbJdbLAbPNbNxbQubFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSbfbbPyaYyaYybPzbmubPAbPBbKPbPCbKPbPDbPEbHgbPzaYyaYybPFaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaYEaYFaYFaYFaYFaYFbPGbPHbPIbAobAobPJbPKbPLbPMbQxalWbdTardapUbCpbEebPObEcbEcbPObPPbCpbPQaovaoxbPRbMAbOoalWbCucaUbwLbPTbPUbPVbPWbCwbPXbtlbPZbQabQbbwLbQcbwPbcAbQdbJJbQebQfbQgbQhbLqbLqbQibQjbQkbQlbJNbQmbQnbQobQpbQqbQrbQsbQtbQzbQvbQwbJXbtnbOKbQybRZbJXbQAbQBbQCbJXbQDbgbbQEaXQbQFbtobQHbQIbQJbQKbQLbOVbOVbQMbQNbNrbQObQPbQQbQPbQRbNrbtpbQTbQUbQVbNDbKvbNFbQWbQXbQYbNFasfapxapxbQZbzBbPkbRbbRabzCbzCbzCbRccgpbRdcgpbNRbRebNSbBIaahbFvbFvbFvbFvbFvaahaaaaafaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaUAbRfbKPbKPbRgbRhbRibRjaUAaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDbRkbRkaHDaHDaHDaTqaHDaTqaHDaTqaTqalWbRmalWalWalWbdTarhapUbCpbPPbRnbRobEcbRobtqbCpbRqapRaotapTbRranfalWbCualObwLbwLbkDbRtbRubkDbwLbwLbwLbwLbRvbwLbwLbRwbglbRxbJJbRybRzbRAbRBbRCbLqbRDbREbRFbtrbJNbRHbRIbRJbRKbRLbRJbRMbRJbRNbRObRPbJXbtsbOKbRRbRSbtJbRUbRVbRWbJXbRlbgbbRYaXQbLGbubbuabusbukbSdbSebSabusbQMbSfbNrbSgbShbSibSjbQRbNrbSkbSlbSmbSnbRpbSpbNFbSqbSrbSsbNFbStbSubSvbSwbzBbRsbRTbRQbRXbzCbSobPscgpbPqbSybSxbSzbMjbFgbFsbIzbSFbSHbSGbFvaahaaabCaaaabBZaaabCaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaUAbSIbSJbSKbSLbSMbSNbSIaUAaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaHDbSAbbUaHDaaaaahbSBbSBbSBaahaaaaaaalWbSObSPbuzbSRbSSbSRbSTbCpbCpbCpbCpbSCbCpbCpbCpbSVardalOaotbSWbSXalWbSYbSZbwLbTabTbbTcbTdbTebTfbTgbwLbThbTibTjbwLbwPbcAbTkbJJbMNbQfbTlbTmbMNbLqbTnbTobTpbTqbJNbuDbTsbTtbTubvpbTwbTxbTybTzbTAbTBbJXbTCbTDbTEbTFbTGbTHbTIbTJbTKbSDbgbbTMaXQbLGbubbTObTPbTPbTQbTRbTSbTTbTUbTVbNrbTWbShbTXbTYbTZbNrbvqbvwbvsbUdbNDbKvbNFbNFbNFbNFbNFbUeapxapxbUfbzBbRsbRTbRQbSUbSEbSobTLbESbPqbUgbNRbUhbNSbBIaahbBIbUlbUnbUmbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaUAbUobHibUpbUqbUrbHibUsaUAaaaaaaaVRaUwaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaHDbRkbRkaHDaahaahbUibUibUiaahaahaahalWbUtasvasvasvbAMapRapUalOankaviaosarbbUuarhalWalWalWalWalWbUvalWalWbCuapTbwLbUwbUxbUybUybTdbUzbUAbwLbUBbvxbUDbwLbARbcAbUEbJJbMNbUFbUGbUHbUIbLqbUJbUKbULbJNbJNbUXbUWbUObwjbwMbwkbxcbxbbUUbUYbUZbJXbxSbVDbxUbVabtgbVcbVcbVdbJXbUjbgbbVfaXQbLGbNrbVgbVhbVibOVbVjbVkbQKbVlbVmbVnbVobVpbVqbVrbVsbNrbNDbNDbNDbNDbNDbVtaocbVubQZaqKapxbVvaqJbVwapxbzBbzBbUkbKobRXbzCbUQbUMcgpbURbSybNRbUSbPvbIVbJdbLAbVEbSHbXXbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxbfbbVFaUzaUzaUzbmtaYyaYyaYyaYBaYyaYyaYybAkaUzaUzaUzbkTaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalWalWalWalWbSXbVGasvbVHbVIbVJbVKbVKbVKbVLbVMbVKbVIbVKbVNbVKbVObVKaMDbVPaotbwLbVQbVRbVSbyNbEobVUbVVbwLbwLbwLbwLbwLbVWbcAbLkcbLbJJbVXbVXbVXbJJbJJbJNbJNbVYbJNbJNbyTbyTbWbbyTbyTbyTbyTbyTbWdbyTbyTbJXbJXbJXbJXbJXbJXbWebWebWebJXbVebgbbWgaXQbWhbepbWibWibWibWjbWibWibWkbWlbWibWibWibWibNrbWmbWnbWobWpbWqbWrapxbWsbWtaocbSvbWubWvapxbVvapxapxaoabzBbVzbGDbVAbzCbzCbzCbVBcgpbVCbWfbNRbRebNSbBIaahbFvbFvbFvbFvbFvaahaahbNWaahbMpaahaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwaUCaaaaaaaaaaaaaaaaaabWBaaaaaaaaaaaaaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWCbWCbWDbWEbWFalWbWGalWalWalWaUObWHbWHbWHbWHbWHbWHbWHaotbWIbWJcbZbwLbWLbWMbyUbWObEobTdbWPbWQbWRavialWbWSbwPbWTbWUbWVbWWbWXbWXbWXbWYbWZbXabXbbWXbXcbXdbWVbWVbXebXfbXfbXfbXgbXfbXhbXibXibXjbXkbXlbXmbXnbXobWXbWXbWXbXpbXqbXibXraXQbXsbXtbyVbXvbXwbXxbyWbyXbXAbXxbXBbXCbXDbXEbNrbXFbXGbWwbXIbXJbXKbXLbWtbXMaocaocaocaocaocbXNbXObzBbzBbzBbWxbGDbKobWzbWybWAbGGbXzbWKbXHbSxbXPbMjbFgbFsbIzbYZbZabZabFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwbJhaRIaRIaRIaRIaRIaRIbWBaRIaRIaRIaRIaRIaRIbgNaUwaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFbXZbYabYbbWFaotbYcbMAcesalWbYebWHceGbYgbYhbYiceIbWHaotalObWJalObwLbwLbwLbwLbwLbwLbwLbwLbwLatRalOalWbYkbwPbYlbYmbaUbaUbaUbaUbaUbaUbaXbaUbYnbYobYpbaWbaUbaUbYqbYrbYsbYtbYubYvbYwbYxbaUbaUbYybYzbaUbaUbaXbaUbaUbaUbaUbYAbaUbYnbYBbYCbYDbYEbYFbYGbYFbYHbYHbYIbYJbYKbYHbYGbYLbNrbNrbNrbNrbYMbYNapwaoaceWbYPapwbYPbYQbYRaocauWaocbzBbXQbXUbXTbXWbXVbYdbYdbYdbINcgpcgpcgpbNRbYSbNSbBIaahbBIbZbcaDcaCbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbZcaTkaTkaTkaTkaTkaTkaTkbZdaTkaTkaTkaTkaTkaTkaTkbZeaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahbWFbZfbZgbZhbWFaotbZibZjalWalWbZkbWHbZlbZmbZnbZobZpbWHawqaotbZqbVKbVIbVKbVNbVKbZrbZsbZsbZsbZsbZtaZebZubZvbZwbZxbZybZzbZAbZBbZybZybZybZCbZybZDaZCbZEbZFaZCaZCbZGbZHbZIbZJbZKbZLbZMbZNaZCbZObZPbZQbZQbZRbZSbZRbZRbZRbZTbZUbZVbZWbZXbZYbZZcaacabcaccadcaecafcagcahcaicajcagcakbWicalcambWicanbYNapwapwapwapwapwcaocapcaqcarcascatbYUbYTbYWbYVbYYbYXcgpcgpcgpcgpcgpbEScgpbNRcaubPvbIVbJdbLAcaVbZacbibFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaUyaUyaUyaUyaUyaUyaUyaUycaEaUyaUyaUyaUyaUyaUyaUyaUyaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFcaFcaGcaHbWFcgvaotcaJalWcaKcaLbWHcaMcaNcaOcaPcaQbWHbWHbWHbWHbWHbWHcaRbWHbWHcaSchcchdalOardccuarhcklcklcklcklcklcklcklcchcchcchcchcchcdzcaWcaWcaXcaYcaWcaZcaWcbacbbaXQcbcchzcbecbfcbecbgcbhcbecbecdKbepaXFaXHaXHcbjbepcbkbepbzacbmbzabWibzkbzbcahcbpcbqcagcahcbrcbscbtbzlbWichAcbwbWicbxcbycbzcaqcaqcaqcaqcbAcbBcbCcbDcbCcbEbzGcavcaxcawcgpcaybMdbMdbMdbMdbMdcazcgpbNRbRecaAbzBaahbFvbFvbFvbFvbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWFbzocbMbzobWFalWalWalWalWbWHcbObWHcbPchBcbRcbScbTbWHcbUcbVcbWbWHcbXcbYchQbWHccabWHbWHbWHbWHbWHbWHcklccbbBhbCRbCKcibccgcchcciccjcckcchbASccmbASccnccobASccmbASciKccqccrccsciWbATccvbATccwccxbATccvbATcctccyccyccyccyccycczbepbAUccBbAVbyVccDbYGcahcajcajcagccEcajcajcagccFbWiccGccHbWibYMccIccJcbCcbCcbEcbCcbCccKcbucbdcbucbubzBcbvcbGcbFcbIcbHbEScgpcgpcaybMdcbJbPubNRcbKbNSbzBaahaahaahaahaahaahaahaahbMoaahbMpaahbNWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaaabzocbQbzoaaaaahaaaaaaaaabWHcbObWHbWHbWHbWHccZbWHbWHcdacdbcdabWHbWHbWHbWHbWHcdccddbWHcdecdfcjgcdhccdcdjcdkcdlcdkcdmcdncdocdpcdqcdrbBbbAZbBfcdvcdwcdxcdycdzckWccmcdBcdCcdDccvcdEcdFcdGcdHcdIcdJcdKcdLcdMccycdNbBjcdPccycdQbepcdRcdScdTcdUcdVcdWcdXcdYcdZcdWcdXcdYcdYcdWceacebceccedccLcefbYNapwcegcehcbucbucbucbucbuceicejcekbzBccMccNcgpcgpbPqccObFbbFbccPccQccPbFbccRccSbNSbzBbzMbzMaahaaaaaaaaaaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahaahbzocbMbzoaahaahaahaahaahbWHcewcexceybWHcezceAceBbWHceCceDceEceFckXceHckZbWHceJceKceLceMbBlceObBRccUceRceSceTceUceVbDVbDWcchceXceYbCmcfacfbcfccfdcfecffcfgcfhcficdBcdCcdDcfjcfkcflcfmcfncfocfpcfpcfqcfqbCncfscftcfuccycfvbepcfwcfxcfybyVcfzcfAcfBcfCcfDcfCcfEcfCcfFcfCbCJbWibCLcfIcfJcfKccKaocaocaoccbucfLcfMccVcfOcfPcfQcfRbzBccWccYccXcdscdicelceecencemcepceocerceqcevbNSceQcghcggabjabjaaaaaaaahaaabCaaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaacfHaaaaaaaahaaaaahaaabWHbWHbWHcbObWHcgicgjcgkcglcgmcgncgoceHceHceBclLbWHcgqcgrbWHcaQcgscgtcgucklbCTbCScmDcgycgzcgAcmEccpccpcgCccpcgDcgEcgFcgFcgGcgHcgIcgJcgKcgLcgMcgNcfjcfkcfkcfkcgOcgPcgQcgRcgScgTbDucgVcgWcgXccycgYbepbepbepbepbWibWicfNbWibWibWibWibWibWibWibWibWibWibWibWibWichachbaoccnHcnqcbuchechfchgchhchichjchkbzBcfScfScfTcfScfUcfScfTcfVcfUcfUbNScfScfWcfYcfXbzBbzMbzMaahaaaaaaaaaaahaaabCaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaaabEzaaaaaaaahaaaabjabjchuchvbWHchwchxchybWHbWHbWHcpzcnIceHcpDchCbWHbWHbWHchDchEbWHchFchFchFchFchFchFchFcqjcgychHchIcqlccpchKchLbDXchNchOcqpcrxchPchRchSchTbAScdBchUcdDbATchVchWchXchYchZciacrHciccidccyciecifcigccycihciiciiciicijciicikcilcimciiciicinciiciiciiciiciocipciqcircaqciscitciucivbSucbuciwcixciycizciAciBciCbzBbzBbzBcfZbBIcgabBIcfZbBIcgacgacgbbBIcgbbzBbzBbzBaahaahaahaahaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaaaaafaahcgcaahaahaahaaaaahaahbWHbYgciLciMbWHbWHbWHciNbWHbWHbWHbWHbWHbWHbWHciOciPcgqciQciRchFciSciTccebTvcdgchFcrNciYcgBcjacsYccpcjccjdcjecjfctBctgcjhcjibEFcjkbEFcjlcjmchUcjncjocjpcjpcjpcjqcgdcjscufcjtcjuccycjvcjwcjxccycjycjzcjAcjAcjAcjAcgecjAbEHbEHbEHbEHbEHbEHbEHbEHbEHcjDbWHcjEapxapxapxaocapxavUcbucjFcjGcjHcizcjIcjJcjKcizaahaahcjLaahcjMaahcjLaahcjNcjOcjPaahcjPbEMaahaahaahaaaaaaaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaahaaaaQxaaabBkaaaaahaaaaaaaahaaabWHcjXbWHcewcexcgjcjYcgjcgjcjZckackackackbckackackackcckdckecgfckgckhckickjckkchFcklckmbFFckocklccpckpbFJccpckrckscjhcktckuckvckwckxcjhckyckzckAcjpckBckCckDckEckFckGcjqckHckIckJckKckJccyccyckLbWHcjAbGUbHcckOckPckQbEHbHdbHdbHdbHvbHjbIxbHdbEHcjDbWHckVapwcugcumaocckYcuucbuclaclbclccizciAcldclecizaahboObIzbotbIzboObIzbotbIzboObIQbotbJcboOaahaaaaaaaaaaaaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaQxaaabDDaaaaahaaaaaaaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHcljcmMcmMcgwcgZcgZcgZcgZchlcgZcgZcgZclncloclpclqclrclscltcluclvclwclxclyclzclAclBclCclDclEclFclGbJlclIclJcjhclKchUcjnchmchnclNclOclPclQclRcjqclSclTclUclVcjAcaQcgsclWcddcjAclXclYclZcmacmbbEHbHdbKibJQbKubHdbKGbKFbEHcmibWHbWHbWHbWHbWHaocaocaoccbucbucbubKHcizcmkcmlcmmcmnaahboOcmocmpcmqboOcmrcmscmtboOcmucmvcmwboOaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaahaaaaafaaabEzaahaahaahaahaahaaabWHcmycmzcmAcmBcmCcvvcvwbWHcljcmMcmHcmIcmJcmKcmLcmMcmNcmOcmPcmMcmQcmRcmScmTcmUcmVcmWcmXcmYcmZcnacnbcnacmZcnacnccndcnebKJcngcnhcnibKKbEFckychUcjncjqcnkcnlcnmcnncnocnpbKLcnrcnscntcnucjAcnvcnwcnxcnycjAcnzcnAcnBcnCcnDbEHbHdbHdbKRbHdbHdbKYbKWbEHcjDbWHcvHcvJbWHbLhbLgcnLbLibLzbLvaoccnPcizcizcnQcizcizaahboOcnRcnScnTboOcnUcnVcnWboOcnXcnYcnZboOaahaahaahaahaahaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaahaaaaQxaaabEzaahaaaaaaaaaaahaaabLQcobcoccodbMlcmCcofcogbWHcljcmMcohcoicojcokcolcomconcoocopcmMcoqcorcoscotcoubMucowcoxcoycozcoAchochochocoBcoCcoDbMKcoFcngcoGcnibMWcjhcoIchUcoJcjqcoKcoLcoMcnncoNcoOcjqcoPcoQcoRcoScjAcoTcoUcoVcoWcjAbMXcoYcoZcpacpbbEHbEHbNebNdbNibNibEHbNjbEHcphcpicpjcpkbWHcplapxapxapxcaNcpmbWHcpncpocizcppcizaMjaahboOcnRcpqcnRboOcnUcprcnUboOcpscptcpsboOaahaaaaaaaaaaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaafaahbEzaahaaaaaaaaaaahaaabLQcpvcofcoccpwcmCcpxbWHbWHcpycmMbNCbNBbNCbOGbNCcmMbNCcpFbNCcmMchFbONcpHchpchFchFcpJcpKcpLcpMcpMbPdbPYbPpcpMcpMchqcjhcpRcngcpSbQxcjhcjhcpUchUcpVcjqcjqcpWcpXcpYcpZcqacjqcqbckIcctcctcjAcqccjAchrcjAcjAcctcqecqfcctcctbQSbQGciIchMbRGcjjcjBcjrbEHcqobWHcwzcqqbWHcqrcaNceBceHcqsbRZbWHcqtcqucqvcqwcqvatJaahboOboOboOboOboOboOboOboOboOboOboOboOboOaahaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaahaaaaaaaQxaaacgcaaaaaaaaaaaaaahaaabLQbSccocbTrbSQcmCcqBcqCcaRcljcmMcqDcqEcqFcqGcqHcmMcqIcqJcqKcmMciZcqMcqNcqOcqPbTNcqRcdwcqScpMcqTbUabUcbUbckUcpMbZncjhcqYcngcqZbUCbEFcrbcrccrdcrecrfcjCcrhcricrjcoNcrkbUNcrmcrncrocrpcrqcfkcrrcrscrtcfkcrucrvcrwcfkcxkbQSbUPckfcjRbUTclhclkbUVbEHcjDbWHbWHcrFbWHcrGbUXceHceHcrIbUZbLQaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaaaaaaaahaaaaaaaafaaabBkaahaaaaaaaaaaahaaabLQbLQcoccmCcmCcoccoccrPcaRcljcmMbVbcrRcrScrTcrUcmMcllcrWcrXbVTcrZcsacsbcsccsdcsecsfcdwcdxbPdcshcsicsjcskcslcpMceBcjhcsmcsncsocspcsqcsrcsschUcstcsucsvcswcsxcsycszcsAbVZcsCcsDcsEcsFcsGcsHcsIcsJcsKcsLcsKcsMcsNcsOcsPcxlbWabXubWNclmbXybXSbXRcnjcsZbWHctactbctcbYicqsceHceHctdctebWHctfaahaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaQxaaacfHaaaaaaaaaaaaaahaaabLQcthcoccticoccoccpxbWHbWHctjcpIctlcrRctmcrTctnctoctpctqctrctscttctuctvctwctxctyctzctAcgEcblctCctDctEctFctEcpQctHcjhctIctJctKctLbEFcsrcsschUcstctMcgdctNctOctPctQctRbUNctSctTctUctVctWctXctYctZcfpcfpcuacubcuccudcuecbocbncxzcxoccccbNccfcqdbEHcjDbWHcuncuocupcpjcuqcrIcjEceHcurbLQaaaaahaaaaaaaaaaahaahaafbBZbBZbBZbBZbBZbBZaafbBZbCabBZbMpaahbCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaQxaaabEzaaaaaaaahaahaahaaabLQcuscmCcodcmCcutceBcclbWHcljcmMcuvcuwcuxcuycuzcmMcracuBcuCcmMcuDcoecuFcuGcuHbTNcuIcdwcuJcpMcuKcuLcuMcuNccucpMcuPcjhcjhcjhcrKcjhcjhcjhcuRcuScuTcjqcjqcjqcjqcjqcuUcrVcjqcjAcjAcrYcuXcuYccCccAccTcvccvccvccvccvdcvecvfcvdbEHbEHbEHctkcsBcdtctGbEHcjDbWHctacdubWHcvlcvmcdAceHceHcdObWHaahaahaahaahaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaahaafaQxaaaaafaQxaQxaahaahaahbEzaahaahaahaaaaahaahbLQcmCcutcmCcvpcqscxAcxBcmFcmGcmMcvrcvscetcvuceucmMcuAcvxcvycmMcuQcvAcvAcvAcvAcvAcvBcvCcvDcvEcvFcvGceNcvIcePcpMcvKcvLcvMcvNcvOcvPceKcvQcvRcvScvTcvUcuVcvLcvXcvYcvZcwacuWcwccvzcvicwfcwgceZcwicwjcwkcwlcwmcwncvdcwocwpcwqcwrcwsbEHbEHbEHbEHbEHbEHcwtbWHbWHbWHbWHbWHbWHbWHbLQbWHbWHbWHaaaaahaaaaaaaaaaahaahaahaafbCabCabCaaafbCabCabCaaafbCabNWbCabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachsaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahaaacgcaaaaaaaahaaaaahaaabLQbLQbLQbLQbWHcwycxEbWHbWHcljcmMcmMcmMcmMcmMcmMcmMcmMcvVcmMcmMcwAbWHcwBcfGcwDcwEctzcwFcwGcpMcwHcwIcwJcwKcwKcwKcwKcwKcwKcwKcwLcvWcwLcxScwNcwOcwPcxWcwdcwbcwebWHcwwcwwcwMcwwcwwcwScwVcwWceZcwXcwYcwZcxacxbcxccvdcxdcxecxfcxgcxhcoUcddciRbWHcxickdcxjbWHcylcddbWHaaaaahaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaaaaahaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahaahaahbEybEybEybBkbEyaaaaQxaaaaahaaaaaaaaaaaaaahbWHbWHbWHbWHcyrcljchEcyXcyEceHczbcaQchEciPbZnbWHcxpceHbWHcxqcxrcxscxncxucxvcxwcpMcpMcpMcpMcwKcgUcgxchGchtchJcwKcxCcxDcxIcxFcxGcdCcxHbWHcxKcxJcxMcxLcwwcxNcxPcxOcwwcyIcxQcxRciDcxTcxUcxVczdcxXcxYcvdcxZcyacybcyccydcoUcyecyfcygcyhchEcyicygcyjctdbLQaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahaahaahaahaahaahaahaahaahabjbWHcykbWHczecymciiciiciiciiciiciiciiciociicynceHcyobWHcypcyqcyqcyqcyscytcyucyvcywcyxcyycwKcyzcyAcyBcyCcyDcwKcqXcyFcyGcyHcxGcdCcCZcwRcyJcwRcwRcwRcwwcyKcyLcxPczGczocyMcyNcyOcyPcyQcyRcyRcyScxXcvdcyTcyacyUcyVcyWcoUciEcyYbWHcyZceHczabWHceHczlbWHaaaaahaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabEzaaabJebJebJebJebJeaaaaQxaaaaaaaaaaaaaahaahciGciFciLczfczgczfceEceBceHceHceHczhcziczjceHceHczkbZpcznbWHczmciHczJczIczqczrczscyvcztczuczvcwKczwczxczyczzczAcwKciJczCcwLcwLczDcdCcjncwRczKczHczMczLcwwczNcxPczOcwwcABczPczQcvcczRczSczTczUczVczWcvdczXczYczZcAacyVcoUbWHbWHbWHcqobWHcAbbWHbWHbWHbWHaahaahaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaahaaaaahaahaahaaabKIaaaaahaaaaahaaaaahaaaaQxaaaaaaaaaaahaahaaaabjabjbWHczpbWHceHchEceHceHcAdbWHbWHbWHbWHbWHchEczkcaQcgsbWHcAecAfcAgcAhcAicAjcAkciUcAmcAncAociVcAqcArcAscAtcAuciXcjbcAwcAxcwLcjmcAycAzcAAcAEcADcADcAGcwwcAScAScBmcwwcdHczPcAHcvccvccvccvccvccvccvccvdcvdcvdcAIcvdcvdcoUcxicAJckdcAKbWHceHcALcAMcANcAMabjabjaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahbEzaahbEybEybEybEybEyaahaQxaaaaaaaaaaafaaaaaaaahabjbWHbWHbWHcdebWHcgscAcczBbWHcAQcARcAQbWHcdeczkcBPcBPcBPcBPcBPcBPcBPcATcAUcAVcAWcAXcAYcAZcBacBbcBccBdcBecBfcBgcBhcBicBjcBkcBlcdCczEczFcBncACcACcBocwwcBpcBqcBqcwwcBrcBtcBucBvcBscCfcBycBzcBAcBBcBCcBDcBEcBFcBGcBHcdecBIceHceHbWHbWHcBJbWHbWHbWHbWHaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahcrMaahaahaahaQxaahaahaahaahaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHcqsczkcBPcjQcBLcBMcBNcBOcBPcBQcBRcBScyvcBTcBUcBVcwKcBWcBXcBXcBXcBYcwKcBZcCacCbcCccCdcCecCgcwRcChczHcCYcDccwwcDacDdcDbczGcIScCicCjcDecClcCmcCncCocCpcCqcCrcCscCqcCtcCucBHbWHcCwbWHcCvcCvcCxcCycCzcCAcCBaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcCCcjScCCaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabSbaahbJebJebJebJebJeaaaaQxaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaaaaahaaaaaabWHceHcCEcDfcCFcCGcCHcCIcCJcCKcCLcCMcCNcyvcjUcjTcCQcwKcCRcCScCTcCUcCVcwKcCWcCXcCXcwLcDRcDgcDUcDScEScDVcEUcETcwwcEVcEXcEWcFPcEYcFQcDhcDicDjcDkcDlcDmcDmcDncDocDpcDqcDrcjVcDtcDucDvcDwcDxcDycDzcDzcDzcDAcjWaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjScCCckncCCcjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaaaaahaaaaahaaaaahaaabBkaaaaahaaaaahaahaahaahcrMaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaabWHchEcDEcBPcDFcDGcDHcDIcDJckqcDLcDMcDNcyvcyvckMcyvcwKcwKcwKcwKcwKcwKcwKckNcwLcwLcAlcFRcwOcwPcApcFScFScGTcGRcwwcGVcGYcGWcHMcHLcHQcHPcIdcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcEicEjcEkcElcEmcEncEocEpcEqcErcjWaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEtcjScEvckRcExcjScEtaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaaabzocbQbzoaaaaahaaaaaaaaabWHcbObWHbWHbWHbWHccZbWHbWHcdacdbcdabWHbWHbWHbWHbWHcdccddbWHcdecdfcjgcdhccdcdjcdkcdlcdkcdmcdncdocdpcdqcdrbBbcggbBfcdvcdwcdxcdycghchmccmcdBcdCcdDccvcdEcdFcdGcdHcdIcdJchncdLcdMccycdNbBjcdPccycdQbepcdRcdScdTcdUcdVcdWcdXcdYcdZcdWcdXcdYcdYcdWceacebceccedccLcefbYNapwcegcehcbucbucbucbucbuceicejcekbzBccMccNcgpcgpbPqccObFbbFbccPccQccPbFbccRccSbNSbzBbzBbzBaRJaRIaRJaRIaRJaaabCaaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahaahbzocbMbzoaahaahaahaahaahbWHcewcexceybWHcezceAceBbWHceCceDceEceFckXceHckZbWHceJceKceLceMbBlceObBRccUceRceSceTceUceVbDVbDWcchceXceYbCmcfacfbcfccfdcfecffcfgcfhcficdBcdCcdDcfjcfkcflcfmcfncfocfpcfpcfqcfqbCncfscftcfuccycfvbepcfwcfxcfybyVcfzcfAcfBcfCcfDcfCcfEcfCcfFcfCbCJbWibCLcfIcfJcfKccKaocaocaoccbucfLcfMccVcfOcfPcfQcfRbzBccWccYccXcdscdicelceecencemcepceocerceqcevbNSceQchMceQchVchVchVchVciIaahaafaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaacfHaaaaaaaahaaaaahaaabWHbWHbWHcbObWHcgicgjcgkcglcgmcgncgoceHceHceBclLbWHcgqcgrbWHcaQcgscgtcgucklbCTbCScmDcgycgzcgAcmEccpccpcgCccpcgDcgEcgFcgFcgGcgHcgIcgJcgKcgLcgMcgNcfjcfkcfkcfkcgOcgPcgQcgRcgScgTbDucgVcgWcgXccycgYbepbepbepbepbWibWicfNbWibWibWibWibWibWibWibWibWibWibWibWibWichachbaoccnHcnqcbuchechfchgchhchichjchkbzBcfScfScfTcfScfUcfScfTcfVcfUcfUbNScfScfWcfYcfXbzBbzBbzBcjjcjochVcjpcjjaaabCaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaaabEzaaaaaaaahaaaabjabjchuchvbWHchwchxchybWHbWHbWHcpzcnIceHcpDchCbWHbWHbWHchDchEbWHchFchFchFchFchFchFchFcqjcgychHchIcqlccpchKchLbDXchNchOcqpcrxchPchRchSchTbAScdBchUcdDbATcjBchWchXchYchZciacjRciccidccyciecifcigccycihciiciiciicijciicikcilcimciiciicinciiciiciiciiciocipciqcircaqciscitciucivbSucbuciwcixciycizciAciBciCbzBbzBbzBcfZbBIcgabBIcfZbBIcgacgacgbbBIcgbbzBbzBbzBaahaahaahckxchVaTpaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaafaahcgcaahaahaahaaaaahaahbWHbYgciLciMbWHbWHbWHciNbWHbWHbWHbWHbWHbWHbWHciOciPcgqciQciRchFciSciTccebTvcdgchFcrNciYcgBcjacsYccpcjccjdcjecjfctBctgcjhcjibEFcjkbEFcjlcjmchUcjnckBcjqcjqcjqcjqcgdcjscufcjtcjuccycjvcjwcjxccycjycjzcjAcjAcjAcjAcgecjAbEHbEHbEHbEHbEHbEHbEHbEHbEHcjDbWHcjEapxapxapxaocapxavUcbucjFcjGcjHcizcjIcjJcjKcizaahaahcjLaahcjMaahcjLaahcjNcjOcjPaahcjPaahaahaahaahaaaaaackCchVckDaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaQxaaabBkaaaaahaaaaaaaahaaabWHcjXbWHcewcexcgjcjYcgjcgjcjZckackackackbckackackackcckdckecgfckgckhckickjckkchFcklckmbFFckocklccpckpbFJccpckrckscjhcktckuckvckwckWcjhckyckzckAcjqclNclhckFckEckFckGcjqckHckIckJckKckJccyccyckLbWHcjAbGUbHcckOckPckQbEHbHdbHdbHdbHvbHjbIxbHdbEHcjDbWHckVapwcugcumaocckYcuucbuclaclbclccizciAcldclecizaahbFvclObBIclObFvclObBIclObFvclPbBIclQbFvaahaaaaahaahaahcmochVcmpaahaahaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaQxaaabDDaaaaahaaaaaaaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHcljcmMcmMcgwcgZcgZcgZcgZchlcgZcgZcgZclncloclpclqclrclscltcluclvclwclxclyclzclAclBclCclDclEclFclGbJlclIclJcjhclKchUcjncgdcmqcnlcnmcmrcmsclRcjqclSclTclUclVcjAcaQcgsclWcddcjAclXclYclZcmacmbbEHcmtbKibJQbKubHdcmubKFbEHcmibWHbWHbWHbWHbWHaocaocaoccbucbucbubKHcizcmkcmlcmmcmnaahbFvcmvcmBcmwbFvcnkcnpcnobFvcnEcnScnRbFvaahaaaaahaaabzBcnUcnTcnWcnVaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaafaaabEzaahaahaahaahaahaaabWHcmycmzcmAcnXcmCcvvcvwbWHcljcmMcmHcmIcmJcmKcmLcmMcmNcmOcmPcmMcmQcmRcmScmTcmUcmVcmWcmXcmYcmZcnacnbcnacmZcnacnccndcnebKJcngcnhcnibKKbEFckychUcjncjqcnYcoLcoMcnncoEcnZbKLcnrcnscntcnucjAcnvcnwcnxcnycjAcnzcnAcnBcnCcnDbEHbHdbHdbKRbHdbHdbKYbKWbEHcjDbWHcvHcvJbWHbLhbLgcnLbLibLzbLvaoccnPcizcizcnQcizcizaahbFvcoGcoOcoKbFvcoPcpqcoRbFvcprcptcpsbFvaahaahaahaahcnVcpGbIQcpWcpSaahaafaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaQxaaabEzaahaaaaaaaaaaahaaabLQcobcoccodbMlcmCcofcogbWHcljcmMcohcoicojcokcolcomconcoocopcmMcoqcorcoscotcoubMucowcoxcoycozcoAchochochocoBcoCcoDbMKcoFcngcpYcpXbMWcjhcoIchUcoJcjqcqacpZcqAcqkcqTcqPcjqcqZcoQcracoScjAcoTcoUcoVcoWcjAbMXcoYcoZcpacpbbEHbEHbNebNdbNibNibEHbNjbEHcphcpicpjcpkbWHcplapxapxapxcaNcpmbWHcpncpocizcppcizaMjaahbFvcoGcrhcoGbFvcoPcricoPbFvcrjcrkcrjbFvaahaaaaahaaacpSbIQcrHbIQchVaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaafaahbEzaahaaaaaaaaaaahaaabLQcpvcofcoccpwcmCcpxbWHbWHcpycmMbNCbNBbNCbOGbNCcmMbNCcpFbNCcmMchFbONcpHchpchFchFcpJcpKcpLcpMcpMbPdbPYbPpcpMcpMchqcjhcpRcskcsocsncjhcjhcpUchUcpVcjqcjqcsvctDcswcoNctGcjqcqbckIcctcctcjAcqccjAchrcjAcjAcctcqecqfcctcctbQSbQGctKctJbRGctLctNcjrbEHcqobWHcwzcqqbWHcqrcaNceBceHcqsctObWHcqtcqucqvcqwcqvatJaahbFvbFvbFvbFvbFvbFvbFvbFvbFvbFvbFvbFvbFvaahaahaahaahchVbIQbIQbIQcpSaahbCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaahaaaaaaaQxaaacgcaaaaaaaaaaaaaahaaabLQbSccocbTrbSQcmCcqBcqCcaRcljcmMcqDcqEcqFcqGcqHcmMcqIcqJcqKcmMciZcqMcqNcqOctPbTNcqRcdwcqScpMcuCbUabUcbUbckUcpMbZncjhcqYcuHcuObUCbEFcrbcrccrdcrecrfcjCcuZcvbcvacvNcvfbUNcrmcrncrocrpcrqcfkcrrcrscrtcfkcrucrvcrwcfkcwwbQSbUPckfcwDbUTcwHclkbUVbEHcjDbWHbWHcrFbWHcrGcwMceHceHcrIcwXbLQaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaahaaachVcpScnVbzBcnVaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaaaaaaaahaaaaaaaafaaabBkaahaaaaaaaaaaahaaabLQbLQcoccmCcmCcoccoccrPcaRcljcmMbVbcrRcrScrTcrUcmMcllcrWcrXbVTcrZcsacsbcsccsdcsecsfcdwcdxbPdcshcsicsjcxkcslcpMceBcjhcsmcxxcxycspcsqcsrcsschUcstcsucxOcxNcsxcsycszcsAbVZcsCcsDcsEcsFcsGcsHcsIcsJcsKcsLcsKcsMcsNcsOcsPcxlbWabXubWNclmbXybXSbXRcnjcsZbWHctactbctcbYicqsceHceHctdctebWHctfaahaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaahaaaaahaaaaaaaahaaaaahaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaQxaaacfHaaaaaaaaaaaaaahaaabLQcthcoccticoccoccpxbWHbWHctjcpIctlcrRctmcrTctnctoctpctqctrctscttctuctvctwctxctyctzctAcgEcblctCcxPctEctFctEcpQctHcjhctIcyKczGcyLbEFcsrcsschUcstctMcgdczNcASczOctQctRbUNctSctTctUctVctWctXctYctZcfpcfpcuacubcuccudcuecbocbncxzcxoccccbNccfcqdbEHcjDbWHcuncuocupcpjcuqcrIcjEceHcurbLQaaaaahaaaaaaaaaaahaahaafbBZbBZbBZbBZbBZbBZaafbBZbCabBZbMpaahbCaaahaahaafbNWbNWbNWaafaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaQxaaabEzaaaaaaaahaahaahaaabLQcuscmCcodcmCcutceBcclbWHcljcmMcuvcuwcuxcuycuzcmMcBmcuBcBpcmMcuDcoecuFcuGcBqbTNcuIcdwcuJcpMcuKcuLcuMcuNcBscpMcuPcjhcjhcrKcjhcjhcjhcjhcuRcuScuTcjqcjqcjqcjqcjqcuUcrVcjqcjAcjAcrYcuXcuYccCccAccTcvccvccvccvccvdcvecCfcvdbEHbEHbEHctkcsBcdtcCObEHcjDbWHctacdubWHcvlcvmcdAcDacDacdObWHaahaahaahaahaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaabCaaaaaaaaahaaaaaaaahaaaaahaahaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaahaafaQxaaaaafaQxaQxaahaahaahbEzaahaahaahaaaaahaahbLQcmCcutcmCcvpcqscxAcxBcmFcmGcmMcvrcvscetcvuceucmMcuAcvxcvycmMcuQcvAcvAcvAcvAcvAcvBcvCcvDcvEcvFcvGceNcvIcePcpMcvKcvLcvMcvOcDbcvPceKcvQcvRcvScvTcvUcuVcvLcvXcvYcvZcwacuWcwccvzcvicwfcwgceZcwicwjcwkcwlcwmcwncvdcwocwpcwqcwrcwsbEHbEHbEHbEHbEHbEHcwtbWHbWHbWHbWHbWHbWHbWHbLQbWHbWHbWHaaaaahaaaaaaaaaaahaahaahaafbCabCabCaaafbCabCabCaaafbCabNWbCabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachsaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahaaacgcaaaaaaaahaaaaahaaabLQbLQbLQbLQbWHcwycxEbWHbWHcljcmMcmMcmMcmMcmMcmMcmMcmMcvVcmMcmMcwAbWHcwBcfGcDdcwEctzcwFcwGcpMcDicwIcwJcwKcwKcwKcwKcwKcwKcwKcwLcvWcwLcxScwNcwOcwPcxWcwdcwbcwebWHcEicEicEucEicEicwScwVcwWceZcEVcwYcwZcxacxbcxccvdcxdcxecxfcxgcxhcoUcddciRbWHcxickdcxjbWHcylcddbWHaaaaahaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaaaaahaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahaahaahbEybEybEybBkbEyaaaaQxaaaaahaaaaaaaaaaaaaahbWHbWHbWHbWHcyrcljchEcyXcyEceHczbcaQchEciPbZnbWHcxpceHbWHcxqcxrcxscxncxucxvcxwcpMcpMcpMcpMcwKcgUcgxchGchtchJcwKcxCcxDcxIcxFcxGcdCcxHbWHcxKcxJcxMcxLcEicEWcFPcEXcEicyIcxQcxRciDcxTcxUcxVczdcxXcxYcvdcxZcyacybcyccydcoUcyecyfcygcyhchEcyicygcyjctdbLQaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahaahaahaahaahaahaahaahaahabjbWHcykbWHczecymciiciiciiciiciiciiciiciociicynceHcyobWHcypcyqcyqcyqcyscytcyucyvcywcyxcyycwKcyzcyAcyBcyCcyDcwKcqXcyFcyGcyHcxGcdCcCZcwRcyJcwRcwRcwRcEicFTcFUcFPcGrczocyMcyNcyOcyPcyQcyRcyRcyScxXcvdcyTcyacyUcyVcyWcoUciEcyYbWHcyZceHczabWHceHczlbWHaaaaahaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabEzaaabJebJebJebJebJeaaaaQxaaaaaaaaaaaaaahaahciGciFciLczfczgczfceEceBceHceHceHczhcziczjceHceHczkbZpcznbWHczmciHczJczIczqczrczscyvcztczuczvcwKczwczxczyczzczAcwKciJczCcwLcwLczDcdCcjncwRczKczHczMczLcEicGtcFPcGucEicABczPczQcvcczRczSczTczUczVczWcvdczXczYczZcAacyVcoUbWHbWHbWHcqobWHcAbbWHbWHbWHbWHaahaahaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaahaaaaahaahaahaaabKIaaaaahaaaaahaaaaahaaaaQxaaaaaaaaaaahaahaaaabjabjbWHczpbWHceHchEceHceHcAdbWHbWHbWHbWHbWHchEczkcaQcgsbWHcAecAfcAgcAhcAicAjcAkciUcAmcAncAociVcAqcArcAscAtcAuciXcjbcAwcAxcwLcjmcAycAzcAAcAEcADcADcAGcEicGNcGNcGVcEicdHczPcAHcvccvccvccvccvccvccvccvdcvdcvdcAIcvdcvdcoUcxicAJckdcAKbWHceHcALcAMcANcAMabjabjaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahbEzaahbEybEybEybEybEyaahaQxaaaaaaaaaaafaaaaaaaahabjbWHbWHbWHcdebWHcgscAcczBbWHcAQcARcAQbWHcdeczkcBPcBPcBPcBPcBPcBPcBPcATcAUcAVcAWcAXcAYcAZcBacBbcBccBdcBecBfcBgcBhcBicBjcBkcBlcdCczEczFcBncACcACcBocEicGWcGXcGXcEicBrcBtcBucBvcGYcHkcBycBzcBAcBBcBCcBDcBEcBFcBGcBHcdecBIceHceHbWHbWHcBJbWHbWHbWHbWHaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahcrMaahaahaahaQxaahaahaahaahaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHcqsczkcBPcjQcBLcBMcBNcBOcBPcBQcBRcBScyvcBTcBUcBVcwKcBWcBXcBXcBXcBYcwKcBZcCacCbcCccCdcCecCgcwRcChczHcCYcDccEicHocHqcHpcGrcIScCicCjcDecClcCmcCncCocCpcCqcCrcCscCqcCtcCucBHbWHcCwbWHcCvcCvcCxcCycCzcCAcCBaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcCCcjScCCaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabSbaahbJebJebJebJebJeaaaaQxaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaaaaahaaaaaabWHceHcCEcDfcCFcCGcCHcCIcCJcCKcCLcCMcCNcyvcjUcjTcCQcwKcCRcCScCTcCUcCVcwKcCWcCXcCXcwLcDRcDgcDUcDScEScDVcEUcETcEicHrcHBcHvcHDcEYcFQcDhcHMcDjcDkcDlcDmcDmcDncDocDpcDqcDrcjVcDtcDucDvcDwcDxcDycDzcDzcDzcDAcjWaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjScCCckncCCcjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaaaaahaaaaahaaaaahaaabBkaaaaahaaaaahaahaahaahcrMaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaabWHchEcDEcBPcDFcDGcDHcDIcDJckqcDLcDMcDNcyvcyvckMcyvcwKcwKcwKcwKcwKcwKcwKckNcwLcwLcAlcFRcwOcwPcApcFScFScGTcGRcEicIhcItcImcIucHLcHQcHPcIdcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcIycEjcEkcElcEmcEncEocEpcEqcErcjWaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEtcjScEvckRcExcjScEtaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahcaBaahbEybEybEybEybEyaahaQxaaaaaaaaaaafaahcEycEycEyckScEycEycEyaaaaahaaaaaaaaaaahaaaaaabWHcAvczkcBPcuEckTcDGcECclfcBPcEEcEFcEGcBPcEHcEIcEJcEKclgcEMclgcENclgcEOcEMcEPcEKcEQckycdCcIfcwRcwTcIgcDTcwTcGScGScGScGScGScFacuXcFbcBvcFccFccFdcFecFfcFgcFhcFicFjcFkcFlcBHcFmcFncFocBvcFpcjWcjWcCvcjWcCvatJaahaaaaaaaahaaaaaaaahaahaahaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaahcjScjScFvcFwcFwcFwcFxcjScjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahaQxaaaaahaahaQxaaacEycFycFzcFycFAcFycEycEyckScEyckScEycEyaahaahbWHciRczkcBPcBPcBPcBPcBPcBPcBPcFBcFCcFDcFEcFFcFGcFHcEKclicFJclgcEMclgcFKcFLcFMcEKcFNckycdCcstctMcIlcIhcIscImcIucItcIAcIycEZcwUczPcwWcBHcBHcBHcBHcBHcBHcFWcFVcFXcFYcFZcGacBHbWHcCwbWHcCvcGbcGccGdcGecGfatJatJaahaahaahaahaahaahaahaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcGgcGhcGgcFwcGicFwcGjcGkcCCaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabSbaaabJebJebJebJebJeaaacrMaahaahaaaaQxaahcEycGlcGmcGncGocGlclHcAOcAFcGscAPcBwcEyaaaaaabWHbWHcGvcGwcGwcGxcGwcGycGzcIDcGAcGBcGCcGDcGEcGFcGGcGHcGIcGJcGIcGIcGKcGLcGMclMcGOcGPcGQcCecIOcINcFOcIRcJdcJccJccJecFTcFUcEZcdHczPcGZcBHcHacHbcHccHdcHecHfcHecHgcHhcHicBHcoUcHjbZkcddcCvcCvcCvcCvcCvbEMagqatJaahaaaaaaaaaaaaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaahcjScjScHlcFwcFwcFwcHmcjScjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaaaaahaahaahaaaaaacfraahaaaaaaaahaahaaaaaaaQxaaaaaaaaaaafaaacEycHncmccmecmdcHncHncBxcHscHtcHucBKcEyaaaaaaaaacoUcoUcoUcoUcoUbWHcHwcBPcBPcHxcHycHzcBPcHAcCkcHCcEKcmfcEMclgcEMclgcHEcHFcHGcHHcHIcHJcHKcJjcGScGScJpcHOcJtcGUcJwcGXcJxcEZcHRcHScHTcjWcHacHbcHUcHUcHVcHWcHXcHYcFYcHZcBHcaQcIacbOceHcIbbWHaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEtcjScIccmgcIecjScEtaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaacfraaaaaaaaaaaaaahaaaaaacrMaaaaaaaaaaQxaahcEycCDcmhcIicIjcIkcmjcmxcIncIocIpcIqcIrcnfcnfcnfcIrcIvcIwcIxcEycJzcIzcBPcCOcIBcICcvjbWHbWHbWHbWHcEKclgcEMclgcIEclgcIFcIGcIHcEKcIIcIJcdCcjncGScJDcHNcILcIMcIMcJEcIPcIQcnEcIScITcIUcBHcHacHbcHUcIVcHecIWcHecIXcIYcIZcBHcJaceHcbOceHcJbbWHaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjScCCcnFcCCcjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaafaQxaQxaQxaaaaaaaaacfraaaaaaaaaaQxaQxaQxcrMaQxaahaahaaaaQxaaackScCPcJfcJgcJhcJicnGcJkcJlcJmcJncJocnJcJqcJrcJscnKcJucJgcJvcnMcJAcJycnNcJAcJBcJCcvncvkcvqcvocvtcEKcEKcEKcEKcEKcEKcEKcJFcEKcEKbWHcJGcdCcjncGScIKcHNcHOcJtcGUcJHcJJcJKcJLcJMcJNcJIcDscJPcJPcJPcJPcJPcJQcJPcJRcJOcJTcBHceHceHcJUceHbWHbWHbWHaahaahaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcCCcjScCCaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaQxaahczcaahaQxaaaaaaaahaaaaaaaahaaaaahaahaahaaacEycDBcJWcJXcJYcJZcnOcKbcKccKdcKecKfcEyckSckSckScEycKjcKkcKlcEycoacKncBPcDCcDKcDDcDObWHcwucwhcwvbWHcKvckacKwckbckacKxcKycAJckecKzcKAcKBcCZcGScovcKDcKEcKEcKEcKFcKGcKHcoEcKJcKKcKLcKMcKNcKOcKPcoHcKRcKScKTcKUcKVcKWcKXckdckdcKYcKZcLacDPbWHbWHbWHabjaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaQxaaaaahaaaaQxaaaaaaaahaahaahaahaaaaaaaaaaahaahcEycpccoXcHncpdcpccLfcLgcLhcLicLjcLkcEycLlaaaaaacoUcoUcoUcoUcoUbWHcLmcBPcBPcBPcBPcBPbWHcJScKtcwxbWHcLqbWHbWHbWHbWHbWHbWHbWHbWHcxWcLrcLscLtcDQcpecLwcLxcpfcGUcLzcLAcLBcEZcfkcLCcJVcLEcLFcLGcLHcLIcLJcLKcKTciPcLLbWHbWHbWHbWHbWHcLocLMcLNciLcLOciLcpgaahaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacEycLQcLRcHncLRcLScLTcHncHncpucHncHncEyaahaahaahbWHcgscdecDWcLVcLWcLXckdcLYcLZcEscMbbWHcwQcwCcxtcxmcMebWHcMfcMgcMhbWHcMicMjcMkbWHcMlcMmcMncGScpAcMpcMqcpBcGUcMscGScKacGScMucMvcEucLEcMxcMycMzcpCcMBcMCcKTceHcMDbWHcEwcMFcEzbWHcMHcMIcEAbWHbWHbWHabjaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacEycMKcMLcHncMMcMNcLTcEBcMPcMQcEDcELcEyaaaaahaaabWHcMTcMUcMVcMWcMXcMYcMZcMYcMYcNacMDbWHbWHbWHbWHbWHcLqbWHcNbcNccNdcNecNfcNgcNhcNicNjcNkcNlcGScGScGScGScGScKgcGScGSbZncoUcNncNocjAcKTcKTcKTcKTcKTcKTcKTcKTceHcNpcNqcNrcNscNtcNucNucNvcNwcNuaaaaaaaaaaaaaahaahaaaaaaaahaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaacEycFqcERcHncERcFqcNzcFrcNBcNCcNDcNEckSaaaaaacNFbWHcNGbWHbWHbWHcNHbWHbWHbWHbWHcNIcNJcNKcNLcNMcNKcNNcNOcNPcNQcNRcNScNTcNUcNVcNWcNWcNXcNYcNZcOacObcOcckdckdcOdckdcOeckecOfcOgcOhcOicOfcOjckdckdcOkcKXckdckdckdcOlbWHckVcFscOncNucOocOpcOqcNuaahaahaahaahaahaahaahaahaahaahaahaahaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEycEyckScEyckScEycOrcOscOtcOucOvcOwcEyaahaahcNFcpEcOycNFcOzcOAcOBcOCcODcpGbWHbWHbWHbWHcOFbWHbWHbWHbWHbWHcOGcNRcOHcNRcOIcOJcOKcNRcOLcOMcONbWHbWHbWHbWHbWHbWHczacOOcdebWHcOPcOQcORbWHcgscdecOSbWHbWHbWHbWHbWHbWHbWHbWHbWHcrFcNucOTcOUcOVcNuaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaahaahaahcOWcOXcKicKhcPacKmcpOcpNcpPcEyaaaaaacNFcPfcPgcNFcpTcPicqgcPkcNFcNFcPlcqhcqicPocPpcPqcqkcFtcFucPucPvcNRcOHcNRcPwcPxcPycNRcPzcPAcPBcPCcPDcPEcPFcPGbWHcPHbWHbWHbWHcPIcKocPKbWHbWHbWHbLQbWHcPLcPMcPNbWHcPOcPPcPQbWHcqqcNucPRcPScPTcNuaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaahaaaaaacPUaahbzXcEycEycEycEycEycEycEyaaaaaacNFcqmcPWcNFcqxcqncqycQacNFcQbcQccQdcQecQfcQgcQhcQicQicQjcQkcQlcQmcQncNRcPwcQocPycNRcOLcOMcPwcqzcQqcNRcQrcQsbWHcQtbWHaahaaacqAcQvcqAaaaaaaaahaaabWHcjEceHceHcQwcgncQxcgncQycQzcNucqLcQBcqLcNuaaaaahaaaaahaahaaaaaaaahcrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahaahaahaaaaaaaaaaahaahaahaaaaaaaaaaahaaaaaaaaacNFcQDcQEcQFcQGcQHcQIcQJcNFcQKcNFcQLcQMcQNcQOcQPcQecQecQQcQRcQScQTcQUcQVcPwcQWcPycNRcOLcQXcQYcQZcRacRbcRccRdbWHcPHbWHaahaahcqAcRfcqAaahaahaahaaabWHcRgceHceHcRhcRibZlcRjbWHbLQcNucqLcRlcqLaahaaaaahaaaaaaaahaahaahaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaacNFcqmcRmcNFcRncRocRpcRqcRrcRscNFcRtcRucRvcRwcRxcRycRzcFucPucPycNRcRAcRBcRCcRDcREcQTcRFcRGcRHcRIcRIcqQcqUcRIbWHabjaahaaaaaacqAcRMcqAaaaaaaaahaahbWHcRNcROcRPbWHcRQcRRcRPbWHaaaaahcqLcQBcqLaahaaaaahaaaaaaaahaahaaaaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaahaafaagaafaahaafaafaafaahcPlcPlcPlcNFcNFcNFcNFcRTcRUcNFcNFcNFcRVcRWcRXcRwcRYcRZcSacPlcPlcPycNRcNRcNRcPwcPxcPycNRcSbcSccSdcqVaahaahaaaaaaaahabjaahaaacSfcSgcKpcSgcSfaaaaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHaaaaahaaacqWaaaaahaahaahaahaahaahaaaaaaaahaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaacKqcSkcSlcPlcrgcrycrlcSpcSqcrzcPlcSscStcSucSvcRwcRxcRycRzcSwcPlcSxcNRcSycSzcSAcSBcSCcSzcSDcNRcSEcRIaaaaahaahaahaahaahaahaahcSgcKrcSGcSHcSgaahaahaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaahaaacqWaaaaahaahaaaaaaaaaaahaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaacKqcSJcSlcSKcSLcSLcSLcSMcSNcSOcSPcSQcSRcSQcSScSLcSTcSScSUcSVcFucSWcSXcSYcSXcSXcSXcSXcSXcSYcSXcSZcqVaaaaahaaaaaaaahaaaaaaaaacSgcTacTbcTccTdcpoaahaahaahaahaahaahaahaahaahaahaahaahaahaaacrBcrAcrAcrAcrCaaaaaaaaaaaaaaaaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaacKqcSJcThcSqcTicTjcTicTkcTlcTmcTncTocTpcTqcTqcrDcTqcTqcTscTtcPlcTucTvcTwcTvcTvcTxcTvcTvcTycTzcTAcRIaahaahaaacSgcSgcSgcSgcSgcSgcTBcTCcTDcSgcSgcSgcSgcSgcSgaahaaaaaaaaaaaaaahaaaaaaaahaaaaaaaaaaaaaaacqWaaaaaaaahaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaaacKqcTFcSlcSqcTicTicTicTGcPlcPlcPlcPlcFIcrEcRwcTJcRwcrEcTKcPlcPlcqVcTMcqVcTMcqVcqVcqVcTMcTMcqVcqVcRIaaaaahaahcSgcKucKscKIcKCcSgcTXcKQcSgcSgcLbcLdcLccLecSgaahaahaahaaaaaaaahaahcrMaQxcrMaahaahaahaahcqWaahaahaahaahaahaafaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcPlcPlcPlcUdcRwcRwcUecRwcUfcUgcPlcUhcUicUjcUjcUkcUjcUjcGpcPlaaacqVcLncqVcTvcqVaaacqVcTvcLpcqVaaaaaaaaaaahaaacqAcLvcLucLDcLycLUcLPcUrcMacMccMccMdcMccMocqAaahaaaaahaahaahaahaahaaaaahaaaaahaaaaaaaaacrJaaaaaaaahaaaaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacKqcUwcUxcMrcUzcUzcUAcUkcrLcUCcPlcPlcPlcGqcGqcGqcGqcGqcPlcPlaahcqVcTMcqVcTMcqVaahcqVcTMcTMcqVaahaahaahaahaaacqAcMtcUIcUKcUJcUJcULcUMcUNcUNcUNcUNcUPcMwcqAaahaaaaaaaaaaaaaaaaafaaacrOcrOcrOcrOcrOaahcrQaahcrOcrOcrOcrOcrOaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcPlcKqcPlcPlcKqcKqcKqcKqcPlcUScPlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsgaaaaaaaaaaaaaahaaacSgcMEcMAcMGcUYcMOcMJcMRcWKcMScVbcNxcNmcNycSgaahaaaaaaaaaaaaaaaaQxaahcsRcsQcsQcsQcsQcsScsUcsTcsVcsVcsVcsVcsWaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaahaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcPKcPKcPKcPKcPIcNAcOxcOmcPIcPKcPKcPKcPKcSgaahaahaahaahaahaahaQxaahcsXcsXcsXcsXcsXaaacrQaaacsXcsXcsXcsXcsXaahaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcVrcVscVscGrcVucOEcOZcOYcVxcGtcVzcVzcVzcSgaaaaaaaaaaaaaaaaaaaafaaaaahaaaaahaahaahaaacrQaaaaahaaaaahaaaaahaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcSgcVzcVzcVzcVAcVBcVvcVwcUtcVCcVDcVzcVEcVzcSgaahaaaaaaaaaaaaaaaaQxaaacrOcrOcrOcrOcrOaahcrQaahcrOcrOcrOcrOcrOaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcVzcVzcVzcGucVGcPbcVIcPccVKcGNcVscVscVMcSgaahaaaaaaaaaaahaahaQxaahcsRcsQcsQcsQcsQcsScrQcsTcsVcsVcsVcsVcsWaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcPKcPKcPKcPKcVNcPdcVPcPecVNcPKcPKcPKcPKcSgaahaaaaaaaaaaaaaahaQxaahcsXcsXcsXcsXcsXaaacrQaahcsXcsXcsXcsXcsXaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcVrcVscVscHkcVucPhcVPcPjcVScHocVzcVzcVzcSgaahaahaaaaaaaaaaahcrMaaaaahaaaaahaaaaahaaacrQaaaaahaaaaahaahaahaahcrMaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcVzcVEcVzcVVcVWcVvcVXcUtcVYcVZcVzcVzcVzcSgaahaaaaaaaaaaaaaaaaQxaaacrOcrOcrOcrOcrOaahcuhaahcrOcrOcrOcrOcrOaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcSgcVzcVzcVzcHpcWccPbcWdcPmcVKcHqcVscVscVMcSgaahaaaaaaaaaaaaaahaQxaahcsRcsQcsQcsQcsQcuicrQcujcsVcsVcsVcsVcsWaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcSgcPKcPKcPKcPKcVNcPncVPcPrcVNcPKcPKcPKcPKcSgcSgaahaahaahaahaahaahaahcsXcsXcsXcsXcsXaaacukaaacsXcsXcsXcsXcsXaaaaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcVrcVscVscHrcVucPtcPscVPcPjcOYcPJcHvcWocVzcVzcSgaaaaaaaaaaaaaaaaafaaaaaaaahaahaahaaaaaacqWaahaaaaaaaahaahaaaaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaculaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcVzcVzcVzcWpcWqcUtcUtcWrcUtcUtcWscWtcWucVzcVzcSgaaaaaaaaaaaaaaaaQxaafaQxaQxaQxaaaaaaaaacqWaaaaaaaaaaQxaQxaQxcrMaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcVzcVzcVzcHBcWwcWxcWycWzcWAcWBcWCcHDcWEcVscVMcSgaahaahaaaaahaahaaaaaaaaaaaaaahaaaaQxaahcWFaahaQxaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcSgcSgcSgcSgcxxcWHcWIcWJcWKcWLcxycSgcSgcSgcSgcSgaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaahaaaaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaacSgcWNcWOcWPcWQcWRcWScWTcWUcWVcWWcWXcWYcWZcSgaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaacSgcSgcXacSgcXbcuZcuOcXecvacvbcXbcSgcWYcSgcSgaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahcSgcXacSgcSgcXhcXicVzcXjcXhcSgcSgcWYcSgaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcXacSgcVzcVzcXicVzcVzcVzcXkcSgcWYcSgaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSgcXacSgcXmcVzcXncVzcXocVzcXpcSgcWYcSgaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcSgcXacSgcXqcVzcVzcXrcVzcXscXtcSgcWYcSgaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcXacSgcSgcSgcSgcSgcSgcSgcSgcSgcWYcSgaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSgcXucXvcXvcXvcXwcXxcWYcWYcWYcWYcWYcSgaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacSgcSgcSgcSgcSgcqAcXzcqAcSgcSgcSgcSgcSgaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahaQxaaaaahaahaQxaaacEycFycFzcFycFAcFycEycEyckScEyckScEycEyaahaahbWHciRczkcBPcBPcBPcBPcBPcBPcBPcFBcFCcFDcFEcFFcFGcFHcEKclicFJclgcEMclgcFKcFLcFMcEKcFNckycdCcstctMcIlcIAcIscILcIPcIMcJccIQcEZcwUczPcwWcBHcBHcBHcBHcBHcBHcFWcFVcFXcFYcFZcGacBHbWHcCwbWHcCvcGbcGccGdcGecGfatJatJaahaahaahaahaahaahaahaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcGgcGhcGgcFwcGicFwcGjcGkcCCaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabSbaaabJebJebJebJebJeaaacrMaahaahaaaaQxaahcEycGlcGmcGncGocGlclHcAOcAFcGscAPcBwcEyaaaaaabWHbWHcGvcGwcGwcGxcGwcGycGzcIDcGAcGBcGCcGDcGEcGFcGGcGHcGIcGJcGIcGIcGKcGLcGMclMcGOcGPcGQcCecIOcINcFOcIRcJecJdcJdcJdcJwcJtcEZcdHczPcGZcBHcHacHbcHccHdcHecHfcHecHgcHhcHicBHcoUcHjbZkcddcCvcCvcCvcCvcCvbEMagqatJaahaaaaaaaaaaaaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaahcjScjScHlcFwcFwcFwcHmcjScjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaaaaahaahaahaaaaaacfraahaaaaaaaahaahaaaaaaaQxaaaaaaaaaaafaaacEycHncmccmecmdcHncHncBxcHscHtcHucBKcEyaaaaaaaaacoUcoUcoUcoUcoUbWHcHwcBPcBPcHxcHycHzcBPcHAcCkcHCcEKcmfcEMclgcEMclgcHEcHFcHGcHHcHIcHJcHKcJjcGScGScJpcJEcJxcHOcGUcJKcJHcEZcHRcHScHTcjWcHacHbcHUcHUcHVcHWcHXcHYcFYcHZcBHcaQcIacbOceHcIbbWHaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEtcjScIccmgcIecjScEtaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaacfraaaaaaaaaaaaaahaaaaaacrMaaaaaaaaaaQxaahcEycCDcmhcIicIjcIkcmjcmxcIncIocIpcIqcIrcnfcnfcnfcIrcIvcIwcIxcEycJzcIzcBPcJLcIBcICcvjbWHbWHbWHbWHcEKclgcEMclgcIEclgcIFcIGcIHcEKcIIcIJcdCcjncGScJDcHNcJMcHOcHOcJOcKpcKocEZcKrcITcIUcBHcHacHbcHUcIVcHecIWcHecIXcIYcIZcBHcJaceHcbOceHcJbbWHaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjScCCcnFcCCcjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaafaQxaQxaQxaaaaaaaaacfraaaaaaaaaaQxaQxaQxcrMaQxaahaahaaaaQxaaackScCPcJfcJgcJhcJicnGcJkcJlcJmcJncJocnJcJqcJrcJscnKcJucJgcJvcnMcJAcJycnNcJAcJBcJCcvncvkcvqcvocvtcEKcEKcEKcEKcEKcEKcEKcJFcEKcEKbWHcJGcdCcjncGScIKcHNcHOcGUcHOcKscJJcKucKIcKCcJNcJIcDscJPcJPcJPcJPcJPcJQcJPcJRcKJcJTcBHceHceHcJUceHbWHbWHbWHaahaahaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcCCcjScCCaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaQxaahczcaahaQxaaaaaaaahaaaaaaaahaaaaahaahaahaaacEycDBcJWcJXcJYcJZcnOcKbcKccKdcKecKfcEyckSckSckScEycKjcKkcKlcEycoacKncBPcDCcDKcDDcDObWHcwucwhcwvbWHcKvckacKwckbckacKxcKycAJckecKzcKAcKBcCZcGScovcKDcKEcKEcKEcKFcKGcKHcLbcKQcKKcKLcKMcKNcKOcKPcoHcKRcKScKTcKUcKVcKWcKXckdckdcKYcKZcLacDPbWHbWHbWHabjaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaQxaaaaahaaaaQxaaaaaaaahaahaahaahaaaaaaaaaaahaahcEycpccoXcHncpdcpccLfcLgcLhcLicLjcLkcEycLlaaaaaacoUcoUcoUcoUcoUbWHcLmcBPcBPcBPcBPcBPbWHcJScKtcwxbWHcLqbWHbWHbWHbWHbWHbWHbWHbWHcxWcLrcLscLtcDQcpecLwcLxcpfcLdcLccGUcLecLvcLucLCcJVcLEcLFcLGcLHcLIcLJcLKcKTciPcLLbWHbWHbWHbWHbWHcLocLMcLNciLcLOciLcpgaahaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacEycLQcLRcHncLRcLScLTcHncHncpucHncHncEyaahaahaahbWHcgscdecDWcLVcLWcLXckdcLycLZcEscMbbWHcwQcwCcxtcxmcMebWHcMfcMgcMhbWHcMicMjcMkbWHcMlcMmcMncGScpAcMpcMqcpBcLAcLzcGUcLBcGScMucMvcLDcLEcMxcMycMzcpCcMBcMCcKTceHcMDbWHcEwcMFcEzbWHcMHcMIcEAbWHbWHbWHabjaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacEycMKcMLcHncMMcMNcLTcEBcMPcMQcEDcELcEyaaaaahaaabWHcMTcMUcMVcMWcMXcMYcMZcMYcMYcNacMDbWHbWHbWHbWHbWHcLqbWHcNbcNccNdcNecNfcNgcNhcNicNjcNkcNlcGScGScGScGScGScKacGScKgcoUcoUcLPcLUcjAcKTcKTcKTcKTcKTcKTcKTcKTceHcNpcNqcNrcNscNtcNucNucNvcNwcNuaaaaaaaaaaaaaahaahaaaaaaaahaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaacEycFqcERcHncERcFqcNzcFrcNBcNCcNDcNEckSaaaaaacNFbWHcNGbWHbWHbWHcNHbWHbWHbWHbWHcNIcNJcNKcNLcNMcNKcNNcNOcNPcNQcNRcNScNTcNUcNVcNWcNWcNXcNYcNZcOacObcOcckdckdcOdckdcLYckecOfcMacMdcMccOfcOjckdckdcOkcKXckdckdckdcOlbWHckVcFscOncNucOocOpcOqcNuaahaahaahaahaahaahaahaahaahaahaahaahaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEycEyckScEyckScEycOrcOscOtcOucOvcOwcEyaahaahcNFcpEcOycNFcOzcOAcOBcOCcODcMobWHbWHbWHbWHcOFbWHbWHbWHbWHbWHcMscNRcOHcNRcOIcOJcOKcNRcOLcOMcMtbWHbWHbWHbWHbWHbWHczacOOcdebWHcMwcMEcMAbWHcgscdecOSbWHbWHbWHbWHbWHbWHbWHbWHbWHcrFcNucOTcOUcOVcNuaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaahaahaahcOWcOXcKicKhcPacKmcpOcpNcpPcEyaaaaaacNFcPfcPgcNFcpTcPicqgcPkcNFcNFcPlcqhcqicPocPpcPqcMGcFtcFucPucPvcNRcOHcNRcPwcPxcPycNRcPzcPAcPBcPCcPDcPEcPFcPGbWHcPHbWHbWHbWHcMJcMRcMObWHbWHbWHbLQbWHcPLcPMcPNbWHcPOcPPcPQbWHcqqcNucPRcPScPTcNuaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaahaaaaaacPUaahbzXcEycEycEycEycEycEycEyaaaaaacNFcqmcPWcNFcqxcqncqycQacNFcQbcQccQdcQecQfcQgcQhcQicQicQjcQkcQlcQmcQncNRcPwcQocPycNRcOLcOMcPwcqzcQqcNRcQrcQsbWHcQtbWHaahaaacMScNmcMSaaaaaaaahaaabWHcjEceHceHcQwcgncQxcgncQycQzcNucqLcQBcqLcNuaaaaahaaaaahaahaaaaaaaahcrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahaahaahaaaaaaaaaaahaahaahaaaaaaaaaaahaaaaaaaaacNFcQDcQEcQFcQGcQHcQIcQJcNFcQKcNFcQLcQMcQNcQOcQPcQecQecQQcQRcQScQTcQUcQVcPwcQWcPycNRcOLcQXcQYcQZcRacRbcRccRdbWHcPHbWHaahaahcMScNncMSaahaahaahaaabWHcRgceHceHcRhcRibZlcRjbWHbLQcNucqLcRlcqLaahaaaaahaaaaaaaahaahaahaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaacNFcqmcRmcNFcRncRocRpcRqcRrcRscNFcRtcRucRvcRwcRxcRycRzcFucPucPycNRcRAcRBcRCcRDcREcQTcRFcRGcRHcRIcRIcqQcqUcRIbWHabjaahaaaaaacMScNocMSaaaaaaaahaahbWHcRNcROcRPbWHcRQcRRcRPbWHaaaaahcqLcQBcqLaahaaaaahaaaaaaaahaahaaaaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaahaafaagaafaahaafaafaafaahcPlcPlcPlcNFcNFcNFcNFcRTcRUcNFcNFcNFcRVcRWcRXcRwcRYcRZcSacPlcPlcPycNRcNRcNRcPwcPxcPycNRcSbcSccSdcqVaahaahaaaaaaaahabjaahaaacNycNxcNAcNxcOeaaaaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHaaaaahaaacqWaaaaahaahaahaahaahaahaaaaaaaahaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaacKqcSkcSlcPlcrgcrycrlcSpcSqcrzcPlcSscStcSucSvcRwcRxcRycRzcSwcPlcOgcNRcSycSzcSAcSBcSCcSzcSDcNRcOhcRIaaaaahaahaahaahaahaahaahcNxcOicOxcOmcNxaahaahaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaahaaacqWaaaaahaahaaaaaaaaaaahaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaacKqcSJcSlcSKcSLcSLcSLcSMcSNcSOcOEcSQcSRcSQcSScSLcSTcSScSUcSVcFucSWcSXcSYcSXcSXcSXcSXcSXcSYcSXcSZcqVaaaaahaaaaaaaahaaaaaaaaacNxcOGcOPcONcORcOQaahaahaahaahaahaahaahaahaahaahaahaahaahaaacrBcrAcrAcrAcrCaaaaaaaaaaaaaaaaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaacKqcSJcThcSqcTicTjcTicTkcTlcTmcOYcTocTpcTqcTqcrDcTqcTqcTscTtcPlcTucTvcTwcTvcTvcTxcTvcTvcTycTzcTAcRIaahaahaaacNxcNxcNxcNxcNxcNxcOZcPccPbcNxcNxcNxcNxcNxcNxaaaaahaaaaaaaaaaahaaaaaaaahaaaaaaaaaaaaaaacqWaaaaaaaahaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaahaaacKqcTFcSlcSqcTicTicTicTGcPlcPlcPlcPlcFIcrEcRwcTJcRwcrEcTKcPlcPlcqVcTMcqVcTMcqVcqVcqVcTMcTMcqVcqVcRIaaaaahaahcNxcPecPdcPjcPhcNxcPmcPncNxcNxcPrcPtcPscPIcNxaahaahaahaahaaaaahaahcrMaQxcrMaahaahaahaahcqWaahaahaahaahaahaafaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcPlcPlcPlcUdcRwcRwcUecRwcUfcUgcPlcUhcUicUjcUjcUkcUjcUjcGpcPlaaacqVcLncqVcTvcqVaaacqVcTvcLpcqVaaaaaaaaaaahaaacMScPKcPJcPXcPVcPVcPYcQpcPZcQucQucQAcQvcQCcMSaaaaahaaaaahaahaahaahaaaaahaaaaahaaaaaaaaacrJaaaaaaaahaaaaaaaaaaaacrMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacKqcUwcUxcMrcUzcUzcUAcUkcrLcUCcPlcPlcPlcGqcGqcGqcGqcGqcPlcPlaahcqVcTMcqVcTMcqVaahcqVcTMcTMcqVaahaahaahaahaaacMScRfcRecRJcRkcRkcRKcRMcRLcRLcRLcRLcRScSecMSaaaaahaaaaaaaaaaaaaafaaacrOcrOcrOcrOcrOaahcrQaahcrOcrOcrOcrOcrOaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcPlcKqcPlcPlcKqcKqcKqcKqcPlcUScPlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsgaaaaaaaaaaaaaahaaacNxcSgcSfcSicShcSmcSjcSocSncSxcSrcSFcSEcSGcNxaaaaahaaaaaaaaaaaaaQxaahcsRcsQcsQcsQcsQcsScsUcsTcsVcsVcsVcsVcsWaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaahaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcSHcSHcSHcSHcMJcSIcTacSPcMJcSHcSHcSHcSHcNxaahaahaahaahaahaahaQxaahcsXcsXcsXcsXcsXaaacrQaaacsXcsXcsXcsXcsXaahaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcTccTbcTbcTdcTfcTecTncTgcTBcTrcTCcTCcTCcNxaaaaahaaaaaaaaaaaaaafaaaaahaaaaahaahaahaaacrQaaaaahaaaaahaaaaahaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcNxcTCcTCcTCcTDcTHcTEcTLcTIcTOcTNcTCcTCcTCcNxaaaaahaaaaaaaaaaaaaQxaaacrOcrOcrOcrOcrOaahcrQaahcrOcrOcrOcrOcrOaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcTPcTCcTCcTQcTScTRcTUcTTcTWcTVcTbcTbcTXcNxaaaaahaahaaaaahaahaQxaahcsRcsQcsQcsQcsQcsScrQcsTcsVcsVcsVcsVcsWaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcSHcSHcSHcSHcTZcTYcUbcUacTZcSHcSHcSHcSHcNxaaaaahaaaaaaaaaaahaQxaahcsXcsXcsXcsXcsXaaacrQaahcsXcsXcsXcsXcsXaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcTccTbcTbcUccTfcUlcUbcUmcUocUncTCcTCcTPcNxaahaahaaaaaaaaaaahcrMaaaaahaaaaahaaaaahaaacrQaaaaahaaaaahaahaahaahcrMaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcTCcTCcTCcUpcUqcTEcUrcTIcUtcUscTCcTCcTCcNxaaaaahaahaaaaaaaaaaQxaaacrOcrOcrOcrOcrOaahcuhaahcrOcrOcrOcrOcrOaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcNxcTPcTCcTCcUucUvcTRcUBcUycTWcUDcTbcTbcTXcNxaaaaaaaahaaaaaaaahaQxaahcsRcsQcsQcsQcsQcuicrQcujcsVcsVcsVcsVcsWaahaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcNxcSHcSHcSHcSHcTZcUEcUbcUFcTZcSHcSHcSHcSHcNxcNxaaaaahaahaahaahaahaahcsXcsXcsXcsXcsXaaacukaaacsXcsXcsXcsXcsXaaaaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcTccTbcTbcUGcTfcUIcUHcUbcUmcTgcUJcULcUKcTCcTCcNxaahaahaaaaaaaaaaafaaaaaaaahaahaahaaaaaacqWaahaaaaaaaahaahaaaaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaculaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcTCcTCcTCcUNcUMcTIcTIcUOcTIcTIcUPcURcUQcTCcTCcNxaaaaahaaaaaaaaaaQxaafaQxaQxaQxaaaaaaaaacqWaaaaaaaaaaQxaQxaQxcrMaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcTCcTCcTCcUUcUTcUWcUVcUYcUXcVacUZcVccVbcTbcTXcNxaaaaahaaaaahaahaaaaaaaaaaaaaahaaaaQxaahcWFaahaQxaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcNxcNxcNxcNxcVdcVfcVecVgcSncVicVhcNxcNxcNxcNxcNxaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaahaaaaQxaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaacNxcVkcVjcVmcVlcVocVncVqcVpcVscVrcVucVtcVvcNxaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaacNxcNxcVwcNxcVxcVzcVycVBcVAcVCcVxcNxcVtcNxcNxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahcNxcVwcNxcNxcVEcVDcTCcVFcVEcNxcNxcVtcNxaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcVwcNxcTCcTCcVDcTCcTCcTCcVGcNxcVtcNxaahaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNxcVwcNxcVHcTCcVIcTCcVJcTCcVKcNxcVtcNxaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcNxcVwcNxcVLcTCcTCcVMcTCcVOcVNcNxcVtcNxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcVwcNxcNxcNxcNxcNxcNxcNxcNxcNxcVtcNxaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNxcVPcVQcVQcVQcVRcVScVtcVtcVtcVtcVtcNxaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaacNxcNxcNxcNxcNxcMScVTcMScNxcNxcNxcNxcNxaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaaaaahaahaaaaaacXAaaaaahaahaahaahaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaahaaaaaaaaaaaaaaacXBaaaaaaaahaaaaahaaaaahaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaaaaagaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaagaagaahaaaaaaaaaaaaaaaaahaagaafaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaagaafaagaaaaaaaahaagaagaagaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaagaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaagaagaaaaahaaaaaaaaaaaaaahaagaafaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaagaaaaaaaahaagaagaagaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index fda4e802e09..f5fd004225f 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -600,7 +600,7 @@ "lB" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "lC" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) "lD" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership) -"lE" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"lE" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "lF" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "lG" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership) "lH" = (/turf/unsimulated/wall/fakedoor,/area/centcom/ferry) @@ -882,6 +882,63 @@ "qX" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/holding) "qY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "qZ" = (/obj/effect/landmark{name = "Holding Facility"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/holding) +"ra" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship) +"rb" = (/turf/unsimulated/wall/abductor{icon_state = "alien20"},/area/abductor_ship) +"rc" = (/turf/unsimulated/wall/abductor{icon_state = "alien23"},/area/abductor_ship) +"rd" = (/turf/unsimulated/wall/abductor{icon_state = "alien22"},/area/abductor_ship) +"re" = (/turf/unsimulated/wall/abductor{icon_state = "alien24"},/area/abductor_ship) +"rf" = (/turf/unsimulated/wall/abductor{icon_state = "alien16"},/area/abductor_ship) +"rg" = (/obj/machinery/abductor/experiment{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rh" = (/turf/unsimulated/wall/abductor{icon_state = "alien17"},/area/abductor_ship) +"ri" = (/obj/machinery/abductor/pad{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rj" = (/obj/effect/landmark/abductor/console,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rk" = (/turf/unsimulated/wall/abductor{icon_state = "alien19"},/area/abductor_ship) +"rl" = (/turf/unsimulated/wall/abductor{icon_state = "alien18"},/area/abductor_ship) +"rm" = (/obj/machinery/abductor/experiment{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rn" = (/obj/machinery/abductor/pad{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ro" = (/obj/effect/landmark/abductor/console{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rp" = (/turf/unsimulated/wall/abductor{icon_state = "alien14"},/area/abductor_ship) +"rq" = (/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rr" = (/obj/machinery/computer/camera_advanced/abductor{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rs" = (/turf/unsimulated/wall/abductor{icon_state = "alien15"},/area/abductor_ship) +"rt" = (/obj/structure/closet/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ru" = (/obj/machinery/computer/camera_advanced/abductor{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rv" = (/turf/unsimulated/wall/abductor{icon_state = "alien12"},/area/abductor_ship) +"rw" = (/obj/effect/landmark/abductor/scientist,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rx" = (/obj/item/weapon/retractor/alien,/obj/item/weapon/hemostat/alien,/obj/structure/table/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ry" = (/obj/effect/landmark/abductor/agent,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rz" = (/obj/structure/optable/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rA" = (/turf/unsimulated/wall/abductor{icon_state = "alien13"},/area/abductor_ship) +"rB" = (/obj/item/weapon/storage/box/handcuffs,/obj/structure/table/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rC" = (/obj/effect/landmark/abductor/scientist{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rD" = (/obj/effect/landmark/abductor/agent{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rE" = (/turf/unsimulated/wall/abductor{icon_state = "alien10"},/area/abductor_ship) +"rF" = (/obj/item/weapon/surgical_drapes,/obj/item/weapon/paper/abductor,/obj/item/weapon/scalpel/alien,/obj/structure/table/abductor,/obj/item/weapon/cautery/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rG" = (/turf/unsimulated/wall/abductor{icon_state = "alien11"},/area/abductor_ship) +"rH" = (/turf/unsimulated/wall/abductor{icon_state = "alien6"},/area/abductor_ship) +"rI" = (/obj/machinery/abductor/gland_dispenser,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rJ" = (/turf/unsimulated/wall/abductor{icon_state = "alien7"},/area/abductor_ship) +"rK" = (/obj/structure/stool/bed/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rL" = (/obj/structure/table/abductor,/obj/item/weapon/surgicaldrill/alien,/obj/item/weapon/circular_saw/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rM" = (/turf/unsimulated/wall/abductor{icon_state = "alien9"},/area/abductor_ship) +"rN" = (/turf/unsimulated/wall/abductor{icon_state = "alien8"},/area/abductor_ship) +"rO" = (/turf/unsimulated/wall/abductor{icon_state = "alien2"},/area/abductor_ship) +"rP" = (/turf/unsimulated/wall/abductor,/area/abductor_ship) +"rQ" = (/turf/unsimulated/wall/abductor{icon_state = "alien4"},/area/abductor_ship) +"rR" = (/turf/unsimulated/wall/abductor{icon_state = "alien3"},/area/abductor_ship) +"rS" = (/turf/unsimulated/wall/abductor{icon_state = "alien5"},/area/abductor_ship) +"rT" = (/obj/machinery/abductor/experiment{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rU" = (/obj/machinery/abductor/pad{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rV" = (/obj/effect/landmark/abductor/console{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rW" = (/obj/machinery/abductor/experiment{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rX" = (/obj/machinery/abductor/pad{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rY" = (/obj/effect/landmark/abductor/console{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rZ" = (/obj/machinery/computer/camera_advanced/abductor{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"sa" = (/obj/machinery/computer/camera_advanced/abductor{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"sb" = (/obj/effect/landmark/abductor/scientist{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"sc" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"sd" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"se" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababadaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeag @@ -1097,21 +1154,21 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrbrardrcreabababrbrardrcreababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrfrhrgrjrirlrkabrfrhrmrornrlrkabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrprrrqrqrqrtrsabrprurqrqrqrtrsabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrvrxrwrzryrBrAabrvrxrCrzrDrBrAabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrErFrqrqrqrtrGabrErFrqrqrqrtrGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrHrJrIrLrKrNrMabrHrJrIrLrKrNrMabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrPrOrRrQrSabababrPrOrRrQrSababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrbrardrcreabababrbrardrcreababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrfrhrTrVrUrlrkabrfrhrWrYrXrlrkabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrprZrqrqrqrtrsabrpsarqrqrqrtrsabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrvrxsbrzscrBrAabrvrxsdrzserBrAabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrErFrqrqrqrtrGabrErFrqrqrqrtrGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrHrJrIrLrKrNrMabrHrJrIrLrKrNrMabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrPrOrRrQrSabababrPrOrRrQrSababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab @@ -1140,3 +1197,4 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab "} + diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm index 2f3c901147a..8f1e302b0f2 100644 --- a/_maps/map_files/MetaStation/z4.dmm +++ b/_maps/map_files/MetaStation/z4.dmm @@ -744,7 +744,7 @@ "op" = (/obj/machinery/power/smes,/obj/structure/cable,/turf/simulated/floor/plasteel/airless,/area/derelict/se_solar) "oq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel/airless,/area/derelict/se_solar) "or" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/derelict/se_solar) -"os" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plasteel/airless,/area/derelict/se_solar) +"os" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/module/power_control,/obj/item/weapon/module/power_control,/obj/item/weapon/module/power_control,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plasteel/airless,/area/derelict/se_solar) "ot" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_painter,/turf/simulated/floor/plasteel/airless,/area/derelict/se_solar) "ou" = (/obj/docking_port/stationary{dheight = 0; dir = 2; dwidth = 11; height = 15; id = "whiteship_z4"; name = "KC13: Space, Station-Aft"; width = 27},/turf/space,/area/space) "ov" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel/airless,/area/derelict/se_solar) diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 652ba504919..144eb8c3a48 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -1235,7 +1235,7 @@ "xM" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/meter{use_power = 0},/turf/space,/area/space) "xN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/hallway/primary/central) "xO" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/hallway/primary/central) -"xP" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/kitchenspike,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar) +"xP" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/kitchenspike,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar) "xQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar) "xR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/gibber,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/bar) "xS" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar) diff --git a/_maps/map_files/MiniStation/z2.dmm b/_maps/map_files/MiniStation/z2.dmm index 4e02a325fcd..059bd30b2cf 100644 --- a/_maps/map_files/MiniStation/z2.dmm +++ b/_maps/map_files/MiniStation/z2.dmm @@ -294,7 +294,7 @@ "jc" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) "jd" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) "je" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership) -"jf" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"jf" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "jg" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "jh" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership) "ji" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome/tdomeobserve) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 6b5ff650249..d18f6746f97 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -1099,7 +1099,7 @@ "avg" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "avh" = (/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "avi" = (/obj/structure/stool{pixel_y = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) -"avj" = (/obj/structure/table/wood,/obj/item/clothing/mask/balaclava,/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) +"avj" = (/obj/structure/table/wood,/obj/item/device/instrument/guitar,/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "avk" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/prison) "avl" = (/obj/structure/table/wood,/obj/item/weapon/coin/silver,/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "avm" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) @@ -1167,9 +1167,9 @@ "aww" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "awx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "awy" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) -"awz" = (/obj/structure/table/wood,/obj/item/device/violin,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) +"awz" = (/obj/structure/table/wood,/obj/item/device/instrument/violin,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "awA" = (/obj/structure/table/wood,/obj/item/device/paicard,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) -"awB" = (/obj/structure/table/wood,/obj/item/toy/cards/deck,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) +"awB" = (/obj/structure/table/wood,/obj/item/toy/cards/deck{pixel_x = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/item/clothing/mask/balaclava{pixel_x = -8; pixel_y = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "awC" = (/obj/machinery/camera{c_tag = "Arrivals Bay 1 North"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry) "awD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) "awE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/crew_quarters/sleep) @@ -1987,7 +1987,7 @@ "aMk" = (/obj/machinery/door/window{dir = 4; name = "Theatre Stage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre) "aMl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aMm" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aMn" = (/obj/machinery/computer/slot_machine,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aMn" = (/obj/machinery/computer/slot_machine,/obj/machinery/light/small{dir = 4},/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aMo" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aMp" = (/obj/structure/closet/gmcloset,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aMq" = (/obj/structure/kitchenspike,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -2037,7 +2037,7 @@ "aNi" = (/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/theatre) "aNj" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/crew_quarters/theatre) "aNk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre) -"aNl" = (/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/slot_machine,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aNl" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aNm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/crew_quarters/bar) "aNn" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/bar) "aNo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/bar) @@ -2108,9 +2108,9 @@ "aOB" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aOC" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aOD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aOE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aOE" = (/obj/structure/table/wood/poker,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aOF" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aOG" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/chem_dispenser/drinks/beer,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aOG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aOH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/kitchen) "aOI" = (/obj/machinery/door/airlock{name = "Kitchen cold room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "aOJ" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics) @@ -2175,9 +2175,9 @@ "aPQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/wrench,/obj/item/device/assembly/timer,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/turf/simulated/floor/plasteel,/area/bridge) "aPR" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "aPS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aPT" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aPU" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aPV" = (/obj/structure/table/reinforced,/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = 4; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aPT" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aPU" = (/obj/machinery/disposal,/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = 4; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aPV" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/chem_dispenser/drinks/beer,/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aPW" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aPX" = (/obj/machinery/vending/boozeomat,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aPY" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen) @@ -2242,11 +2242,11 @@ "aRf" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison) "aRg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aRh" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry) -"aRi" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aRj" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aRk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aRl" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aRm" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aRi" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aRj" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aRk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aRl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table/wood/poker,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aRm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aRn" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aRo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/carbon/monkey{name = "Pun Pun"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aRp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) @@ -2267,7 +2267,7 @@ "aRE" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/library) "aRF" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/security/armory) "aRG" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) -"aRH" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aRH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table/wood/poker,/obj/item/stack/spacecash/c100{amount = 5},/obj/item/stack/spacecash/c10{amount = 10},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aRI" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) "aRJ" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) "aRK" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main) @@ -2318,11 +2318,11 @@ "aSD" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/bridge) "aSE" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/bridge) "aSF" = (/obj/machinery/computer/security/mining,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/bridge) -"aSG" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aSG" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aSH" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main) -"aSI" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aSJ" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aSK" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aSI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/table/reinforced,/obj/item/clothing/head/that{throwforce = 1; throwing = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aSJ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aSK" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aSL" = (/obj/effect/landmark/start{name = "Bartender"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aSM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aSN" = (/obj/machinery/requests_console{department = "Bar"; departmentType = 2; pixel_x = 30; pixel_y = 0},/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("SS13")},/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/chem_dispenser/drinks,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) @@ -2391,9 +2391,9 @@ "aTY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central) "aTZ" = (/obj/machinery/camera{c_tag = "Bridge East Entrance"; dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central) "aUa" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aUb" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aUc" = (/obj/structure/table/reinforced,/obj/item/clothing/head/that{throwforce = 1; throwing = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aUd" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen) +"aUb" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aUc" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/item/weapon/reagent_containers/food/snacks/pie/cream,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen) +"aUd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -31},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aUe" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen) "aUf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen) "aUg" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen) @@ -2481,12 +2481,12 @@ "aVK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "aVL" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "aVM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) -"aVN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -31},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aVO" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aVN" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aVO" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aVP" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aVQ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aVR" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) -"aVS" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) +"aVQ" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) +"aVR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 9},/turf/simulated/floor/plating,/area/atmos) +"aVS" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 6},/turf/simulated/floor/plasteel,/area/atmos) "aVT" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aVU" = (/obj/machinery/door/window/southright{name = "Bar Door"; req_access_txt = "0"; req_one_access_txt = "25;28"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) "aVV" = (/obj/structure/table/reinforced,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar) @@ -4654,7 +4654,7 @@ "bLz" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Air to Distro"; on = 1},/turf/simulated/floor/plasteel,/area/atmos) "bLA" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 10; initialize_directions = 10},/turf/simulated/floor/plasteel,/area/atmos) "bLB" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 6},/turf/simulated/floor/plasteel,/area/atmos) -"bLC" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/atmos) +"bLC" = (/obj/machinery/door/airlock/external{name = "Atmospherics External Airlock"; req_access_txt = "24"},/turf/simulated/floor/plating,/area/atmos) "bLD" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/space,/area/space) "bLE" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) "bLF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/medical/virology) @@ -5570,7 +5570,7 @@ "cdf" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; filter_type = 1; on = 1},/turf/simulated/floor/plasteel,/area/atmos) "cdg" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4; initialize_directions = 12},/turf/simulated/floor/plasteel,/area/atmos) "cdh" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 9},/turf/simulated/floor/plasteel,/area/atmos) -"cdi" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 9},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/atmos) +"cdi" = (/turf/simulated/floor/plating,/area/atmos) "cdj" = (/turf/simulated/wall,/area/maintenance/incinerator) "cdk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/incinerator) "cdl" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/incinerator) @@ -6378,8 +6378,10 @@ "csH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) "csI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) "csJ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "MiniSat Exterior South West"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/aisat) +"csK" = (/obj/machinery/atmospherics/pipe/simple/green/visible,/turf/simulated/wall/r_wall,/area/atmos) "csL" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "MiniSat Exterior South East"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat) "csM" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) +"csN" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/wall/r_wall,/area/atmos) "csP" = (/turf/simulated/wall,/area/ai_monitored/storage/secure) "csQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera{c_tag = "MiniSat Entrance"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/power/apc{dir = 8; name = "MiniSat External Power APC"; pixel_x = -27; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners (WEST)"; icon_state = "darkbluecorners"; dir = 8},/area/aisat) "csR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/aisat) @@ -6460,7 +6462,7 @@ "cuA" = (/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_x = 32; pixel_y = -32; tag = "icon-direction_sci (EAST)"},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "cuB" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/directions/engineering{pixel_x = -32; pixel_y = -40},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = -32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = -32; pixel_y = -32; tag = "icon-direction_evac (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "cuD" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Custodial Closet"},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor/plasteel,/area/janitor) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6577,14 +6579,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaekaCXaCYalQalQalQalQalQalQaIMalQaDgaINavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaJXaekaeZaeZaeZaeZaekaBEaJYafOaqpaJZaxaaKaaHbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaKBaKCaKDaKEaKFaKGaKHaKIaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaIpaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfaLyaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMavMavMavMavMavMaylavMaaaaqpaAuaLEaKaaLFaLGaLHaLHaLIarpaLJaKfaLKaLLaKhaLMaLNaLOaLPaLQaLRaKiaKiaKiaKiaKiaKiaKiaKmaKiaKhaKiaKiaKiaLSaLTaLUaLUaLUaLUaLVaLUaLWaLUaLUaLXaKhaGyaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaKAaHYaLYaLZaMaaMbaMcaMdaMeaMfaHYaHYaKAaHYaHYaHYaHYaHYaHYaHYaHYaHYaMgaHYaBdaKUaKUaKUaMhaMiaMjaMkaMlaMmaMnaIkaMoaImaMpaIkaIkaIpaMqaJzaMraLiaMsaIpaGWaGWaGWaGWaGWaGWaMtaMuaMvaGWaGXaEfaMwaGZaMxaMyaGZaMzaEfaEiaEiaEiaEiaEiaEiaMAaEiaEjaEjaEkaCTaMCaMDaBDaMEaMFaMGaMHaMIaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaKZaNlaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafarpavMaylavMaBGaxaaxaaMBavMaylavMaNXaNYaNZaxaaKaaOaaRhaKcaOaaKdarpaObaKfaxaaOcaOcaOcaOdaOcaOeaOeaOeaOeaOeaOfaOgaOeaOhaOeaOeaOeaOiaOjaOkaOjaOlaOmaOnaKiaKiaOoaOpaOqaOraKlaKiaNdaOsaOsaHYaHYaHZaHUaHUaHUaHUaHUaHUaHUaHUaOtbUPbUObUQbUObUObUObVMbUObWHbUObXtaOtaHUaHUaHUaHUaHUaHUaHUaHUaHXaHYaHYaIkaOAaOBaOCaOCaOCaOCaOCaJsaODaOCaIkaOEaOFaOGaIpaIpaIpaOHaOIaIpaIpaIpaIpaIpaNwaOJaOKaOKaOKaOLaOMaNwaGWaGXaEfaONaGZaNCaNDaGZaGZaOOaEfaOPaOQaORaBDaEjaOSaOTaOUaOUaOVaOWaOXaOYaBDaOZaPaaNRaPbaNRaPcaPdaPdaPcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaPeaxaavNaNZaxaaxaaPfavNaxaaPeaNZaxaaxaaxaaPgaPhaPhaPhaPhaPhaPhaPhaPiaxaaOcaPjaOcaPkaOeaPlaPmaPnaPoaPpaPmaPqaPraPsaPtaPuaPvaOiaPwaPxaPyaOlaPzaOnaOnaPAaOnaOnaOsaPBaPCaPDaPEaOsaOsaPFaHYaHZaHUaaaaaaaaaaaaaaaaaaaaaaOtaPGaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaOtaaaaaaaaaaaaaaaaaaaaaaHUaHXaHYaPRaIkaPSaOCaOCaOCaOCaOCaUaaJsaODaPUaPVaJsaPWaPXaIpaPYaPZaQaaQbaQcaQdaQeaQfaIpaNwaQgaQhaQhaQhaQiaQjaNwaGWaQkaEfaQlaQlaNCaNDaQmaQmaQnaEfaEfaQoaEfaBDaQpaNKaNLaQqaQqaNMaNNaBDaBDaBDaLDaQraQsaQtaLDaLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaavMaQvaQwaQwaQwaQwaQwaQwaQwaQwaQvaQwaQxaxaaxaaLLaxaaQyaQzaxaaQAaQBaxaaQCaQDaOcaQEaOcaPkaOeaQFaPmaQGaPmaPmaPmaPqaQHaPmaPmaPmaPvaOiaQIaPxaPxaOlaPzaOnaQJaQKaQKaQLaOsaQMaQNaQOaQPaQQaQRaHYaHYaHZaHUaaaaaaaaaaaaaOtaOtaOtaOtaQSaQTaQUaQVaQWaQXaQYaQZaRaaRbaRcaOtaOtaOtaOtaaaaaaaaaaaaaHUaHXaHYaHYaRdaOCaReaRgaRgaRgaRjaRiaRHaRkaRlaRmaRnaRoaRpaRqaRraRraRsaRtaRuaRuaRvaRraRwaRxaRyaRzaRAaRBaRCaQjaNwaGWaGXaEfaGZaGZaNCaNDaGZaGZaGZaRDaREaGZbqpaBDaRGaUyaRIaQqaQqaSHaRKaRLaBDaRMaRNaPaaNRaROaNRaRPaPdaPdaRQaRRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaLLaRSaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTaOcaQEaRWaRXaOeaRYaPmaRZaTfaSbaScaSdaSaaPmaPmaPmaSeaOiaSfaSgaShaOlaPzaOnaSiaSjaSkaSlaOsaSmaSnaSoaSpaSqaQRaHYaHYaHZaHUaHUaIcaSraOtaOtaSsaStaSuaSvaSwaSxaSyaSzaSxaSAaSxaSxaSBaSCaSDaSEaSFaOtaOtaSraIcaHUaHUaHXaHYaHYaIkaSGaJsaOCaOCaOCaOCaXsaOCaSIaSJaSKaSLaSMaSNaSOaSPaSQaSRaSSaSTaSUaSVaSPaSWaSXaSYaSZaTaaTbaSZaTcaTdaGWaGXaEfaTeaTeaNCaNDaTlaGZaGZaTgaGZaThaTiaBDaTjaTkaTpaQqaQqaTmaTnaEjaBDaToaNRaPaaNRaROaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaymaxbaTqaRTaTraTsaTtaTuaTtaTvaTraTtaRTaQEaQEaTwaTxaOeaTyaPmaTzaTAaTBaTCaTDaTfaPmaPmaPmaPvaOiaOiaOiaOiaOlaPzaOnaOnaOnaOnaOnaOsaTEaQOaQOaQOaQOaQRaHYaHYaHZaIaaIaaTFaTGaTHaOtaTIaTJaTKaTLaTMaTLaTNaTOaTPaTQaTRaTSaTTaTRaTUaTVaTWaOtaTXaTGaTYaTZaIaaHXaHYaHYaRdaOCaJsaPTaOCaUbaOCaPTaOCaODaPUaUcaOCaOCaOCaUdaUeaUfaUgaUhaUiaUjaUkaUlaIpaUmaUnaUoaQhaUpaQhaUqaUraGWaUsaEfaEfaEfaNCaNDaUtaUuaGZaUvaUwaJKaUxaBDaEjaUyaRIaQqaQqaRJaRKaUAaBDaUBaNRaPaaUCaUDaUEaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFavMavMaBGaUGaUHaUIaUJaUKaULaUMaUNaTraTtaRTaUOaUPaUQaOcaOeaURaUSaUTaUUaUTaUVaUWaUVaUVaUVaUXaUYaOeaUZaVaaVbaVcaVdaVeaVfaVgaOcaVhaOsaViaVjaVkaVlaVlaQRaHYaHYaHYaHYaHYaVmaVnaVoaVpaVqaVraVsaVtaVuaVvaVwaVxaVyaVzaVAaVBaVCaVDaVsaVEaVFaVGaVHaVIaVJaVKaVLaVMaHYaHYaIkaVNaVOaVPaVQaOCaVRaVSaVQaODaPUaVTaVTaVUaVVaIpaUeaUeaUeaVWaUeaUeaUkaVXaIpaNwaUnaQhaQhaUpaQhaVYaNwaGWaVZaWaaWbaWcaWdaWeaWfaWfaWfaWfaWfaWfaWgaWhaWiaWiaWiaWiaWiaWjaWkaWlaWhaWmaWnaWoaWpaNRaWqaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWraWsatBaWsaxaaxaaRTaWtaWuaWvaWvaWvaWwaWxaWyaRTaWzaQEaUQaWAaWAaWAaWBaWCaWAaWDaWEaWFaWGaWHaWHaWIaWJaOeaWKaWLaWMaWNaWOaWPaWPaWQaWRaWRaWSaWSaWSaWSaWSaWTaOsaHYaHYaWUaWVaWWaWXaWYaWZaOtaXaaXbaXcaXdaXeaXfaXfaXgaXhaXiaXjaXkaXlaXmaXcaXnaXaaOtaWZaWYaXoaXpaWVaXqaHYaHYaRdaOCaXraXsaOCaOCaOCaXsaOCaODaOCaPUaPUaOCaOCaXtaXuaXvaUeaUeaUeaUeaXwaXxaIpaXyaXzaQhaXAaXBaXCaXzaXDaGWaXEaXFaXFaXGaXHaXIaXJaXKaXLaXJaXJaXJaXMaXNaXOaXPaXPaXPaXPaXPaXQaXRaXNaXSaXTaXUaXVaNRaXWaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaODaRdaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafarpavMaylavMaBGaxaaxaaMBavMaylavMaNXaNYaNZaxaaKaaOaaRhaKcaOaaKdarpaObaKfaxaaOcaOcaOcaOdaOcaOeaOeaOeaOeaOeaOfaOgaOeaOhaOeaOeaOeaOiaOjaOkaOjaOlaOmaOnaKiaKiaOoaOpaOqaOraKlaKiaNdaOsaOsaHYaHYaHZaHUaHUaHUaHUaHUaHUaHUaHUaOtbUPbUObUQbUObUObUObVMbUObWHbUObXtaOtaHUaHUaHUaHUaHUaHUaHUaHUaHXaHYaHYaIkaOAaOBaNlaVPaNlaNlaOCaJsaOGaOEaPUaPTaOFaPVaIpaIpaIpaOHaOIaIpaIpaIpaIpaIpaNwaOJaOKaOKaOKaOLaOMaNwaGWaGXaEfaONaGZaNCaNDaGZaGZaOOaEfaOPaOQaORaBDaEjaOSaOTaOUaOUaOVaOWaOXaOYaBDaOZaPaaNRaPbaNRaPcaPdaPdaPcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaPeaxaavNaNZaxaaxaaPfavNaxaaPeaNZaxaaxaaxaaPgaPhaPhaPhaPhaPhaPhaPhaPiaxaaOcaPjaOcaPkaOeaPlaPmaPnaPoaPpaPmaPqaPraPsaPtaPuaPvaOiaPwaPxaPyaOlaPzaOnaOnaPAaOnaOnaOsaPBaPCaPDaPEaOsaOsaPFaHYaHZaHUaaaaaaaaaaaaaaaaaaaaaaOtaPGaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaOtaaaaaaaaaaaaaaaaaaaaaaHUaHXaHYaPRaIkaPSaOCaRiaXsaXsaXsaOCaJsaOGaRjaOBaJsaPWaPXaIpaPYaPZaQaaQbaQcaQdaQeaQfaIpaNwaQgaQhaQhaQhaQiaQjaNwaGWaQkaEfaQlaQlaNCaNDaQmaQmaQnaEfaEfaQoaEfaBDaQpaNKaNLaQqaQqaNMaNNaBDaBDaBDaLDaQraQsaQtaLDaLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaavMaQvaQwaQwaQwaQwaQwaQwaQwaQwaQvaQwaQxaxaaxaaLLaxaaQyaQzaxaaQAaQBaxaaQCaQDaOcaQEaOcaPkaOeaQFaPmaQGaPmaPmaPmaPqaQHaPmaPmaPmaPvaOiaQIaPxaPxaOlaPzaOnaQJaQKaQKaQLaOsaQMaQNaQOaQPaQQaQRaHYaHYaHZaHUaaaaaaaaaaaaaOtaOtaOtaOtaQSaQTaQUaQVaQWaQXaQYaQZaRaaRbaRcaOtaOtaOtaOtaaaaaaaaaaaaaHUaHXaHYaHYaRdaOCaReaRgaRgaRgaRkaRgaRnaRmaRlaRHaRnaRoaRpaRqaRraRraRsaRtaRuaRuaRvaRraRwaRxaRyaRzaRAaRBaRCaQjaNwaGWaGXaEfaGZaGZaNCaNDaGZaGZaGZaRDaREaGZbqpaBDaRGaUyaRIaQqaQqaSHaRKaRLaBDaRMaRNaPaaNRaROaNRaRPaPdaPdaRQaRRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaLLaRSaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTaOcaQEaRWaRXaOeaRYaPmaRZaTfaSbaScaSdaSaaPmaPmaPmaSeaOiaSfaSgaShaOlaPzaOnaSiaSjaSkaSlaOsaSmaSnaSoaSpaSqaQRaHYaHYaHZaHUaHUaIcaSraOtaOtaSsaStaSuaSvaSwaSxaSyaSzaSxaSAaSxaSxaSBaSCaSDaSEaSFaOtaOtaSraIcaHUaHUaHXaHYaHYaIkaSGaJsaUaaUaaUaaUaaOCaOCaSJaSIaSMaSLaSMaSNaSOaSPaSQaSRaSSaSTaSUaSVaSPaSWaSXaSYaSZaTaaTbaSZaTcaTdaGWaGXaEfaTeaTeaNCaNDaTlaGZaGZaTgaGZaThaTiaBDaTjaTkaTpaQqaQqaTmaTnaEjaBDaToaNRaPaaNRaROaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaymaxbaTqaRTaTraTsaTtaTuaTtaTvaTraTtaRTaQEaQEaTwaTxaOeaTyaPmaTzaTAaTBaTCaTDaTfaPmaPmaPmaPvaOiaOiaOiaOiaOlaPzaOnaOnaOnaOnaOnaOsaTEaQOaQOaQOaQOaQRaHYaHYaHZaIaaIaaTFaTGaTHaOtaTIaTJaTKaTLaTMaTLaTNaTOaTPaTQaTRaTSaTTaTRaTUaTVaTWaOtaTXaTGaTYaTZaIaaHXaHYaHYaRdaNlaJsaNlaSKaUbaNlaOCaOCaOGaVTaOCaOCaOCaOCaUcaUeaUfaUgaUhaUiaUjaUkaUlaIpaUmaUnaUoaQhaUpaQhaUqaUraGWaUsaEfaEfaEfaNCaNDaUtaUuaGZaUvaUwaJKaUxaBDaEjaUyaRIaQqaQqaRJaRKaUAaBDaUBaNRaPaaUCaUDaUEaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFavMavMaBGaUGaUHaUIaUJaUKaULaUMaUNaTraTtaRTaUOaUPaUQaOcaOeaURaUSaUTaUUaUTaUVaUWaUVaUVaUVaUXaUYaOeaUZaVaaVbaVcaVdaVeaVfaVgaOcaVhaOsaViaVjaVkaVlaVlaQRaHYaHYaHYaHYaHYaVmaVnaVoaVpaVqaVraVsaVtaVuaVvaVwaVxaVyaVzaVAaVBaVCaVDaVsaVEaVFaVGaVHaVIaVJaVKaVLaVMaHYaHYaIkaUdaJsaXsaXsaRiaXsaOCaOCaOGaVTaVNaVTaVUaVVaIpaUeaUeaUeaVWaUeaUeaUkaVXaIpaNwaUnaQhaQhaUpaQhaVYaNwaGWaVZaWaaWbaWcaWdaWeaWfaWfaWfaWfaWfaWfaWgaWhaWiaWiaWiaWiaWiaWjaWkaWlaWhaWmaWnaWoaWpaNRaWqaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWraWsatBaWsaxaaxaaRTaWtaWuaWvaWvaWvaWwaWxaWyaRTaWzaQEaUQaWAaWAaWAaWBaWCaWAaWDaWEaWFaWGaWHaWHaWIaWJaOeaWKaWLaWMaWNaWOaWPaWPaWQaWRaWRaWSaWSaWSaWSaWSaWTaOsaHYaHYaWUaWVaWWaWXaWYaWZaOtaXaaXbaXcaXdaXeaXfaXfaXgaXhaXiaXjaXkaXlaXmaXcaXnaXaaOtaWZaWYaXoaXpaWVaXqaHYaHYaRdaOCaXraOCaOCaOCaOCaOCaOCaODaOBaVOaOBaOCaOCaXtaXuaXvaUeaUeaUeaUeaXwaXxaIpaXyaXzaQhaXAaXBaXCaXzaXDaGWaXEaXFaXFaXGaXHaXIaXJaXKaXLaXJaXJaXJaXMaXNaXOaXPaXPaXPaXPaXPaXQaXRaXNaXSaXTaXUaXVaNRaXWaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavMavMaBGaxaaXXaTraXYaWvaWvaWvaXZaYaaTraRTaYbaYcaUQaWAaYdaYeaYfaYgaWAaYhaYiaYjaOeaYkaYlaYmaRZaOeaYnaYoaYpaYpaYpaYpaYqaYpaYpaYraYsaYsaYsaYtaYsaYuaYvaKAaKAaYwaYxaYxaYxaYxaYxaYxaYyaYzaYAaYBaXgaYCaYDaYDaYEaYFaYDaYCaXiaYGaYHaYIaYJaYHaYHaYHaYHaYHaYHaYKaKAaKAaIkaYLaYMaYNaYOaOCaOCaOCaYPaYQaYRaOCaYSaYTaYUaIpaIpaIpaYVaYWaYWaYWaIpaIpaIpaYXaQhaQhaYYaYZaZaaZbaYYaGWaZcaXFaZdaEfaZeaUzaZgaZfaZiaZjaTgaUuaZkaBDaZlaEjaZmaQqaQqaZmaEjaZnaBDaZoaZpaZqaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaZraNZaZsaRTaTtaZtaTtaTraZuaZvaZwaTtaRTaZxaZyaZzaWAaWAaWAaZAaZBaWAaZCaYiaZEaOeaYkaYlaYmaRZaOeaYnaYoaYpaZFaZGaZGaZGaZHaYpaZIaZJaZKaZLaYvaYvaYvaYvaHYaHYaZMaZNaZOaZPaZQaZRaZSaZTaZUaZVaZWaZXaYDaYDaZYaZZaZYaYDaYDbaababbacbadbaebafbagbahbaibajaYHaXqaHYaHYaIkaIkaIkaIkaIkbakaRdbakbalaIkaIkaIkaIkaIkaIkaIkbaobaobaobaobaobaobapbaoaGWaYYbaqbaqaYYbaraXFaXFaXFbanaZcaXFaZdaEfaEfaEfbasbatbasaEfbasaEfaEfaBDaBDbaubaubaubaubaubauaBDaBDbavaNRbawaROaNRaNRaRQaPdaPdaRQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaQyaxaaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTbaxbaybazaWAaYdbaBaZAbaCaWAbaDbaEbaDaOeaYkaYlaYmaRZaOeaYnaYoaYpaZGbaFbaFaZGbaFaYpaZIbaGbaHbaHbaIbaJbaKaYvbaLaHYaWUbXubaNbaObaPbaQbaQbaRbaSbaTaZWbaUaYDaYDaZYbaVaZYaYDaYDbaWbabbaXbaYbaZbbabbbbbcbajbbdaYHaXqbbecrtaGybbfaXFaXFaXFaXFaXFaXFaXFaXFbbgaXFaXFaXFaXFbbhaXFaXFaXFaXFaXFaXFaXFaXFbbfaXFaXFaXFaXFbaraXFaXFaXFbbibbjaXFaXFbbkaXFaXFaXFbblaXFaXFaXFaXFaXFbbhbbmaXFaXFaXFaXFaXFaXFbbfbbnaRNaNRbbobbpbbqbbraLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6615,7 +6617,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalQalQalQbHJbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHnaeZbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMbJUbJVbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZamIbJWbJXajZbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekbLiaekafOaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBbLCbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWbLXbLYbLZbMabMbbMcbDnbMdbsbbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekbLiaekafOaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBaVQbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWbLXbLYbLZbMabMbbMcbDnbMdbsbbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebsbbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUcrqbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebsbbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbOsbGnbOtbGnbOubBcaaaaaaaaaaaabJYbJZbEZaaaaafbJYbJYbMkbMmbMmbOwbOvbMmbOxbMobMobOzbDLbMqbOAbOBbZmbODbOEbOFbOGbOHbOIbOFbOJbOFbOKbOLbOMbLubONbOObOPbOQbORbOSbOTbOUaafbOVbOWbNObOXbMKbMLbNPbKvbLFbOYbOZbMUbPabLGbPbbPcbPdbLGbMUbPebPfbMUbMUbLFbKvbBMbItbItbItbItbJHbPgbPhbPibJHbItbItbItbItbItbPjbPkbPlbPmbPnbPobPpbPqbPpbPrbOpbPsbPtbPubPvbPwbsbbkFbjobjobjobjoabtaafaafaafaagaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6632,17 +6634,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaacfaaaaafaaaaafaaaabfaafaafbBcbZebGnbBcbBcbBcbRAbBcbBcbBcbBcaaaaaaaaaaaIbZfbZgaaIaaIaafbEZbTNbTObZhbWCbUGbUGbUGbWCbZibZjbZkcqGcqNcqPbTPbBcbBcbZnbZobZpbWKbWKbZqbXybZrbZsbZtbZsbZubKmbMFbZvbZwbZxbZybONbZzbZAbZBbWabRVbZCbNKbLDbNLbZDbZEbZEbMKbMLbNPbUjbyebyebyebZFbZGbyebZHbZIbyebyebZJbyebyebZIbZKbZLbZMbBMbCWbCWbCWbZNbZObQobZPbKKbShbZQbQkbQkbSjbBMbRrbRrbZRbRrbRrbPvbXXbXXbZSbZTbOpbZUbZVbZWbPvboUbZabGVbjobjobjobsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXbZYbZZaaabZXbZYbZZaaabZXbZYbZZaaaabfaaaaaabBccaacabbBccacbGnbGncadbOucaebBcaaaaaaaaacafaaIaaIaafaaaaaabEZbTNbTObWCcagcahbUGcaibWCbWCbVKcajcqGcqKcakbTPcalcamcancaocapcaqcarcascatcascatcaucatcavbKmcawcaxcaybPSbPSbPUbRPcazbRUbPVbTecaAbOUaafbOVcaBcaCcaDbMKbMLbyebUjbzicaEcaFbZFcaGbyebZHcaHcaIcaJcaKcaLcaIcaMbZHbgxcaNbBMbBMbBMbBMbBMbBMcaOcaPcaObBMbBMbBMbBMbBMbBMbPvbPvbPvbPvbPvbPvcaQcaQcaRcaSbPvbPvbPvbPvbPvbjobRxbGVbjocaTcaUbsebjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaabBcbJYbJYbBcbBccaWcaXbOubGnbQDbBcaaaaaaaaaaaaaafaaaaaaaaaaaabDCbTNbTObUGcaYcaZbUGcbacbbbUGbVKcbccqEcqQcqVcqUcqXcqWbOAaZDcbgcbhcbicbjcbkcblcbmcbnbXycbobKmcbpbMFbZvbRPbRQcbqcbrcbscbtbLAcbucbvbQabQbbNLcbwbZEbZEbMKbMLbyecbxcbycbzcbAcbBcbCbyecbDcbEcbFcbGcbHcbGcbIcbEcbJbgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjocbMbMfbkGcbNcbNbPvcbOcbOcaRbQtcbPcbQbsebsebsebBRbRxbHzbjocbRbsebsebjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXcaVbZZaafbZXcaVbZZaafbZXcaVbZZaaaaafaafaafaafaafaafaafbBcbBcbBcbBcbRAbBcbBcaaaaaaaaaaaaaafaaaaaaaafaaabDCbTNbTObUGcbScbTcbUcbVcbWbUGcbXcbYcbZccaccbbTPccccqYcceccfccgcchcciccjcckcclccmccnccoccpccqccrbOQccscctbMFbMFbMFbMHbSYcctbTebUYbOUaafbMKbMKbMKbMKbMKbMLbyebYFccuccvccwccxccybyebyecczccAccBbKwccCccDbyebyebgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjobseccEbqvccFccGbPvccHccHccIbQtbPvbOpbjoccJccKbBRbRxbGVbsebsebsebUCbkHbVybkHaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaaaaaaaaaaaaaabBcccRbBcbGnbGnbBcaafaaaaafaaaaaaaafaaaaaaaafaaabDCbTNbTObTObTObTObTObTObTObTObTPbTPbTPbTPbTPbTPbBcccSbBcccTccUccUccUccVccWccXccUccYccZcdabKmcdbcdcbPXcddcdecdfcdecddcdgcddcdhbRPcdiaafaafaafaafaafaafbMLcdjcdjcdjcdkcdlcdjcdjcdjcdmbyecdncdncdocdncdnbyebABbZGcbKbjobXkbXkbXkbjobXkbXkcdpbXkbjobXkbXkbXkbXkbjobjobRxcdqbjobjobPvbPvbPvcdrcdsbPvbBRbjobYcbseboTbRxbUBbjobjocdtbjobjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaaaaafaaaaaacducdvcdvcdvcdvbBcbBccdwbGnbBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbDCbTNbBccdxcdycdzcdzcdzcdzcdzcdzcdzcdzcdzcdAcdAcdzcdBcaWccTcdCcdDcdEcdFcdGcdHccUcdIcdJcdKbKmcdbcdLcdMcdNcdOcdPcdQcdRbMFcdScdTcdUbLuaafaafaaaaaaaaaaaacdVcdWcdXcdYcdZceacebceccdjcedceecefcegcehccBccBbzibzibZGbntceiceiceiceiceiceiceicejcekcekcekcekcekcekcelcekcemcekcekcenceocepceqbXOcesbjobjocetceoceuceocevbGVbjocewbsebsebjoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacexaaaaaaaaacexaaaaaaaaacexaaaaaaaafcducducduceycezceAceBceCbGnceDceEceFceEceEceEceEceEceEceEceEceEceEceGceHbRGceIceJceKceKceKceKceKceKceKceKceKceKceKceKceKceKccTccUceLceMceNceOcePceQceRceSceTceKbLuceUbLuceVbLuceUbLuceVbLuceWbLuceWbLuaafaafaaaaaaaaaaaacdjceXceYceZcfacfbcfccfdcdjcedcfeccBcffcfgcfhcfibDZcfjcfkcflcflcflcflcflcflcflcfmcfncflcflcflcflcflcflcfocfpcfqbmicfrcfscftcftcftbXPbYKbXQbYMbYLcbfbZbbZbccLccMbjocaUbsecfCbjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafalkcfEcfEcfFcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfHcfIcfJcfIcfKcfLcfMcfNceEcfOcfPbOubBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbBccfQbSKcfRcfSceKcfTcfTcfUceKcfVcfWcfXctHcfZcgacgbcgccgdcgeccUcgfcggcghcgicgjcgkcglcgmcgnceKaafcgoaafbMLaafcgoaafbMLaafcgpaafcgpaaaaaaaaaaaaaaaaaaaaacdjcgqcgrcgscgtcgucgvcgwcdjbzicgxcgycgzcgAcgBbDZcgCcgDbyebjobXkbXkbXkbXkbjobXkbXkbXkbXkbjobXkbXkbXkbXkbjocgEbsebjocgFcgGbjobjobXkbXkbjobjocgHbZacgIbjocgJcgKboRbjobjobjobjobjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacgLaaaaaaaaacgLaaaaaaaaacgLaaaaaaaafcducducducgMcgNcgOcdvbGnbGnbGnbGnbBcaaaaaaaafaaaaaaaafaaaaaaaafaaabBccgPbBccgQcgRceKcgScgTcgUcgVcgWcgXceRceRceRcgYcgZchachbcgXccUchcchdchecgictIccUchgchhchiceKbMKchjbOVchjbMKchjbOVchjbMKchkbOVchlbMKaaaaaaaaaaaaaaaaaacdjchmchnchochpchqchrchschtchuchubFMchvchwbFMchxbyebyebyeaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjochybLebjochzbZabjoaaaaaaaaaaaabjobsebZachAchBchBchCchDchBaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXchEbZZaaabZXchEbZZaaabZXchEbZZaaaaafaaaaaacducdvcdvcdvcdvchFbWBbGnbGnbBcaafaafchGchGchGchGchGchGchGaafbBcbBcbBcchHchIceKchJcgUcgUcgVchKchLchLchMchNchOchPchPchQceRccUchRchSchTchUchVccUchWcdJchXceKbMKchYchZciabMKcibciccidbMKciecifcigbMKaaaaaaaaaaaaaaaaaacihciichncijcikcilcimcincdjaafbyecczciobNPbNPbyebyeaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjocipbjobjociqbZabjobjobXkbXkbjobjobsecircischBcitciucivchBaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaafaaaaaaaaaaaaaagbBcbBcbBcciwbGnbBcaaaaaachGcixciycizciyciAchGaaabBcbQDbGnciBchIceKciCciCciDceKciEciFciGciHceSciIciJciKciLciLccUciMciNciOciPciQciRciSciTciUceKbMKciVciWciVbMKciXciYciXbMKciZcjacjbbMKaaaaaaaaaaaaaaaaaacdjcjccjdcjecjfcjgcjhcjicdjaafaafaafcjjaaaaaaaafaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbXkbXkbjocjkbBRbjocjlcjmcjnceocjncjncjncjncjocjpcjqchBcjrcjscjtchBaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXchEbZZaafbZXchEbZZaafbZXchEbZZaaaaafaafaafaaaaaaaaaaagcjucjvcjubGnbGnbBcaaaaaachGcjwcjxcjycjzcjAchGaaabBccaXbGnciBchIceKciCciCciDceKcjBcgccjCcjDcjEcjFcjCcgccjCcjCcgccjGcjHcjIciIcjJcjKcjLceScjMceKbMKciVcjNciVbMKciXcjOciXbMKcjbcjPcjbbMKaaaaaaaaaaaaaaaaaacdjcdjcdjcjQcjRcjScjTcjUcjRaafaaaaafcfDaaaaaaaaaaaaaaaabtaafaafaafaafaafaafaaaaaaaaaaaaaaaaaabXkbsecjWbjocjXbsebjocjYbmhbmhcjZbmhbmibmibmickackackbchBckcckdckechBaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaaaaafaafaaaaaaaagbBcbBcbBcbBcbGnbBcaafaafchGckfckgckhckickfchGaafbBcceKckjckkcklceKciCciDciDceKckmcknckockpceSckqckrcksckrckrcktckuckvckwckxckyckyckyckzckAceKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKaaaaaaaaaaaaaaaaaaaaaaaaaaackBcjRckCckDckEcjRaafaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkckFbsebWwcgEbsebjobjobjobjobjobsebjoaafaaaaaaaaaaafckGckGckHckGckGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGccNckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKaafaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjSckZcjUcjRaaaaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbsebuEbjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXcaVbZZaafbZXcaVbZZaafbZXcaVbZZaaaaafaafaafaafaafaafaafbBcbBcbBcbBcbRAbBcbBcaaaaaaaaaaaaaafaaaaaaaafaaabDCbTNbTObUGcbScbTcbUcbVcbWbUGcbXcbYcbZccaccbbTPccccqYcceccfccgcchcciccjcckcclccmccnccoccpccqccrbMFbZvcctbMFbMFbMFcctcctcctbTeaVSaVRaafbMKbMKbMKbMKbMKbMLbyebYFccuccvccwccxccybyebyecczccAccBbKwccCccDbyebyebgxcbKbjoaaaaaaaaaaafaaaaaacbLaaaaafaaaaaaaaaaaabjobseccEbqvccFccGbPvccHccHccIbQtbPvbOpbjoccJccKbBRbRxbGVbsebsebsebUCbkHbVybkHaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaafaafaaaaaaaaaaaaaaaaaabBcccRbBcbGnbGnbBcaafaaaaafaaaaaaaafaaaaaaaafaaabDCbTNbTObTObTObTObTObTObTObTObTPbTPbTPbTPbTPbTPbBcccSbBcccTccUccUccUccVccWccXccUccYccZcdabKmbMFbOQccscctbMFbMFbMFbMHbSYcctbTecctbKmaafaafaafaafaafaafbMLcdjcdjcdjcdkcdlcdjcdjcdjcdmbyecdncdncdocdncdnbyebABbZGcbKbjobXkbXkbXkbjobXkbXkcdpbXkbjobXkbXkbXkbXkbjobjobRxcdqbjobjobPvbPvbPvcdrcdsbPvbBRbjobYcbseboTbRxbUBbjobjocdtbjobjobjobjoaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXcaVbZZaaabZXcaVbZZaaabZXcaVbZZaaaaafaaaaaacducdvcdvcdvcdvbBcbBccdwbGnbBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbDCbTNbBccdxcdycdzcdzcdzcdzcdzcdzcdzcdzcdzcdAcdAcdzcdBcaWccTcdCcdDcdEcdFcdGcdHccUcdIcdJcdKbKmcdbcdcbPXcddcdecdfcdecddcdgcddcdhcctbKmbKmbKmaaaaaaaafaaacdVcdWcdXcdYcdZceacebceccdjcedceecefcegcehccBccBbzibzibZGbntceiceiceiceiceiceiceicejcekcekcekcekcekcekcelcekcemcekcekcenceocepceqbXOcesbjobjocetceoceuceocevbGVbjocewbsebsebjoaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacexaaaaaaaaacexaaaaaaaaacexaaaaaaaafcducducduceycezceAceBceCbGnceDceEceFceEceEceEceEceEceEceEceEceEceEceGceHbRGceIceJceKceKceKceKceKceKceKceKceKceKceKceKceKceKccTccUceLceMceNceOcePceQceRceSceTceKcdbcdLcdMcdNcdOcdPcdQcdRbMFcdScdTcdUbLCcdibLCaaaaaaaafaaacdjceXceYceZcfacfbcfccfdcdjcedcfeccBcffcfgcfhcfibDZcfjcfkcflcflcflcflcflcflcflcfmcfncflcflcflcflcflcflcfocfpcfqbmicfrcfscftcftcftbXPbYKbXQbYMbYLcbfbZbbZbccLccMbjocaUbsecfCbjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafalkcfEcfEcfFcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfGcfHcfIcfJcfIcfKcfLcfMcfNceEcfOcfPbOubBcbJYbJYbJYbJYbJYbJYbJYbJYbJYbBcbBccfQbSKcfRcfSceKcfTcfTcfUceKcfVcfWcfXctHcfZcgacgbcgccgdcgeccUcgfcggcghcgicgjcgkcglcgmcgnceKbKmcsKbLuceVbLuceUbLuceVbLuceWbLucsNbKmbKmbKmaafaafaafaaacdjcgqcgrcgscgtcgucgvcgwcdjbzicgxcgycgzcgAcgBbDZcgCcgDbyebjobXkbXkbXkbXkbjobXkbXkbXkbXkbjobXkbXkbXkbXkbjocgEbsebjocgFcgGbjobjobXkbXkbjobjocgHbZacgIbjocgJcgKboRbjobjobjobjobjoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaaaaaacgLaaaaaaaaacgLaaaaaaaaacgLaaaaaaaafcducducducgMcgNcgOcdvbGnbGnbGnbGnbBcaaaaaaaafaaaaaaaafaaaaaaaafaaabBccgPbBccgQcgRceKcgScgTcgUcgVcgWcgXceRceRceRcgYcgZchachbcgXccUchcchdchecgictIccUchgchhchiceKaafcgoaafbMLaafcgoaafbMLaafcgpaafcgpaafaafaaaaaaaaaaafaafcdjchmchnchochpchqchrchschtchuchubFMchvchwbFMchxbyebyebyeaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjochybLebjochzbZabjoaaaaaaaaaaaabjobsebZachAchBchBchCchDchBaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaaabZXchEbZZaaabZXchEbZZaaabZXchEbZZaaaaafaaaaaacducdvcdvcdvcdvchFbWBbGnbGnbBcaafaafchGchGchGchGchGchGchGaafbBcbBcbBcchHchIceKchJcgUcgUcgVchKchLchLchMchNchOchPchPchQceRccUchRchSchTchUchVccUchWcdJchXceKbMKchjbOVchjbMKchjbOVchjbMKchkbOVchlbMKaaaaaaaaaaaaaaaaafcihciichncijcikcilcimcincdjaafbyecczciobNPbNPbyebyeaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaabjocipbjobjociqbZabjobjobXkbXkbjobjobsecircischBcitciucivchBaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaafaaaaaaaaaaaaaagbBcbBcbBcciwbGnbBcaaaaaachGcixciycizciyciAchGaaabBcbQDbGnciBchIceKciCciCciDceKciEciFciGciHceSciIciJciKciLciLccUciMciNciOciPciQciRciSciTciUceKbMKchYchZciabMKcibciccidbMKciecifcigbMKaaaaaaaaaaaaaaaaaacdjcjccjdcjecjfcjgcjhcjicdjaafaafaafcjjaaaaaaaafaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbXkbXkbjocjkbBRbjocjlcjmcjnceocjncjncjncjncjocjpcjqchBcjrcjscjtchBaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXchEbZZaafbZXchEbZZaafbZXchEbZZaaaaafaafaafaaaaaaaaaaagcjucjvcjubGnbGnbBcaaaaaachGcjwcjxcjycjzcjAchGaaabBccaXbGnciBchIceKciCciCciDceKcjBcgccjCcjDcjEcjFcjCcgccjCcjCcgccjGcjHcjIciIcjJcjKcjLceScjMceKbMKciVciWciVbMKciXciYciXbMKciZcjacjbbMKaafaafaafaafcnDaafcdjcdjcdjcjQcjRcjScjTcjUcjRaafaaaaafcfDaaaaaaaaaaaaaaaabtaafaafaafaafaafaafaaaaaaaaaaaaaaaaaabXkbsecjWbjocjXbsebjocjYbmhbmhcjZbmhbmibmibmickackackbchBckcckdckechBaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaaaaafaafaaaaaaaagbBcbBcbBcbBcbGnbBcaafaafchGckfckgckhckickfchGaafbBcceKckjckkcklceKciCciDciDceKckmcknckockpceSckqckrcksckrckrcktckuckvckwckxckyckyckyckzckAceKbMKciVcjNciVbMKciXcjOciXbMKcjbcjPcjbbMKaaaaaaaafaafaaaaaaaaaaaaaaackBcjRckCckDckEcjRaafaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkckFbsebWwcgEbsebjobjobjobjobjobsebjoaafaaaaaaaaaaafckGckGckHckGckGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGccNckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKaaaaafaafaaaaaaaaaaaaaaaaaackYcjRcjSckZcjUcjRaaaaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbsebuEbjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEclFceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaaaaafaafaafaafaaeaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXkbXkbXkbjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabqabfabfabfabfabfabfabfabfabfaaaaaaaaaaaaaafaafaaaaaaaafbJYbGnbJYaafaafchGclMclNclOclPclQclRclSclTclRclUclVclWclXclYclZcmaclZcmbcmccmdcmecmfcmgcmhcmicmjcmkcmjcmlcmmcmnchPcmecmochPcmpcmqchPcmrceRcmsceKcmtcgccmuaekaekaelaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjRcmvcjRcjRaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafcmwaafbjobjobXkbXkbjobjoaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJYbGnbJYaaaaaachGcmycmzcmAcmBcmCchGcmDcmEchGcmFceRcmGciHceScmHcjCcmIciIcmJcmKcmLcmLcmLcmMcmNcmOcmPcmQcmRcmMcmScmSckUceRckVciIcmTcmUcmVchLcmWcmXcgUcmXcmYaeXaeYaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYaagcjRcmZcjRcnaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaaaaaaaaaaaaafcnbaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index 950e7c8cb57..c95ba677a27 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -193,7 +193,7 @@ "dK" = (/obj/structure/filingcabinet,/turf/simulated/shuttle/floor,/area/centcom/evac) "dL" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/centcom/evac) "dM" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/shuttle/plating,/area/space) -"dN" = (/turf/unsimulated/wall/fakedoor,/area/centcom/suppy) +"dN" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/evac) "dO" = (/obj/structure/table,/obj/item/weapon/storage/lockbox,/turf/simulated/shuttle/floor,/area/centcom/evac) "dP" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/centcom/evac) "dQ" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor,/area/centcom/evac) @@ -271,14 +271,14 @@ "fk" = (/obj/machinery/door/window/northleft{dir = 2; name = "Centcom Security"; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac) "fl" = (/turf/unsimulated/floor{tag = "icon-yellowsiding (WEST)"; icon_state = "yellowsiding"; dir = 8},/area/centcom/evac) "fm" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) -"fn" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/evac) +"fn" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) "fo" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/space) "fp" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "fq" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "fr" = (/obj/structure/closet/emcloset,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "fs" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "ft" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin{pixel_y = 4},/obj/item/weapon/pen,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"fu" = (/obj/machinery/door/airlock/centcom{name = "Centcom Supply"; req_access_txt = "106"},/turf/unsimulated/floor{tag = "icon-brown"; icon_state = "brown"},/area/centcom/suppy) +"fu" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{tag = "icon-red (NORTHWEST)"; icon_state = "red"; dir = 9},/area/centcom/evac) "fv" = (/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/suppy) "fw" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/suppy) "fx" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/evac) @@ -290,7 +290,7 @@ "fD" = (/obj/structure/stool/bed/chair/office/dark,/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "fE" = (/turf/unsimulated/wall/fakeglass,/area/centcom/suppy) "fF" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) -"fG" = (/obj/machinery/door/airlock/centcom{name = "Crate Storage"; req_access_txt = "106"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/suppy) +"fG" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/obj/item/toy/foamblade,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) "fH" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/control) "fI" = (/obj/machinery/vending/autodrobe,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) "fJ" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/control) @@ -302,7 +302,7 @@ "fP" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "fQ" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "fR" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) -"fS" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) +"fS" = (/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) "fT" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "fU" = (/obj/machinery/door/airlock/centcom{name = "Dressing Room"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) "fV" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/control) @@ -314,7 +314,7 @@ "gb" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "gc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry) "gd" = (/obj/effect/landmark{name = "Deathsquad"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) -"ge" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac) +"ge" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) "gf" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control) "gg" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control) "gh" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac) @@ -330,20 +330,20 @@ "gr" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space) "gs" = (/turf/unsimulated/floor{name = "plating"},/area/space) "gt" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/ferry) -"gu" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/evac) +"gu" = (/obj/machinery/door/airlock/external{name = "Supply Shuttle"; req_access_txt = "106"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/suppy) "gv" = (/turf/unsimulated/wall/fakeglass,/area/centcom/control) "gw" = (/obj/structure/stool/bed/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "gx" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "gy" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "gz" = (/turf/unsimulated/wall,/area/syndicate_mothership) -"gA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/ferry) +"gA" = (/obj/machinery/door/airlock/centcom{name = "Centcom Supply"; req_access_txt = "106"},/turf/unsimulated/floor{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/centcom/suppy) "gB" = (/turf/unsimulated/wall/fakedoor,/area/centcom/ferry) "gC" = (/turf/unsimulated/floor{icon_state = "stairs-r"},/area/syndicate_mothership) "gD" = (/obj/machinery/computer/shuttle/ferry/request,/turf/simulated/shuttle/floor,/area/space) "gE" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/space) "gF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry) "gG" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (SOUTHEAST)"; icon_state = "fakewindows"; dir = 6},/area/centcom/ferry) -"gH" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/obj/item/toy/foamblade,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac) +"gH" = (/turf/unsimulated/floor{tag = "icon-brown (WEST)"; icon_state = "brown"; dir = 8},/area/centcom/control) "gI" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) "gJ" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) "gK" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) @@ -356,8 +356,8 @@ "gR" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/surgical_drapes,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "gS" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "small"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/unsimulated/floor/plating,/area/wizard_station) "gT" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; travelDir = 180; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_away"; name = "unknown"; turf_type = /turf/unsimulated/floor; width = 5},/turf/simulated/shuttle/floor,/area/space) -"gU" = (/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac) -"gV" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac) +"gU" = (/turf/unsimulated/floor{tag = "icon-redcorner (NORTH)"; icon_state = "redcorner"; dir = 1},/area/centcom/evac) +"gV" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac) "gW" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/evac) "gX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac) "gY" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/unsimulated/floor/plating,/area/wizard_station) @@ -369,7 +369,7 @@ "he" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/unsimulated/floor/plating,/area/wizard_station) "hf" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "medium"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/unsimulated/floor/plating,/area/wizard_station) "hg" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor/plating,/area/wizard_station) -"hh" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"hh" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac) "hi" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space) "hj" = (/turf/unsimulated/floor{tag = "icon-warndark (EAST)"; icon_state = "warndark"; dir = 4},/area/centcom/evac) "hk" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/evac) @@ -392,7 +392,7 @@ "hB" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/ferry) "hC" = (/obj/structure/closet/secure_closet/cargotech,/turf/unsimulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/suppy) "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) +"hE" = (/obj/structure/table/reinforced,/obj/item/toy/carpplushie,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (SOUTHEAST)"; icon_state = "red"; dir = 6},/area/centcom/evac) "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) @@ -405,8 +405,8 @@ "hO" = (/obj/structure/grille,/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/obj/structure/window/reinforced/fulltile,/turf/simulated/shuttle/plating,/area/space) "hP" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/space) "hQ" = (/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_f5"; dir = 2},/area/space) -"hR" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry) -"hS" = (/obj/machinery/door/airlock/centcom{name = "briefing room"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) +"hR" = (/obj/structure/showcase/fakesec,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/ferry) +"hS" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/unsimulated/wall/fakeglass,/area/centcom/ferry) "hT" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/area/centcom/control) "hU" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "hV" = (/obj/structure/dresser,/obj/structure/mirror{pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) @@ -414,11 +414,11 @@ "hX" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "hY" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 5},/obj/item/weapon/pen/blue,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry) "hZ" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve) -"ia" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/tdome/tdomeobserve) +"ia" = (/obj/structure/reagent_dispensers/water_cooler,/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/ferry) "ib" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeobserve) "ic" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve) "id" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/tdome/tdomeobserve) -"ie" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/tdome/tdomeobserve) +"ie" = (/obj/structure/filingcabinet,/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/ferry) "if" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) "ig" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "ih" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) @@ -435,7 +435,7 @@ "is" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue (EAST)"; icon_state = "darkblue"; dir = 4},/area/centcom/ferry) "it" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) "iu" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"iv" = (/turf/unsimulated/wall/fakeglass,/area/tdome/tdomeobserve) +"iv" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{tag = "icon-darkgreen"; icon_state = "darkgreen"; dir = 2},/area/centcom/ferry) "iw" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 8},/area/tdome/tdomeobserve) "ix" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve) "iy" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 4},/area/tdome/tdomeobserve) @@ -460,9 +460,9 @@ "iR" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "iS" = (/obj/structure/table/wood,/obj/item/weapon/storage/box/drinkingglasses,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "iT" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/gun/syringe/rapidsyringe,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) -"iU" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"iV" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) -"iW" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve) +"iU" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) +"iV" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/ferry) +"iW" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/ferry) "iX" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac) "iY" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) "iZ" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) @@ -501,14 +501,14 @@ "jG" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) "jH" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue"; icon_state = "darkblue"; dir = 2},/area/centcom/ferry) "jI" = (/obj/structure/closet/secure_closet/ertSec,/turf/unsimulated/floor{tag = "icon-darkred"; icon_state = "darkred"; dir = 2},/area/centcom/ferry) -"jJ" = (/obj/structure/closet/secure_closet/ertEngi,/obj/structure/extinguisher_cabinet{pixel_y = -28},/turf/unsimulated/floor{tag = "icon-darkbrown"; icon_state = "darkbrown"; dir = 2},/area/centcom/ferry) +"jJ" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/ferry) "jK" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (WEST)"; icon_state = "yellowcornersiding"; dir = 8},/area/centcom/evac) "jL" = (/obj/structure/table/reinforced,/obj/item/weapon/c4,/obj/item/weapon/c4{pixel_x = 7},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) "jM" = (/turf/unsimulated/floor{tag = "icon-yellowsiding"; icon_state = "yellowsiding"},/area/centcom/evac) "jN" = (/turf/unsimulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/centcom/evac) "jO" = (/turf/unsimulated/floor{tag = "icon-darkgreencorners"; icon_state = "darkgreencorners"},/area/centcom/ferry) "jP" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome/tdomeobserve) -"jQ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve) +"jQ" = (/obj/machinery/door_control{id = "adminshut"; name = "Administrative Shutter-Control"; pixel_y = 26},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/ferry) "jR" = (/turf/unsimulated/floor{dir = 10; icon_state = "green"},/area/centcom/evac) "jS" = (/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac) "jT" = (/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/centcom/evac) @@ -527,8 +527,8 @@ "kg" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHWEST)"; icon_state = "podhatch"; dir = 9},/area/syndicate_mothership) "kh" = (/obj/structure/dresser,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) "ki" = (/obj/structure/table/wood,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"kj" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/evac) -"kk" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac) +"kj" = (/obj/structure/table/wood,/obj/item/weapon/pen,/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/ferry) +"kk" = (/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/ferry) "kl" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome/tdomeobserve) "km" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/tdome/tdomeobserve) "kn" = (/turf/unsimulated/floor{icon_state = "green"},/area/tdome/tdomeobserve) @@ -542,11 +542,11 @@ "kv" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "kw" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/syndicate_mothership) "kx" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/syndicate_mothership) -"ky" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) +"ky" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "kz" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "kA" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership) -"kB" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac) -"kC" = (/obj/structure/table/reinforced,/obj/item/toy/carpplushie,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/centcom/evac) +"kB" = (/obj/machinery/door/airlock/centcom{name = "briefing room"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry) +"kC" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/ferry) "kD" = (/turf/unsimulated/floor{tag = "icon-yellowcornersiding (NORTH)"; icon_state = "yellowcornersiding"; dir = 1},/area/centcom/evac) "kE" = (/turf/unsimulated/floor{tag = "icon-yellowsiding (NORTH)"; icon_state = "yellowsiding"; dir = 1},/area/centcom/evac) "kF" = (/turf/unsimulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/centcom/evac) @@ -648,7 +648,7 @@ "mx" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) "my" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/bush,/turf/unsimulated/floor{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership) "mz" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"mA" = (/obj/structure/table/reinforced,/obj/item/toy/AI,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/evac) +"mA" = (/obj/machinery/door/airlock/centcom{name = "Administrative Office"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) "mB" = (/turf/unsimulated/wall,/area/tdome/arena) "mC" = (/obj/machinery/igniter,/turf/simulated/floor/plasteel,/area/tdome/arena) "mD" = (/turf/simulated/floor/plasteel,/area/tdome/arena) @@ -656,7 +656,7 @@ "mF" = (/obj/structure/stool/bed/chair/wood/wings,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mG" = (/obj/structure/table/wood,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mH" = (/obj/structure/table/wood,/obj/item/weapon/retractor,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) -"mI" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-red (NORTHEAST)"; icon_state = "red"; dir = 5},/area/centcom/evac) +"mI" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry) "mJ" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mK" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mL" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) @@ -671,8 +671,8 @@ "mU" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "mV" = (/obj/structure/table,/obj/item/weapon/weldingtool/largetank{pixel_y = 3},/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "mW" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"mX" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) -"mY" = (/turf/unsimulated/floor{tag = "icon-redcorner (WEST)"; icon_state = "redcorner"; dir = 8},/area/centcom/evac) +"mX" = (/obj/machinery/door/poddoor/shutters/preopen{id = "adminshut"; name = "Administrative Shutters"},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/ferry) +"mY" = (/obj/structure/closet/secure_closet/ertEngi,/obj/structure/extinguisher_cabinet{pixel_y = 28},/turf/unsimulated/floor{tag = "icon-darkbrown"; icon_state = "darkbrown"; dir = 2},/area/centcom/ferry) "mZ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/saber/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) "na" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) "nb" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) @@ -696,7 +696,7 @@ "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/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/centcom/evac) +"nw" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/tdome/tdomeobserve) "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) @@ -713,7 +713,7 @@ "nK" = (/obj/machinery/flasher{id = "tdomeflash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena) "nL" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("thunder"); c_tag = "Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) "nM" = (/turf/unsimulated/wall/fakeglass{color = "#008000"},/area/wizard_station) -"nN" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac) +"nN" = (/obj/structure/table/reinforced,/obj/item/toy/AI,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/evac) "nO" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) "nP" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "nQ" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/wizard_station) @@ -733,13 +733,13 @@ "oe" = (/turf/unsimulated/floor{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station) "of" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "og" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) -"oh" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/centcom/evac) -"oi" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac) +"oh" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-green (NORTHEAST)"; icon_state = "green"; dir = 5},/area/centcom/evac) +"oi" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/evac) "oj" = (/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Corridor A"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "ok" = (/turf/unsimulated/wall/normal{tag = "icon-uranium15"; icon_state = "uranium15"},/area/wizard_station) "ol" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Corridor A"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) -"om" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac) -"on" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/obj/item/toy/katana,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac) +"om" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{dir = 10; icon_state = "green"},/area/centcom/control) +"on" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/centcom/control) "oo" = (/obj/structure/table,/obj/item/weapon/gun/projectile/automatic/toy/pistol,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/centcom/holding) "op" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/space) "oq" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) @@ -834,6 +834,81 @@ "qb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding) "qc" = (/obj/effect/landmark{name = "Holding Facility"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/holding) "qd" = (/obj/docking_port/stationary/transit{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship_transit"; width = 35},/turf/space/transit/horizontal,/area/space) +"qe" = (/turf/unsimulated/wall/abductor{icon_state = "alien21"},/area/abductor_ship) +"qf" = (/turf/unsimulated/wall/abductor{icon_state = "alien20"},/area/abductor_ship) +"qg" = (/turf/unsimulated/wall/abductor{icon_state = "alien23"},/area/abductor_ship) +"qh" = (/turf/unsimulated/wall/abductor{icon_state = "alien22"},/area/abductor_ship) +"qi" = (/turf/unsimulated/wall/abductor{icon_state = "alien24"},/area/abductor_ship) +"qj" = (/turf/unsimulated/wall/abductor{icon_state = "alien16"},/area/abductor_ship) +"qk" = (/obj/machinery/abductor/experiment{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ql" = (/turf/unsimulated/wall/abductor{icon_state = "alien17"},/area/abductor_ship) +"qm" = (/obj/machinery/abductor/pad{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qn" = (/obj/effect/landmark/abductor/console,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qo" = (/turf/unsimulated/wall/abductor{icon_state = "alien19"},/area/abductor_ship) +"qp" = (/turf/unsimulated/wall/abductor{icon_state = "alien18"},/area/abductor_ship) +"qq" = (/obj/machinery/abductor/experiment{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qr" = (/obj/machinery/abductor/pad{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qs" = (/obj/effect/landmark/abductor/console{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qt" = (/turf/unsimulated/wall/abductor{icon_state = "alien14"},/area/abductor_ship) +"qu" = (/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qv" = (/obj/machinery/computer/camera_advanced/abductor{team = 1},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qw" = (/turf/unsimulated/wall/abductor{icon_state = "alien15"},/area/abductor_ship) +"qx" = (/obj/structure/closet/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qy" = (/obj/machinery/computer/camera_advanced/abductor{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qz" = (/turf/unsimulated/wall/abductor{icon_state = "alien12"},/area/abductor_ship) +"qA" = (/obj/effect/landmark/abductor/scientist,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qB" = (/obj/item/weapon/retractor/alien,/obj/item/weapon/hemostat/alien,/obj/structure/table/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qC" = (/obj/effect/landmark/abductor/agent,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qD" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "neutral"; dir = 8},/area/tdome/tdomeobserve) +"qE" = (/obj/structure/optable/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qF" = (/turf/unsimulated/wall/abductor{icon_state = "alien13"},/area/abductor_ship) +"qG" = (/obj/item/weapon/storage/box/handcuffs,/obj/structure/table/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qH" = (/obj/effect/landmark/abductor/scientist{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"qI" = (/obj/structure/closet/secure_closet/bar,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome/tdomeobserve) +"qJ" = (/obj/machinery/door/airlock/centcom{name = "Crate Storage"; req_access_txt = "106"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/suppy) +"qK" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "neutral"; dir = 4},/area/tdome/tdomeobserve) +"qL" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve) +"qM" = (/obj/structure/table,/turf/unsimulated/floor{tag = "icon-red (NORTHWEST)"; icon_state = "red"; dir = 9},/area/tdome/tdomeobserve) +"qN" = (/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/tdome/tdomeobserve) +"qO" = (/obj/structure/table,/turf/unsimulated/floor{tag = "icon-red (NORTH)"; icon_state = "red"; dir = 1},/area/tdome/tdomeobserve) +"qP" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac) +"qQ" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{dir = 10; icon_state = "green"},/area/centcom/evac) +"qR" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac) +"qS" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/obj/item/toy/katana,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/evac) +"qT" = (/obj/structure/table,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/tdome/tdomeobserve) +"qU" = (/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/tdome/tdomeobserve) +"qV" = (/obj/structure/table,/turf/unsimulated/floor{tag = "icon-green (NORTHEAST)"; icon_state = "green"; dir = 5},/area/tdome/tdomeobserve) +"qW" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve) +"qX" = (/obj/structure/table,/obj/item/weapon/storage/box/drinkingglasses,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome/tdomeobserve) +"qY" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve) +"qZ" = (/obj/effect/landmark/abductor/agent{team = 4},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ra" = (/turf/unsimulated/wall/abductor{icon_state = "alien10"},/area/abductor_ship) +"rb" = (/obj/item/weapon/surgical_drapes,/obj/item/weapon/paper/abductor,/obj/item/weapon/scalpel/alien,/obj/structure/table/abductor,/obj/item/weapon/cautery/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rc" = (/turf/unsimulated/wall/abductor{icon_state = "alien11"},/area/abductor_ship) +"rd" = (/turf/unsimulated/wall/abductor{icon_state = "alien6"},/area/abductor_ship) +"re" = (/obj/machinery/abductor/gland_dispenser,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rf" = (/turf/unsimulated/wall/abductor{icon_state = "alien7"},/area/abductor_ship) +"rg" = (/obj/structure/stool/bed/abductor,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rh" = (/obj/structure/table/abductor,/obj/item/weapon/surgicaldrill/alien,/obj/item/weapon/circular_saw/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ri" = (/turf/unsimulated/wall/abductor{icon_state = "alien9"},/area/abductor_ship) +"rj" = (/turf/unsimulated/wall/abductor{icon_state = "alien8"},/area/abductor_ship) +"rk" = (/turf/unsimulated/wall/abductor{icon_state = "alien2"},/area/abductor_ship) +"rl" = (/turf/unsimulated/wall/abductor,/area/abductor_ship) +"rm" = (/turf/unsimulated/wall/abductor{icon_state = "alien4"},/area/abductor_ship) +"rn" = (/turf/unsimulated/wall/abductor{icon_state = "alien3"},/area/abductor_ship) +"ro" = (/turf/unsimulated/wall/abductor{icon_state = "alien5"},/area/abductor_ship) +"rp" = (/obj/machinery/abductor/experiment{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rq" = (/obj/machinery/abductor/pad{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rr" = (/obj/effect/landmark/abductor/console{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rs" = (/obj/machinery/abductor/experiment{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rt" = (/obj/machinery/abductor/pad{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ru" = (/obj/effect/landmark/abductor/console{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rv" = (/obj/machinery/computer/camera_advanced/abductor{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rw" = (/obj/machinery/computer/camera_advanced/abductor{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rx" = (/obj/effect/landmark/abductor/scientist{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"ry" = (/obj/effect/landmark/abductor/agent{team = 2},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rz" = (/obj/effect/landmark/abductor/scientist{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) +"rA" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababadaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeafaeaeaeaeaeag @@ -969,43 +1044,43 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcWdsdsdsdsdscXabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdwdwdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdAdBdBdBdBdBdCdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwdwdwdwdwdwdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwlFhChthChrdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdMhqfvetetetetdwabababababepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdThEfvetetetetdNabababababepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdUdGhqhFetetetetdwabababababepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdVhEfvetetetetdwabababababepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdWhDfvetetetetdwdwdwdwdwabepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGfwfvetetetetdweIeIeIdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdXeBdHdHdHeGeafEfvetetetetfGeIeIeIdwabepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwebecedededeceedwkQeyexeteYdweIeIeIdwabepeuepeuepeuepeuepabababababababababababdAezezezezezdCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwefegegegehdwdwdwdwdwdwfudwdwdwdwdwabepepepepepepepepepabekekekekekekabababdAdZeCeDeEeDeFdYdCababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdweifXfXfXfHhlfHfXfXfXeiabepeuepeuepeuepeuepabeklflglglCekabababdGeLeMdHdHdHeNeOdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfheifXhpfXfVemfVfXhpfXeiabepepepepepepepepepabeAeJeJeJeJekabababdGeSeTeUeVdHeNeWdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhftfFfWfIfhfXfXfXgvemgvfXfXfXeiabababababababababababekeJkTfbfcekababdAfddBdBfedBfffgdBfddCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfYhhfFfFfheQeieQeiemeieQeieQeiabababekekekekekekekekekfklelcldekababdGfofofoezfpdHfqfrfsezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfFfFfFelfhfJfHgfemememggeQfJeiabababekgugegegegUgHgVgWeJeJeJhjfxfyfzdGfAfBfBfCdHdHdHdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfUfhfhfJfVevemememeseieQeieieieiekghgigigigigigihkeJeJeJhjfKfLfKfMfBfNfNezfOfPfQdHfqezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgcfahUeKfhfJfVevemememememenejePePeoekghgigigigigigieHfyfzfZfxfyfyfzdXdBdBdBgafQfQfQdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhHdBdBgqdBdBdBezdBdBgrgsgtfagdeKfhfJfVevemememggeieQeieiePfiekghgigigigigifmfnflgigigjfKfLfKgkdHgldHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababfhhHhIeNgDgEgEgEgEgEgEgEgqgFgGfagdeKfhfJgvevemememkreQfJeieReZfjekkjgigigigikkkBkCflgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgJgIgIgIgKgLgIgIgIgKgIgIgIgIgIgIgKgIgIgzababababababababababababababababababababababababababababfhgodHdHdHdHdHdHdHdHdHdHgTkHkGfagdkPfhgAfheremememeseieQeieQeqeQekkFgigigigikEkEkEkDgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgJgIgIgIgIgIgIgIgIgIgIgIgKgIgIgIgIgIgKgIgIgIgIgIgzababababababababababababababababababababababababababababfhhQeBgMgMeDeDeDeDeDeDeDgqgFhafagdhUhRfSfSememememememenjaePeXePhTirgigigigigigigigigigigjgXababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhcgIgIgIgIgIgJgIgIgLgKgIgIgKgIgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhgbhQdBdBgqdBdBdBezdBdBhigsgtfagdjOfhgAfhgfemememggeieQeieieieiekjNgigigigijMjMjMjKgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgKgLgIgIgKgIgLgzababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmfahUeKfhfJfHevemememewfHfJeiabababekmYgigigiginwmXmIflgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgIgIgIgLgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhfhfhfhfhfhfhhzhAhAhBfhfhfhfhfhhSfhfhfJfVevemememewfVfJeiabababekmkgigigigigiiYmAflgigigjfKfLfKhndHhodHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIhyhyhyhyhyhyhygIgIgIgIgIgIgIgKgIgIhcgLgIgIgIgzabababababababababababababababababababababababababababababababfhhUhVhUhUhUhUhUhUhWhYhXhUhUhUfhfJgvevemememewgvfJeiabababekmkgigigigigiginAfyfzhufxfyfyfzdXdBdBhvdBhwezhxezezeaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhMhNhOhOhOhOhOhNhPgIgIgIgIhcgIhygJhygJgIgKgIgKgzabababababababababababababababababababababababababababababababfhhUhUhUhUfDhUfDhUhUhUhUhUhUisfhhZhZiaibicidiehZhZhZabababekmkgigigigigigihkgigigigjfKfLfKhnhJhJhJhKdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNigihiiijikililhNimgIgIhygzgziniogzgzhyipiqhygzabababababababababababababababababababababababababababababababfhiJhUhUiKiKiKiKfRhUhUhUhUhUiLfhitiuiviwixiyiviuiuhZabababekohoioioiomonnNnDgigigigjfxfyfzdGhJhJhJhJdGfqfqfqifdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNiEihihiFihihihhNimgIiGgzgziHiIiIiHgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababfhiMhUfTiKiNiOiKhUhUhUhUhUhUiPfhiuiUiViwixiyiViWiuhZabababekekekekekekekekekgiiziAiBekababdGiCiCiDiDdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagSjbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzabababababababababababababababababababababababababababababfhiQhUhUiKiKiKiKfRhUhUhUhUhUiRfhjriujriwixiyjriujrhZabababababababababababekgiiXiYiZekababebfeedededededededfeeeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsaajtjujvjwjxaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIjyhNhNhNjzhNhNhNjAgIgIjBgzjCjijDjDjEjijijijFjGjGjGgzabababababababababababababababababababababababababababababfhiShUhUgnhUgnhUhUhUhUhUhUhUiTfhjPiuiuiwixiyiuiujQhZabababababababababababkpgigigigiekabababebegegegegegegegeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsjUjVjWjvjXjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNjZihkahNkbhyhyhykcgzjijDkdkejDjikfkgjmkhkigzgzabababababababababababababababababababababababababababababfhjqhUhUhUhUhUhUhUjHjJjIgpiTjLfhklkmkmiwixiyknknkohZabababababababababababekjRjSjSjTekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajYkqlGjXksktjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNkuihkvhNkwkxkxkxiogzjijDkykzjDjikfkAgzgzgzgzababababababababababababababababababababababababababababababfhfhfhfhfhgBfhfhfhfhfhfhfhfhfhfhhZhZhZhZixhZhZhZhZhZabababababababababababekekekekekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajwjxkIkJkIkKkLaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhMhNhNhNhNhNkuihkvhNkMkNkNkNkNkOjijijijijijikfkAgzgzgzgzabababababababababababababababababababababababababababababababababababababababababababababababababhZixhZabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhgBfhfhfhfhfhfhfhfhfhfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhUhVhUhUhUhUhUhUjHmYjIgpiTjLfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhUhUhUhUfDhUfDhUhUhUhUhUhUiRfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiJhUhUiKiKiKiKfRhUhUhUhUhUiTfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiMhUfTiKiNiOiKhUhUhUhUhUhUiPfhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiQhUhUiKiKiKiKfRhUhUhUhUhUiLfhfhfhfhfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhiShUhUgnhUgnhUhUhUhUhUhUhUismXfFfFfFfhepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhjqhUhUhUhUhUhUhUhWhYhXhUhUeKmAfFmIfFfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhhzhAhAhBfhfhfhfhfhkBfhfhkCkjkkfhepeuepeuepeuepeuepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgcfahUeKjJjQiViWfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhHdBdBgqdBdBdBezdBdBgrgsgtfagdeKhShRieiafhababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhHhIeNgDgEgEgEgEgEgEgEgqgFgGfagdeKfhfhfhfhfhepepepepepepepepepabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgodHdHdHdHdHdHdHdHdHdHgTkHkGfagdkPfhfWfFfIfhepeuepeuepeuepeuepabababababababababababdAezezezezezdCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhhQeBgMgMeDeDeDeDeDeDeDgqgFhafagdhUfUfFfFelfhepepepepepepepepepabekekekekekekabababdAdZeCeDeEeDeFdYdCababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhQdBdBgqdBdBdBezdBdBhigsgtfagdjOfhfFfFftfhepeuepeuepeuepeuepabeklflglglCekabababdGeLeMdHdHdHeNeOdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmfahUeKfhfFiUfYfhepepepepepepepepepabeAeJeJeJeJekabababdGeSeTeUeVdHeNeWdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhivfhfhfhfhfhfhababababababababababekeJkTfbfcekababdAfddBdBfedBfffgdBfddCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeifXhpfXfHhlfHfXhpfXeiabababekekekekekekekekekfklelcldekababdGfofofoezfpdHfqfrfsezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeifXfXfXgvemgvfXfXfXeiabababekfufnfnfnfSfGgegWeJeJeJhjfxfyfzdGfAfBfBfCdHdHdHdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdwdwdwabababababeieQeieQeiemeieQeieQeieieieiekmkgigigigigigihkeJeJeJhjfKfLfKfMfBfNfNezfOfPfQdHfqezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdAdBdBdBdBdBdCdwabababababeifJfHevemememememenejePePeoekmkgigigigigigieHfyfzfZfxfyfyfzdXdBdBdBgafQfQfQdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwdwdwdwdwdwdwfJfVevemememggeieQeieiePfiekmkgigigigigifmdNflgigigjfKfLfKgkdHgldHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwlFhChthChrdwfJgvevemememkreQfJeieReZfjekgUgigigigigVhhhEflgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgJgIgIgIgKgLgIgIgIgKgIgIgIgIgIgIgKgIgIgzababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdMhqfvetetetetdweQeieremememeseieQeieQeqeQekkFgigigigikEkEkEkDgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgJgIgIgIgIgIgIgIgIgIgIgIgKgIgIgIgIgIgKgIgIgIgIgIgzababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdTgufvetetetetgAgHemememememememenjaePeXePhTirgigigigigigigigigigigjgXababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhcgIgIgIgIgIgJgIgIgLgKgIgIgKgIgIgKgLgIgKgIgzababababababababababababababababababababababababababababababababdwdGdHdHdHdHdUdGhqhFetetetetdweQeigfemememggeieQeieieieiekjNgigigigijMjMjMjKgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgKgLgIgIgKgIgLgzababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdVgufvetetetetdwfJfHevemememewfHfJeiabababekoigigigigiiBiAohflgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgIgIgIgLgIgKgLgIgKgIgzababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdWhDfvetetetetdwfJfVevemememewfVfJeiabababekghgigigigigiiYnNflgigigjfKfLfKhndHhodHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIhyhyhyhyhyhyhygIgIgIgIgIgIgIgKgIgIhcgLgIgIgIgzababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGfwfvetetetetdwfJgvomgfemggongvfJeiabababekghgigigigigiginAfyfzhufxfyfyfzdXdBdBhvdBhwezhxezezeaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhMhNhOhOhOhOhOhNhPgIgIgIgIhcgIhygJhygJgIgKgIgKgzababababababababababababababababababababababababababababababababdwdXeBdHdHdHeGeafEfvetetetetdwhZhZidibicidibhZhZhZabababekghgigigigigigihkgigigigjfKfLfKhnhJhJhJhKdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNigihiiijikililhNimgIgIhygzgziniogzgzhyipiqhygzababababababababababababababababababababababababababababababababdwebecedededeceedwkQeyexeteYdwqMqNqOqDixqKqTqUqVhZabababekqQqRqRqRjSqSqPnDgigigigjfxfyfzdGhJhJhJhJdGfqfqfqifdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNiEihihiFihihihhNimgIiGgzgziHiIiIiHgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababababdwdwefegegegehdwdwdwdwdwqJdwdwqIiuitqDixqKitiuqLhZabababekekekekekekekekekgiiziAiBekababdGiCiCiDiDdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagSjbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzabababababababababababababababababababababababababababababababdwdwdwdwdwdwdwababdweIeIeIdwqXiuitqDixqKitiuqYhZabababababababababababekgiiXiYiZekababebfeedededededededfeeeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsaajtjujvjwjxaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIjyhNhNhNjzhNhNhNjAgIgIjBgzjCjijDjDjEjijijijFjGjGjGgzababababababababababababababababababababababababababababababababababababababababdweIeIeIdwjPiuitqDixqKitiuqWhZabababababababababababkpgigigigiekabababebegegegegegegegeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsjUjVjWjvjXjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNjZihkahNkbhyhyhykcgzjijDkdkejDjikfkgjmkhkigzgzababababababababababababababababababababababababababababababababababababababababdweIeIeIdwklkmkmiwixiyknknkohZabababababababababababekjRjSjSjTekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajYkqlGjXksktjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNkuihkvhNkwkxkxkxiogzjijDkykzjDjikfkAgzgzgzgzabababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwidmpibhZixhZidmpibhZabababababababababababekekekekekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajwjxkIkJkIkKkLaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhMhNhNhNhNhNkuihkvhNkMkNkNkNkNkOjijijijijijikfkAgzgzgzgzabababababababababababababababababababababababababababababababababababababababababababababhZnwnwnwjrixjrnwnwnwhZabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjskLkRkSjvjwaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihkVhNkuihkvhNkWkXinkxiogzkYjDjDjDjijikfkZgzlalbgzgzabababababababababababababababababababababababababababababababababababababababababhZhZhZhZhZhZhZhZichZhZhZhZhZhZhZhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaalhliljlklllmjvlnjsaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihlolphNkuihkvhNhNnrlrhPlsgzltlulvlulujijijilwlxlxlygzabababababababababababababababababababababababababababababababababababababababababhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaalBgYlDlEgZlljvlGlHlIjsjsaaaaaaaaaaaaaaaaababababababgzlJgIhNkUihihlKhNihihihhNihihihhNjBgzlLlMlLlLlNjijijigzlOlPlygzababababababababababababababababababababababababababababababababababababababababablQlzlzlzlRlzlzlzlzlzlzlzlRlzlzlzlQababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab @@ -1058,21 +1133,21 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqfqeqhqgqiabababqfqeqhqgqiababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqjqlqkqnqmqpqoabqjqlqqqsqrqpqoabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtqvquququqxqwabqtqyquququqxqwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqzqBqAqEqCqGqFabqzqBqHqEqZqGqFabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrarbquququqxrcabrarbquququqxrcabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrdrfrerhrgrjriabrdrfrerhrgrjriabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrlrkrnrmroabababrlrkrnrmroababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqfqeqhqgqiabababqfqeqhqgqiababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqjqlrprrrqqpqoabqjqlrsrurtqpqoabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqtrvquququqxqwabqtrwquququqxqwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababqzqBrxqEryqGqFabqzqBrzqErAqGqFabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrarbquququqxrcabrarbquququqxrcabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrdrfrerhrgrjriabrdrfrerhrgrjriabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababrlrkrnrmroabababrlrkrnrmroababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab diff --git a/_maps/metastation.dm b/_maps/metastation.dm index 1e0e8b973c9..b0b2d87d0a5 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -15,7 +15,7 @@ z7 = empty space #if !defined(MAP_FILE) - #include "map_files\MetaStation\MetaStation.v41A.dmm" + #include "map_files\MetaStation\MetaStation.v41A.II.dmm" #include "map_files\MetaStation\z2.dmm" #include "map_files\MetaStation\z3.dmm" #include "map_files\MetaStation\z4.dmm" @@ -23,7 +23,7 @@ z7 = empty space #include "map_files\generic\z6.dmm" #include "map_files\generic\z7.dmm" - #define MAP_FILE "MetaStation.v41A.dmm" + #define MAP_FILE "MetaStation.v41A.II.dmm" #define MAP_NAME "MetaStation" #elif !defined(MAP_OVERRIDE) diff --git a/cfg/admin.txt b/cfg/admin.txt index 62879301135..1f4c89d373b 100644 --- a/cfg/admin.txt +++ b/cfg/admin.txt @@ -12,3 +12,4 @@ cheridan giacomand rockdtben MrStonedOne +Jordie0608 diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 9569becc9fc..3c707b3da2e 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -21,9 +21,19 @@ Pipelines + Other Objects -> Pipe network var/pipe_color var/obj/item/pipe/stored + var/welded = 0 //Used on pumps and scrubbers + var/global/list/iconsetids = list() var/global/list/pipeimages = list() + +/obj/machinery/atmospherics/Destroy() + for(var/mob/living/L in src) + L.remove_ventcrawl() + L.forceMove(get_turf(src)) + ..() + + /obj/machinery/atmospherics/New() ..() @@ -78,21 +88,21 @@ Pipelines + Other Objects -> Pipe network if(can_unwrench && istype(W, /obj/item/weapon/wrench)) var/turf/T = src.loc if (level==1 && isturf(T) && T.intact) - user << "You must remove the plating first." + user << "You must remove the plating first!" return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() add_fingerprint(user) if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "You cannot unwrench this [src], it is too exerted due to internal pressure." + user << "You cannot unwrench this [src], it is too exerted due to internal pressure!" return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." if (do_after(user, 40) && !gc_destroyed) user.visible_message( \ "[user] unfastens \the [src].", \ - "You have unfastened \the [src].", \ - "You hear ratchet.") + "You unfasten \the [src].", \ + "You hear ratchet.") investigate_log("was REMOVED by [key_name(usr)]", "atmos") Deconstruct() else @@ -150,4 +160,50 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) - Deconstruct() \ No newline at end of file + Deconstruct() + + +//Find a connecting /obj/machinery/atmospherics in specified direction +/obj/machinery/atmospherics/proc/findConnecting(var/direction) + for(var/obj/machinery/atmospherics/target in get_step(src, direction)) + if(target.initialize_directions & get_dir(target,src)) + return target + + +#define VENT_SOUND_DELAY 30 + +/obj/machinery/atmospherics/relaymove(var/mob/living/user, var/direction) + if(!(direction & initialize_directions)) //cant go this way. + return + + var/obj/machinery/atmospherics/target_move = findConnecting(direction) + if(target_move) + if(is_type_in_list(target_move, ventcrawl_machinery) && target_move.can_crawl_through()) + user.remove_ventcrawl() + user.forceMove(target_move.loc) //handle entering and so on. + user.visible_message("You hear something squeezing through the ducts...","You climb out the ventilation system.") + else if(target_move.can_crawl_through()) + user.loc = target_move + user.client.eye = target_move //Byond only updates the eye every tick, This smooths out the movement + if(world.time - user.last_played_vent > VENT_SOUND_DELAY) + user.last_played_vent = world.time + playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3) + else + if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery) && can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent + user.remove_ventcrawl() + user.forceMove(src.loc) + user.visible_message("You hear something squeezing through the ducts...","You climb out the ventilation system.") + user.canmove = 0 + spawn(1) + user.canmove = 1 + + +/obj/machinery/atmospherics/AltClick(var/mob/living/L) + if(is_type_in_list(src, ventcrawl_machinery)) + L.handle_ventcrawl(src) + return + ..() + + +/obj/machinery/atmospherics/proc/can_crawl_through() + return 1 diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 0719c32f502..24771a56241 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -171,6 +171,6 @@ Passive gate is similar to the regular pump except: if (!istype(W, /obj/item/weapon/wrench)) return ..() if (on) - user << "You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench this [src], turn it off first!" return 1 return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 09a5e421de6..d9547e0a1c3 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -176,7 +176,7 @@ Thus, the two variables affect pump operation are set in New(): if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench this [src], turn it off first!" return 1 return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index de0ca2a8ab7..380e1c16bfe 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -175,6 +175,6 @@ Thus, the two variables affect pump operation are set in New(): if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench this [src], turn it off first!" return 1 return ..() diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 84c9f0c7714..4f9a62ea92d 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -37,7 +37,7 @@ /obj/machinery/atmospherics/unary/portables_connector/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/wrench)) if(connected_device) - user << "You cannot unwrench this [src], dettach [connected_device] first." + user << "You cannot unwrench this [src], dettach [connected_device] first!" return 1 return ..() diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index aa7fc41240a..17076ed8694 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -23,8 +23,6 @@ //2: Do not pass internal_pressure_bound //3: Do not pass either - var/welded = 0 - var/frequency = 1439 var/datum/radio_frequency/radio_connection @@ -267,22 +265,22 @@ /obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/weapon/wrench)&& !(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench this [src], turn it off first!" return 1 if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) playsound(loc, 'sound/items/Welder.ogg', 40, 1) - user << "Now welding the vent." + user << "You begin welding the vent..." if(do_after(user, 20)) if(!src || !WT.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(!welded) - user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") welded = 1 update_icon() else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") welded = 0 update_icon() return 1 @@ -307,68 +305,6 @@ initial_loc.air_vent_names -= id_tag ..() -/* - Alt-click to ventcrawl -*/ -/obj/machinery/atmospherics/unary/vent_pump/AltClick(var/mob/living/L) - if(!L.ventcrawler || !isliving(L) || !Adjacent(L)) - return - if(L.stat) - L << "You must be conscious to do this!" - return - if(L.lying) - L << "You can't vent crawl while you're stunned!" - return - if(welded) - L << "That vent is welded shut." - return - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in parent.other_atmosmch) - if(temp_vent.welded) - continue - if(temp_vent in loc) - continue - var/turf/T = get_turf(temp_vent) - - if(!T || T.z != loc.z) - continue - - var/i = 1 - var/index = "[T.loc.name]\[[i]\]" - while(index in vents) - i++ - index = "[T.loc.name]\[[i]\]" - vents[index] = temp_vent - if(!vents.len) - L << "There are no available vents to travel to, they could be welded. " - return - - var/obj/selection = input(L,"Select a destination.", "Duct System") as null|anything in sortList(vents) - if(!selection) - return - - if(!Adjacent(L) || L.stat || L.lying || !L.ventcrawler || welded) - return - if(iscarbon(L) && L.ventcrawler < 2) // lesser ventcrawlers can't bring items - for(var/obj/item/carried_item in L.contents) - if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant - L << "You can't be carrying items or have items equipped when vent crawling!" - return - - var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection] - if(!target_vent) - return - - L.visible_message("[L] scrambles into the ventilation ducts!", \ - "You scramble into the ventilation ducts.") - - target_vent.audible_message("You hear something squeezing through the ventilation ducts.") - - if(target_vent.welded) //the vent can be welded while they scrolled through the list. - target_vent = src - L << "The vent you were heading to appears to be welded." - L.loc = target_vent.loc - var/area/new_area = get_area(L.loc) - if(new_area) - new_area.Entered(L) +/obj/machinery/atmospherics/unary/vent_pump/can_crawl_through() + return !welded diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index cb7859c1268..f9ccca6c829 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -27,6 +27,7 @@ var/radio_filter_out var/radio_filter_in + /obj/machinery/atmospherics/unary/vent_scrubber/New() ..() initial_loc = get_area(loc) @@ -50,6 +51,10 @@ if(showpipe) overlays += getpipeimage('icons/obj/atmospherics/unary_devices.dmi', "scrub_cap", initialize_directions) + if(welded) + icon_state = "scrub_welded" + return + if(!node || !on || stat & (NOPOWER|BROKEN)) icon_state = "scrub_off" return @@ -107,7 +112,7 @@ if (!node) on = 0 //broadcast_status() - if(!on) + if(!on || welded) return 0 @@ -238,15 +243,38 @@ update_icon_nopipes() /obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0,user)) + playsound(loc, 'sound/items/Welder.ogg', 40, 1) + user << "Now welding the scrubber." + if(do_after(user, 20)) + if(!src || !WT.isOn()) + return + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + if(!welded) + user.visible_message("[user] welds the scrubber shut.","You weld the scrubber shut.", "You hear welding.") + welded = 1 + update_icon() + else + user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") + welded = 0 + update_icon() + return 1 if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench this [src], turn it off first!" return 1 return ..() + /obj/machinery/atmospherics/unary/vent_scrubber/Destroy() if(initial_loc) initial_loc.air_scrub_info -= id_tag initial_loc.air_scrub_names -= id_tag ..() + + +/obj/machinery/atmospherics/unary/vent_scrubber/can_crawl_through() + return !welded diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 0c121617b81..ac619b10b20 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -107,6 +107,4 @@ #define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( #define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). -#define PRESSURE_SUIT_REDUCTION_COEFFICIENT 0.8 //This is how much (percentual) a suit with the flag STOPSPRESSUREDMAGE reduces pressure. -#define PRESSURE_HEAD_REDUCTION_COEFFICIENT 0.4 //This is how much (percentual) a helmet/hat with the flag STOPSPRESSUREDMAGE reduces pressure. - +#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this \ No newline at end of file diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 4598cd77308..8675d6cca0e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -68,6 +68,7 @@ #define NOGUNS 512 #define NOBLOOD 1024 #define NOFIRE 2048 +#define VIRUSIMMUNE 4096 /* These defines are used specifically with the atom/movable/languages bitmask. diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 0126fde5384..d2c854462a8 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -24,4 +24,5 @@ #define ANTAG_HUD_OPS 7 #define ANTAG_HUD_GANG_A 8 #define ANTAG_HUD_GANG_B 9 -#define ANTAG_HUD_WIZ 10 \ No newline at end of file +#define ANTAG_HUD_WIZ 10 +#define ANTAG_HUD_SHADOW 11 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index bdfc636ee20..bc0dd8fc2b4 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -40,3 +40,6 @@ #define BE_NINJA 1024 #define BE_MONKEY 2048 #define BE_GANG 4096 +#define BE_SHADOWLING 8192 +#define BE_ABDUCTOR 16384 +#define BE_REVENANT 32768 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 8d30dd0343a..aa2578347df 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -53,18 +53,10 @@ return 0 return 1 - -//Magic constants obtained by using linear regression on right-angled triangles of sides 0=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :) - else return (k2*dx) + (k1*dy) -#undef k1 -#undef k2 +//We used to use linear regression to approximate the answer, but Mloc realized this was actually faster. +//And lo and behold, it is, and it's more accurate to boot. +/proc/cheap_hypotenuse(Ax,Ay,Bx,By) + return sqrt(abs(Ax - Bx)**2 + abs(Ay - By)**2) //A squared + B squared = C squared /proc/circlerange(center=usr,radius=3) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 9a237d24be0..243c176cb8d 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -185,8 +185,8 @@ return L = L.Copy() - for(var/i=1, i<=L.len, ++i) - L.Swap(i,rand(1,L.len)) + for(var/i=1, i[user] has used the analyzer on \icon[icon] [target].") + user.visible_message("[user] has used the analyzer on \icon[icon] [target].", "You use the analyzer on \icon[icon] [target].") var/pressure = air_contents.return_pressure() var/total_moles = air_contents.total_moles() diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 417bedd80e3..6c6718d4ec7 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -31,7 +31,7 @@ #define AGE_MAX 85 //oldest a character can be #define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up #define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets -#define DOOR_CRUSH_DAMAGE 10 //the amount of damage that airlocks deal when they crush you +#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you #define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases #define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default. diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index 062be18c68d..0db83ac6adb 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -46,5 +46,7 @@ var/list/be_special_flags = list( "Blob" = BE_BLOB, "Ninja" = BE_NINJA, "Monkey" = BE_MONKEY, - "Gang" = BE_GANG + "Gang" = BE_GANG, + "Abductor" = BE_ABDUCTOR, + "Revenant" = BE_REVENANT ) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 88dd74669d2..1775761d6a2 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -17,13 +17,6 @@ Therefore, the top right corner (except during admin shenanigans) is at "15,15" */ -//Upper left action buttons, displayed when you pick up an item that has this enabled. -#define ui_action_slot1 "WEST :6, NORTH-1:26" -#define ui_action_slot2 "WEST+1:8, NORTH-1:26" -#define ui_action_slot3 "WEST+2:10,NORTH-1:26" -#define ui_action_slot4 "WEST+3:12,NORTH-1:26" -#define ui_action_slot5 "WEST+4:14,NORTH-1:26" - //Lower left, persistant menu #define ui_inventory "WEST:6,SOUTH:5" diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm new file mode 100644 index 00000000000..df88cf950d4 --- /dev/null +++ b/code/_onclick/hud/action.dm @@ -0,0 +1,247 @@ +#define AB_ITEM 1 +#define AB_SPELL 2 +#define AB_INNATE 3 +#define AB_GENERIC 4 + +#define AB_CHECK_RESTRAINED 1 +#define AB_CHECK_STUNNED 2 +#define AB_CHECK_LYING 4 +#define AB_CHECK_ALIVE 8 +#define AB_CHECK_INSIDE 16 + + +/datum/action + var/name = "Generic Action" + var/action_type = AB_ITEM + var/procname = null + var/atom/movable/target = null + var/check_flags = 0 + var/processing = 0 + var/active = 0 + var/obj/screen/movable/action_button/button = null + var/button_icon = 'icons/mob/actions.dmi' + var/button_icon_state = "default" + var/background_icon_state = "bg_default" + var/mob/living/owner + +/datum/action/New(var/Target) + target = Target + +/datum/action/Destroy() + if(owner) + Remove(owner) + +/datum/action/proc/Grant(mob/living/T) + if(owner) + if(owner == T) + return + Remove(owner) + owner = T + owner.actions.Add(src) + owner.update_action_buttons() + return + +/datum/action/proc/Remove(mob/living/T) + if(button) + if(T.client) + T.client.screen -= button + del(button) + T.actions.Remove(src) + T.update_action_buttons() + owner = null + return + +/datum/action/proc/Trigger() + if(!Checks()) + return + switch(action_type) + if(AB_ITEM) + if(target) + var/obj/item/item = target + item.ui_action_click() + if(AB_SPELL) + if(target) + var/obj/effect/proc_holder/spell = target + spell.Click() + if(AB_INNATE) + if(!active) + Activate() + else + Deactivate() + if(AB_GENERIC) + if(target && procname) + call(target,procname)(usr) + return + +/datum/action/proc/Activate() + return + +/datum/action/proc/Deactivate() + return + +/datum/action/proc/Process() + return + +/datum/action/proc/CheckRemoval(mob/living/user) // 1 if action is no longer valid for this mob and should be removed + return 0 + +/datum/action/proc/IsAvailable() + return Checks() + +/datum/action/proc/Checks()// returns 1 if all checks pass + if(!owner) + return 0 + if(check_flags & AB_CHECK_RESTRAINED) + if(owner.restrained()) + return 0 + if(check_flags & AB_CHECK_STUNNED) + if(owner.stunned) + return 0 + if(check_flags & AB_CHECK_LYING) + if(owner.lying) + return 0 + if(check_flags & AB_CHECK_ALIVE) + if(owner.stat) + return 0 + if(check_flags & AB_CHECK_INSIDE) + if(!(target in owner)) + return 0 + return 1 + +/datum/action/proc/UpdateName() + return name + +/obj/screen/movable/action_button + var/datum/action/owner + screen_loc = "WEST,NORTH" + +/obj/screen/movable/action_button/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + return 1 + if(usr.next_move >= world.time) // Is this needed ? + return + owner.Trigger() + return 1 + +/obj/screen/movable/action_button/proc/UpdateIcon() + if(!owner) + return + icon = owner.button_icon + icon_state = owner.background_icon_state + + overlays.Cut() + var/image/img + if(owner.action_type == AB_ITEM && owner.target) + var/obj/item/I = owner.target + img = image(I.icon, src , I.icon_state) + else if(owner.button_icon && owner.button_icon_state) + img = image(owner.button_icon,src,owner.button_icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + overlays += img + + if(!owner.IsAvailable()) + color = rgb(128,0,0,128) + else + color = rgb(255,255,255,255) + +//Hide/Show Action Buttons ... Button +/obj/screen/movable/action_button/hide_toggle + name = "Hide Buttons" + icon = 'icons/mob/actions.dmi' + icon_state = "bg_default" + var/hidden = 0 + +/obj/screen/movable/action_button/hide_toggle/Click() + usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden + + hidden = usr.hud_used.action_buttons_hidden + if(hidden) + name = "Show Buttons" + else + name = "Hide Buttons" + UpdateIcon() + usr.update_action_buttons() + + +/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user) + if(isalien(user)) + icon_state = "bg_alien" + else + icon_state = "bg_default" + UpdateIcon() + return + +/obj/screen/movable/action_button/hide_toggle/UpdateIcon() + overlays.Cut() + var/image/img = image(icon,src,hidden?"show":"hide") + overlays += img + return + +//This is the proc used to update all the action buttons. Properly defined in /mob/living/ +/mob/proc/update_action_buttons() + return + +#define AB_WEST_OFFSET 4 +#define AB_NORTH_OFFSET 26 +#define AB_MAX_COLUMNS 10 + +/datum/hud/proc/ButtonNumberToScreenCoords(var/number) // TODO : Make this zero-indexed for readabilty + var/row = round((number-1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + var/coord_col = "+[col-1]" + var/coord_col_offset = 4+2*col + var/coord_row = "[-1 - row]" + var/coord_row_offset = 26 + return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:[coord_row_offset]" + +/datum/hud/proc/SetButtonCoords(var/obj/screen/button,var/number) + var/row = round((number-1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + var/x_offset = 32*(col-1) + 4 + 2*col + var/y_offset = -32*(row+1) + 26 + + var/matrix/M = matrix() + M.Translate(x_offset,y_offset) + button.transform = M + +//Presets for item actions +/datum/action/item_action + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE + +/datum/action/item_action/CheckRemoval(mob/living/user) + return !(target in user) + +/datum/action/item_action/hands_free + check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE + + +//Preset for spells +/datum/action/spell_action + action_type = AB_SPELL + check_flags = 0 + background_icon_state = "bg_spell" + +/datum/action/spell_action/UpdateName() + var/obj/effect/proc_holder/spell/spell = target + return spell.name + +/datum/action/spell_action/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/spell/spell = target + + if(usr) + return spell.can_cast(usr) + else + if(owner) + return spell.can_cast(owner) + return 1 + +/datum/action/spell_action/CheckRemoval() + if(owner.mind) + if(target in owner.mind.spell_list) + return 0 + return !(target in owner.mob_spell_list) \ No newline at end of file diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index a0422e05b91..8c52e9221d5 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -15,8 +15,10 @@ icon_state = "nightvision1" /obj/screen/alien/nightvision/Click() - var/mob/living/carbon/alien/humanoid/A = usr - A.nightvisiontoggle() + var/mob/living/carbon/alien/A = usr + var/obj/effect/proc_holder/alien/nightvisiontoggle/T = locate() in A.abilities + if(T) + T.fire(A) /datum/hud/proc/alien_hud() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index c84ae5a071c..c896fb76999 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -110,8 +110,8 @@ var/datum/global_hud/global_hud = new() var/list/other var/list/obj/screen/hotkeybuttons - var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. - + var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle + var/action_buttons_hidden = 0 datum/hud/New(mob/owner) mymob = owner @@ -243,8 +243,6 @@ datum/hud/New(mob/owner) mymob.client.screen -= other if(hotkeybuttons) mymob.client.screen -= hotkeybuttons - if(item_action_list) - mymob.client.screen -= item_action_list //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason. @@ -269,8 +267,6 @@ datum/hud/New(mob/owner) mymob.client.screen -= other if(hotkeybuttons) mymob.client.screen -= hotkeybuttons - if(item_action_list) - mymob.client.screen -= item_action_list //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason. diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 18b4f72a13b..64e8cdc77e9 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -323,50 +323,3 @@ else client.screen -= hud_used.hotkeybuttons hud_used.hotkey_ui_hidden = 1 - - -/mob/living/carbon/human/update_action_buttons() - var/num = 1 - if(!hud_used) return - if(!client) return - - if(hud_used.hud_shown != 1) //Hud toggled to minimal - return - - client.screen -= hud_used.item_action_list - - for(var/obj/item/I in src) - if(I.action_button_name) - if(hud_used.item_action_list.len < num) - var/obj/screen/item_action/N = new(hud_used) - hud_used.item_action_list += N - - var/obj/screen/item_action/A = hud_used.item_action_list[num] - - A.icon = ui_style2icon(client.prefs.UI_style) - A.icon_state = "template" - - A.overlays = list() - var/image/img = image(I.icon, A, I.icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - A.overlays += img - - A.name = I.action_button_name - A.owner = I - - client.screen += hud_used.item_action_list[num] - - switch(num) - if(1) - A.screen_loc = ui_action_slot1 - if(2) - A.screen_loc = ui_action_slot2 - if(3) - A.screen_loc = ui_action_slot3 - if(4) - A.screen_loc = ui_action_slot4 - if(5) - A.screen_loc = ui_action_slot5 - break //5 slots available, so no more can be added. - num++ diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 8e0455db14d..a0dc4827ba9 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -10,7 +10,7 @@ /obj/screen/movable var/snap2grid = FALSE - + var/moved = FALSE //Snap Screen Object //Tied to the grid, snaps to the nearest turf @@ -43,6 +43,7 @@ var/pix_Y = text2num(screen_loc_Y[2]) - 16 screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" + moved = TRUE //Debug procs diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 856dce11be8..e15c104de11 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -42,32 +42,6 @@ return 1 -/obj/screen/item_action - var/obj/item/owner - -/obj/screen/item_action/Click() - if(!usr || !owner) - return 1 - if(usr.next_move >= world.time) - return - - if(!owner.action_button_is_hands_free && (usr.restrained() || usr.stunned || usr.lying)) - return 1 - - if(usr.stat) - return 1 - - if(!(owner in usr)) - return 1 - - owner.ui_action_click() - return 1 - -//This is the proc used to update all the action buttons. It just returns for all mob types except humans. -/mob/proc/update_action_buttons() - return - - /obj/screen/drop name = "drop" icon = 'icons/mob/screen_midnight.dmi' @@ -126,13 +100,19 @@ if(!C.incapacitated()) if(C.internal) C.internal = null - C << "No longer running on internals." + C << "You are no longer running on internals." icon_state = "internal0" else if(!istype(C.wear_mask, /obj/item/clothing/mask)) - C << "You are not wearing a mask." + C << "You are not wearing an internals mask!" return 1 else + var/obj/item/clothing/mask/M = C.wear_mask + if(M.mask_adjusted) // if mask on face but pushed down + M.adjustmask(C) // adjust it back + if( !(M.flags & MASKINTERNALS) ) + C << "You are not wearing an internals mask!" + return if(istype(C.l_hand, /obj/item/weapon/tank)) C << "You are now running on internals from the [C.l_hand] on your left hand." C.internal = C.l_hand @@ -162,7 +142,7 @@ if(C.internal) icon_state = "internal1" else - C << "You don't have an oxygen tank." + C << "You don't have an oxygen tank!" /obj/screen/mov_intent name = "run/walk toggle" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index b2f0fd6fcdf..68b4f2f104d 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -11,6 +11,8 @@ user.do_attack_animation(src) if(W && !(W.flags&NOBLUDGEON)) visible_message("[user] has hit [src] with [W].") + user << "You hit [src] with [W]." + src << "[user] has hit you with [W]!" /mob/living/attackby(obj/item/I, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) @@ -42,12 +44,12 @@ /mob/living/simple_animal/attacked_by(var/obj/item/I, var/mob/living/user) if(!I.force) user.visible_message("[user] gently taps [src] with [I].",\ - "This weapon is ineffective, it does no damage.") + "This weapon is ineffective, it does no damage!") else if(I.force >= force_threshold && I.damtype != STAMINA) ..() else - visible_message("[I] bounces harmlessly off of [src].",\ - "[I] bounces harmlessly off of [src].") + visible_message("[I] bounces harmlessly off of [src].",\ + "[I] bounces harmlessly off of [src]!") diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 515f0368ec6..ba55e9cf993 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -42,6 +42,10 @@ for(var/datum/mutation/human/HM in dna.mutations) HM.on_ranged_attack(src, A) + var/turf/T = A + if(istype(T) && get_dist(src,T) <= 1) + src.Move_Pulled(T) + /* Animals & All Unspecified */ diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm deleted file mode 100644 index ea1b76b1ce2..00000000000 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ /dev/null @@ -1,308 +0,0 @@ -/* - Modified DynamicAreaLighting for TGstation - Coded by Carnwennan - - This is TG's 'new' lighting system. It's basically a heavily modified combination of Forum_Account's and - ShadowDarke's respective lighting libraries. Credits, where due, to them. - - Like sd_DAL (what we used to use), it changes the shading overlays of areas by splitting each type of area into sub-areas - by using the var/tag variable and moving turfs into the contents list of the correct sub-area. This method is - much less costly than using overlays or objects. - - Unlike sd_DAL however it uses a queueing system. Everytime we call a change to opacity or luminosity - (through SetOpacity() or SetLuminosity()) we are simply updating variables and scheduling certain lights/turfs for an - update. Actual updates are handled periodically by the SSlighting subsystem. This carries additional overheads, however it - means that each thing is changed only once per SSlighting.wait deciseconds. Allowing for greater control - over how much priority we'd like lighting updates to have. - - UPDATE: we no longer postpone lighting updates by editting variables, there is now a subsystem/proc/postpone() procedure. - So you would do SSlighting.postpone() - - Unlike our old system there are hardcoded maximum luminositys (different for certain atoms). - This is to cap the cost of creating lighting effects. - (without this, an atom with luminosity of 20 would have to update 41^2 turfs!) :s - - Also, in order for the queueing system to work, each light remembers the effect it casts on each turf. This is going to - have larger memory requirements than our previous system but it's easily worth the hassle for the greater control we - gain. It also reduces cost of removing lighting effects by a lot! - - Known Issues/TODO: - Shuttles still do not have support for dynamic lighting (I hope to fix this at some point) - No directional lighting support. (prototype looked ugly) -*/ - -#define USE_CIRCULAR_LIGHTING //comment this out to use old square lighting effects. - -/datum/light_source - var/atom/owner - var/changed = 1 - var/list/effect = list() - var/__x = 0 //x coordinate at last update - var/__y = 0 //y coordinate at last update - - -/datum/light_source/New(atom/A) - if(!istype(A)) - CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.") - ..() - owner = A - __x = owner.x - __y = owner.y - // the lighting object maintains a list of all light sources - SSlighting.lights += src - - -//Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one -/datum/light_source/proc/check() - if(!owner) - remove_effect() - return 1 //causes it to be removed from our list of lights. The garbage collector will then destroy it. - - // check to see if we've moved since last update - if(owner.x != __x || owner.y != __y) - __x = owner.x - __y = owner.y - changed = 1 - - if(changed) - changed = 0 - remove_effect() - return add_effect() - return 0 - - -/datum/light_source/proc/remove_effect() - // before we apply the effect we remove the light's current effect. - for(var/turf/T in effect) // negate the effect of this light source - T.update_lumcount(-effect[T]) - - if(T.affecting_lights && T.affecting_lights.len) - T.affecting_lights -= src - else - T.affecting_lights = null - - effect.Cut() // clear the effect list - -/datum/light_source/proc/add_effect() - // only do this if the light is turned on and is on the map - if(owner.loc && owner.luminosity > 0) - effect = list() - var/turf/To = get_turf(owner) - var/range = owner.get_light_range() - - for(var/turf/T in view(range, To)) - var/delta_lumcount = T.lumen(src) - if(delta_lumcount > 0) - effect[T] = delta_lumcount - T.update_lumcount(delta_lumcount) - - if(!T.affecting_lights) - T.affecting_lights = list() - T.affecting_lights += src - - return 0 - else - owner.light = null - return 1 //cause the light to be removed from the lights list and garbage collected once it's no - //longer referenced by the queue - -/turf/proc/lumen(datum/light_source/L) - . = L.owner.luminosity -#ifdef USE_CIRCULAR_LIGHTING - . -= cheap_hypotenuse(x, y, L.__x, L.__y) -#else - . -= max(abs(x - L.__x), abs(y - L.__y)) -#endif - return . - -/turf/space/lumen() - return 0 - - -/atom - var/datum/light_source/light - - -//Turfs with opacity when they are constructed will trigger nearby lights to update -//Turfs and atoms with luminosity when they are constructed will create a light_source automatically -/turf/New() - ..() - if(luminosity) - if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.") - light = new(src) - -//Movable atoms with opacity when they are constructed will trigger nearby lights to update -//Movable atoms with luminosity when they are constructed will create a light_source automatically -/atom/movable/New() - ..() - if(opacity) - UpdateAffectingLights() - if(luminosity) - if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.") - light = new(src) - -//Objects with opacity will trigger nearby lights to update at next lighting process. -/atom/movable/Destroy() - if(opacity) - UpdateAffectingLights() - return ..() - -//Sets our luminosity. -//If we have no light it will create one. -//If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its -//queues are complete. -//if we have a light already it is merely updated, rather than making a new one. -/atom/proc/SetLuminosity(new_luminosity) - if(new_luminosity < 0) - new_luminosity = 0 - if(light) - if(luminosity != new_luminosity) //non-luminous lights are removed from the lights list in add_effect() - light.changed = 1 - else - if(new_luminosity) - light = new(src) - luminosity = new_luminosity - -/atom/proc/AddLuminosity(delta_luminosity) - SetLuminosity(luminosity + delta_luminosity) - -/area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas - luminosity = !!new_luminosity - - -//change our opacity (defaults to toggle), and then update all lights that affect us. -/atom/proc/SetOpacity(new_opacity) - if(new_opacity == null) - new_opacity = !opacity //default = toggle opacity - else if(opacity == new_opacity) - return 0 //opacity hasn't changed! don't bother doing anything - opacity = new_opacity //update opacity, the below procs now call light updates. - UpdateAffectingLights() - - -/turf - var/lighting_lumcount = 0 - var/lighting_changed = 0 - var/list/affecting_lights //not initialised until used (even empty lists reserve a fair bit of memory) - -/turf/space - lighting_lumcount = 4 //starlight - -/turf/proc/update_lumcount(amount) - lighting_lumcount += amount - if(!lighting_changed) - SSlighting.changed_turfs += src - lighting_changed = 1 - -/area/proc/lighting_tag(level) - return tagbase + "sd_L[level]" - -/area/proc/build_lighting_area(tag, level) - var/area/A = locate(tag) // find an appropriate area - if(A) - return A - A = new type() // create area if it wasn't found - // replicate vars - for(var/V in vars) - switch(V) - if("contents","last_light","overlays") continue - else - if(issaved(vars[V])) A.vars[V] = vars[V] - - A.tag = tag - A.lighting_subarea = 1 - A.lighting_space = 0 // in case it was copied from a space subarea - A.SetLightLevel(level) - - related += A - return A - -/turf/proc/shift_to_subarea() - lighting_changed = 0 - var/area/Area = loc - - if(!istype(Area) || !Area.lighting_use_dynamic) return - - var/level = min(max(round(lighting_lumcount,1),0),SSlighting.lighting_images.len) - var/new_tag = Area.lighting_tag(level) - if(Area.tag!=new_tag) //skip if already in this area - var/area/A = Area.build_lighting_area(new_tag,level) - A.contents += src // move the turf into the area - -/area - var/lighting_use_dynamic = 1 //Turn this flag off to prevent sd_DynamicAreaLighting from affecting this area - var/last_light //tracks the last light level set for this area (used for removing previously applied lighting overlays) - var/lighting_subarea = 0 //tracks whether we're a lighting sub-area - var/lighting_space = 0 // true for space-only lighting subareas - var/tagbase - -/area/proc/SetLightLevel(light) - if(!src) return - if(light <= 1) - light = 1 - luminosity = 0 - else - if(light > SSlighting.lighting_images.len) - light = SSlighting.lighting_images.len - luminosity = 1 - - if(last_light != light) - if(last_light) - overlays -= SSlighting.lighting_images[last_light] - overlays += SSlighting.lighting_images[light] - last_light = light - -/area/proc/SetDynamicLighting() - lighting_use_dynamic = 1 - for(var/turf/T in contents) - T.update_lumcount(0) - -/area/proc/InitializeLighting() //TODO: could probably improve this bit ~Carn - tagbase = "[type]" - if(!tag) tag = tagbase - if(!lighting_use_dynamic) - if(!lighting_subarea) // see if this is a lighting subarea already - //show the dark overlay so areas, not yet in a lighting subarea, won't be bright as day and look silly. - SetLightLevel(4) - -#undef USE_CIRCULAR_LIGHTING - -//set the changed status of all lights which could have possibly lit this atom. -//We don't need to worry about lights which lit us but moved away, since they will have change status set already -//This proc can cause lots of lights to be updated. :( -/atom/proc/UpdateAffectingLights() - -/atom/movable/UpdateAffectingLights() - if(isturf(loc)) - loc.UpdateAffectingLights() - -/turf/UpdateAffectingLights() - if(affecting_lights) - for(var/thing in affecting_lights) - thing:changed = 1 //force it to update at next process() - - -#define LIGHTING_MAX_LUMINOSITY_STATIC 8 //Maximum luminosity to reduce lag. -#define LIGHTING_MAX_LUMINOSITY_MOBILE 5 //Moving objects have a lower max luminosity since these update more often. (lag reduction) -#define LIGHTING_MAX_LUMINOSITY_MOB 5 -#define LIGHTING_MAX_LUMINOSITY_TURF 1 //turfs have a severely shortened range to protect from inevitable floor-lighttile spam. - -//caps luminosity effects max-range based on what type the light's owner is. -/atom/proc/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC) - -/atom/movable/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_MOBILE) - -/mob/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_MOB) - -/obj/machinery/light/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC) - -/turf/get_light_range() - return min(luminosity, LIGHTING_MAX_LUMINOSITY_TURF) - -#undef LIGHTING_MAX_LUMINOSITY_STATIC -#undef LIGHTING_MAX_LUMINOSITY_MOBILE -#undef LIGHTING_MAX_LUMINOSITY_MOB -#undef LIGHTING_MAX_LUMINOSITY_TURF diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index dba2b9a506b..ec38e7265bb 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -92,23 +92,20 @@ var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors var/changeling_scaling_coeff = 6 //how much does the amount of players get divided by to determine changelings var/security_scaling_coeff = 8 //how much does the amount of players get divided by to determine open security officer positions + var/abductor_scaling_coeff = 15 //how many players per abductor team var/traitor_objectives_amount = 2 var/protect_roles_from_antagonist = 0 //If security and such can be traitor/cult/other var/protect_assistant_from_antagonist = 0 //If assistants can be traitor/cult/other var/enforce_human_authority = 0 //If non-human species are barred from joining as a head of staff var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling - var/continuous_round_rev = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. - var/continuous_round_gang = 0 - var/continuous_round_wiz = 0 - var/continuous_round_malf = 0 - var/continuous_round_blob = 0 + var/list/continuous = list() // which roundtypes continue if all antagonists die + var/list/midround_antag = list() // which roundtypes use the midround antagonist system var/midround_antag_time_check = 60 // How late (in minutes) you want the midround antag system to stay on, setting this to 0 will disable the system var/midround_antag_life_check = 0.7 // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist var/shuttle_refuel_delay = 12000 var/show_game_type_odds = 0 //if set this allows players to see the odds of each roundtype on the get revision screen var/mutant_races = 0 //players can choose their mutant race before joining the game - var/mutant_colors = 0 var/no_summon_guns //No var/no_summon_magic //Fun @@ -397,16 +394,18 @@ config.sec_start_brig = 1 if("gateway_delay") config.gateway_delay = text2num(value) - if("continuous_round_rev") - config.continuous_round_rev = 1 - if("continuous_round_gang") - config.continuous_round_gang = 1 - if("continuous_round_wiz") - config.continuous_round_wiz = 1 - if("continuous_round_malf") - config.continuous_round_malf = 1 - if("continuous_round_blob") - config.continuous_round_blob = 1 + if("continuous") + var/mode_name = lowertext(value) + if(mode_name in config.modes) + config.continuous[mode_name] = 1 + else + diary << "Unknown continuous configuration definition: [mode_name]." + if("midround_antag") + var/mode_name = lowertext(value) + if(mode_name in config.modes) + config.midround_antag[mode_name] = 1 + else + diary << "Unknown midround antagonist configuration definition: [mode_name]." if("midround_antag_time_check") config.midround_antag_time_check = text2num(value) if("midround_antag_life_check") @@ -423,6 +422,8 @@ config.changeling_scaling_coeff = text2num(value) if("security_scaling_coeff") config.security_scaling_coeff = text2num(value) + if("abductor_scaling_coeff") + config.abductor_scaling_coeff = text2num(value) if("traitor_objectives_amount") config.traitor_objectives_amount = text2num(value) if("probability") @@ -472,8 +473,6 @@ config.silicon_max_law_amount = text2num(value) if("join_with_mutant_race") config.mutant_races = 1 - if("mutant_colors") - config.mutant_colors = 1 if("assistant_cap") config.assistant_cap = text2num(value) if("starlight") diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 3a329379f97..6ebee701170 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -82,7 +82,8 @@ var/datum/subsystem/garbage_collector/SSgarbage // Return true if the the GC controller should allow the object to continue existing. (Useful if pooling objects.) /datum/proc/Destroy() //del(src) - return + tag = null + return 0 /datum/var/gc_destroyed //Time when this object was destroyed. diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 0754b284c67..0aacf50f5b6 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -1,56 +1,50 @@ var/datum/subsystem/lighting/SSlighting #define MC_AVERAGE(average, current) (0.8*(average) + 0.2*(current)) -#define LIGHTING_ICON 'icons/effects/ss13_dark_alpha6.dmi' -#define LIGHTING_LAYER 10 //Drawing layer for lighting overlays /datum/subsystem/lighting name = "Lighting" wait = 5 priority = 1 - var/list/lighting_images = list() //replaces lighting_states (use lighting_images.len) ~carn - var/list/lights = list() //list of all datum/light_source - var/lights_workload = 0 //stats on the largest number of lights (max lights.len) - var/list/changed_turfs = list() //list of all turfs which need moving to a new lighting subarea + var/list/changed_lights = list() //list of all datum/light_source that need updating + var/changed_lights_workload = 0 //stats on the largest number of lights (max changed_lights.len) + var/list/changed_turfs = list() //list of all turfs which may have a different light level var/changed_turfs_workload = 0 //stats on the largest number of turfs changed (max changed_turfs.len) /datum/subsystem/lighting/New() NEW_SS_GLOBAL(SSlighting) - //cache lighting images - if(!lighting_images.len) - for(var/icon_state in icon_states(LIGHTING_ICON)) - lighting_images += image(LIGHTING_ICON, null, icon_state, LIGHTING_LAYER) - return ..() /datum/subsystem/lighting/stat_entry() - stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%) L:[round(lights_workload,1)]/T:[round(changed_turfs_workload,1)]") + stat(name, "[round(cost,0.001)]ds (CPU:[round(cpu,1)]%) L:[round(changed_lights_workload,1)]/T:[round(changed_turfs_workload,1)]") -//Workhorse of lighting. It cycles through each light to see which ones need their effects updating. It updates their -//effects and then processes every turf in the queue, moving the turfs to the corresponing lighting sub-area. -//All queue lists prune themselves, which will cause lights with no luminosity to be garbage collected (cheaper and safer -//than deleting them). +//Workhorse of lighting. It cycles through each light that needs updating. It updates their +//effects and then processes every turf in the queue, updating their lighting object's appearance +//Any light that returns 1 in check() deletes itself //By using queues we are ensuring we don't perform more updates than are necessary /datum/subsystem/lighting/fire() - lights_workload = MC_AVERAGE(lights_workload, lights.len) - var/i=1 - for(var/thing in lights) - if(thing && !thing:check()) //yes, cry that I'm using the : operator, it's much faster looping like this. And this gets called a lot. Dealwithit. - ++i - continue - lights.Cut(i, i+1) + changed_lights_workload = MC_AVERAGE(changed_lights_workload, changed_lights.len) + +// for(var/area/A in sortedAreas) +// A.luminosity = 1 + + for(var/datum/light_source/thing in changed_lights) + thing.check() + changed_lights.Cut() changed_turfs_workload = MC_AVERAGE(changed_turfs_workload, changed_turfs.len) - for(var/thing in changed_turfs) - if(thing && thing:lighting_changed) - thing:shift_to_subarea() + for(var/turf/thing in changed_turfs) + if(thing && thing.lighting_changed) + thing.redraw_lighting() changed_turfs.Cut() +// for(var/area/A in sortedAreas) +// A.luminosity = !A.lighting_use_dynamic //same as above except it attempts to shift ALL turfs in the world regardless of lighting_changed status //Does not loop. Should be run prior to process() being called for the first time. @@ -58,12 +52,13 @@ var/datum/subsystem/lighting/SSlighting //z-levels with the z_level argument /datum/subsystem/lighting/Initialize(timeofday, z_level) - var/i=1 - for(var/thing in lights) - if(thing && !thing:check()) - ++i - continue - lights.Cut(i, i+1) +// for(var/area/A in sortedAreas) +// A.luminosity = 1 + + for(var/datum/light_source/thing in changed_lights) + thing.add_effect() + thing.changed = 0 + changed_lights.Cut() var/z_start = 1 var/z_finish = world.maxz @@ -72,28 +67,24 @@ var/datum/subsystem/lighting/SSlighting z_start = z_level z_finish = z_level - for(var/z=z_start, z<=z_finish, ++z) - for(var/x=1, x<=world.maxx, ++x) - for(var/y=1, y<=world.maxy, ++y) - var/turf/T = locate(x,y,z) - if(T) - T.shift_to_subarea() + var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish)) + + for(var/turf/T in turfs_to_init) + T.init_lighting() if(z_level) //we need to loop through to clear only shifted turfs from the list. or we will cause errors - i=1 - for(var/thing in changed_turfs) - if(thing && thing:z < z_start && z_finish < thing:z) + var/i=1 + for(var/turf/thing in changed_turfs) + if(thing && thing.z < z_start && z_finish < thing.z) ++i continue changed_turfs.Cut(i, i+1) else changed_turfs.Cut() - if(config.starlight) - set background = 1 - for(var/turf/space/S in world) - S.update_starlight() +// for(var/area/A in sortedAreas) +// A.luminosity = !A.lighting_use_dynamic ..() @@ -103,21 +94,20 @@ var/datum/subsystem/lighting/SSlighting /datum/subsystem/lighting/Recover() if(!istype(SSlighting.changed_turfs)) SSlighting.changed_turfs = list() - if(!istype(SSlighting.lights)) - SSlighting.lights = list() + if(!istype(SSlighting.changed_lights)) + SSlighting.changed_lights = list() - if(istype(SSlighting.lighting_images)) - lighting_images = SSlighting.lighting_images +// for(var/area/A in sortedAreas) +// A.luminosity = 1 - for(var/datum/light_source/L in SSlighting.lights) + for(var/datum/light_source/L in SSlighting.changed_lights) spawn(-1) //so we don't crash the loop (inefficient) L.check() - lights += L //If we didn't runtime then this will get transferred over for(var/turf/T in changed_turfs) if(T.lighting_changed) spawn(-1) - T.shift_to_subarea() + T.redraw_lighting() var/msg = "## DEBUG: [time2text(world.timeofday)] [name] subsystem restarted. Reports:\n" for(var/varname in SSlighting.vars) @@ -132,5 +122,5 @@ var/datum/subsystem/lighting/SSlighting msg += "\t [varname] = [varval1] -> [varval2]\n" world.log << msg -#undef LIGHTING_ICON -#undef LIGHTING_LAYER \ No newline at end of file +// for(var/area/A in sortedAreas) +// A.luminosity = !A.lighting_use_dynamic \ No newline at end of file diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 743435ec989..92fbccae6b6 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -110,7 +110,7 @@ var/datum/subsystem/npcpool/SSbp if(needsHelp_non.len) for(var/obj/machinery/bot/B in needsHelp_non) if(canBeUsed_non.len) - var/obj/machinery/bot/candidate = pick(canBeUsed_non.len) + var/obj/machinery/bot/candidate = pick(canBeUsed_non) candidate.call_bot(B,get_turf(B),FALSE) canBeUsed_non -= B needsHelp_non -= candidate diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 040232d7baa..c33ecb81ac9 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -17,6 +17,7 @@ var/datum/subsystem/ticker/ticker var/event = 0 var/login_music //music played in pregame lobby + var/round_end_sound //music/jingle played when the world reboots var/list/datum/mind/minds = list() //The characters in the game. Used for objective tracking. @@ -50,6 +51,8 @@ var/datum/subsystem/ticker/ticker if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS]) login_music = 'sound/ambience/clown.ogg' + round_end_sound = pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','sound/misc/leavingtg.ogg') + /datum/subsystem/ticker/Initialize() if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 0285f2be06c..a43a3996271 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -70,6 +70,7 @@ return {" + [head_content] diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 49991b32bea..952c22982ef 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -38,6 +38,7 @@ DD.holder = src if(DD.disease_flags & CAN_CARRY && prob(5)) DD.carrier = 1 + DD.strain_data = D.strain_data.Copy() DD.affected_mob.med_hud_set_status() @@ -127,3 +128,9 @@ if(!CanContractDisease(D)) return 0 AddDisease(D) + + +/mob/living/carbon/human/CanContractDisease(var/datum/disease/D) + if(dna && VIRUSIMMUNE in dna.species.specflags) + return 0 + return ..() \ No newline at end of file diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index f7772c5ac2b..05ea21602c3 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -179,7 +179,9 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease /datum/disease/proc/Copy() - return new type() + var/datum/disease/D = new type() + D.strain_data = strain_data.Copy() + return D /datum/disease/proc/GetDiseaseID() diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 28b08852240..541fef7bef7 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -13,7 +13,7 @@ var/list/archive_diseases = list() var/list/advance_cures = list( "nutriment", "sugar", "orangejuice", "spaceacillin", "salglu_solution", "ethanol", - "leporazine", "synaptizine", "lipozine", + "leporazine", "synaptizine", "lipolicide", "silver", "gold" ) diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 1edf47c6366..c615d644b51 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -31,10 +31,10 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(3, 4) - M << "[pick("You hear a ringing in your ear.", "Your ears pop.")]" + M << "[pick("You hear a ringing in your ear.", "Your ears pop.")]" if(5) if(!(M.ear_deaf)) - M << "Your ears pop and begin ringing loudly!" + M << "Your ears pop and begin ringing loudly!" M.setEarDamage(-1,INFINITY) //Shall be enough spawn(200) if(M) diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 3de7edf76cc..315a01aa5d3 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -16,7 +16,7 @@ switch(stage) if(2) //also changes say, see say.dm if(prob(5)) - affected_mob << "Your feel anxious." + affected_mob << "You feel anxious." if(3) if(prob(10)) affected_mob << "Your stomach flutters." diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index c24e13668e0..eb38e8689af 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -8,7 +8,7 @@ disease_flags = CAN_CARRY|CAN_RESIST agent = "S4E1 retrovirus" viable_mobtypes = list(/mob/living/carbon/human) - var/list/original_dna = list() + var/datum/dna/original_dna = null var/transformed = 0 desc = "This disease transplants the genetic code of the intial vector into new hosts." severity = MEDIUM @@ -16,6 +16,17 @@ /datum/disease/dnaspread/stage_act() ..() + if(!affected_mob.dna) + cure() + + if(!strain_data["dna"]) + //Absorbs the target DNA. + strain_data["dna"] = new affected_mob.dna.type + affected_mob.dna.copy_dna(strain_data["dna"]) + src.carrier = 1 + src.stage = 4 + return + switch(stage) if(2 || 3) //Pretend to be a cold and give time to spread. if(prob(8)) @@ -32,21 +43,18 @@ affected_mob.adjustToxLoss(2) affected_mob.updatehealth() if(4) - if(!src.transformed) - if ((!strain_data["name"]) || (!strain_data["UI"]) || (!strain_data["SE"])) - del(affected_mob.virus) - return - + if(!src.transformed && !src.carrier) //Save original dna for when the disease is cured. - src.original_dna["name"] = affected_mob.real_name - src.original_dna["UI"] = affected_mob.dna.uni_identity - src.original_dna["SE"] = affected_mob.dna.struc_enzymes + original_dna = new affected_mob.dna.type + affected_mob.dna.copy_dna(original_dna) affected_mob << "You don't feel like yourself.." - affected_mob.dna.uni_identity = strain_data["UI"] + var/datum/dna/transform_dna = strain_data["dna"] + + transform_dna.transfer_identity(affected_mob) + affected_mob.real_name = affected_mob.dna.real_name + updateappearance(affected_mob) - affected_mob.dna.struc_enzymes = strain_data["SE"] - affected_mob.real_name = strain_data["name"] domutcheck(affected_mob) src.transformed = 1 @@ -55,12 +63,12 @@ return /datum/disease/dnaspread/Del() - if ((original_dna["name"]) && (original_dna["UI"]) && (original_dna["SE"])) - if(affected_mob) - affected_mob.dna.uni_identity = original_dna["UI"] - updateappearance(affected_mob) - affected_mob.dna.struc_enzymes = original_dna["SE"] - affected_mob.real_name = original_dna["name"] + if (original_dna && transformed && affected_mob) + original_dna.transfer_identity(affected_mob) + affected_mob.real_name = affected_mob.dna.real_name - affected_mob << "You feel more like yourself." + updateappearance(affected_mob) + domutcheck(affected_mob) + + affected_mob << "You feel more like yourself." ..() \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index de27718296c..4eac92f16b9 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -9,6 +9,7 @@ severity = HARMFUL stage_prob = 10 visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + disease_flags = CURABLE var/list/stage1 = list("You feel unremarkable.") var/list/stage2 = list("You feel boring.") var/list/stage3 = list("You feel utterly plain.") @@ -202,7 +203,7 @@ var/mob/living/carbon/human/human = affected_mob if(human.dna && human.dna.species.id != "slime") human.dna.species = new /datum/species/slime() - human.update_icons() + human.regenerate_icons() /datum/disease/transformation/corgi name = "The Barkening" diff --git a/code/datums/helper_datums/icon_snapshot.dm b/code/datums/helper_datums/icon_snapshot.dm new file mode 100644 index 00000000000..22b402be446 --- /dev/null +++ b/code/datums/helper_datums/icon_snapshot.dm @@ -0,0 +1,15 @@ +/datum/icon_snapshot + var/name + var/icon + var/icon_state + var/list/overlays + +/datum/icon_snapshot/proc/makeImg() + if(!icon || !icon_state) + return + var/obj/temp = new + temp.icon = icon + temp.icon_state = icon_state + temp.overlays = overlays.Copy() + var/icon/tempicon = getFlatIcon(temp) // TODO Actually write something less heavy-handed for this + return tempicon diff --git a/code/datums/hud.dm b/code/datums/hud.dm index f3315d1cfd6..e1fa433e26f 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -12,6 +12,7 @@ var/datum/atom_hud/huds = list( \ ANTAG_HUD_GANG_A = new/datum/atom_hud/antag(), \ ANTAG_HUD_GANG_B = new/datum/atom_hud/antag(), \ ANTAG_HUD_WIZ = new/datum/atom_hud/antag(), \ + ANTAG_HUD_SHADOW = new/datum/atom_hud/antag(), \ ) /datum/atom_hud diff --git a/code/datums/martial.dm b/code/datums/martial.dm new file mode 100644 index 00000000000..81e611df4f4 --- /dev/null +++ b/code/datums/martial.dm @@ -0,0 +1,324 @@ +/datum/martial_art + var/name = "Martial Art" + var/streak = "" + var/max_streak_length = 6 + var/current_target = null + var/temporary = 0 + var/datum/martial_art/base = null // The permanent style + +/datum/martial_art/proc/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + return 0 + +/datum/martial_art/proc/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + return 0 + +/datum/martial_art/proc/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + return 0 + +/datum/martial_art/proc/add_to_streak(var/element,var/mob/living/carbon/human/D) + if(D != current_target) + current_target = D + streak = "" + streak = streak+element + if(length(streak) > max_streak_length) + streak = copytext(streak,2) + return + +/datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D) + add_logs(A, D, "punched") + A.do_attack_animation(D) + var/damage = rand(0,9) + + var/atk_verb = "punch" + if(D.lying) + atk_verb = "kick" + else if(A.dna) + atk_verb = A.dna.species.attack_verb + + if(A.dna) + damage += A.dna.species.punchmod + + if(!damage) + if(A.dna) + playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) + else + playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + D.visible_message("[A] has attempted to [atk_verb] [D]!") + return 0 + + var/obj/item/organ/limb/affecting = D.get_organ(ran_zone(A.zone_sel.selecting)) + var/armor_block = D.run_armor_check(affecting, "melee") + + if(A.dna) + playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) + else + playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) + + D.visible_message("[A] has [atk_verb]ed [D]!", \ + "[A] has [atk_verb]ed [D]!") + + D.apply_damage(damage, BRUTE, affecting, armor_block) + if((D.stat != DEAD) && damage >= 9) + D.visible_message("[A] has weakened [D]!!", \ + "[A] has weakened [D]!") + D.apply_effect(4, WEAKEN, armor_block) + D.forcesay(hit_appends) + else if(D.lying) + D.forcesay(hit_appends) + return 1 + +/datum/martial_art/proc/teach(var/mob/living/carbon/human/H,var/make_temporary=0) + if(make_temporary) + temporary = 1 + if(H.martial_art && H.martial_art.temporary) + if(temporary) + base = H.martial_art.base + else + H.martial_art.base = src //temporary styles have priority + return + H.martial_art = src + +/datum/martial_art/proc/remove(var/mob/living/carbon/human/H) + if(H.martial_art != src) + return + H.martial_art = base + +/datum/martial_art/boxing + name = "Boxing" + +/datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + A << " Can't disarm while boxing!" + return 1 + +/datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + A << " Can't grab while boxing!" + return 1 + +/datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_logs(A, D, "punched") + A.do_attack_animation(D) + + var/atk_verb = pick("left hook","right hook","straight punch") + + var/damage = rand(5,8) + if(A.dna) + damage += A.dna.species.punchmod + if(!damage) + if(A.dna) + playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) + else + playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + D.visible_message("[A] has attempted to hit [D] with a [atk_verb]!") + return 0 + + + var/obj/item/organ/limb/affecting = D.get_organ(ran_zone(A.zone_sel.selecting)) + var/armor_block = D.run_armor_check(affecting, "melee") + + playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) + + + D.visible_message("[A] has hit [D] with a [atk_verb]!", \ + "[A] has hit [D] with a [atk_verb]!") + + D.apply_damage(damage, STAMINA, affecting, armor_block) + if(D.getStaminaLoss() > 50) + var/knockout_prob = D.getStaminaLoss() + rand(-15,15) + if((D.stat != DEAD) && prob(knockout_prob)) + D.visible_message("[A] has knocked [D] out with a haymaker!", \ + "[A] has knocked [D] out with a haymaker!") + D.apply_effect(10,WEAKEN,armor_block) + D.SetSleeping(5) + D.forcesay(hit_appends) + else if(D.lying) + D.forcesay(hit_appends) + return 1 + +/datum/martial_art/wrestling + name = "Wrestling" + +/datum/martial_art/wrestling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + D.grabbedby(A,1) + var/obj/item/weapon/grab/G = A.get_active_hand() + if(G && prob(50)) + G.state = GRAB_AGGRESSIVE + D.visible_message("[A] has [D] in a clinch!", \ + "[A] has [D] in a clinch!") + else + D.visible_message("[A] fails to get [D] in a clinch!", \ + "[A] fails to get [D] in a clinch!") + return 1 + + +/datum/martial_art/wrestling/proc/Suplex(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_logs(A, D, "suplexed") + D.visible_message("[A] suplexes [D]!", \ + "[A] suplexes [D]!") + D.forceMove(A.loc) + var/armor_block = D.run_armor_check(null, "melee") + D.apply_damage(30, BRUTE, null, armor_block) + D.apply_effect(6, WEAKEN, armor_block) + A.SpinAnimation(10,1) + + D.SpinAnimation(10,1) + spawn(3) + armor_block = A.run_armor_check(null, "melee") + A.apply_effect(4, WEAKEN, armor_block) + return + +/datum/martial_art/wrestling/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(istype(A.get_inactive_hand(),/obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = A.get_inactive_hand() + if(G.affecting == D) + Suplex(A,D) + return 1 + harm_act(A,D) + return 1 + +/datum/martial_art/wrestling/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + D.grabbedby(A,1) + D.visible_message("[A] holds [D] down!", \ + "[A] holds [D] down!") + var/obj/item/organ/limb/affecting = D.get_organ(ran_zone(A.zone_sel.selecting)) + var/armor_block = D.run_armor_check(affecting, "melee") + D.apply_damage(10, STAMINA, affecting, armor_block) + return 1 + +#define TORNADO_COMBO "HHD" +#define THROWBACK_COMBO "DHD" +#define PLASMA_COMBO "HDDDH" + +/datum/martial_art/plasma_fist + name = "Plasma Fist" + +/datum/martial_art/plasma_fist/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(findtext(streak,TORNADO_COMBO)) + streak = "" + Tornado(A,D) + return 1 + if(findtext(streak,THROWBACK_COMBO)) + streak = "" + Throwback(A,D) + return 1 + if(findtext(streak,PLASMA_COMBO)) + streak = "" + Plasma(A,D) + return 1 + return 0 + +/datum/martial_art/plasma_fist/proc/Tornado(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + A.say("TORNADO SWEEP!") + spawn(0) + for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH)) + A.dir = i + playsound(A.loc, 'sound/weapons/punch1.ogg', 15, 1, -1) + sleep(1) + var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null) + var/list/turfs = list() + for(var/turf/T in range(1,A)) + turfs.Add(T) + R.cast(turfs) + return + +/datum/martial_art/plasma_fist/proc/Throwback(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + D.visible_message("[A] has hit [D] with Plasma Punch!", \ + "[A] has hit [D] with Plasma Punch!") + playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A))) + D.throw_at(throw_target, 200, 4) + A.say("HYAH!") + return + +/datum/martial_art/plasma_fist/proc/Plasma(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + A.do_attack_animation(D) + playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) + A.say("PLASMA FIST!") + D.visible_message("[A] has hit [D] with THE PLASMA FIST TECHNIQUE!", \ + "[A] has hit [D] with THE PLASMA FIST TECHNIQUE!") + var/obj/item/organ/brain/B = D.getorgan(/obj/item/organ/brain) + if(B) + B.loc = get_turf(D) + B.transfer_identity(D) + D.internal_organs -= B + D.gib() + return + +/datum/martial_art/plasma_fist/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_to_streak("H") + if(check_streak(A,D)) + return 1 + basic_hit(A,D) + return 1 + +/datum/martial_art/plasma_fist/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_to_streak("D") + if(check_streak(A,D)) + return 1 + basic_hit(A,D) + return 1 + +/datum/martial_art/plasma_fist/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_to_streak("G") + if(check_streak(A,D)) + return 1 + basic_hit(A,D) + return 1 + + +//ITEMS +/obj/item/clothing/gloves/boxing + var/datum/martial_art/boxing/style = new + +/obj/item/clothing/gloves/boxing/equipped(mob/user, slot) + if(!ishuman(user)) + return + if(slot == slot_gloves) + var/mob/living/carbon/human/H = user + style.teach(H,1) + return + +/obj/item/clothing/gloves/boxing/dropped(mob/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(H.get_item_by_slot(slot_gloves) == src) + style.remove(H) + return + +/obj/item/weapon/storage/belt/champion/wrestling + name = "Wrestling Belt" + var/datum/martial_art/wrestling/style = new + +/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot) + if(!ishuman(user)) + return + if(slot == slot_belt) + var/mob/living/carbon/human/H = user + style.teach(H,1) + return + +/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(H.get_item_by_slot(slot_belt) == src) + style.remove(H) + return + +/obj/item/weapon/plasma_fist_scroll + name = "Plasma Fist Scroll" + desc = "Teaches the traditional wizard martial art." + icon = 'icons/obj/wizard.dmi' + icon_state ="scroll2" + var/used = 0 + +/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user as mob) + if(!ishuman(user)) + return + if(!used) + var/mob/living/carbon/human/H = user + var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) + F.teach(H) + H << "You learn the PLASMA FIST style" + used = 1 + desc += "It looks like it's magic was used up." diff --git a/code/datums/mind.dm b/code/datums/mind.dm index dbdcb3afadb..97d113d445f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -80,6 +80,7 @@ current = new_character //associate ourself with our new body new_character.mind = src //and associate our new body with ourself transfer_antag_huds(new_character) //inherit the antag HUDs from this mind (TODO: move this to a possible antag datum) + transfer_actions(new_character) if(active) new_character.key = key //now transfer the key to link the client to our new body @@ -288,39 +289,26 @@ text += "
Equipment: give" var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - if (flash) - if(!flash.broken) - text += "|take." - else - text += "|take|repair flash." + var/obj/item/device/gangtool/gangtool = locate() in L + if (gangtool) + text += "|take." else text += "." - if (objectives.len==0) - text += "
Objectives are empty! Set to kill all rival gang leaders." - - else if (src in ticker.mode.B_bosses) text += "loyal|none|(A) gangster boss|(B) gangster BOSS" text += "
Equipment: give" var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - if (flash) - if(!flash.broken) - text += "
take." - else - text += "
take|repair flash." + var/obj/item/device/gangtool/gangtool = locate() in L + if (gangtool) + text += "|take." else text += "." - if (objectives.len==0) - text += "
Objectives are empty! Set to kill all rival gang leaders." - - else if (src in ticker.mode.A_gangsters) + else if (src in ticker.mode.A_gang) text += "loyal|none|(A) GANGSTER boss|(B) gangster boss" - else if (src in ticker.mode.B_gangsters) + else if (src in ticker.mode.B_gang) text += "loyal|none|(A) gangster boss|(B) GANGSTER boss" else if(isloyal(current)) text += "LOYAL|none|(A) gangster boss|(B) gangster boss" @@ -448,6 +436,25 @@ sections["traitor"] = text + /** SHADOWLING **/ + text = "shadowling" + if(ticker.mode.config_tag == "shadowling") + text = uppertext(text) + text = "[text]: " + if(src in ticker.mode.shadows) + text += "SHADOWLING|thrall|human" + else if(src in ticker.mode.thralls) + text += "shadowling|THRALL|human" + else + text += "shadowling|thrall|HUMAN" + + if(current && current.client && current.client.prefs.be_special & BE_SHADOWLING) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["shadowling"] = text + /** MONKEY ***/ if (istype(current, /mob/living/carbon)) text = "monkey" @@ -804,7 +811,7 @@ log_admin("[key_name(usr)] has de-gang'ed [current].") if("agang") - if(src in ticker.mode.A_gangsters) + if(src in ticker.mode.A_gang) return ticker.mode.remove_gangster(src, 0, 2) ticker.mode.add_gangster(src,"A",0) @@ -821,9 +828,11 @@ current << "You are a [gang_name("A")] Gang Boss!" message_admins("[key_name_admin(usr)] has added [current] to the [gang_name("A")] Gang (A) leadership.") log_admin("[key_name(usr)] has added [current] to the [gang_name("A")] Gang (A) leadership.") + ticker.mode.forge_gang_objectives(src) + ticker.mode.greet_gang(src,0) if("bgang") - if(src in ticker.mode.B_gangsters) + if(src in ticker.mode.B_gang) return ticker.mode.remove_gangster(src, 0, 2) ticker.mode.add_gangster(src,"B",0) @@ -840,39 +849,26 @@ current << "You are a [gang_name("B")] Gang Boss!" message_admins("[key_name_admin(usr)] has added [current] to the [gang_name("B")] Gang (B) leadership.") log_admin("[key_name(usr)] has added [current] to the [gang_name("B")] Gang (B) leadership.") - - if("autoobjective") ticker.mode.forge_gang_objectives(src) ticker.mode.greet_gang(src,0) - usr << "Unable to equip flash!" if(1) - usr << "Unable to equip recaller!" - if(0) - usr << "Unable to equip both flash and recaller!" + usr << "Unable to equip territory spraycan!" + if(2) + usr << "Unable to equip recruitment pen and spraycan!" + if(3) + usr << "Unable to equip gangtool, pen, and spraycan!" if("takeequip") var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - if (!flash) - usr << "Deleting flash failed!" - qdel(flash) - var/obj/item/device/recaller/recaller = locate() in L - if (!recaller) - usr << "Deleting recaller failed!" - qdel(recaller) - - if("repairflash") - var/list/L = current.get_contents() - var/obj/item/device/flash/flash = locate() in L - if (!flash) - usr << "Repairing flash failed!" - else - flash.broken = 0 + for(var/obj/item/weapon/pen/gang/pen in L) + qdel(pen) + for(var/obj/item/device/gangtool/gangtool in L) + qdel(gangtool) + for(var/obj/item/toy/crayon/spraycan/gang/SC in L) + qdel(SC) else if (href_list["cult"]) switch(href_list["cult"]) @@ -1035,6 +1031,49 @@ ticker.mode.forge_traitor_objectives(src) usr << "The objectives for traitor [key] have been generated. You can edit them and anounce manually." + else if(href_list["shadowling"]) + switch(href_list["shadowling"]) + if("clear") + ticker.mode.update_shadow_icons_removed(src) + src.spell_list = null + if(src in ticker.mode.shadows) + ticker.mode.shadows -= src + special_role = null + current << "Your powers have been quenched! You are no longer a shadowling!" + src.spell_list = null + message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") + log_admin("[key_name(usr)] has de-shadowling'ed [current].") + current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch + current.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance + else if(src in ticker.mode.thralls) + ticker.mode.thralls -= src + special_role = null + current << "You have been brainwashed! You are no longer a thrall!" + message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") + log_admin("[key_name(usr)] has de-thrall'ed [current].") + if("shadowling") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.shadows += src + special_role = "shadowling" + current << "You notice a brightening around you. No, it isn't that. The shadows grow, darken, swirl. The darkness has a new welcome for you, and you realize with a \ + start that you can't be human. No, you are a shadowling, a harbringer of the shadows! Your alien abilities have been unlocked from within, and you may both commune with your allies and use \ + a chrysalis to reveal your true form. You are to ascend at all costs." + ticker.mode.finalize_shadowling(src) + ticker.mode.update_shadow_icons_added(src) + if("thrall") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.add_thrall(src) + special_role = "thrall" + current << "All at once it becomes clear to you. Where others see darkness, you see an ally. You realize that the shadows are not dead and dark as one would think, but \ + living, and breathing, and eating. Their children, the Shadowlings, are to be obeyed and protected at all costs." + current << "You may use the Hivemind Commune ability to communicate with your fellow enlightened ones." + message_admins("[key_name_admin(usr)] has thrall'ed [current].") + log_admin("[key_name(usr)] has thrall'ed [current].") + else if (href_list["monkey"]) var/mob/living/L = current if (L.notransform) @@ -1310,6 +1349,37 @@ ticker.mode.greet_gang(src) ticker.mode.equip_gang(current) + + +/datum/mind/proc/AddSpell(var/obj/effect/proc_holder/spell/spell) + spell_list += spell + if(!spell.action) + spell.action = new/datum/action/spell_action + spell.action.target = spell + spell.action.name = spell.name + spell.action.button_icon = spell.action_icon + spell.action.button_icon_state = spell.action_icon_state + spell.action.background_icon_state = spell.action_background_icon_state + spell.action.Grant(current) + return +/datum/mind/proc/transfer_actions(var/mob/living/new_character) + if(current && current.actions) + for(var/datum/action/A in current.actions) + A.Grant(new_character) + transfer_mindbound_actions(new_character) + +/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) + for(var/obj/effect/proc_holder/spell/spell in spell_list) + if(!spell.action) // Unlikely but whatever + spell.action = new/datum/action/spell_action + spell.action.target = spell + spell.action.name = spell.name + spell.action.button_icon = spell.action_icon + spell.action.button_icon_state = spell.action_icon_state + spell.action.background_icon_state = spell.action_background_icon_state + spell.action.Grant(new_character) + return + /mob/proc/sync_mind() mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) mind.active = 1 //indicates that the mind is currently synced with a client diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 587d5f1c646..b6978142e01 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -53,6 +53,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/critfailchance = 0 var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2 + var/datum/action/spell_action/action = null + var/action_icon = 'icons/mob/actions.dmi' + var/action_icon_state = "spell_default" + var/action_background_icon_state = "bg_spell" + /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) @@ -347,4 +352,45 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin qdel(dummy) return 0 qdel(dummy) + return 1 + +/obj/effect/proc_holder/spell/proc/can_cast(mob/user = usr) + if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) + return 0 + + if(user.z == ZLEVEL_CENTCOM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel + return 0 + if(user.z == ZLEVEL_CENTCOM && ticker.mode.name == "ragin' mages") + return 0 + + switch(charge_type) + if("recharge") + if(charge_counter < charge_max) + return 0 + if("charges") + if(!charge_counter) + return 0 + + if(user.stat && !stat_allowed) + return 0 + + if(ishuman(user)) + + var/mob/living/carbon/human/H = user + + if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled()) + return 0 + + if(clothes_req) //clothes check + if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard)) + return 0 + if(!istype(H.shoes, /obj/item/clothing/shoes/sandal)) + return 0 + if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard)) + return 0 + else + if(clothes_req || human_req) + return 0 + if(nonabstract_req && (isbrain(user) || ispAI(user))) + return 0 return 1 \ No newline at end of file diff --git a/code/datums/spells/barnyard.dm b/code/datums/spells/barnyard.dm index 7b62eb90a81..5b81f684b44 100644 --- a/code/datums/spells/barnyard.dm +++ b/code/datums/spells/barnyard.dm @@ -14,6 +14,8 @@ selection_type = "range" var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) + action_icon_state = "barn" + /obj/effect/proc_holder/spell/targeted/barnyardcurse/cast(list/targets, mob/user = usr) if(!targets.len) user << "No target found in range." diff --git a/code/datums/spells/emplosion.dm b/code/datums/spells/emplosion.dm index 33ad284421c..e27814a6fde 100644 --- a/code/datums/spells/emplosion.dm +++ b/code/datums/spells/emplosion.dm @@ -5,6 +5,8 @@ var/emp_heavy = 2 var/emp_light = 3 + action_icon_state = "emp" + /obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets) for(var/mob/living/target in targets) diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index dc098de63f3..da2b438ebbb 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -13,6 +13,7 @@ centcom_cancast = 0 //Prevent people from getting to centcom nonabstract_req = 1 var/jaunt_duration = 50 //in deciseconds + action_icon_state = "jaunt" /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded for(var/mob/living/target in targets) diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index b96c96455a8..85bcaa0c6da 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -10,6 +10,8 @@ range = 3 cooldown_min = 20 //20 deciseconds reduction per rank + action_icon_state = "knock" + /obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets) for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index b3e813c7e0e..38249722221 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -14,6 +14,8 @@ var/ready = 0 var/image/halo = null + action_icon_state = "lightning" + /obj/effect/proc_holder/spell/targeted/lightning/Click() if(!ready) if(cast_check()) diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index 12c4a8e837b..b0a7e3a336f 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -12,6 +12,8 @@ range = 0 cast_sound = null + action_icon_state = "mime" + action_background_icon_state = "bg_mime" /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() if(usr && usr.mind) @@ -35,6 +37,9 @@ range = -1 include_user = 1 + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + /obj/effect/proc_holder/spell/targeted/mime/speak/Click() if(!usr) return @@ -42,9 +47,9 @@ return var/mob/living/carbon/human/H = usr if(H.mind.miming) - still_recharging_msg = "You can't break your vow of silence that fast!" + still_recharging_msg = "You can't break your vow of silence that fast!" else - still_recharging_msg = "You'll have to wait before you can give your vow of silence again." + still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" ..() /obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets) diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index 0c8032c9b7e..9a6605ff3ca 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -13,6 +13,8 @@ var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell + action_icon_state = "mindswap" + /* Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do. Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering. @@ -20,29 +22,29 @@ Also, you never added distance checking after target is selected. I've went ahea */ /obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr, distanceoverride) if(!targets.len) - user << "No mind found." + user << "No mind found!" return if(targets.len > 1) - user << "Too many minds! You're not a hive damnit!"//Whaa...aat? + user << "Too many minds! You're not a hive damnit!"//Whaa...aat? return var/mob/living/target = targets[1] if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. - user << "They are too far away!" + user << "They are too far away!" return if(target.stat == DEAD) - user << "You don't particularly want to be dead." + user << "You don't particularly want to be dead!" return if(!target.key || !target.mind) - user << "They appear to be catatonic. Not even magic can affect their vacant mind." + user << "They appear to be catatonic! Not even magic can affect their vacant mind." return if(target.mind.special_role in protected_roles) - user << "Their mind is resisting your spell." + user << "Their mind is resisting your spell!" return var/mob/living/victim = target//The target of the spell whos body will be transferred to. diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 70becd17a9f..bdd35c2dd01 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -13,6 +13,8 @@ var/obj/marked_item + action_icon_state = "summons" + /obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets) for(var/mob/living/user in targets) var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand()) diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index a0b201d9dd7..14ba4bad123 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -24,6 +24,8 @@ proj_trail_lifespan = 5 proj_trail_icon_state = "magicmd" + action_icon_state = "magicm" + /obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile amt_weakened = 3 amt_dam_fire = 10 @@ -46,6 +48,8 @@ duration = 300 cooldown_min = 300 //25 deciseconds reduction per rank + action_icon_state = "mutate" + /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate name = "Disintegrate" desc = "This spell instantly kills somebody adjacent to you with the vilest of magick." @@ -63,6 +67,8 @@ sparks_spread = 1 sparks_amt = 4 + action_icon_state = "gib" + /obj/effect/proc_holder/spell/targeted/smoke name = "Smoke" desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." @@ -79,6 +85,8 @@ smoke_spread = 2 smoke_amt = 10 + action_icon_state = "smoke" + /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech name = "Disable Tech" desc = "This spell disables all weapons, cameras and most other technology in range." @@ -115,6 +123,8 @@ centcom_cancast = 0 //prevent people from getting to centcom + action_icon_state = "blink" + /obj/effect/proc_holder/spell/targeted/area_teleport/teleport name = "Teleport" desc = "This spell teleports you to a type of area of your selection." @@ -146,6 +156,8 @@ summon_type = list("/obj/effect/forcefield") summon_lifespan = 300 + action_icon_state = "shield" + /obj/effect/proc_holder/spell/aoe_turf/conjure/carp name = "Summon Carp" @@ -174,6 +186,8 @@ summon_type = list(/obj/structure/constructshell) + action_icon_state = "artificer" + /obj/effect/proc_holder/spell/aoe_turf/conjure/creature name = "Summon Creature Swarm" @@ -203,6 +217,8 @@ starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind","/obj/effect/proc_holder/spell/targeted/genetic/blind") + action_icon_state = "blind" + /obj/effect/proc_holder/spell/targeted/inflict_handler/blind amt_eye_blind = 10 amt_eye_blurry = 20 @@ -226,6 +242,8 @@ summon_type = "/obj/structure/closet/statue" + action_icon_state = "statue" + /obj/effect/proc_holder/spell/dumbfire/fireball name = "Fireball" desc = "This spell fires a fireball at a target and does not require wizard garb." @@ -245,6 +263,8 @@ proj_lifespan = 200 proj_step_delay = 1 + action_icon_state = "fireball" + /obj/effect/proc_holder/spell/turf/fireball/cast(var/turf/T) explosion(T, -1, 0, 2, 3, 0, flame_range = 2) @@ -271,6 +291,8 @@ selection_type = "view" var/maxthrow = 5 + action_icon_state = "repulse" + /obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets) var/mob/user = usr var/list/thrownatoms = list() @@ -279,10 +301,10 @@ for(var/turf/T in targets) //Done this way so things don't get thrown all around hilariously. for(var/atom/movable/AM in T) thrownatoms += AM - + for(var/atom/movable/AM in thrownatoms) if(AM == user || AM.anchored) continue - + var/obj/effect/overlay/targeteffect = new /obj/effect/overlay{icon='icons/effects/effects.dmi'; icon_state="shieldsparkles"; mouse_opacity=0; density = 0}() AM.overlays += targeteffect throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user))) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 119f1682296..69dfe876213 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -736,12 +736,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/organic/food name = "Food Crate" contains = list(/obj/item/weapon/reagent_containers/food/condiment/flour, + /obj/item/weapon/reagent_containers/food/condiment/rice, /obj/item/weapon/reagent_containers/food/condiment/milk, /obj/item/weapon/reagent_containers/food/condiment/soymilk, /obj/item/weapon/storage/fancy/egg_box, /obj/item/weapon/reagent_containers/food/condiment/enzyme, /obj/item/weapon/reagent_containers/food/condiment/sugar, - /obj/item/weapon/reagent_containers/food/snacks/meat/monkey, + /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey, /obj/item/weapon/reagent_containers/food/snacks/grown/banana, /obj/item/weapon/reagent_containers/food/snacks/grown/banana, /obj/item/weapon/reagent_containers/food/snacks/grown/banana) @@ -1254,19 +1255,19 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/gun/projectile/shotgun/toy, /obj/item/weapon/gun/projectile/shotgun/toy, /obj/item/weapon/gun/projectile/shotgun/toy, - /obj/item/weapon/gun/projectile/shotgun/toy, /obj/item/weapon/gun/projectile/shotgun/toy, - /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, + /obj/item/weapon/gun/projectile/shotgun/toy, /obj/item/weapon/gun/projectile/shotgun/toy) cost = 10 containername = "foam force crate" /datum/supply_packs/misc/foamforce/bonus - name = "Foam Force Pistols Crate" + name = "Foam Force Pistols Crate" contains = list(/obj/item/weapon/gun/projectile/automatic/toy/pistol, /obj/item/weapon/gun/projectile/automatic/toy/pistol, /obj/item/ammo_box/magazine/toy/pistol, /obj/item/ammo_box/magazine/toy/pistol) cost = 40 - containername = "foam force pistols crate" + containername = "foam force pistols crate" contraband = 1 \ No newline at end of file diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 633d40e84cd..980cca93832 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -120,6 +120,10 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 40 +/datum/uplink_item/dangerous/smg/unrestricted + item = /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted + gamemodes = list(/datum/game_mode/gang) + /datum/uplink_item/dangerous/carbine name = "M-90gl Carbine" desc = "A fully-loaded three-round burst carbine that uses 30-round 5.56mm magazines with a togglable underslung 40mm grenade launcher." @@ -128,6 +132,10 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 50 +/datum/uplink_item/dangerous/carbine/unrestricted + item = /obj/item/weapon/gun/projectile/automatic/m90/unrestricted + gamemodes = list(/datum/game_mode/gang) + /datum/uplink_item/dangerous/machinegun name = "L6 Squad Automatic Weapon" desc = "A fully-loaded Aussec Armoury belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition." @@ -142,7 +150,7 @@ var/list/uplink_items = list() The bow generates bolts using an internal power source but must be manually charged between shots." item = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow cost = 12 - excludefrom = list(/datum/game_mode/nuclear) + excludefrom = list(/datum/game_mode/nuclear,/datum/game_mode/gang) surplus = 50 /datum/uplink_item/dangerous/flamethrower @@ -150,7 +158,7 @@ var/list/uplink_items = list() desc = "A flamethrower, fueled by a portion of highly flammable biotoxins stolen previously from Nanotrasen stations. Make a statement by roasting the filth in their own greed. Use with caution." item = /obj/item/weapon/flamethrower/full/tank cost = 11 - gamemodes = list(/datum/game_mode/nuclear) + gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) surplus = 40 /datum/uplink_item/dangerous/sword @@ -201,7 +209,7 @@ var/list/uplink_items = list() Use with extreme caution, to prevent exposure to yourself and your fellow operatives." item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror cost = 20 - gamemodes = list(/datum/game_mode/nuclear) + gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) surplus = 0 /datum/uplink_item/dangerous/gygax @@ -258,7 +266,7 @@ var/list/uplink_items = list() desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage." item = /obj/item/ammo_box/magazine/smgm45 cost = 2 - gamemodes = list(/datum/game_mode/nuclear) + gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) /datum/uplink_item/ammo/bullbuck name = "Drum Magazine - 12g Buckshot" @@ -286,7 +294,7 @@ var/list/uplink_items = list() desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage." item = /obj/item/ammo_box/magazine/m556 cost = 2 - gamemodes = list(/datum/game_mode/nuclear) + gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) /datum/uplink_item/ammo/a40mm name = "Ammo Box - 40mm grenades" @@ -330,6 +338,7 @@ var/list/uplink_items = list() item = /obj/item/weapon/gun/projectile/automatic/toy/pistol/riot cost = 10 surplus = 10 + excludefrom = list(/datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/sleepy_pen name = "Sleepy Pen" @@ -337,7 +346,7 @@ var/list/uplink_items = list() The pen holds one dose of the mixture, and cannot be refilled." item = /obj/item/weapon/pen/sleepy cost = 4 - excludefrom = list(/datum/game_mode/nuclear) + excludefrom = list(/datum/game_mode/nuclear,/datum/game_mode/gang) /datum/uplink_item/stealthy_weapons/soap name = "Syndicate Soap" @@ -367,6 +376,19 @@ var/list/uplink_items = list() cost = 3 surplus = 10 +/datum/uplink_item/stealthy_weapons/pizza_bomb + name = "Pizza Bomb" + desc = "A pizza box with a bomb taped inside of it. The timer needs to be set by opening the box; afterwards, opening the box again will trigger the detonation." + item = /obj/item/device/pizza_bomb + cost = 4 + surplus = 8 + +/datum/uplink_item/stealthy_weapons/dehy_carp + name = "Dehydrated Space Carp" + desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie." + item = /obj/item/toy/carpplushie/dehy_carp + cost = 3 + // STEALTHY TOOLS /datum/uplink_item/stealthy_tools @@ -409,6 +431,7 @@ var/list/uplink_items = list() desc = "Projects an image across a user, disguising them as an object scanned with it, as long as they don't move the projector from their hand. The disguised user cannot run and rojectiles pass over them." item = /obj/item/device/chameleon cost = 7 + excludefrom = list(/datum/game_mode/gang) /datum/uplink_item/stealthy_tools/camera_bug name = "Camera Bug" @@ -441,6 +464,7 @@ var/list/uplink_items = list() desc = "The emag is a small card that unlocks hidden functions in electronic devices, subverts intended functions and characteristically breaks security mechanisms." item = /obj/item/weapon/card/emag cost = 6 + excludefrom = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/toolbox name = "Full Syndicate Toolbox" @@ -454,7 +478,7 @@ var/list/uplink_items = list() and other medical supplies helpful for a medical field operative." item = /obj/item/weapon/storage/firstaid/tactical cost = 9 - gamemodes = list(/datum/game_mode/nuclear) + gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) /datum/uplink_item/badass/syndiecigs name = "Syndicate Smokes" @@ -467,6 +491,7 @@ var/list/uplink_items = list() desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings." item = /obj/item/weapon/storage/box/syndie_kit/space cost = 5 + excludefrom = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/hardsuit name = "Blood-red Hardsuit" @@ -476,6 +501,7 @@ var/list/uplink_items = list() Nanotrasen crewmembers are trained to report red space suit sightings, these suits in particular are known to drive employees into a panic." item = /obj/item/clothing/suit/space/hardsuit/syndi cost = 8 + excludefrom = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/thermal name = "Thermal Imaging Glasses" @@ -540,6 +566,7 @@ var/list/uplink_items = list() leading to an emergency evacuation. Because of its size, it cannot be carried. Ordering this sends you a small beacon that will teleport the larger beacon to your location on activation." item = /obj/item/device/sbeacondrop cost = 14 + excludefrom = list(/datum/game_mode/gang) /datum/uplink_item/device_tools/syndicate_bomb name = "Syndicate Bomb" @@ -577,7 +604,7 @@ var/list/uplink_items = list() desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles and defending against other attacks." item = /obj/item/weapon/shield/energy cost = 16 - gamemodes = list(/datum/game_mode/nuclear) + gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang) surplus = 20 @@ -623,7 +650,7 @@ var/list/uplink_items = list() desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 10 telecrystals, but you do not know which specialisation you will receive." item = /obj/item/weapon/storage/box/syndicate cost = 20 - excludefrom = list(/datum/game_mode/nuclear) + excludefrom = list(/datum/game_mode/nuclear,/datum/game_mode/gang) /datum/uplink_item/badass/syndiecards name = "Syndicate Playing Cards" diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 6309fa53df2..a25186734b5 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -137,11 +137,11 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 //raises them if they are down (only if power's on) if(!A.locked) A.locked = 1 - A.audible_message("You hear a click from the bottom of the door.", null, 1) + A.audible_message("You hear a click from the bottom of the door.", null, 1) else if(A.hasPower()) //only can raise bolts if power's on A.locked = 0 - A.audible_message("You hear a click from the bottom of the door.", null, 1) + A.audible_message("You hear a click from the bottom of the door.", null, 1) A.update_icon() if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 6081eaa8e28..ba6f252724a 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -113,14 +113,14 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", var/colour = href_list["cut"] CutWireColour(colour) else - L << "You need wirecutters!" + L << "You need wirecutters!" else if(href_list["pulse"]) if(istype(I, /obj/item/device/multitool)) var/colour = href_list["pulse"] PulseColour(colour) else - L << "You need a multitool!" + L << "You need a multitool!" else if(href_list["attach"]) var/colour = href_list["attach"] @@ -138,7 +138,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", L.drop_item() Attach(colour, A) else - L << "You need a attachable assembly!" + L << "You need a attachable assembly!" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index b5d6712d4bd..9f349e338b0 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -134,7 +134,7 @@ name = "syntiflesh" desc = "Meat that appears...strange..." gender = PLURAL - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "meat" flags = CONDUCT w_class = 1.0 diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index fb9b8f856d3..2ab48980639 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -28,6 +28,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station mouse_opacity = 0 invisibility = INVISIBILITY_LIGHTING var/lightswitch = 1 + var/valid_territory = 1 //If it's a valid territory for gangs to claim var/eject = null @@ -109,6 +110,7 @@ proc/process_ghost_teleport_locs() power_light = 0 power_equip = 0 power_environ = 0 + valid_territory = 0 ambientsounds = list('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg',) @@ -123,6 +125,7 @@ proc/process_ghost_teleport_locs() luminosity = 1 lighting_use_dynamic = 1 has_gravity = 1 + valid_territory = 0 /area/start @@ -194,8 +197,7 @@ proc/process_ghost_teleport_locs() /area/asteroid/artifactroom/New() ..() - lighting_use_dynamic = 1 - InitializeLighting() + SetDynamicLighting() /area/planet/clown name = "\improper Clown Planet" @@ -246,9 +248,12 @@ proc/process_ghost_teleport_locs() requires_power = 0 has_gravity = 1 - - - +//Abductors +/area/abductor_ship + name = "\improper Abductor Ship" + icon_state = "yellow" + requires_power = 0 + has_gravity = 1 //PRISON @@ -344,6 +349,7 @@ proc/process_ghost_teleport_locs() //Maintenance /area/maintenance ambientsounds = list('sound/ambience/ambimaint1.ogg', 'sound/ambience/ambimaint2.ogg', 'sound/ambience/ambimaint3.ogg', 'sound/ambience/ambimaint4.ogg', 'sound/ambience/ambimaint5.ogg') + valid_territory = 0 /area/maintenance/atmos_control name = "Atmospherics Maintenance" @@ -653,6 +659,7 @@ proc/process_ghost_teleport_locs() requires_power = 0 luminosity = 1 lighting_use_dynamic = 0 + valid_territory = 0 auxport name = "\improper Fore Port Solar Array" @@ -961,6 +968,7 @@ proc/process_ghost_teleport_locs() icon_state = "toxmisc" /area/toxins/test_area + valid_territory = 0 name = "\improper Toxins Test Area" icon_state = "toxtest" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 86520169a27..0eb02295941 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -43,7 +43,6 @@ ..() power_change() // all machines set to current power level, also updates lighting icon - InitializeLighting() blend_mode = BLEND_MULTIPLY // Putting this in the constructure so that it stops the icons being screwed up in the map editor. @@ -223,7 +222,7 @@ return /area/proc/updateicon() - if ((fire || eject || party) && (!requires_power||power_environ) && !lighting_space)//If it doesn't require power, can still activate this proc. + if ((fire || eject || party) && (!requires_power||power_environ))//If it doesn't require power, can still activate this proc. if(fire && !eject && !party) icon_state = "blue" /*else if(atmosalm && !fire && !eject && !party) @@ -238,6 +237,8 @@ // new lighting behaviour with obj lights icon_state = null +/area/space/updateicon() + icon_state = null /* #define EQUIP 1 @@ -251,8 +252,6 @@ return 1 if(master.always_unpowered) return 0 - if(src.lighting_space) - return 0 // Nope sorry switch(chan) if(EQUIP) return master.power_equip @@ -263,6 +262,9 @@ return 0 +/area/space/powered(chan) //Nope.avi + return 0 + // called when power status changes /area/proc/power_change() @@ -330,11 +332,11 @@ L.lastarea = newarea // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch - if(!L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE) + if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE) L.client.ambience_playing = 1 L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2) - if(!(L && L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return //General ambience check is below the ship ambience so one can play without the other + if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return //General ambience check is below the ship ambience so one can play without the other if(prob(35)) var/sound = pick(ambientsounds) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 66042f4f67b..2404daaba58 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -20,7 +20,7 @@ //var/chem_is_open_container = 0 // replaced by OPENCONTAINER flags and atom/proc/is_open_container() ///Chemistry. - + var/allow_spin = 1 /atom/proc/onCentcom() var/turf/T = get_turf(src) if(!T) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a0eaf523e16..86f153923a5 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -15,6 +15,7 @@ var/pass_flags = 0 glide_size = 8 + /atom/movable/Move(atom/newloc, direct = 0) if(!loc || !newloc) return 0 var/atom/oldloc = loc @@ -46,11 +47,13 @@ else if (step(src, WEST)) . = step(src, SOUTH) - if(!loc || (loc == oldloc && oldloc != newloc)) last_move = 0 return + if(.) + Moved(oldloc, direct) + last_move = direct spawn(5) // Causes space drifting. /tg/station has no concept of speed, we just use 5 @@ -58,6 +61,10 @@ if(loc == newloc) //Remove this check and people can accelerate. Not opening that can of worms just yet. newtonian_move(last_move) +//Called after a successful Move(). By this point, we've already moved +/atom/movable/proc/Moved(atom/OldLoc, Dir) + return 1 + /atom/movable/Del() if(isnull(gc_destroyed) && loc) testing("GC: -- [type] was deleted via del() rather than qdel() --") @@ -68,14 +75,13 @@ ..() /atom/movable/Destroy() + . = ..() if(reagents) qdel(reagents) for(var/atom/movable/AM in contents) qdel(AM) - tag = null loc = null invisibility = 101 - // Do not call ..() // Previously known as HasEntered() // This is automatically called when something enters your square @@ -96,12 +102,15 @@ /atom/movable/proc/forceMove(atom/destination) if(destination) - if(loc) - loc.Exited(src) + var/atom/oldloc = loc + if(oldloc) + oldloc.Exited(src, destination) loc = destination - loc.Entered(src) - for(var/atom/movable/AM in loc) + destination.Entered(src, oldloc) + for(var/atom/movable/AM in destination) + if(AM == src) continue AM.Crossed(src) + Moved(oldloc, 0) return 1 return 0 @@ -159,7 +168,8 @@ //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target src.throwing = 1 - SpinAnimation(5, 1) + if(target.allow_spin) // turns out 1000+ spinning objects being thrown at the singularity creates lag - Iamgoofball + SpinAnimation(5, 1) var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) var/dx = (target.x > src.x) ? EAST : WEST diff --git a/code/game/communications.dm b/code/game/communications.dm index 16cd14b7fb7..fe92b777815 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -97,7 +97,7 @@ Radio: 1355 - Medical 1357 - Engineering 1359 - Security -1441 - death squad +1337 - death squad 1443 - Confession Intercom 1349 - Miners 1347 - Cargo techs @@ -130,7 +130,7 @@ var/list/radiochannels = list( "Medical" = 1355, "Engineering" = 1357, "Security" = 1359, - "Centcom" = 1441, + "Centcom" = 1337, "Syndicate" = 1213, "Supply" = 1347, "Service" = 1349, @@ -144,7 +144,7 @@ var/list/radiochannelsreverse = list( "1355" = "Medical", "1357" = "Engineering", "1359" = "Security", - "1441" = "Centcom", + "1337" = "Centcom", "1213" = "Syndicate", "1347" = "Supply", "1349" = "Service", @@ -160,7 +160,7 @@ var/const/COMM_FREQ = 1353 //command, colored gold in chat window var/const/MED_FREQ = 1355 //medical, coloured blue in chat window var/const/ENG_FREQ = 1357 //engineering, coloured orange in chat window var/const/SEC_FREQ = 1359 //security, coloured red in chat window -var/const/CENTCOM_FREQ = 1441 //centcom frequency, coloured grey in chat window +var/const/CENTCOM_FREQ = 1337 //centcom frequency, coloured grey in chat window var/const/AIPRIV_FREQ = 1447 //AI private, colored magenta in chat window #define TRANSMISSION_WIRE 0 @@ -173,12 +173,7 @@ var/const/RADIO_CHAT = "3" //deprecated var/const/RADIO_ATMOSIA = "4" var/const/RADIO_NAVBEACONS = "5" var/const/RADIO_AIRLOCK = "6" -var/const/RADIO_SECBOT = "7" -var/const/RADIO_MULEBOT = "8" var/const/RADIO_MAGNETS = "9" -var/const/RADIO_CLEANBOT = "10" -var/const/RADIO_FLOORBOT = "11" -var/const/RADIO_MEDBOT = "12" /datum/radio_frequency diff --git a/code/game/dna.dm b/code/game/dna.dm index 21f94b0ce29..58f5ac12a95 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -36,9 +36,20 @@ destination.dna.uni_identity = uni_identity destination.dna.blood_type = blood_type destination.dna.species = species + destination.dna.mutant_color = mutant_color destination.dna.real_name = real_name destination.dna.mutations = mutations +/datum/dna/proc/copy_dna(var/datum/dna/new_dna) + new_dna.unique_enzymes = unique_enzymes + new_dna.struc_enzymes = struc_enzymes + new_dna.uni_identity = uni_identity + new_dna.blood_type = blood_type + new_dna.species = new species.type + new_dna.mutant_color = mutant_color + new_dna.real_name = real_name + new_dna.mutations = mutations + /datum/dna/proc/add_mutation(mutation_name) var/datum/mutation/human/HM = mutations_list[mutation_name] HM.on_acquiring(holder) @@ -392,15 +403,15 @@ return user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - user << "You lean on the back of [src] and start pushing the door open. (this will take about [breakout_time] minutes.)" - user.visible_message("You hear a metallic creaking from [src]!") + user << "You lean on the back of [src] and start pushing the door open... (this will take about [breakout_time] minutes.)" + user.visible_message("You hear a metallic creaking from [src]!") if(do_after(user,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) return locked = 0 - visible_message("[user] successfully broke out of [src]!") + visible_message("[user] successfully broke out of [src]!") user << "You successfully break out of [src]!" open_machine() diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm new file mode 100644 index 00000000000..90b2deaa6a3 --- /dev/null +++ b/code/game/gamemodes/abduction/abduction.dm @@ -0,0 +1,371 @@ +/datum/game_mode + var/list/datum/mind/abductors = list() + +/datum/game_mode/abduction + name = "Abduction" + config_tag = "abduction" + antag_flag = BE_ABDUCTOR + pre_setup_before_jobs = 1 + recommended_enemies = 2 + required_players = 15 + var/max_teams = 4 + var/teams = 1 + var/list/datum/mind/scientists = list() + var/list/datum/mind/agents = list() + var/list/datum/objective/team_objectives = list() + var/list/team_names = list() + +/datum/game_mode/abduction/announce() + world << "The current game mode is - Abduction!" + +/datum/game_mode/abduction/pre_setup() + teams = max(1, min(max_teams,round(num_players()/config.abductor_scaling_coeff))) + var/possible_teams = max(1,round(antag_candidates.len / 2)) + teams = min(teams,possible_teams) + + abductors.len = 2*teams + scientists.len = teams + agents.len = teams + team_objectives.len = teams + team_names.len = teams + + for(var/i=1,i<=teams,i++) + if(!make_abductor_team(i)) + return 0 + + return 1 + +/datum/game_mode/abduction/proc/make_abductor_team(var/team_number,var/preset_agent=null,var/preset_scientist=null) + //Team Name + team_names[team_number] = "Mothership [pick(possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names + //Team Objective + var/datum/objective/experiment/team_objective = new + team_objective.team = team_number + team_objectives[team_number] = team_objective + //Team Members + + if(!preset_agent || !preset_scientist) + if(antag_candidates.len <=2) + return 0 + + var/datum/mind/scientist + var/datum/mind/agent + + if(!preset_scientist) + scientist = pick(antag_candidates) + antag_candidates -= scientist + else + scientist = preset_scientist + + if(!preset_agent) + agent = pick(antag_candidates) + antag_candidates -= agent + else + agent = preset_agent + + + scientist.assigned_role = "MODE" + scientist.special_role = "Abductor" + log_game("[scientist.key] (ckey) has been selected as an abductor team [team_number] scientist.") + + agent.assigned_role = "MODE" + agent.special_role = "Abductor" + log_game("[agent.key] (ckey) has been selected as an abductor team [team_number] agent.") + + abductors |= agent + abductors |= scientist + scientists[team_number] = scientist + agents[team_number] = agent + return 1 + +/datum/game_mode/abduction/post_setup() + //Spawn Team + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = max_teams + scientist_landmarks.len = max_teams + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/datum/mind/agent + var/obj/effect/landmark/L + var/datum/mind/scientist + var/team_name + var/mob/living/carbon/human/H + var/datum/species/abductor/S + for(var/team_number=1,team_number<=teams,team_number++) + team_name = team_names[team_number] + agent = agents[team_number] + H = agent.current + L = agent_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.agent = 1 + S.team = team_number + H.real_name = team_name + " Agent" + equip_common(H,team_number) + equip_agent(H,team_number) + greet_agent(agent,team_number) + H.regenerate_icons() + + scientist = scientists[team_number] + H = scientist.current + L = scientist_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.scientist = 1 + S.team = team_number + H.real_name = team_name + " Scientist" + equip_common(H,team_number) + equip_scientist(H,team_number) + greet_scientist(scientist,team_number) + H.regenerate_icons() + return ..() + +//Used for create antag buttons +/datum/game_mode/abduction/proc/post_setup_team(var/team_number) + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = max_teams + scientist_landmarks.len = max_teams + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/datum/mind/agent + var/obj/effect/landmark/L + var/datum/mind/scientist + var/team_name + var/mob/living/carbon/human/H + var/datum/species/abductor/S + + team_name = team_names[team_number] + agent = agents[team_number] + H = agent.current + L = agent_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.agent = 1 + S.team = team_number + H.real_name = team_name + " Agent" + equip_common(H,team_number) + equip_agent(H,team_number) + greet_agent(agent,team_number) + H.regenerate_icons() + + scientist = scientists[team_number] + H = scientist.current + L = scientist_landmarks[team_number] + H.loc = L.loc + H.dna.species = new /datum/species/abductor() + S = H.dna.species + S.scientist = 1 + S.team = team_number + H.real_name = team_name + " Scientist" + equip_common(H,team_number) + equip_scientist(H,team_number) + greet_scientist(scientist,team_number) + H.regenerate_icons() + + +/datum/game_mode/abduction/proc/greet_agent(var/datum/mind/abductor,var/team_number) + abductor.objectives += team_objectives[team_number] + var/team_name = team_names[team_number] + + abductor.current << "You are an Abductor Agent of [team_name]!" + abductor.current << "With the help of your teammate kidnap and experiment on station members!" + abductor.current << "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." + + var/obj_count = 1 + for(var/datum/objective/objective in abductor.objectives) + abductor.current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + return + +/datum/game_mode/abduction/proc/greet_scientist(var/datum/mind/abductor,var/team_number) + abductor.objectives += team_objectives[team_number] + var/team_name = team_names[team_number] + + abductor.current << "You are an Abductor Scientist of [team_name]!" + abductor.current << "With the help of your teammate kidnap and experiment on station members!" + abductor.current << "Use your tool and ship consoles to support the agent and retrieve human specimens." + + var/obj_count = 1 + for(var/datum/objective/objective in abductor.objectives) + abductor.current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + return + +/datum/game_mode/abduction/proc/equip_common(var/mob/living/carbon/human/agent,var/team_number) + var/radio_freq = SYND_FREQ + + var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(agent) + R.set_frequency(radio_freq) + agent.equip_to_slot_or_del(R, slot_ears) + agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes) + agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit + agent.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(agent), slot_back) + +/datum/game_mode/abduction/proc/get_team_console(var/team) + var/obj/machinery/abductor/console/console + for(var/obj/machinery/abductor/console/c in machines) + if(c.team == team) + console = c + break + return console + +/datum/game_mode/abduction/proc/equip_agent(var/mob/living/carbon/human/agent,var/team_number) + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent) + if(console!=null) + console.vest = V + V.flags |= NODROP + agent.equip_to_slot_or_del(V, slot_wear_suit) + agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack) + agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_belt) + agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack) + agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head) + + +/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number) + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/item/device/abductor/gizmo/G = new /obj/item/device/abductor/gizmo(scientist) + if(console!=null) + console.gizmo = G + G.console = console + scientist.equip_to_slot_or_del(G, slot_in_backpack) + + var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(scientist) + beamplant.imp_in = scientist + beamplant.implanted = 1 + beamplant.implanted(scientist) + beamplant.home = console.pad + + +/datum/game_mode/abduction/check_finished() + var/all_dead = 1 + for(var/team_number=1,team_number<=teams,team_number++) + var/datum/mind/smind = scientists[team_number] + if(smind.current) + var/mob/living/M = smind.current + if(M.stat != DEAD) + all_dead = 0 + var/obj/machinery/abductor/console/con = get_team_console(team_number) + var/datum/objective/objective = team_objectives[team_number] + if (con.experiment.points > objective.target_amount) + return 1 + if(all_dead) + return 1 + return ..() + +/datum/game_mode/abduction/declare_completion() + for(var/team_number=1,team_number<=teams,team_number++) + var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/datum/objective/objective = team_objectives[team_number] + var/team_name = team_names[team_number] + var/datum/mind/amind = agents[team_number] + var/datum/mind/smind = scientists[team_number] + var/mob/living/carbon/human/agent = amind.current + var/mob/living/carbon/human/scientist = smind.current + if (console.experiment.points > objective.target_amount) + world << "[team_name] team fullfilled its mission! " + world << "Team Members : [agent.name]([agent.ckey]),[scientist.name]([scientist.ckey])" + else + world << "[team_name] team failed its mission! " + world << "Team Members: [agent.name]([agent.ckey])
[scientist.name]([scientist.ckey])" + + world << "Abductees:" + display_abductees(console) + + ..() + return 1 + +/datum/game_mode/abduction/proc/display_abductees(var/obj/machinery/abductor/console/console) + var/list/mob/living/abductees = console.experiment.history + for(var/mob/living/abductee in abductees) + if(!abductee.mind) + continue + world << "[abductee.name]([abductee.ckey]))" + var/count = 1 + for(var/datum/objective/objective in abductee.mind.objectives) + if(objective.check_completion()) + world << "
Objective #[count]: [objective.explanation_text] Success!" + else + world << "
Objective #[count]: [objective.explanation_text] Fail." + count++ + +/datum/game_mode/proc/auto_declare_completion_abduction() + if(abductors.len) + world << "Abductors:" + for(var/datum/mind/M in abductors) + world << "Abductor [M.current ? M.current.name : "Abductor"]([M.key])" + return + +//Landmarks +// TODO: Split into seperate landmarks for prettier ships +/obj/effect/landmark/abductor + var/team = 1 + +/obj/effect/landmark/abductor/console/New() + var/obj/machinery/abductor/console/c = new /obj/machinery/abductor/console(src.loc) + c.team = team + + spawn(5) // I'd do this properly when i got some time, temporary hack for mappers + c.Initialize() + qdel(src) + + +/obj/effect/landmark/abductor/agent +/obj/effect/landmark/abductor/scientist + + +// OBJECTIVES +datum/objective/experiment + dangerrating = 10 + target_amount = 6 + var/team + +datum/objective/experiment/New() + explanation_text = "Experiment on [target_amount] humans" + +datum/objective/experiment/check_completion() + return 0 + +datum/objective/abductee + dangerrating = 5 + completed = 1 + +datum/objective/abductee/steal + explanation_text = "Steal all" + +datum/objective/abductee/steal/New() + var/target = pick(list("Pets","Lights","Monkeys","Fruits","Shoes","Soap Bars")) + explanation_text+=" [target]" + +datum/objective/abductee/capture + explanation_text = "Capture" + +datum/objective/abductee/capture/New() + var/list/jobs = SSjob.occupations + for(var/datum/job/J in jobs) + if(J.current_positions < 1) + jobs -= J + if(jobs.len > 0) + var/datum/job/target = pick(jobs) + explanation_text += " \a [target.title]." + else + explanation_text += " someone." + +datum/objective/abductee/shuttle + explanation_text = "You must escape the station! Get the shuttle called!" + +datum/objective/abductee/noclone + explanation_text = "Don't allow anyone to be cloned." \ No newline at end of file diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm new file mode 100644 index 00000000000..0b8b72cb227 --- /dev/null +++ b/code/game/gamemodes/abduction/abduction_gear.dm @@ -0,0 +1,536 @@ +#define VEST_STEALTH 1 +#define VEST_COMBAT 2 +#define GIZMO_SCAN 1 +#define GIZMO_MARK 2 + +//AGENT VEST +/obj/item/clothing/suit/armor/abductor/vest + name = "Agent Vest" + desc = "Vest outfitted with alien stealth technology." + icon = 'icons/obj/abductor.dmi' + icon_state = "vest_stealth" + item_state = "armor" + blood_overlay_type = "armor" + armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) + action_button_name = "Activate" + action_button_is_hands_free = 1 + var/mode = VEST_STEALTH + var/stealth_active = 0 + var/combat_cooldown = 10 + var/datum/icon_snapshot/disguise + var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) + var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50) + + var/obj/machinery/camera/portable/vest_cam = null + + +/obj/item/clothing/suit/armor/abductor/vest/New() + ..() + vest_cam = new /obj/machinery/camera/portable(src) + vest_cam.c_tag = "Agent Vest Cam" + vest_cam.network = list("Abductor") + +/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() + switch(mode) + if(VEST_STEALTH) + mode = VEST_COMBAT + DeactivateStealth() + armor = combat_armor + icon_state = "vest_combat" + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit() + return + if(VEST_COMBAT)// TO STEALTH + mode = VEST_STEALTH + armor = stealth_armor + icon_state = "vest_stealth" + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit() + return + + + +/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(var/datum/icon_snapshot/entry) + disguise = entry + +/obj/item/clothing/suit/armor/abductor/vest/proc/ActivateStealth() + if(disguise == null) + return + stealth_active = 1 + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + spawn(0) + anim(M.loc,M,'icons/mob/mob.dmi',,"cloak",,M.dir) + + M.name_override = disguise.name + M.icon = disguise.icon + M.icon_state = disguise.icon_state + M.overlays = disguise.overlays + M.update_inv_r_hand() + M.update_inv_l_hand() + return + +/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth() + if(!stealth_active) + return + stealth_active = 0 + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + spawn(0) + anim(M.loc,M,'icons/mob/mob.dmi',,"uncloak",,M.dir) + M.name_override = null + M.overlays.Cut() + M.regenerate_icons() + return + +/obj/item/clothing/suit/armor/abductor/vest/IsShield() + DeactivateStealth() + return 0 +/obj/item/clothing/suit/armor/abductor/vest/IsReflect() + DeactivateStealth() + return 0 + +/obj/item/clothing/suit/armor/abductor/vest/ui_action_click() + switch(mode) + if(VEST_COMBAT) + Adrenaline() + if(VEST_STEALTH) + if(stealth_active) + DeactivateStealth() + else + ActivateStealth() + +/obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() + if(istype(src.loc, /mob/living/carbon/human)) + if(combat_cooldown != initial(combat_cooldown)) + src.loc << "Combat injection is still recharging." + var/mob/living/carbon/human/M = src.loc + M.stat = 0 + M.SetParalysis(0) + M.SetStunned(0) + M.SetWeakened(0) + M.lying = 0 + M.update_canmove() + M.adjustStaminaLoss(-75) + combat_cooldown = 0 + SSobj.processing |= src + +/obj/item/clothing/suit/armor/abductor/vest/process() + combat_cooldown++ + if(combat_cooldown==initial(combat_cooldown)) + SSobj.processing.Remove(src) + +/obj/item/device/abductor/proc/IsAbductor(var/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna.species.id != "abductor") + return 0 + return 1 + return 0 + +/obj/item/device/abductor/proc/AbductorCheck(var/user) + if(IsAbductor(user)) + return 1 + user << "You can't figure how this works!" + return 0 + +/obj/item/device/abductor/proc/ScientistCheck(var/user) + var/mob/living/carbon/human/H = user + var/datum/species/abductor/S = H.dna.species + return S.scientist + +/obj/item/device/abductor/gizmo + name = "Science Tool" + desc = "Alien science is 90% dissections 10% probings." + icon = 'icons/obj/abductor.dmi' + icon_state = "gizmo_scan" + item_state = "silencer" + var/mode = GIZMO_SCAN + var/mob/living/marked = null + var/obj/machinery/abductor/console/console + +/obj/item/device/abductor/gizmo/attack_self(mob/user) + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + user << "You're not trained to use this!" + return + if(mode == GIZMO_SCAN) + mode = GIZMO_MARK + icon_state = "gizmo_mark" + else + mode = GIZMO_SCAN + icon_state = "gizmo_scan" + user << "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE" + +/obj/item/device/abductor/gizmo/attack(mob/living/M, mob/user) + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + user << "You're not trained to use this" + return + switch(mode) + if(GIZMO_SCAN) + scan(M, user) + if(GIZMO_MARK) + mark(M, user) + + +/obj/item/device/abductor/gizmo/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(flag) + return + if(!AbductorCheck(user)) + return + if(!ScientistCheck(user)) + user << "You're not trained to use this" + return + switch(mode) + if(GIZMO_SCAN) + scan(target, user) + if(GIZMO_MARK) + mark(target, user) + +/obj/item/device/abductor/gizmo/proc/scan(var/atom/target, var/mob/living/user) + if(istype(target,/mob/living/carbon/human)) + if(console!=null) + console.AddSnapshot(target) + user << "You scan and add the being to the database" + +/obj/item/device/abductor/gizmo/proc/mark(var/atom/target, var/mob/living/user) + if(marked == target) + user << "This specimen is already marked!" + return + if(istype(target,/mob/living/carbon/human)) + if(IsAbductor(target)) + marked = target + user << "You mark the target for future retrieval." + else + prepare(target,user) + +/obj/item/device/abductor/gizmo/proc/prepare(var/atom/target, var/mob/living/user) + if(get_dist(target,user)>1) + user << "You need to be next to the specimen to prepare it for transport!" + return + user << "You start preparing the specimen for transport..." + if(do_after(user, 100)) + marked = target + user << "You finish preparing the specimen for transport." + + +/obj/item/device/abductor/silencer + name = "Abductor Silencer" + desc = "Device used to break communication equipment" + icon = 'icons/obj/abductor.dmi' + icon_state = "silencer" + item_state = "gizmo" + +/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user) + if(!AbductorCheck(user)) + return + radio_off(M, user) + +/obj/item/device/abductor/silencer/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(flag) + return + if(!AbductorCheck(user)) + return + radio_off(target, user) + +/obj/item/device/abductor/silencer/proc/radio_off(var/atom/target, var/mob/living/user) + if( !(user in (viewers(7,target))) ) + return + + var/turf/targloc = get_turf(target) + + var/mob/living/carbon/human/M + for(M in view(2,targloc)) + user << "You silence [M.name] radio devices." + radio_off_mob(M) + +/obj/item/device/abductor/silencer/proc/radio_off_mob(var/mob/living/carbon/human/M) + var/list/all_items = M.GetAllContents() + + for(var/obj/I in all_items) + if(istype(I,/obj/item/device/radio/)) + var/obj/item/device/radio/r = I + r.listening = 0 + if(!istype(I,/obj/item/device/radio/headset)) + r.broadcasting = 0 //goddamned headset hacks + + +/obj/item/weapon/implant/abductor + name = "Emergency Beam" + desc = "Gets you back on the ship." + icon = 'icons/obj/abductor.dmi' + icon_state = "implant" + activated = 1 + var/obj/machinery/abductor/pad/home + var/cooldown = 30 + +/obj/item/weapon/implant/abductor/activate() + if(cooldown == initial(cooldown)) + home.Retrieve(imp_in,1) + cooldown = 0 + SSobj.processing |= src + else + imp_in << "The emergency beam is still recharging!" + return + +/obj/item/weapon/implant/abductor/process() + if(cooldown < initial(cooldown)) + cooldown++ + if(cooldown == initial(cooldown)) + SSobj.processing.Remove(src) + + +/obj/item/device/firing_pin/alien + name = "alien-looking pin" + desc = "Only non-humans can use this pin" + fail_message = "Human DNA detected! Authorization revoked!" + +/obj/item/device/firing_pin/alien/pin_auth(mob/living/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna.species.id == "human") //stealth lizard buff go + return 0 + return 1 + +/obj/item/weapon/gun/energy/decloner/alien + ammo_type = list(/obj/item/ammo_casing/energy/declone) + pin = /obj/item/device/firing_pin/alien + icon_state = "alienpistol" + item_state = "alienpistol" + +/obj/item/weapon/gun/energy/decloner/alien/update_icon() // No charge levels + return + +/obj/item/weapon/paper/abductor + name = "Dissection Guide" + info = {"Dissection for Dummies
+
+ 1.Acquire fresh specimen.
+ 2.Put the specimen on operating table
+ 3.Apply surgical drapes preparing for dissection
+ 4.Apply scalpel to specimen torso
+ 5.Stop the bleeders and retract skin
+ 6.Cut out organs you find with a scalpel
+ 7.Use your hands to remove the remaining organs
+ 8.Insert replacement gland (Retrieve one from gland storage)
+ 9.Consider dressing the specimen back to not disturb the habitat
+ 10.Put the specimen in the experiment machinery
+ 11.Choose one of the machine options and follow displayed instructions
+
+Congratulations! You are now trained for xenobiology research!"} + +#define BATON_STUN 0 +#define BATON_SLEEP 1 +#define BATON_CUFF 2 +#define BATON_MODES 3 + +/obj/item/weapon/abductor_baton + name = "Advanced Baton" + var/mode = BATON_STUN + icon = 'icons/obj/abductor.dmi' + icon_state = "wonderprod" + item_state = "wonderprod" + slot_flags = SLOT_BELT + force = 7 + w_class = 3 + action_button_name = "Toggle Mode" + +/obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr) + mode = (mode+1)%BATON_MODES + var/txt + switch(mode) + if(BATON_STUN) + txt = "stun" + if(BATON_SLEEP) + txt = "sleep inducment" + if(BATON_CUFF) + txt = "restraining" + + usr << "You switch the baton to [txt] mode" + update_icon() + +/obj/item/weapon/abductor_baton/update_icon() + switch(mode) + if(BATON_STUN) + icon_state = "wonderprod" + if(BATON_SLEEP) + icon_state = "wonderprod" + if(BATON_CUFF) + icon_state = "wonderprod" + +/obj/item/weapon/abductor_baton/proc/IsAbductor(var/mob/living/user) + if(!ishuman(user)) + return 0 + var/mob/living/carbon/human/H = user + if(!H.dna) + return 0 + if(H.dna.species.id != "abductor") + return 0 + return 1 + +/obj/item/weapon/abductor_baton/attack(mob/target as mob, mob/living/user as mob) + if(!IsAbductor(user)) + return + + if(isrobot(target)) + ..() + return + + if(!isliving(target)) + return + + if(user.a_intent == "help") + target.visible_message("[user] probes [target] with [src]!", \ + "[user] probed [target]!") + return + + var/mob/living/L = target + + user.do_attack_animation(L) + switch(mode) + if(BATON_STUN) + StunAttack(L,user) + if(BATON_SLEEP) + SleepAttack(L,user) + if(BATON_CUFF) + CuffAttack(L,user) + +/obj/item/weapon/abductor_baton/attack_self(mob/living/user) + toggle(user) + +/obj/item/weapon/abductor_baton/proc/StunAttack(mob/living/L,mob/living/user) + user.lastattacked = L + L.lastattacker = user + + L.Stun(7) + L.Weaken(7) + L.apply_effect(STUTTER, 7) + + L.visible_message("[user] has stunned [L] with [src]!", \ + "[user] has stunned you with [src]!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.forcesay(hit_appends) + + add_logs(user, L, "stunned") + return + +/obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user) + if(L.stunned) + L.SetSleeping(60) + L.visible_message("[user] has induced sleep in [L] with [src]!", \ + "You suddenly feel very drowsy!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + + add_logs(user, L, "put to sleep") + return + +/obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user) + if(!iscarbon(L)) + return + var/mob/living/carbon/C = L + if(!C.handcuffed) + playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) + C.visible_message("[user] is trying to put energy cuffs on [C]!", \ + "[user] is trying to put energy cuffs on [C]!") + if(do_mob(user, C, 30)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C) + C.update_inv_handcuffed(0) + user << "You handcuff [C]." + add_logs(user, C, "handcuffed") + else + user << "You fail to handcuff [C]." + return + +/obj/item/weapon/restraints/handcuffs/energy + name = "energy cuffs" + desc = "Energy field restraining the hands." + icon_state = "cuff_white" // Needs sprite + breakouttime = 450 + trashtype = /obj/item/weapon/restraints/handcuffs/energy/used + +/obj/item/weapon/restraints/handcuffs/energy/used + desc = "Energy Discharge" + +/obj/item/weapon/restraints/handcuffs/energy/used/dropped(mob/user) + user.visible_message("[user] cuffs break in a discharge of energy!", \ + "[user] cuffs break in a discharge of energy!") + var/datum/effect/effect/system/spark_spread/S = new + S.set_up(4,0,user.loc) + S.start() + qdel(src) + +/obj/item/weapon/abductor_baton/examine(mob/user) + ..() + switch(mode) + if(BATON_STUN) + user <<"The baton is in stun mode." + if(BATON_SLEEP) + user <<"The baton is in sleep induction mode." + if(BATON_CUFF) + user <<"The baton is in restrain mode." + + +/obj/item/weapon/scalpel/alien + name = "alien scalpel" + icon = 'icons/obj/abductor.dmi' + +/obj/item/weapon/hemostat/alien + name = "alien hemostat" + icon = 'icons/obj/abductor.dmi' + +/obj/item/weapon/retractor/alien + name = "alien retractor" + icon = 'icons/obj/abductor.dmi' + +/obj/item/weapon/circular_saw/alien + name = "alien saw" + icon = 'icons/obj/abductor.dmi' + +/obj/item/weapon/surgicaldrill/alien + name = "alien drill" + icon = 'icons/obj/abductor.dmi' + +/obj/item/weapon/cautery/alien + name = "alien cautery" + icon = 'icons/obj/abductor.dmi' + +/obj/item/clothing/head/helmet/abductor + name = "Agent Headgear" + desc = "Abducting with style. Spiky style." + icon_state = "alienhelmet" + item_state = "alienhelmet" + blockTracking = 1 + +// Operating Table / Beds / Lockers + +/obj/structure/optable/abductor + icon = 'icons/obj/abductor.dmi' + icon_state = "bed" + can_buckle = 1 + buckle_lying = 1 + +/obj/structure/stool/bed/abductor + name = "resting contraption" + desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?" + icon = 'icons/obj/abductor.dmi' + icon_state = "bed" + +/obj/structure/table/abductor + name = "alien table" + desc = "Advanced flat surface technology at work!" + icon_state = "alientable" + +/obj/structure/closet/abductor + name = "alien locker" + desc = "Contains secrets of the universe" + icon_state = "abductor" + icon_door = "abductor" \ No newline at end of file diff --git a/code/game/gamemodes/abduction/abduction_surgery.dm b/code/game/gamemodes/abduction/abduction_surgery.dm new file mode 100644 index 00000000000..a618e1d2544 --- /dev/null +++ b/code/game/gamemodes/abduction/abduction_surgery.dm @@ -0,0 +1,47 @@ +/datum/surgery/organ_extraction + name = "experimental dissection" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin,/datum/surgery_step/incise, /datum/surgery_step/extract_organ ,/datum/surgery_step/gland_insert) + species = list(/mob/living/carbon/human) + location = "chest" + user_species_restricted = 1 + user_species_ids = list("abductor") + ignore_clothes = 1 + +/datum/surgery_step/extract_organ + accept_hand = 1 + time = 32 + var/obj/item/IC = null + var/list/organ_types = list(/obj/item/organ/heart) + +/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + for(var/obj/item/I in target.internal_organs) + if(I.type in organ_types) + IC = I + break + user.visible_message("[user] starts to remove [target]'s organs.", "You start to remove [target]'s organs...") + +/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(IC) + user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") + user.put_in_hands(IC) + target.internal_organs -= IC + return 1 + else + user << "You don't find anything in [target]'s [target_zone]!" + return 0 + +/datum/surgery_step/gland_insert + implements = list(/obj/item/gland = 100) + time = 32 + +/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] starts to insert [tool] into [target].", "You start to insert [tool] into [target]...") + +/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] inserts [tool] into [target].", "You insert [tool] into [target].") + user.drop_item() + var/obj/item/gland/gland = tool + gland.Inject(target) + return 1 + + diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm new file mode 100644 index 00000000000..b20e7c98b85 --- /dev/null +++ b/code/game/gamemodes/abduction/gland.dm @@ -0,0 +1,255 @@ +/obj/item/gland/ + name = "Fleshy mass" + desc = "Eww" + icon = 'icons/obj/abductor.dmi' + icon_state = "gland" + var/cooldown_low = 300 + var/cooldown_high = 300 + var/next_activation = 0 + var/uses // -1 For inifinite + var/active = 0 + var/mob/living/carbon/human/host + +/obj/item/gland/proc/HostCheck() + if(ishuman(host) && host == src.loc) + if(host.stat != DEAD) + return 1 + return 0 + +/obj/item/gland/proc/Start() + active = 1 + next_activation = world.time + rand(cooldown_low,cooldown_high) + SSobj.processing |= src + +/obj/item/gland/proc/Inject(var/mob/living/carbon/human/target) + host = target + target.internal_organs += src + src.loc = target + +/obj/item/gland/process() + if(!active) + SSobj.processing.Remove(src) + return + if(next_activation <= world.time) + //This gives a chance to transplant the gland active into someone else if you're fast + if(!HostCheck()) + active = 0 + return + activate() + uses-- + next_activation = world.time + rand(cooldown_low,cooldown_high) + if(uses == 0) + active = 0 + +/obj/item/gland/proc/activate() + return + +/obj/item/gland/heals + cooldown_low = 200 + cooldown_high = 400 + uses = -1 + icon_state = "health" + +obj/item/gland/heals/activate() + host << "You feel weird." + host.adjustBruteLoss(-20) + host.adjustOxyLoss(-20) + host.adjustFireLoss(-20) + +/obj/item/gland/slime + cooldown_low = 600 + cooldown_high = 1200 + uses = -1 + icon_state = "slime" + +obj/item/gland/slime/activate() + host << "You feel weird." + + host.visible_message("[host] vomits on the floor!", \ + "You throw up on the floor!") + + host.nutrition -= 20 + host.adjustToxLoss(-3) + + var/turf/pos = get_turf(host) + pos.add_vomit_floor(host) + playsound(pos, 'sound/effects/splat.ogg', 50, 1) + + var/mob/living/simple_animal/slime/Slime = new/mob/living/simple_animal/slime(pos) + Slime.Friends = list(host) + Slime.Leader = host + +/obj/item/gland/mindshock + cooldown_low = 300 + cooldown_high = 300 + uses = -1 + icon_state = "mindshock" + +/obj/item/gland/mindshock/activate() + host << "You feel weird." + + var/turf/T = get_turf(host) + for(var/mob/living/carbon/human/H in orange(4,T)) + if(H == host) + continue + H << " You hear a buzz in your head " + H.confused += 20 + +/obj/item/gland/pop + cooldown_low = 900 + cooldown_high = 1800 + uses = 6 + icon_state = "species" + +/obj/item/gland/pop/activate() + host << "You feel weird." + var/species = pick(list(/datum/species/lizard,/datum/species/slime,/datum/species/plant/pod,/datum/species/fly)) + host.dna.species = new species() + host.regenerate_icons() + return + +/obj/item/gland/ventcrawling + cooldown_low = 1800 + cooldown_high = 2400 + uses = 1 + icon_state = "vent" + +/obj/item/gland/ventcrawling/activate() + host << "You feel weird." + host << "You feel very stretchy." + host.ventcrawler = 2 + return + + +/obj/item/gland/viral + cooldown_low = 1800 + cooldown_high = 2400 + uses = 1 + icon_state = "viral" + +/obj/item/gland/viral/activate() + var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis) + var/datum/disease/D = new virus_type() + D.carrier = 1 + host.viruses += D + D.affected_mob = host + D.holder = host + host.med_hud_set_status() + + +/obj/item/gland/emp //TODO : Replace with something more interesting + cooldown_low = 900 + cooldown_high = 1600 + uses = 10 + icon_state = "emp" + +/obj/item/gland/emp/activate() + empulse(get_turf(host), 2, 5, 1) + +/obj/item/gland/spiderman + cooldown_low = 450 + cooldown_high = 900 + uses = 10 + icon_state = "spider" + +/obj/item/gland/spiderman/activate() + if(uses == initial(uses)) + host.faction += "spiders" + new /obj/effect/spider/spiderling(host.loc) + +/obj/item/gland/egg + cooldown_low = 300 + cooldown_high = 600 + uses = -1 + icon_state = "egg" + +/obj/item/gland/egg/activate() + var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(host.loc) + egg.reagents.add_reagent("sacid",20) + egg.desc += " It smells bad." + +/obj/item/gland/bloody + cooldown_low = 200 + cooldown_high = 400 + uses = -1 + +/obj/item/gland/bloody/activate() + host.adjustBruteLoss(15) + + host.visible_message("[host] skin erupts with blood!",\ + "Your skin erupts with blood! It hurts!") + + for(var/turf/T in oview(3,host)) //Make this respect walls and such + T.add_blood_floor(host) + for(var/mob/living/carbon/human/H in oview(3,host)) //Blood decals for simple animals would be neat. aka Carp with blood on it. + if(H.wear_suit) + H.wear_suit.add_blood(host) + H.update_inv_wear_suit(0) + else if(H.w_uniform) + H.w_uniform.add_blood(host) + H.update_inv_w_uniform(0) + +/obj/item/gland/bodysnatch + cooldown_low = 600 + cooldown_high = 600 + uses = 1 + +/obj/item/gland/bodysnatch/activate() + //spawn cocoon with clone greytide snpc inside + var/obj/effect/cocoon/abductor/C = new (get_turf(host)) + C.Copy(host) + C.Start() + host.gib() + return + +/obj/effect/cocoon/abductor + name = "Slimy cocoon" + desc = "You can see something moving inside" + icon = 'icons/effects/effects.dmi' + icon_state = "cocoon_large3" + color = rgb(10,120,10) + density = 1 + var/hatch_time = 0 + +/obj/effect/cocoon/abductor/proc/Copy(var/mob/living/carbon/human/H) + var/mob/living/carbon/human/interactive/greytide/clone = new(src) + hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.mutant_color) + + //There's no define for this / get all items ? + var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ + slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_ears,\ + slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id) + + for(var/slot in slots) + var/obj/item/I = H.get_item_by_slot(slot) + if(I) + clone.equip_to_slot_if_possible(I,slot) + +/obj/effect/cocoon/abductor/proc/Start() + hatch_time = world.time + 600 + SSobj.processing |= src + +/obj/effect/cocoon/abductor/process() + if(world.time > hatch_time) + SSobj.processing.Remove(src) + for(var/mob/M in contents) + src.visible_message("[src] hatches!") + M.loc = src.loc + qdel(src) + +/obj/item/gland/plasma + cooldown_low = 1200 + cooldown_high = 2400 + uses = 1 + +/obj/item/gland/plasma/activate() + host << "You feel bloated." + sleep(150) + host << "Your stomach feels about to explode!" + sleep(50) + host.visible_message("[host] explodes in a cloud of plasma!") + var/turf/simulated/T = get_turf(host) + if(istype(T)) + T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C,300) + host.gib() + return \ No newline at end of file diff --git a/code/game/gamemodes/abduction/machinery/camera.dm b/code/game/gamemodes/abduction/machinery/camera.dm new file mode 100644 index 00000000000..52773d60e1a --- /dev/null +++ b/code/game/gamemodes/abduction/machinery/camera.dm @@ -0,0 +1,142 @@ +/obj/machinery/computer/camera_advanced/abductor + name = "Human Observation Console" + var/team = 0 + networks = list("SS13","Abductor") + off_action = new/datum/action/camera_off/abductor //specific datum + var/datum/action/teleport_in/tele_in_action = new + var/datum/action/teleport_out/tele_out_action = new + var/datum/action/teleport_self/tele_self_action = new + var/datum/action/vest_mode_swap/vest_mode_action = new + var/datum/action/vest_disguise_swap/vest_disguise_action = new + var/obj/machinery/abductor/console/console + + icon = 'icons/obj/abductor.dmi' + icon_state = "camera" + +/obj/machinery/computer/camera_advanced/abductor/CreateEye() + ..() + eyeobj.visible_icon = 1 + eyeobj.icon = 'icons/obj/abductor.dmi' + eyeobj.icon_state = "camera_target" + +/obj/machinery/computer/camera_advanced/abductor/GrantActions(var/mob/living/carbon/user) + off_action.target = user + off_action.Grant(user) + + jump_action.target = user + jump_action.Grant(user) + //TODO : add null checks + tele_in_action.target = console.pad + tele_in_action.Grant(user) + + tele_out_action.target = console + tele_out_action.Grant(user) + + tele_self_action.target = console.pad + tele_self_action.Grant(user) + + vest_mode_action.target = console + vest_mode_action.Grant(user) + + vest_disguise_action.target = console + vest_disguise_action.Grant(user) + +/obj/machinery/computer/camera_advanced/abductor/proc/IsAbductor(var/mob/living/carbon/human/H) + return H.dna.species.id == "abductor" + +/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(var/mob/living/carbon/human/H) + var/datum/species/abductor/S = H.dna.species + return S.scientist + +/obj/machinery/computer/camera_advanced/abductor/attack_hand(var/mob/user as mob) + if(!iscarbon(user) || !IsAbductor(user)) + return + return ..() + +/datum/action/camera_off/abductor/Activate() + if(!target || !iscarbon(target)) + return + var/mob/living/carbon/C = target + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/abductor/origin = remote_eye.origin + C.remote_view = 0 + origin.current_user = null + origin.jump_action.Remove(C) + origin.tele_in_action.Remove(C) + origin.tele_out_action.Remove(C) + origin.tele_self_action.Remove(C) + origin.vest_mode_action.Remove(C) + origin.vest_disguise_action.Remove(C) + if(C.client) + C.client.perspective = MOB_PERSPECTIVE + C.client.eye = src + C.client.images -= remote_eye.user_image + C.remote_control = null + C.unset_machine() + src.Remove(C) + + +/datum/action/teleport_in + name = "Send To" + action_type = AB_INNATE + button_icon_state = "beam_down" + +/datum/action/teleport_in/Activate() + if(!target || !iscarbon(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/abductor/pad/P = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + P.PadToLoc(remote_eye.loc) + +/datum/action/teleport_out + name = "Retrieve" + action_type = AB_INNATE + button_icon_state = "beam_up" + +/datum/action/teleport_out/Activate() + if(!target || !iscarbon(owner)) + return + var/obj/machinery/abductor/console/console = target + + console.TeleporterRetrieve() + +/datum/action/teleport_self + name = "Send Self" + action_type = AB_INNATE + button_icon_state = "beam_down" + +/datum/action/teleport_self/Activate() + if(!target || !iscarbon(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/abductor/pad/P = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + P.MobToLoc(remote_eye.loc,C) + +/datum/action/vest_mode_swap + name = "Switch Vest Mode" + action_type = AB_INNATE + button_icon_state = "vest_mode" + +/datum/action/vest_mode_swap/Activate() + if(!target || !iscarbon(owner)) + return + var/obj/machinery/abductor/console/console = target + console.FlipVest() + + +/datum/action/vest_disguise_swap + name = "Switch Vest Disguise" + action_type = AB_INNATE + button_icon_state = "vest_disguise" + +/datum/action/vest_disguise_swap/Activate() + if(!target || !iscarbon(owner)) + return + var/obj/machinery/abductor/console/console = target + console.SelectDisguise(remote=1) diff --git a/code/game/gamemodes/abduction/machinery/console.dm b/code/game/gamemodes/abduction/machinery/console.dm new file mode 100644 index 00000000000..bfaeefa3e2c --- /dev/null +++ b/code/game/gamemodes/abduction/machinery/console.dm @@ -0,0 +1,184 @@ +//Common + +/obj/machinery/abductor + var/team = 0 + +/obj/machinery/abductor/proc/IsAbductor(var/mob/living/carbon/human/H) + if(!H.dna) + return 0 + return H.dna.species.id == "abductor" + +/obj/machinery/abductor/proc/IsAgent(var/mob/living/carbon/human/H) + if(H.dna.species.id == "abductor") + var/datum/species/abductor/S = H.dna.species + return S.agent + return 0 + +/obj/machinery/abductor/proc/IsScientist(var/mob/living/carbon/human/H) + if(H.dna.species.id == "abductor") + var/datum/species/abductor/S = H.dna.species + return S.scientist + return 0 + +//Console + +/obj/machinery/abductor/console + name = "Abductor console" + desc = "Ship command center." + icon = 'icons/obj/abductor.dmi' + icon_state = "console" + density = 1 + anchored = 1.0 + var/obj/item/device/abductor/gizmo/gizmo + var/obj/item/clothing/suit/armor/abductor/vest/vest + var/obj/machinery/abductor/experiment/experiment + var/obj/machinery/abductor/pad/pad + var/obj/machinery/computer/camera_advanced/abductor/camera + var/list/datum/icon_snapshot/disguises = list() + +/obj/machinery/abductor/console/attack_hand(var/mob/user as mob) + if(..()) + return + if(!IsAbductor(user)) + user << "You start mashing alien buttons at random!" + if(do_after(user,100)) + TeleporterSend() + return + user.set_machine(src) + var/dat = "" + dat += "

Abductsoft 3000

" + + if(experiment != null) + var/points = experiment.points + dat += "Collected Samples : [points]
" + else + dat += "NO EXPERIMENT MACHINE DETECTED
" + + if(pad!=null) + dat += "Emergency Teleporter System." + dat += "Consider using primary observation console first." + dat += "Activate Teleporter
" + dat += "Set Teleporter
" + if(gizmo!=null && gizmo.marked!=null) + dat += "Retrieve Mark
" + else + dat += "Retrieve Mark
" + else + dat += "NO TELEPAD DETECTED
" + + if(vest!=null) + dat += "

Agent Vest Mode


" + var/mode = vest.mode + if(mode == VEST_STEALTH) + dat += "Combat" + dat += "Stealth" + else + dat += "Combat" + dat += "Stealth" + + dat+="
" + dat += "Select Agent Vest Disguise
" + else + dat += "NO AGENT VEST DETECTED" + var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/abductor/console/Topic(href, href_list) + if(..()) + return + + usr.set_machine(src) + if(href_list["teleporter_set"]) + TeleporterSet() + else if(href_list["teleporter_send"]) + TeleporterSend() + else if(href_list["teleporter_retrieve"]) + TeleporterRetrieve() + else if(href_list["flip_vest"]) + FlipVest() + else if(href_list["select_disguise"]) + SelectDisguise() + src.updateUsrDialog() + +/obj/machinery/abductor/console/proc/TeleporterSet() + var/A = null + A = input("Select area to teleport to", "Teleport", A) in teleportlocs + if(pad!=null && in_range(usr,src)) + pad.teleport_target = teleportlocs[A] + return + +/obj/machinery/abductor/console/proc/TeleporterRetrieve() + if(gizmo!=null && pad!=null && gizmo.marked) + pad.Retrieve(gizmo.marked) + return + +/obj/machinery/abductor/console/proc/TeleporterSend() + if(pad!=null) + pad.Send() + return + +/obj/machinery/abductor/console/proc/FlipVest() + if(vest!=null) + vest.flip_mode() + return + +/obj/machinery/abductor/console/proc/SelectDisguise(var/remote=0) + var/list/entries = list() + var/tempname + var/datum/icon_snapshot/temp + for(var/i = 1; i <= disguises.len; i++) + temp = disguises[i] + tempname = temp.name + entries["[tempname]"] = disguises[i] + var/entry_name = input( "Choose Disguise", "Disguise") in entries + var/datum/icon_snapshot/chosen = entries[entry_name] + if(chosen && (remote || in_range(usr,src))) + vest.SetDisguise(chosen) + return + +/obj/machinery/abductor/console/proc/Initialize() + + for(var/obj/machinery/abductor/pad/p in machines) + if(p.team == team) + pad = p + break + + for(var/obj/machinery/abductor/experiment/e in machines) + if(e.team == team) + experiment = e + e.console = src + + for(var/obj/machinery/computer/camera_advanced/abductor/c in machines) + if(c.team == team) + camera = c + c.console = src + +/obj/machinery/abductor/console/proc/AddSnapshot(var/mob/living/carbon/human/target) + var/datum/icon_snapshot/entry = new + entry.name = target.name + entry.icon = target.icon + entry.icon_state = target.icon_state + entry.overlays = target.get_overlays_copy(list(L_HAND_LAYER,R_HAND_LAYER)) + for(var/i=1,i<=disguises.len,i++) + var/datum/icon_snapshot/temp = disguises[i] + if(temp.name == entry.name) + disguises[i] = entry + return + disguises.Add(entry) + return + +/obj/machinery/abductor/console/attackby(O as obj, user as mob, params) + if(istype(O, /obj/item/device/abductor/gizmo)) + var/obj/item/device/abductor/gizmo/G = O + user << "You link the tool to the console." + gizmo = G + G.console = src + else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest)) + var/obj/item/clothing/suit/armor/abductor/vest/V = O + user << "You link the vest to the console." + vest = V + else + ..() \ No newline at end of file diff --git a/code/game/gamemodes/abduction/machinery/dispenser.dm b/code/game/gamemodes/abduction/machinery/dispenser.dm new file mode 100644 index 00000000000..d346e0366a5 --- /dev/null +++ b/code/game/gamemodes/abduction/machinery/dispenser.dm @@ -0,0 +1,82 @@ +/obj/machinery/abductor/gland_dispenser + name = "Replacement Organ Storage" + desc = "A tank filled with replacement organs" + icon = 'icons/obj/abductor.dmi' + icon_state = "dispenser" + density = 1 + anchored = 1 + var/list/gland_types + var/list/gland_colors + var/list/amounts + +/obj/machinery/abductor/gland_dispenser/proc/random_color() + //TODO : replace with presets or spectrum + return rgb(rand(0,255),rand(0,255),rand(0,255)) + +/obj/machinery/abductor/gland_dispenser/New() + gland_types = typesof(/obj/item/gland) - /obj/item/gland + gland_types = shuffle(gland_types) + gland_colors = new/list(gland_types.len) + amounts = new/list(gland_types.len) + for(var/i=1,i<=gland_types.len,i++) + gland_colors[i] = random_color() + amounts[i] = rand(1,5) + +/obj/machinery/abductor/gland_dispenser/attack_hand(var/mob/user as mob) + if(..()) + return + if(!IsAbductor(user)) + return + user.set_machine(src) + var/box_css = {" + "} + var/dat = "" + var/item_count = 0 + for(var/i=1,i<=gland_colors.len,i++) + item_count++ + var/g_color = gland_colors[i] + var/amount = amounts[i] + dat += "[amount]" + if(item_count == 3) // Three boxes per line + dat +="

" + item_count = 0 + var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) + popup.add_head_content(box_css) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/gland)) + user.drop_item() + W.loc = src + for(var/i=1,i<=gland_colors.len,i++) + if(gland_types[i] == W.type) + amounts[i]++ + +/obj/machinery/abductor/gland_dispenser/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + + if(href_list["dispense"]) + Dispense(text2num(href_list["dispense"])) + src.updateUsrDialog() + +/obj/machinery/abductor/gland_dispenser/proc/Dispense(var/count) + if(amounts[count]>0) + amounts[count]-- + var/T = gland_types[count] + new T(get_turf(src)) \ No newline at end of file diff --git a/code/game/gamemodes/abduction/machinery/experiment.dm b/code/game/gamemodes/abduction/machinery/experiment.dm new file mode 100644 index 00000000000..371011323df --- /dev/null +++ b/code/game/gamemodes/abduction/machinery/experiment.dm @@ -0,0 +1,204 @@ +/obj/machinery/abductor/experiment + name = "Experimental machinery" + desc = "A human-sized coffin sporting wide array of automatic surgery tools" + icon = 'icons/obj/abductor.dmi' + icon_state = "experiment-open" + density = 0 + anchored = 1 + state_open = 1 + var/points = 0 + var/list/history = new + var/flash = " - || - " + var/obj/machinery/abductor/console/console + +/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) + if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) + return + if(IsAbductor(target)) + return + close_machine(target) + +/obj/machinery/abductor/experiment/allow_drop() + return 0 + +/obj/machinery/abductor/experiment/attack_hand(mob/user) + if(..()) + return + + experimentUI(user) + +/obj/machinery/abductor/experiment/open_machine() + if(!state_open && !panel_open) + ..() + +/obj/machinery/abductor/experiment/close_machine(mob/target) + for(var/mob/living/carbon/C in loc) + if(IsAbductor(C)) + return + if(state_open && !panel_open) + ..(target) + +/obj/machinery/abductor/experiment/proc/dissection_icon(var/mob/living/carbon/human/H) + var/icon/photo = null + var/g = (H.gender == FEMALE) ? "f" : "m" + if(!config.mutant_races || H.dna.species.use_skintones) + photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s") + else + photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s") + photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY) + + var/icon/eyes_s + if(EYECOLOR in H.dna.species.specflags) + eyes_s = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[H.dna.species.eyes]_s") + eyes_s.Blend("#[H.eye_color]", ICON_MULTIPLY) + + var/datum/sprite_accessory/S + S = hair_styles_list[H.hair_style] + if(S && (HAIR in H.dna.species.specflags)) + var/icon/hair_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + hair_s.Blend("#[H.hair_color]", ICON_MULTIPLY) + eyes_s.Blend(hair_s, ICON_OVERLAY) + + S = facial_hair_styles_list[H.facial_hair_style] + if(S && (FACEHAIR in H.dna.species.specflags)) + var/icon/facial_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + facial_s.Blend("#[H.facial_hair_color]", ICON_MULTIPLY) + eyes_s.Blend(facial_s, ICON_OVERLAY) + + if(eyes_s) + photo.Blend(eyes_s, ICON_OVERLAY) + + var/icon/splat = icon("icon" = 'icons/mob/dam_human.dmi',"icon_state" = "chest30") + photo.Blend(splat,ICON_OVERLAY) + + return photo + +/obj/machinery/abductor/experiment/proc/experimentUI(mob/user) + var/dat + dat += "

Experiment

" + if(occupant) + var/obj/item/weapon/photo/P = new + P.photocreate(null, icon(dissection_icon(occupant), dir = SOUTH)) + user << browse_rsc(P.img, "dissection_img") + dat += "
" + dat += "" //Avert your eyes + dat += "" + dat += "Probe
" + dat += "Dissect
" + dat += "Analyze
" + dat += "
" + else + dat += " Experiment " + + if(!occupant) + dat += "

Machine Unoccupied

" + else + dat += "

Subject Status :

" + dat += "[occupant.name] => " + switch(occupant.stat) + if(0) + dat += "Conscious" + if(1) + dat += "Unconscious" + else + dat += "DEAD" + dat += "
" + dat += "[flash]" + dat += "
" + dat += "Scan" + dat += "Close" : "open=1'>Open"]" + var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.set_content(dat) + popup.open() + +/obj/machinery/abductor/experiment/Topic(href, href_list) + if(..() || usr == occupant) + return + usr.set_machine(src) + if(href_list["refresh"]) + updateUsrDialog() + return + if(href_list["open"]) + open_machine() + return + if(href_list["close"]) + close_machine() + return + if(occupant && occupant.stat != DEAD) + if(href_list["experiment"]) + flash = Experiment(occupant,href_list["experiment"]) + updateUsrDialog() + add_fingerprint(usr) + +/obj/machinery/abductor/experiment/proc/Experiment(var/mob/occupant,var/type) + var/mob/living/carbon/human/H = occupant + var/point_reward = 0 + if(H in history) + return "Specimen already in the database" + if(H.stat == DEAD) + say("Specimen deceased - please provide fresh sample.") + return "Specimen Deceased" + var/obj/item/gland/GlandTest = locate() in H + if(!GlandTest) + say("Experimental dissection not detected!") + return "No glands detected!" + if(H.mind != null || H.ckey != null) + history += H + say("Processing Specimen...") + sleep(5) + switch(text2num(type)) + if(1) + H << "You feel violated." + if(2) + H << "You feel being sliced and put back together." + if(3) + H << "You feel under intense scrutiny." + sleep(5) + H << "Your mind snaps!" + var/objtype = pick(typesof(/datum/objective/abductee/) - /datum/objective/abductee/) + var/datum/objective/abductee/O = new objtype() + H.mind.objectives += O + var/obj_count = 1 + H << "Your current objectives:" + for(var/datum/objective/objective in H.mind.objectives) + H << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + for(var/obj/item/gland/G in H) + G.Start() + point_reward++ + if(point_reward > 0) + open_machine() + SendBack(H) + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + points += point_reward + return "Experiment Successfull! [point_reward] new data-points collected." + else + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) + return "Experiment Failed! No replacement organ detected." + else + say("Brain Activity Nonexistant - Disposing Sample...") + open_machine() + SendBack(H) + return "Specimen Braindead - Disposed" + return "ERROR" + + +/obj/machinery/abductor/experiment/proc/SendBack(var/mob/living/carbon/human/H) + H.Sleeping(8) + var/area/A + if(console && console.pad && console.pad.teleport_target) + A = console.pad.teleport_target + else + A = teleportlocs[pick(teleportlocs)] + TeleportToArea(H,A) + +/obj/machinery/abductor/experiment/update_icon() + if(state_open) + icon_state = "experiment-open" + else + icon_state = "experiment" + +/obj/machinery/abductor/experiment/say_quote(text) + return "beeps, \"[text]\"" \ No newline at end of file diff --git a/code/game/gamemodes/abduction/machinery/pad.dm b/code/game/gamemodes/abduction/machinery/pad.dm new file mode 100644 index 00000000000..081f746a085 --- /dev/null +++ b/code/game/gamemodes/abduction/machinery/pad.dm @@ -0,0 +1,86 @@ +/obj/machinery/abductor/pad + name = "Alien Telepad" + desc = "Use this to transport to and from human habitat" + icon = 'icons/obj/abductor.dmi' + icon_state = "alien-pad-idle" + anchored = 1 + var/area/teleport_target + +/obj/machinery/abductor/proc/TeleportToArea(var/mob/living/target,var/area/thearea) + var/list/L = list() + for(var/turf/T in get_area_turfs(thearea.type)) + if(!T.density) + var/clear = 1 + for(var/obj/O in T) + if(O.density) + clear = 0 + break + if(clear) + L+=T + if(!L.len) + return + + if(target && target.buckled) + target.buckled.unbuckle_mob() + + var/list/tempL = L + var/attempt = null + var/success = 0 + while(tempL.len) + attempt = pick(tempL) + target.Move(attempt) + if(get_turf(target) == attempt) + success = 1 + break + else + tempL.Remove(attempt) + if(!success) + target.loc = pick(L) + +/obj/machinery/abductor/pad/proc/Warp(var/mob/living/target) + target.Move(src.loc) + +/obj/machinery/abductor/pad/proc/Send() + if(teleport_target == null) + teleport_target = teleportlocs[pick(teleportlocs)] + flick("alien-pad", src) + for(var/mob/living/target in src.loc) + TeleportToArea(target,teleport_target) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + +/obj/machinery/abductor/pad/proc/Retrieve(var/mob/living/carbon/human/target) + flick("alien-pad", src) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + Warp(target) + +/obj/machinery/abductor/pad/proc/MobToLoc(var/place,var/mob/living/target) + var/obj/effect/teleport_abductor/F = new(place) + var/datum/effect/effect/system/spark_spread/S = new + S.set_up(10,0,place) + S.start() + sleep(80) + qdel(F) + flick("alien-pad", src) + target.forceMove(place) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + +/obj/machinery/abductor/pad/proc/PadToLoc(var/place) + var/obj/effect/teleport_abductor/F = new(place) + var/datum/effect/effect/system/spark_spread/S = new + S.set_up(10,0,place) + S.start() + sleep(80) + qdel(F) + flick("alien-pad", src) + for(var/mob/living/target in src.loc) + target.forceMove(place) + spawn(0) + anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir) + + +/obj/effect/teleport_abductor + name = "Huh" + icon = 'icons/obj/abductor.dmi' + icon_state = "teleport" diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 7be421ee470..549243bf86c 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -71,21 +71,21 @@ M << "You are the [usr.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals." switch(type) if("destruction") - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(null) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null)) M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball." if("bluespace") - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt." if("healing") - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/charge(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null)) M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand) M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall." if("robeless") - M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(null) - M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(null) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) + M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null)) M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap." equip_antag(M) diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 32073430a46..aec57627778 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -1,4 +1,6 @@ /datum/game_mode/blob/check_finished() + if(replacementmode && round_converted == 2) + return replacementmode.check_finished() if(round_converted) return ..() if(infected_crew.len > burst)//Some blobs have yet to burst @@ -6,15 +8,18 @@ if(blobwincount <= blobs.len)//Blob took over return 1 if(!blob_cores.len) // blob is dead - if(config.continuous_round_blob) - round_converted = convert_roundtype() - if(!round_converted) - return 1 + if(config.continuous["blob"]) + SSshuttle.emergencyNoEscape = 0 if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) SSshuttle.emergency.mode = SHUTTLE_DOCKED SSshuttle.emergency.timer = world.time priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") - return 0 + + if(config.midround_antag["blob"]) + round_converted = convert_roundtype() + if(!round_converted) + return 1 + return ..() return 1 if(station_was_nuked)//Nuke went off return 1 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 736fa2e7df9..d08526eda5d 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -54,12 +54,11 @@ var/door = 0 var/grille = 0 var/mach = 0 + var/num_territories = 1//Number of total valid territories for gang mode -/datum/station_state/proc/count() - for(var/turf/T in world) - if(T.z != ZLEVEL_STATION) - continue +/datum/station_state/proc/count(var/count_territories) + for(var/turf/T in block(locate(1,1,1), locate(world.maxx,world.maxy,1))) if(istype(T,/turf/simulated/floor)) if(!(T:burnt)) @@ -79,20 +78,27 @@ else src.r_wall += 1 - for(var/obj/O in world) - if(O.z != ZLEVEL_STATION) - continue - if(istype(O, /obj/structure/window)) - src.window += 1 - else if(istype(O, /obj/structure/grille) && (!O:destroyed)) - src.grille += 1 - else if(istype(O, /obj/machinery/door)) - src.door += 1 - else if(istype(O, /obj/machinery)) - src.mach += 1 - return + for(var/obj/O in T.contents) + if(istype(O, /obj/structure/window)) + src.window += 1 + else if(istype(O, /obj/structure/grille) && (!O:destroyed)) + src.grille += 1 + else if(istype(O, /obj/machinery/door)) + src.door += 1 + else if(istype(O, /obj/machinery)) + src.mach += 1 + if(count_territories) + var/list/valid_territories = list() + for(var/area/A in world) //First, collect all area types on the station zlevel + if(A.z == ZLEVEL_STATION) + if(!(A.type in valid_territories) && A.valid_territory) + valid_territories |= A.type + if(valid_territories.len) + num_territories = valid_territories.len //Add them all up to make the total number of area types + else + world << "ERROR: NO VALID TERRITORIES" /datum/station_state/proc/score(var/datum/station_state/result) if(!result) return 0 diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index d8b317d1eb6..04508a5e2d0 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -35,6 +35,7 @@ melee_damage_upper = 4 attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' + speak_emote = list("pulses") var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 @@ -77,6 +78,7 @@ melee_damage_lower = 10 melee_damage_upper = 15 icon = H.icon + speak_emote = list("groans") icon_state = "zombie_s" H.hair_style = null H.update_hair() @@ -140,10 +142,11 @@ icon_dead = "blobbernaut_dead" health = 240 maxHealth = 240 - melee_damage_lower = 10 - melee_damage_upper = 10 + melee_damage_lower = 20 + melee_damage_upper = 20 attacktext = "hits" attack_sound = 'sound/effects/blobattack.ogg' + speak_emote = list("gurgles") minbodytemp = 0 maxbodytemp = 360 force_threshold = 10 @@ -151,16 +154,9 @@ mob_size = MOB_SIZE_LARGE -/mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget() - ..() - if(isliving(target)) - if(overmind) - overmind.blob_reagent_datum.reaction_mob(target, TOUCH) - - /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() return /mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed) ..(gibbed) - flick("blobbernaut_death", src) \ No newline at end of file + flick("blobbernaut_death", src) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 43c17da6211..e9d0eb6217c 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -2,7 +2,7 @@ /mob/camera/blob/proc/can_buy(var/cost = 15) if(blob_points < cost) - src << "You cannot afford this." + src << "You cannot afford this!" return 0 add_points(-cost) return 1 diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index c2c7d247809..b7dcf10b6f6 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -171,7 +171,7 @@ return /obj/effect/blob/proc/take_damage(damage, damage_type) - if(!damage) // Avoid divide by zero errors + if(!damage || damage_type == STAMINA) // Avoid divide by zero errors return switch(damage_type) if(BRUTE) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 17e34ff67e9..c8d581d08e9 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -88,9 +88,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" if(character.client.prefs.be_special & BE_CHANGELING) if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate")) if(age_check(character.client)) - if(!(character.job in ticker.mode.restricted_jobs)) + if(!(character.job in restricted_jobs)) character.mind.make_Changling() - ..() /datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling) //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 081db162a22..913b6dd295d 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -17,10 +17,10 @@ var/obj/item/weapon/grab/G = user.get_active_hand() if(!istype(G)) - user << "We must be grabbing a creature in our active hand to absorb them." + user << "We must be grabbing a creature in our active hand to absorb them!" return if(G.state <= GRAB_NECK) - user << "We must have a tighter grip to absorb this creature." + user << "We must have a tighter grip to absorb this creature!" return var/mob/living/carbon/target = G.affecting @@ -38,12 +38,10 @@ if(1) user << "This creature is compatible. We must hold still..." if(2) - user << "We extend a proboscis." - user.visible_message("[user] extends a proboscis!") + user.visible_message("[user] extends a proboscis!", "We extend a proboscis.") if(3) - user << "We stab [target] with the proboscis." - user.visible_message("[user] stabs [target] with the proboscis!") - target << "You feel a sharp stabbing pain!" + user.visible_message("[user] stabs [target] with the proboscis!", "We stab [target] with the proboscis.") + target << "You feel a sharp stabbing pain!" target.take_overall_damage(40) feedback_add_details("changeling_powers","A[stage]") @@ -52,9 +50,8 @@ changeling.isabsorbing = 0 return - user << "We have absorbed [target]!" - user.visible_message("[user] sucks the fluids from [target]!") - target << "You have been absorbed by the changeling!" + user.visible_message("[user] sucks the fluids from [target]!", "We have absorbed [target].") + target << "You are absorbed by the changeling!" if(!changeling.has_dna(target.dna)) changeling.absorb_dna(target, user) diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm index 5970b10de9c..a04b48ce627 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headcrab.dm @@ -1,6 +1,6 @@ /obj/effect/proc_holder/changeling/headcrab name = "Last Resort" - desc = "We sacrifce our current body in a moment of need, stunning and damaging everyone nearby. If a dead body is nearby we infect it to raise again." + desc = "We sacrifice our current body in a moment of need, stunning and damaging everyone nearby. If a dead body is nearby we infect it to raise again." chemical_cost = 20 dna_cost = 1 req_human = 1 @@ -11,6 +11,9 @@ spawn(5) // So it's not killed in explosion var/mob/living/simple_animal/hostile/headcrab/crab = new(turf) crab.origin = user.mind + if(user.mind) + user.mind.transfer_to(crab) + crab << "You burst out of the remains of your former body in a shower of gore!" user.gib() feedback_add_details("changeling_powers","LR") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index eb77d14ef3d..c96fc387697 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -23,19 +23,19 @@ /obj/effect/proc_holder/changeling/weapon/try_to_sting(var/mob/user, var/mob/target) if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh qdel(user.l_hand) - user.visible_message("With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "The [user.get_active_hand()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!" return var/obj/item/W = new weapon_type(user) user.put_in_hands(W) @@ -64,7 +64,7 @@ var/mob/living/carbon/human/H = user if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type)) - H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!") + H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!") qdel(H.wear_suit) qdel(H.head) H.update_inv_wear_suit() @@ -133,10 +133,10 @@ /obj/item/weapon/melee/arm_blade/New() ..() if(ismob(loc)) - loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") + loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") /obj/item/weapon/melee/arm_blade/dropped(mob/user) - user.visible_message("With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate the blade back into our body.", "With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate the blade back into our body.", "The airlock's motors resist our efforts to force it." + user << "The airlock's motors resist our efforts to force it!" return else if(A.locked) - user << "The airlock's bolts prevent it from being forced." + user << "The airlock's bolts prevent it from being forced!" return else //user.say("Heeeeeeeeeerrre's Johnny!") - user.visible_message("[user] forces the door to open with \his [src]!", "We force the door to open.", "You hear a metal screeching sound.") + user.visible_message("[user] forces the door to open with \his [src]!", "We force the door to open.", "You hear a metal screeching sound.") A.open(1) @@ -207,7 +207,7 @@ /obj/item/weapon/melee/shield/New() ..() if(ismob(loc)) - loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!") + loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!") /obj/item/clothing/head/helmet/space/changeling/dropped() qdel(src) @@ -216,7 +216,7 @@ if(remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.visible_message("With a sickening crunch, [H] reforms his shield into an arm!", "We assimilate our shield into our body", "With a sickening crunch, [H] reforms his shield into an arm!", "We assimilate our shield into our body", "[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") + loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") SSobj.processing += src /obj/item/clothing/suit/space/changeling/dropped() @@ -312,7 +312,7 @@ /obj/item/clothing/suit/armor/changeling/New() ..() if(ismob(loc)) - loc.visible_message("[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!", "We harden our flesh, creating a suit of armor!", "You hear organic matter ripping and tearing!") + loc.visible_message("[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!", "We harden our flesh, creating a suit of armor!", "You hear organic matter ripping and tearing!") /obj/item/clothing/suit/armor/changeling/dropped() qdel(src) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 292cbe9d52a..25960b275f3 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -73,6 +73,6 @@ if(character.client.prefs.be_special & BE_CHANGELING) if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate")) if(age_check(character.client)) - if(!(character.job in ticker.mode.restricted_jobs)) + if(!(character.job in restricted_jobs)) character.mind.make_Changling() ..() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 0f71d2ee0aa..3e31c0f573b 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -216,6 +216,7 @@ if (!istype(cult_mind)) return 0 if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind)) + cult_mind.current.Paralyse(5) cult += cult_mind cult_mind.current.cult_add_comm() update_cult_icons_added(cult_mind) @@ -233,6 +234,7 @@ if(cult_mind in cult) cult -= cult_mind cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm + cult_mind.current.Paralyse(5) cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it." cult_mind.memory = "" cult_mind.cult_words = initial(cult_mind.cult_words) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 32ae9b5a7e0..ac159322699 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -42,7 +42,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return if(ishuman(usr) || ismonkey(usr)) //Damage only applies to humans and monkeys, to allow constructs to communicate - usr.visible_message("[usr.name] starts clawing at his arms like a mad man!") + usr.visible_message("[usr.name] starts clawing at his arms like a mad man!", "You start clawing at his arms like a mad man!") apply_damage(25,BRUTE, "l_arm") apply_damage(25,BRUTE, "r_arm") sleep(50) @@ -55,7 +55,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", apply_damage(15,BRUTE, "r_arm") if(usr.incapacitated()) return - usr.visible_message("[usr.name] paints strange symbols with their own blood") + usr.visible_message("[usr.name] paints strange symbols with their own blood.", "You paint strange symbols with your own blood.") sleep(20) usr.say("O bidai nabora se[pick("'","`")]sma!") @@ -164,9 +164,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", /obj/effect/rune/attack_hand(mob/living/user as mob) // OH GOD this is horrible if(!iscultist(user)) - user << "You can't mouth the arcane scratchings without fumbling over them." + user << "You can't mouth the arcane scratchings without fumbling over them!" return - var/message = "You are unable to speak the words of the rune." + var/message = "You are unable to speak the words of the rune!" if(!user.can_speak(message) && (user.mind && !user.mind.miming)) user << message return @@ -236,7 +236,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", cultist.say(gibberish) else cultist.whisper(gibberish) - visible_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) + visible_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) return /obj/effect/rune/proc/check_icon() @@ -637,8 +637,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return for (var/mob/V in viewers(src)) - V.show_message("[user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2) - user << "You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." + V.show_message("[user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2) + user << "You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage if(do_after(user, 50)) if(usr.get_active_hand() != src) @@ -670,7 +670,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // if(M == user) for(var/entry in words) words[entry] = T.words[entry] - user << "You copy the translation notes from your tome." + user << "You copy the translation notes from your tome." /obj/item/weapon/tome/examine(mob/user) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index babeb58ab51..340aa519ba5 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -26,8 +26,8 @@ var/list/sacrificed = list() else user.whisper("Sas[pick("'","`")]so c'arta forbici!") user.visible_message("[user] disappears in a flash of red light!", \ - "You feel as your body gets dragged through the dimension of Nar-Sie!", \ - "You hear a sickening crunch and sloshing of viscera.") + "You feel as your body gets dragged through the dimension of Nar-Sie!", \ + "You hear a sickening crunch and sloshing of viscera.") user.loc = allrunesloc[rand(1,index)] return if(istype(src,/obj/effect/rune)) @@ -53,7 +53,7 @@ var/list/sacrificed = list() IP = R runecount++ if(runecount >= 2) - user << "You feel pain, as the rune disappears in reality shift caused by too much wear of space-time fabric" + user << "You feel pain, as the rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -85,7 +85,7 @@ var/list/sacrificed = list() usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") usr.visible_message("Rune disappears with a flash of red light, and in its place now a book lies.", \ "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \ - "You hear a pop and smell ozone.") + "You hear a pop and smell ozone.") if(istype(src,/obj/effect/rune)) new /obj/item/weapon/tome(src.loc) else @@ -110,8 +110,8 @@ var/list/sacrificed = list() C.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!") if(cultsinrange.len >= 3) M.visible_message("[M] writhes in pain as the markings below him glow a bloody red.", \ - "AAAAAAHHHH!", \ - "You hear an anguished scream.") + "AAAAAAHHHH!", \ + "You hear an anguished scream.") if(is_convertable_to_cult(M.mind)) ticker.mode.add_cultist(M.mind) M.mind.special_role = "Cultist" @@ -221,14 +221,14 @@ var/list/sacrificed = list() usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!") usr.visible_message("Blood flows from the rune into [usr]!", \ "The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \ - "You hear a liquid flowing.") + "You hear a liquid flowing.") var/mob/living/user = usr if(user.bhunger) user.bhunger = max(user.bhunger-2*drain,0) if(drain>=50) user.visible_message("[user]'s eyes give off eerie red glow!", \ "...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \ - "You hear a heartbeat.") + "You hear a heartbeat.") user.bhunger += drain src = user spawn() @@ -341,10 +341,10 @@ var/list/sacrificed = list() usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") corpse_to_raise.visible_message("[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \ "Life... I'm alive again...", \ - "You hear a faint, slightly familiar whisper.") + "You hear a faint, slightly familiar whisper.") body_to_sacrifice.visible_message("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \ "You feel as your blood boils, tearing you apart.", \ - "You hear a thousand voices, all crying in pain.") + "You hear a thousand voices, all crying in pain.") body_to_sacrifice.gib() // if(ticker.mode.name == "cult") @@ -396,7 +396,7 @@ var/list/sacrificed = list() usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!") usr.visible_message("[usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \ "The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \ - "You hear only complete silence for a moment.") + "You hear only complete silence for a moment.") usr.ghostize(1) L.ajourn = 1 while(L) @@ -431,7 +431,7 @@ var/list/sacrificed = list() var/mob/living/carbon/human/dummy/D = new(this_rune.loc) usr.visible_message("A shape forms in the center of the rune. A shape of... a man.", \ "A shape forms in the center of the rune. A shape of... a man.", \ - "You hear liquid flowing.") + "You hear liquid flowing.") D.real_name = "[pick(first_names_male)] [pick(last_names)]" D.status_flags = CANSTUN|CANWEAKEN|CANPARALYSE|CANPUSH @@ -453,7 +453,7 @@ var/list/sacrificed = list() if(D) D.visible_message("[D] slowly dissipates into dust and bones.", \ "You feel pain, as bonds formed between your soul and this homunculus break.", \ - "You hear faint rustle.") + "You hear faint rustle.") D.dust() return @@ -552,7 +552,7 @@ var/list/sacrificed = list() runedec+=10 user.visible_message("[user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \ "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \ - "You hear faint rustle.") + "You hear faint rustle.") for(,user.stat==2) sleep(600) if (!user) @@ -877,7 +877,7 @@ var/list/sacrificed = list() C.take_overall_damage(25, 0) user.visible_message("Rune disappears with a flash of red light, and in its place now a body lies.", \ "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ - "You hear a pop and smell ozone.") + "You hear a pop and smell ozone.") qdel(src) return fizzle(user) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 511fb402658..19ac0bf891f 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -84,7 +84,7 @@ spawn (rand(waittime_l, waittime_h)) send_intercept(0) start_state = new /datum/station_state() - start_state.count() + start_state.count(1) return 1 ///make_antag_chance() @@ -104,7 +104,7 @@ living_crew++ if(living_crew / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew") - return 0 + return null var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew) var/list/datum/game_mode/usable_modes = list() @@ -114,11 +114,9 @@ else del(G) - SSshuttle.emergencyNoEscape = 0 //Time to get the fuck out of here - if(!usable_modes) message_admins("Convert_roundtype failed due to no valid modes to convert to. Please report this error to the Coders.") - return 0 + return null replacementmode = pickweight(usable_modes) @@ -131,7 +129,7 @@ if(world.time >= (config.midround_antag_time_check * 600)) message_admins("Convert_roundtype failed due to round length. Limit is [config.midround_antag_time_check] minutes.") - return 0 + return null var/list/antag_canadates = list() @@ -141,7 +139,7 @@ if(!antag_canadates) message_admins("Convert_roundtype failed due to no antag canadates.") - return 0 + return null antag_canadates = shuffle(antag_canadates) @@ -150,9 +148,12 @@ if(config.protect_assistant_from_antagonist) replacementmode.restricted_jobs += "Assistant" - message_admins("The roundtype will be converted. If you feel that the round should not continue, end the round now.") + message_admins("The roundtype will be converted. If you have other plans for the station or think the round should end stop the creation of antags or end the round now.") - spawn(rand(1800,4200)) //somewhere between 3 and 7 minutes from now + spawn(rand(1200,3000)) //somewhere between 2 and 5 minutes from now + if(!config.midround_antag[ticker.mode.config_tag]) + round_converted = 0 + return 1 for(var/mob/living/carbon/human/H in antag_canadates) replacementmode.make_antag_chance(H) round_converted = 2 @@ -172,6 +173,42 @@ /datum/game_mode/proc/declare_completion() + var/clients = 0 + var/surviving_humans = 0 + var/surviving_total = 0 + var/ghosts = 0 + var/escaped_humans = 0 + var/escaped_total = 0 + + for(var/mob/M in player_list) + if(M.client) + clients++ + if(ishuman(M)) + if(!M.stat) + surviving_humans++ + if(M.z == 2) + escaped_humans++ + if(!M.stat) + surviving_total++ + if(M.z == 2) + escaped_total++ + + + if(isobserver(M)) + ghosts++ + + if(clients > 0) + feedback_set("round_end_clients",clients) + if(ghosts > 0) + feedback_set("round_end_ghosts",ghosts) + if(surviving_humans > 0) + feedback_set("survived_human",surviving_humans) + if(surviving_total > 0) + feedback_set("survived_total",surviving_total) + if(escaped_humans > 0) + feedback_set("escaped_human",escaped_humans) + if(escaped_total > 0) + feedback_set("escaped_total",escaped_total) send2irc("Server", "Round just ended.") return 0 @@ -226,6 +263,7 @@ if(BE_GANG) roletext="gangster" if(BE_CULTIST) roletext="cultist" if(BE_MONKEY) roletext="monkey" + if(BE_ABDUCTOR) roletext="abductor" // Ultimate randomizing code right here diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 76d11848dfe..4b5fed604e8 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -2,10 +2,19 @@ //Gang War Game Mode /datum/game_mode - var/list/datum/mind/A_bosses = list() //gang A bosses - var/list/datum/mind/A_gangsters = list() //gang A Members - var/list/datum/mind/B_bosses = list() //gang B bosses - var/list/datum/mind/B_gangsters = list() //gang B Members + var/list/datum/mind/A_gang = list() //gang A Members + var/list/datum/mind/B_gang = list() //gang B Members + var/list/datum/mind/A_bosses = list() //gang A Bosses + var/list/datum/mind/B_bosses = list() //gang B Bosses + var/obj/item/device/gangtool/A_tools = list() + var/obj/item/device/gangtool/B_tools = list() + var/datum/gang_points/gang_points + var/list/A_territory = list() + var/list/B_territory = list() + var/list/A_territory_new = list() + var/list/A_territory_lost = list() + var/list/B_territory_new = list() + var/list/B_territory_lost = list() /datum/game_mode/gang name = "gang war" @@ -16,15 +25,15 @@ required_enemies = 2 recommended_enemies = 2 enemy_minimum_age = 14 - var/finished = 0 - var/checkwin_counter = 0 + var/goal_scalar = 0.6 //Goal = Total territories x goal_scalar + /////////////////////////// //Announces the game type// /////////////////////////// /datum/game_mode/gang/announce() world << "The current game mode is - Gang War!" - world << "A violent turf war has erupted on the station!
Gangsters - Take over the station by recruiting gangsters and killing the rival gang's boss!
Crew - Identify and stop the mob bosses without killing either of them!
" + world << "A violent turf war has erupted on the station!
Gangsters - Take over the station by claiming more than [round(100*goal_scalar,1)]% of the station!
Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win!
" /////////////////////////////////////////////////////////////////////////////// @@ -69,39 +78,30 @@ modePlayer += B_bosses ..() - -/datum/game_mode/gang/process() - checkwin_counter++ - if(checkwin_counter >= 5) - if(!finished) - ticker.mode.check_win() - checkwin_counter = 0 - return 0 - /datum/game_mode/gang/proc/assign_bosses() var/datum/mind/boss = pick(antag_candidates) A_bosses += boss antag_candidates -= boss boss.special_role = "[gang_name("A")] Gang (A) Boss" - log_game("[boss.key] has been selected as a boss for the [gang_name("A")] Gang (A)") + log_game("[boss.key] has been selected as the boss for the [gang_name("A")] Gang (A)") boss = pick(antag_candidates) B_bosses += boss antag_candidates -= boss boss.special_role = "[gang_name("B")] Gang (B) Boss" - log_game("[boss.key] has been selected as a boss for the [gang_name("B")] Gang (B)") + log_game("[boss.key] has been selected as the boss for the [gang_name("B")] Gang (B)") /datum/game_mode/proc/forge_gang_objectives(var/datum/mind/boss_mind) var/datum/objective/rival_obj = new rival_obj.owner = boss_mind - rival_obj.explanation_text = "Assassinate or exile the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang's bosses." + rival_obj.explanation_text = "Claim more than 60% the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does." boss_mind.objectives += rival_obj /datum/game_mode/proc/greet_gang(var/datum/mind/boss_mind, var/you_are=1) var/obj_count = 1 if (you_are) - boss_mind.current << "You are a [(boss_mind in A_bosses) ? gang_name("A") : gang_name("B")] Gang Boss!" + boss_mind.current << "You are the founding member of the [(boss_mind in A_bosses) ? gang_name("A") : gang_name("B")] Gang!" for(var/datum/objective/objective in boss_mind.objectives) boss_mind.current << "Objective #[obj_count]: [objective.explanation_text]" obj_count++ @@ -118,51 +118,9 @@ mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself." mob.dna.remove_mutation(CLOWNMUT) - // find a radio! toolbox(es), backpack, belt, headset - var/loc = "" - var/obj/item/R = locate(/obj/item/device/pda) in mob.contents //Hide the uplink in a PDA if available, otherwise radio - if(!R) - R = locate(/obj/item/device/radio) in mob.contents - - if (!R) - mob << "Unfortunately, Your Syndicate benefactors wasn't able to get you an uplink." - . = 0 - else - if (istype(R, /obj/item/device/radio)) - // generate list of radio freqs - var/obj/item/device/radio/target_radio = R - var/freq = 1441 - var/list/freqlist = list() - while (freq <= 1489) - if (freq < 1451 || freq > 1459) - freqlist += freq - freq += 2 - if ((freq % 2) == 0) - freq += 1 - freq = freqlist[rand(1, freqlist.len)] - - var/obj/item/device/uplink/hidden/T = new(R) - target_radio.hidden_uplink = T - T.uplink_owner = "[mob.key]" - target_radio.traitor_frequency = freq - mob << "Your Syndicate benefactors have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features." - mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [loc]).") - else if (istype(R, /obj/item/device/pda)) - // generate a passcode if the uplink is hidden in a PDA - var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]" - - var/obj/item/device/uplink/hidden/T = new(R) - R.hidden_uplink = T - T.uplink_owner = "[mob.key]" - var/obj/item/device/pda/P = R - P.lock_code = pda_pass - - mob << "Your Syndicate benefactors have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features." - mob.mind.store_memory("Uplink Passcode: [pda_pass] ([R.name] [loc]).") - - var/obj/item/device/flash/T = new(mob) - var/obj/item/device/recaller/recaller = new(mob) - var/obj/item/toy/crayon/spraycan/SC = new(mob) + var/obj/item/weapon/pen/gang/T = new(mob) + var/obj/item/device/gangtool/gangtool = new(mob) + var/obj/item/toy/crayon/spraycan/gang/SC = new(mob) var/list/slots = list ( "backpack" = slot_in_backpack, @@ -174,28 +132,28 @@ . = 0 - var/spray = mob.equip_in_one_of_slots(SC,slots) - - if (!spray) - mob << "Your Syndicate benefactors were unfortunately unable to get you some spraypaint." - else - mob << "The Spraypaint in your [spray] will help you spread your message of unrest." - mob.update_icons() - - var/where2 = mob.equip_in_one_of_slots(recaller, slots) - if (!where2) - mob << "Your Syndicate benefactors were unfortunately unable to get you a Recaller." - else - mob << "The Recaller in your [where2] will allow you to prevent the station from prematurely evacuating. Use it to recall the emergency shuttle from anywhere on the station." - . += 2 - - var/where = mob.equip_in_one_of_slots(T, slots) + var/where = mob.equip_in_one_of_slots(gangtool, slots) if (!where) - mob << "Your Syndicate benefactors were unfortunately unable to get you a flash." + mob << "Your Syndicate benefactors were unfortunately unable to get you a Gangtool." else - mob << "The flash in your [where] will help you to persuade the crew to work for you." + gangtool.register_device(mob) + mob << "The Gangtool in your [where] will allow you to use your influence to purchase items and prevent the station from evacuating before you can take over. Use it to recall the emergency shuttle from anywhere on the station." + mob << "You can also promote your gang members to lieutenant by giving them an unregistered gangtool. Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools." . += 1 + var/where2 = mob.equip_in_one_of_slots(T, slots) + if (!where2) + mob << "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start." + else + mob << "The recruitment pen in your [where2] will help you get your gang started. Use it on unsuspecting crew members to recruit them." + . += 1 + + var/where3 = mob.equip_in_one_of_slots(SC, slots) + if (!where3) + mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start." + else + mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get." + . += 1 mob.update_icons() return . @@ -204,23 +162,16 @@ //Checks if the either gang have won or not// ///////////////////////////////////////////// /datum/game_mode/gang/check_win() - var/A_victory = check_gang_victory(B_bosses) //Check if B bosses are dead or exiled - var/B_victory = check_gang_victory(A_bosses) //Check if A bosses are dead or exiled - - if(A_victory && B_victory) - finished = "Draw" //Both teams fail. Allow for draws in case they're all incapacitated at the same time. - - else if(A_victory) + if(A_territory.len > (start_state.num_territories * goal_scalar)) finished = "A" //Gang A wins - - else if(B_victory) + else if(B_territory.len > (start_state.num_territories * goal_scalar)) finished = "B" //Gang B wins /////////////////////////////// //Checks if the round is over// /////////////////////////////// /datum/game_mode/gang/check_finished() - if(finished && !config.continuous_round_gang) //Check for Gang Boss death + if(finished) return 1 return ..() //Check for evacuation/nuke @@ -230,23 +181,28 @@ /datum/game_mode/proc/add_gangster(datum/mind/gangster_mind, var/gang, var/check = 1) if(check && isloyal(gangster_mind.current)) //Check to see if the potential gangster is implanted return 0 - if((gangster_mind in A_bosses) || (gangster_mind in A_gangsters) || (gangster_mind in B_bosses) || (gangster_mind in B_gangsters)) + if(gangster_mind in (A_bosses | A_gang | B_bosses | B_gang)) return 0 if(gang == "A") - A_gangsters += gangster_mind + A_gang += gangster_mind else - B_gangsters += gangster_mind + B_gang += gangster_mind if(check) - gangster_mind.current.Paralyse(5) + if(iscarbon(gangster_mind.current)) + var/mob/living/carbon/carbon_mob = gangster_mind.current + carbon_mob.silent = max(carbon_mob.silent, 5) + carbon_mob.flash_eyes(1, 1) + gangster_mind.current.Stun(5) gangster_mind.current << "You are now a member of the [gang=="A" ? gang_name("A") : gang_name("B")] Gang!" - gangster_mind.current << "Help your Boss take over the station by defeating the rival gang. You can identify your Boss by their brown \"B\" icon." + gangster_mind.current << "Help your bosses take over the station by claiming territory with the special spraycans they provide. Simply spray on any unclaimed area of the station." + gangster_mind.current << "You can identify your bosses by their brown \"G\" icon." gangster_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]!" gangster_mind.special_role = "[gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]" update_gang_icons_added(gangster_mind,gang) return 1 -////////////////////////////////////////////////////////////// -//Deals with players going straight (Not a gangster anymore)// -////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// +//Deals with players reverting to neutral (Not a gangster anymore)// +//////////////////////////////////////////////////////////////////// /datum/game_mode/proc/remove_gangster(datum/mind/gangster_mind, var/beingborged, var/silent, var/exclude_bosses=0) var/gang @@ -259,12 +215,12 @@ B_bosses -= gangster_mind gang = "B" - if(gangster_mind in A_gangsters) - A_gangsters -= gangster_mind + if(gangster_mind in A_gang) + A_gang -= gangster_mind gang = "A" - if(gangster_mind in B_gangsters) - B_gangsters -= gangster_mind + if(gangster_mind in B_gang) + B_gang -= gangster_mind gang = "B" if(!gang) //not a valid gangster @@ -321,21 +277,6 @@ ganghud.leave_hud(defector_mind.current) set_antag_hud(defector_mind.current, null) -/////////////////////////// -//Checks for gang victory// -/////////////////////////// -/datum/game_mode/gang/proc/check_gang_victory(var/list/boss_list) - if(!boss_list.len) - return 0 - for(var/datum/mind/boss_mind in boss_list) - if(boss_mind.current) - if(boss_mind.current.stat == DEAD || !ishuman(boss_mind.current) || !boss_mind.current.ckey) - return 1 - var/turf/T = get_turf(boss_mind.current) - if(T && (T.z != ZLEVEL_STATION)) //If they leave the station they count as dead for this - return 1 - return 0 - return 1 ////////////////////////////////////////////////////////////////////// //Announces the end of the game with all relavent information stated// @@ -343,10 +284,8 @@ /datum/game_mode/gang/declare_completion() if(!finished) world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before either gang could claim it!"]" - else if(finished == "Draw") - world << "All gang bosses have been killed or exiled!" else - world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang defeated their rivals!" + world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang has taken over the station!" ..() return 1 @@ -359,36 +298,22 @@ else winner = "Draw" - var/num_ganga = 0 - var/list/agang = A_gangsters + A_bosses - for(var/datum/mind/agangster in agang) - if(agangster.current) - if(agangster.current in living_mob_list) - num_ganga++ - - var/num_gangb = 0 - var/list/bgang = B_gangsters + B_bosses - for(var/datum/mind/bgangster in bgang) - if(bgangster.current) - if(bgangster.current in living_mob_list) - num_gangb++ - - if(A_bosses.len || A_gangsters.len) + if(A_bosses.len || A_gang.len) if(winner) - world << "
The [gang_name("A")] Gang was [winner=="A" ? "victorious" : "defeated"] with [num_ganga] members!" - world << "
The [gang_name("A")] Gang Boss was:" + world << "
The [gang_name("A")] Gang was [winner=="A" ? "victorious" : "defeated"] with [round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)]% control of the station!" + world << "
The [gang_name("A")] Gang Bosses were:" gang_membership_report(A_bosses) - world << "
The [gang_name("A")] Gangsters were:" - gang_membership_report(A_gangsters) + world << "
The [gang_name("A")] Gangsters were:" + gang_membership_report(A_gang) world << "
" - if(B_bosses.len || B_gangsters.len) + if(B_bosses.len || B_gang.len) if(winner) - world << "
The [gang_name("B")] Gang was [winner=="B" ? "victorious" : "defeated"] with [num_gangb] members!" - world << "
The [gang_name("B")] Gang Boss was:" + world << "
The [gang_name("B")] Gang was [winner=="B" ? "victorious" : "defeated"] with [round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)]% control of the station!
" + world << "
The [gang_name("B")] Gang Bosses were:" gang_membership_report(B_bosses) - world << "
The [gang_name("B")] Gangsters were:" - gang_membership_report(B_gangsters) + world << "
The [gang_name("B")] Gangsters were:" + gang_membership_report(B_gang) world << "
" /datum/game_mode/proc/gang_membership_report(var/list/membership) @@ -409,3 +334,125 @@ text += ")" world << text + + +////////////////////////////////////////////////////////// +//Handles influence, territories, and the victory checks// +////////////////////////////////////////////////////////// + +/datum/gang_points + var/A = 30 + var/B = 30 + var/next_point_time = 0 + +/datum/gang_points/proc/start() + next_point_time = world.time + 3000 + spawn(3000) + income() + +/datum/gang_points/proc/income() + var/A_added_names = "" + var/B_added_names = "" + var/A_lost_names = "" + var/B_lost_names = "" + + //Process lost territories + for(var/area in ticker.mode.A_territory_lost) + if(A_lost_names == "") + A_lost_names += ":
" + else + A_lost_names += ", " + A_lost_names += "[ticker.mode.A_territory_lost[area]], " + ticker.mode.A_territory -= area + + for(var/area in ticker.mode.B_territory_lost) + if(B_lost_names == "") + B_lost_names += ":
" + else + B_lost_names += ", " + B_lost_names += "[ticker.mode.B_territory_lost[area]], " + ticker.mode.B_territory -= area + + //Calculate and report influence growth + ticker.mode.message_gangtools(ticker.mode.A_tools,"[gang_name("A")] Gang Status Report:") + var/A_new = min(100,A + 15 + min(ticker.mode.A_territory.len, 15) + round(max(ticker.mode.A_territory.len - 15, 0) * 0.5,1)) + var/A_message = "" + if(A_new != A) + A_message += "Your gang has gained [A_new - A] Influence for holding on to [ticker.mode.A_territory.len] territories." + if(A_new == 100) + A_message += "Maximum influence reached." + A = A_new + ticker.mode.message_gangtools(ticker.mode.A_tools,A_message,0) + + ticker.mode.message_gangtools(ticker.mode.B_tools,"[gang_name("B")] Gang Status Report:") + var/B_new = min(100,B + 15 + min(ticker.mode.B_territory.len, 15) + round(max(ticker.mode.B_territory.len - 15, 0) * 0.5,1)) + var/B_message = "" + if(B_new != B) + B_message += "Your gang has gained [B_new - B] Influence for holding on to [ticker.mode.B_territory.len] territories." + if(B_new == 100) + B_message += "Maximum influence reached." + B = B_new + ticker.mode.message_gangtools(ticker.mode.B_tools,B_message,0) + + + //Remove territories they already own from the buffer, so if they got tagged over, they can still earn income if they tag it back before the next status report + ticker.mode.A_territory_new -= ticker.mode.A_territory + ticker.mode.B_territory_new -= ticker.mode.B_territory + + //Process new territories + for(var/area in ticker.mode.A_territory_new) + if(A_added_names == "") + A_added_names += ":
" + else + A_added_names += ", " + A_added_names += "[ticker.mode.A_territory_new[area]]" + ticker.mode.A_territory += area + + for(var/area in ticker.mode.B_territory_new) + if(B_added_names == "") + B_added_names += ":
" + else + B_added_names += ", " + B_added_names += "[ticker.mode.B_territory_new[area]]" + ticker.mode.B_territory += area + + //Report territory changes + ticker.mode.message_gangtools(ticker.mode.A_tools,"[ticker.mode.A_territory_new.len] new territories[A_added_names]",0) + ticker.mode.message_gangtools(ticker.mode.B_tools,"[ticker.mode.B_territory_new.len] new territories[B_added_names]",0,) + ticker.mode.message_gangtools(ticker.mode.A_tools,"[ticker.mode.A_territory_lost.len] territories lost[A_lost_names]",0,1) + ticker.mode.message_gangtools(ticker.mode.B_tools,"[ticker.mode.B_territory_lost.len] territories lost[B_lost_names]",0,1) + + //Clear the lists + ticker.mode.A_territory_new = list() + ticker.mode.B_territory_new = list() + ticker.mode.A_territory_lost = list() + ticker.mode.B_territory_lost = list() + + var/A_control = round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1) + var/B_control = round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1) + ticker.mode.message_gangtools((ticker.mode.A_tools),"Your gang now has [A_control]% control of the station.",0) + ticker.mode.message_gangtools((ticker.mode.A_tools),"The [gang_name("B")] Gang has [B_control]% control of the station.",0,1) + ticker.mode.message_gangtools((ticker.mode.B_tools),"Your gang now has [B_control]% control of the station.",0) + ticker.mode.message_gangtools((ticker.mode.B_tools),"The [gang_name("A")] Gang has [A_control]% control of the station.",0,1) + + //Victory check + ticker.mode.check_win() + + //Restart the counter + start() + + +//////////////////////////////////////////////// +//Sends a message to the boss via his gangtool// +//////////////////////////////////////////////// + +/datum/game_mode/proc/message_gangtools(var/list/gangtools,var/message,var/beep=1,var/warning) + if(!gangtools.len || !message) + return + for(var/obj/item/device/gangtool/tool in gangtools) + var/mob/living/mob = get(tool.loc,/mob/living) + if(mob && mob.mind) + if(((tool.gang == "A") && ((mob.mind in A_gang) || (mob.mind in A_bosses))) || ((tool.gang == "B") && ((mob.mind in B_gang) || (mob.mind in B_bosses)))) + mob << "\icon[tool] [message]" + if(beep) + playsound(mob.loc, 'sound/machines/twobeep.ogg', 50, 1) \ No newline at end of file diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 81ed244f086..e392f101ae7 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -228,9 +228,9 @@ */ /datum/intercept_text/proc/build_gang(datum/mind/correct_person) - src.text += "

Syndicate forces may be supplying opposing criminal organizations within your sector in an attempt at destabilizing our operations." - src.text += "Ensure law and order is maintained on the station and be on the lookout for violent confrontations between station factions." - src.text += "Central Command retains an interest in any criminal leaders captured by station security. The execution or exile of these persons are ill-advised." + src.text += "

We have recieved reports of a sudden increase of criminal activity in close proximity to our operations within your sector." + src.text += "Ensure law and order is maintained on the station and be on the lookout for unusually territorial behavior from the crew." + src.text += "In the event of a full-scale takeover attempt, sensitive research items are to be secured and the station evacuated ASAP." src.text += "

" /datum/intercept_text/proc/build_wizard(datum/mind/correct_person) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index cc74384e53a..b5576eab127 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -47,6 +47,10 @@ /mob/living/silicon/ai/proc/upgrade_turrets() set category = "Malfunction" set name = "Upgrade Turrets" + + if(!canUseTopic()) + return + src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets for(var/obj/machinery/porta_turret/turret in machines) if(turret.ai) //Make sure only the AI's turrets are affected. @@ -67,8 +71,7 @@ set category = "Malfunction" set name = "Initiate Hostile Lockdown" - if(src.stat == 2) - src <<"You cannot begin a lockdown because you are dead!" + if(!canUseTopic()) return if(malf_cooldown) @@ -105,8 +108,7 @@ set category = "Malfunction" set name = "Disable Lockdown" - if(src.stat == 2) - src <<"You cannot disable lockdown because you are dead!" + if(!canUseTopic()) return if(malf_cooldown) return @@ -141,6 +143,10 @@ /mob/living/silicon/ai/proc/disable_rcd() set category = "Malfunction" set name = "Disable RCDs" + + if(!canUseTopic()) + return + for(var/datum/AI_Module/large/disable_rcd/rcdmod in current_modules) if(rcdmod.uses > 0) rcdmod.uses -- @@ -165,6 +171,9 @@ set name = "Override Thermal Sensors" set category = "Malfunction" + if(!canUseTopic()) + return + for(var/obj/machinery/firealarm/F in world) if(F.z != ZLEVEL_STATION) continue @@ -186,6 +195,9 @@ set name = "Disable Air Alarm Safeties" set category = "Malfunction" + if(!canUseTopic()) + return + for(var/obj/machinery/alarm/A in world) if(A.z != ZLEVEL_STATION) continue @@ -207,11 +219,15 @@ /mob/living/silicon/ai/proc/overload_machine(obj/machinery/M as obj in world) set name = "Overload Machine" set category = "Malfunction" + + if(!canUseTopic()) + return + if (istype(M, /obj/machinery)) for(var/datum/AI_Module/small/overload_machine/overload in current_modules) if(overload.uses > 0) overload.uses -- - audible_message("You hear a loud electrical buzzing sound!") + audible_message("You hear a loud electrical buzzing sound!") src << "Overloading machine circuitry..." spawn(50) if(M) @@ -233,11 +249,15 @@ /mob/living/silicon/ai/proc/override_machine(obj/machinery/M as obj in world) set name = "Override Machine" set category = "Malfunction" + + if(!canUseTopic()) + return + if (istype(M, /obj/machinery)) for(var/datum/AI_Module/small/override_machine/override in current_modules) if(override.uses > 0) override.uses -- - audible_message("You hear a loud electrical buzzing sound!") + audible_message("You hear a loud electrical buzzing sound!") src << "Reprogramming machine behaviour..." spawn(50) if(M && !M.gc_destroyed) @@ -271,6 +291,9 @@ src << "Out of uses." return + if(!canUseTopic()) + return + var/sure = alert(src, "Make sure the room it is in is big enough, there is camera vision and that there is a 1x3 area for the machine. Are you sure you want to place the machine here?", "Are you sure?", "Yes", "No") if(sure != "Yes") return @@ -319,6 +342,10 @@ /mob/living/silicon/ai/proc/blackout() set category = "Malfunction" set name = "Blackout" + + if(!canUseTopic()) + return + for(var/datum/AI_Module/small/blackout/blackout in current_modules) if(blackout.uses > 0) blackout.uses -- @@ -341,6 +368,10 @@ /mob/living/silicon/ai/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras) set name = "Reactivate Camera" set category = "Malfunction" + + if(!canUseTopic()) + return + if (istype (C, /obj/machinery/camera)) for(var/datum/AI_Module/small/reactivate_camera/camera in current_modules) if(camera.uses > 0) @@ -365,6 +396,10 @@ /mob/living/silicon/ai/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras) set name = "Upgrade Camera" set category = "Malfunction" + + if(!canUseTopic()) + return + if(istype(C)) var/datum/AI_Module/small/upgrade_camera/UC = locate(/datum/AI_Module/small/upgrade_camera) in current_modules if(UC) @@ -391,11 +426,11 @@ if(upgraded) UC.uses -- C.visible_message("\icon[C] *beep*") - src << "Camera successully upgraded!" + src << "You successully upgrade the camera." else - src << "This camera is already upgraded!" + src << "This camera is already upgraded!" else - src << "Out of uses." + src << "Out of uses!" /datum/module_picker var/temp = null @@ -439,6 +474,10 @@ return var/mob/living/silicon/ai/A = usr + if(A.stat == DEAD) + A <<"You are already dead!" //Omae Wa Mou Shindeiru + return + for(var/datum/AI_Module/AM in possible_modules) if (href_list[AM.mod_pick_name]) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index f9a33fb2308..7271875daee 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -5,7 +5,7 @@ name = "AI malfunction" config_tag = "malfunction" antag_flag = BE_MALF - required_players = 1 + required_players = 25 required_enemies = 1 recommended_enemies = 1 pre_setup_before_jobs = 1 @@ -170,12 +170,14 @@ /datum/game_mode/malfunction/check_finished() - if(round_converted) - return ..() + if(replacementmode && round_converted == 2) + return replacementmode.check_finished() + if(round_converted == 1) //No reason to waste resources + return ..() //Check for evacuation/nuke if (station_captured && !to_nuke_or_not_to_nuke) return 1 if (is_malf_ai_dead() || !check_ai_loc()) - if(config.continuous_round_malf) + if(config.continuous["malfunction"]) if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) SSshuttle.emergency.mode = SHUTTLE_DOCKED SSshuttle.emergency.timer = world.time @@ -184,7 +186,11 @@ malf_mode_declared = 0 if(get_security_level() == "delta") set_security_level("red") - round_converted = convert_roundtype() + if(config.midround_antag["malfunction"]) + round_converted = convert_roundtype() + if(!round_converted) + return 1 + return ..() else return 1 return ..() //check for shuttle and nuke diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index b4b9edbac73..a8a74bbffb1 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -238,7 +238,7 @@ explosion(src.loc, 0, 0, 4, 3, 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) for(var/mob/living/L in view(5, src)) - L.apply_effect(40, IRRADIATE) + L.irradiate(40) //Meaty Ore /obj/effect/meteor/meaty @@ -267,7 +267,7 @@ //Meaty Ore Xeno edition /obj/effect/meteor/meaty/xeno color = "#5EFF00" - meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat/xeno + meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno meteorgibs = /obj/effect/gibspawner/xeno /obj/effect/meteor/meaty/xeno/ram_turf(var/turf/T) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index afd98a9ab5d..a863c31c8bd 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -164,6 +164,7 @@ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(synd_mob) R.set_frequency(radio_freq) + R.freqlock = 1 synd_mob.equip_to_slot_or_del(R, slot_ears) synd_mob.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(synd_mob), slot_w_uniform) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index bfccd051890..74e88d79bad 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -122,7 +122,7 @@ location = locate(locationx,locationy,Z.z) - usr << "You set the pinpointer to locate [locationx],[locationy]" + usr << "You set the pinpointer to locate [locationx],[locationy]" return attack_self() @@ -140,9 +140,9 @@ return target=locate(possible_items[targetitem]) if(!target) - usr << "Failed to locate [targetitem]!" + usr << "Failed to locate [targetitem]!" return - usr << "You set the pinpointer to locate [targetitem]" + usr << "You set the pinpointer to locate [targetitem]." if("DNA") var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "") if(!DNAstring) @@ -170,12 +170,13 @@ /obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob) if(!active) active = 1 + var/mode_text = "Authentication Disk Locator mode" if(!mode) workdisk() - user << "Authentication Disk Locator active." else + mode_text = "Shuttle Locator mode" worklocation() - user << "Shuttle Locator active." + user << "You activate the pinpointer([mode_text])." else active = 0 icon_state = "pinoff" @@ -191,7 +192,7 @@ mode = 1 //Ensures worklocation() continues to work worklocation() playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep - visible_message("Shuttle Locator active.") //Lets the mob holding it know that the mode has changed + visible_message("Shuttle Locator mode actived.") //Lets the mob holding it know that the mode has changed return //Get outta here scandisk() if(!the_disk) @@ -221,7 +222,7 @@ mode = 0 workdisk() playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) - visible_message("Authentication Disk Locator active.") + visible_message("Authentication Disk Locator mode actived.") return if(!home) home = SSshuttle.getShuttle("syndicate") diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 34713b6fb25..ca69a926263 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -49,7 +49,7 @@ datum/objective_item/steal/magboots datum/objective_item/steal/corgimeat name = "a piece of corgi meat" - targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi + targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi difficulty = 5 excludefromjob = list("Head of Personnel", "Quartermaster", "Cargo Technician") //>hurting your little buddy ever diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 5e6433647f4..87f62b30a0a 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -146,18 +146,15 @@ "left hand" = slot_l_hand, "right hand" = slot_r_hand, ) - var/spray = mob.equip_in_one_of_slots(R,slots) var/where = mob.equip_in_one_of_slots(T, slots) - if (!spray) - mob << "The Syndicate were unfortunately unable to get you some spraypaint." - else - mob << "The Spraypaint in your [spray] will help you spread your message of unrest and revolution." - mob.update_icons() + mob.equip_in_one_of_slots(R,slots) + + mob.update_icons() + if (!where) mob << "The Syndicate were unfortunately unable to get you a flash." else mob << "The flash in your [where] will help you to persuade the crew to join your cause." - mob.update_icons() return 1 ///////////////////////////////// @@ -182,7 +179,7 @@ for(var/datum/mind/rev_mind in head_revolutionaries) mark_for_death(rev_mind, head_mind) - if(max_headrevs < initial(max_headrevs) && max_headrevs < heads.len) + if(head_revolutionaries.len < max_headrevs && head_revolutionaries.len < heads.len) latejoin_headrev() /////////////////////////////// @@ -190,14 +187,19 @@ /////////////////////////////// /datum/game_mode/revolution/proc/latejoin_headrev() if(revolutionaries) //Head Revs are not in this list - var/datum/mind/stalin = pick(revolutionaries) - revolutionaries -= stalin - head_revolutionaries += stalin - log_game("[stalin.key] (ckey) has been promoted to a head rev") - equip_revolutionary(stalin.current) - forge_revolutionary_objectives(stalin) - greet_revolutionary(stalin) - ++max_headrevs + var/list/promotable_revs = list() + for(var/datum/mind/khrushchev in revolutionaries) + if(khrushchev.current && khrushchev.current.client && khrushchev.current.stat != DEAD) + if(khrushchev.current.client.prefs.be_special & BE_REV) + promotable_revs += khrushchev + if(promotable_revs) + var/datum/mind/stalin = pick(promotable_revs) + revolutionaries -= stalin + head_revolutionaries += stalin + log_game("[stalin.key] (ckey) has been promoted to a head rev") + equip_revolutionary(stalin.current) + forge_revolutionary_objectives(stalin) + greet_revolutionary(stalin) ////////////////////////////////////// //Checks if the revs have won or not// @@ -213,7 +215,7 @@ //Checks if the round is over// /////////////////////////////// /datum/game_mode/revolution/check_finished() - if(config.continuous_round_rev) + if(config.continuous["revolution"]) if(finished != 0) SSshuttle.emergencyNoEscape = 0 return ..() @@ -234,6 +236,11 @@ if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries)) return 0 revolutionaries += rev_mind + if(iscarbon(rev_mind.current)) + var/mob/living/carbon/carbon_mob = rev_mind.current + carbon_mob.silent = max(carbon_mob.silent, 5) + carbon_mob.flash_eyes(1, 1) + rev_mind.current.Stun(5) rev_mind.current << " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" rev_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the revolution!" rev_mind.special_role = "Revolutionary" @@ -253,6 +260,7 @@ message_admins("[key_name_admin(rev_mind.current)] ? has been borged while being a member of the revolution.") else + rev_mind.current.Paralyse(5) rev_mind.current << "You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..." update_rev_icons_removed(rev_mind) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm new file mode 100644 index 00000000000..372ee45ff10 --- /dev/null +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -0,0 +1,259 @@ +#define LIGHT_DAM_THRESHOLD 4 +#define LIGHT_HEAL_THRESHOLD 2 +#define LIGHT_DAMAGE_TAKEN 10 + +/* + +SHADOWLING: A gamemode based on previously-run events + +Aliens called shadowlings are on the station. +These shadowlings can 'enthrall' crew members and enslave them. +They also burn in the light but heal rapidly whilst in the dark. +The game will end under two conditions: + 1. The shadowlings die + 2. The emergency shuttle docks at CentCom + +Shadowling strengths: + - The dark + - Hard vacuum (They are not affected by it) + - Their thralls who are not harmed by the light + - Stealth + +Shadowling weaknesses: + - The light + - Fire + - Enemy numbers + - Lasers (Lasers are concentrated light and do more damage) + - Flashbangs (High stun and high burn damage; if the light stuns humans, you bet your ass it'll hurt the shadowling very much!) + +Shadowlings start off disguised as normal crew members, and they only have two abilities: Hatch and Enthrall. +They can still enthrall and perhaps complete their objectives in this form. +Hatch will, after a short time, cast off the human disguise and assume the shadowling's true identity. +They will then assume the normal shadowling form and gain their abilities. + +The shadowling will seem OP, and that's because it kinda is. Being restricted to the dark while being alone most of the time is extremely difficult and as such the shadowling needs powerful abilities. +Made by Xhuis + +*/ + + + +/* + GAMEMODE +*/ + + +/datum/game_mode + var/list/datum/mind/shadows = list() + var/list/datum/mind/thralls = list() + var/list/shadow_objectives = list() + var/required_thralls = 15 //How many thralls are needed (hardcoded for now) + var/shadowling_ascended = 0 //If at least one shadowling has ascended + var/shadowling_dead = 0 //is shadowling kill + + +/proc/is_thrall(var/mob/living/M) + return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.thralls) + + +/proc/is_shadow_or_thrall(var/mob/living/M) + return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.thralls) || (M.mind in ticker.mode.shadows)) + + +/proc/is_shadow(var/mob/living/M) + return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadows) + + +/datum/game_mode/shadowling + name = "shadowling" + config_tag = "shadowling" + antag_flag = BE_SHADOWLING + required_players = 30 + required_enemies = 2 + recommended_enemies = 2 + restricted_jobs = list("AI", "Cyborg") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") + +/datum/game_mode/shadowling/announce() + world << "The current game mode is - Shadowling!" + world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." + +/datum/game_mode/shadowling/pre_setup() + if(config.protect_roles_from_antagonist) + restricted_jobs += protected_jobs + + if(config.protect_assistant_from_antagonist) + restricted_jobs += "Assistant" + + for(var/datum/mind/player in antag_candidates) + for(var/job in restricted_jobs) + if(player.assigned_role == job) + antag_candidates -= player + + var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2 + + while(shadowlings) + var/datum/mind/shadow = pick(antag_candidates) + shadows += shadow + antag_candidates -= shadow + modePlayer += shadow + shadow.special_role = "Shadowling" + shadowlings-- + return 1 + + +/datum/game_mode/shadowling/post_setup() + for(var/datum/mind/shadow in shadows) + log_game("[shadow.key] (ckey) has been selected as a Shadowling.") + sleep(10) + shadow.current << "
" + shadow.current << "You are a shadowling!" + greet_shadow(shadow) + finalize_shadowling(shadow) + process_shadow_objectives(shadow) + //give_shadowling_abilities(shadow) + ..() + return + +/datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) + shadow.current << "Currently, you are disguised as an employee aboard [world.name]." + shadow.current << "In your limited state, you have three abilities: Enthrall, Hatch, and Hivemind Commune." + shadow.current << "Any other shadowlings are you allies. You must assist them as they shall assist you." + shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at https://tgstation13.org/wiki/Shadowling
" + + +/datum/game_mode/proc/process_shadow_objectives(var/datum/mind/shadow_mind) + var/objective = "enthrall" //may be devour later, but for now it seems murderbone-y + + if(objective == "enthrall") + var/objective_explanation = "Ascend to your true form by use of the Ascendance ability. This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." + shadow_objectives += "enthrall" + shadow_mind.memory += "Objective #1: [objective_explanation]" + shadow_mind.current << "Objective #1: [objective_explanation]
" + + +/datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind) + var/mob/living/carbon/human/S = shadow_mind.current + shadow_mind.current.verbs += /mob/living/carbon/human/proc/shadowling_hatch + shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/enthrall + spawn(0) + shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + update_shadow_icons_added(shadow_mind) + if(shadow_mind.assigned_role == "Clown") + S << "Your alien nature has allowed you to overcome your clownishness." + S.dna.remove_mutation(CLOWNMUT) + +/datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) + if (!istype(new_thrall_mind)) + return 0 + if(!(new_thrall_mind in thralls)) + update_shadow_icons_added(new_thrall_mind) + thralls += new_thrall_mind + new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall" + new_thrall_mind.memory += "The Shadowlings' Objectives: Ascend to your true form by use of the Ascendance ability. \ + This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." + new_thrall_mind.current << "The objectives of your shadowlings:: Ascend to your true form by use of the Ascendance ability. \ + This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." + new_thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + return 1 + + + +/* + GAME FINISH CHECKS +*/ + + +/datum/game_mode/shadowling/check_finished() + var/shadows_alive = 0 //and then shadowling was kill + for(var/datum/mind/shadow in shadows) //but what if shadowling was not kill? + if(!istype(shadow.current,/mob/living/carbon/human) && !istype(shadow.current,/mob/living/simple_animal/ascendant_shadowling)) + continue + if(shadow.current.stat == DEAD) + continue + shadows_alive++ + if(shadows_alive) + return ..() + else + shadowling_dead = 1 //but shadowling was kill :( + return 1 + + +/datum/game_mode/shadowling/proc/check_shadow_victory() + var/success = 0 //Did they win? + if(shadow_objectives.Find("enthrall")) + success = shadowling_ascended + return success + + +/datum/game_mode/shadowling/declare_completion() + if(check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X + world << "The shadowlings have ascended and taken over the station!" + else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round + world << "The shadowlings have been killed by the crew!" + else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) + world << "The crew has escaped the station before the shadowlings could ascend!" + ..() + return 1 + + +/datum/game_mode/proc/auto_declare_completion_shadowling() + var/text = "" + if(shadows.len) + text += "
The shadowlings were:" + for(var/datum/mind/shadow in shadows) + text += printplayer(shadow) + text += "
" + if(thralls.len) + text += "
The thralls were:" + for(var/datum/mind/thrall in thralls) + text += printplayer(thrall) + text += "
" + world << text + + +/* + MISCELLANEOUS +*/ + + +/datum/species/shadow/ling + //Normal shadowpeople but with enhanced effects + name = "Shadowling" + id = "shadowling" + say_mod = "chitters" + specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS) //Can't use guns due to muzzle flash + burnmod = 2 //2x burn damage lel + heatmod = 2 + +/datum/species/shadow/ling/spec_life(mob/living/carbon/human/H) + //H.shadowling_status = 1 //If they are affected more strongly by flashes and stuff + var/light_amount = 0 + H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry + if(isturf(H.loc)) //Copypasta + var/turf/T = H.loc + var/area/A = T.loc + if(A) + if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount + else light_amount = 10 + if(light_amount > LIGHT_DAM_THRESHOLD) //Not complete blackness - they can live in very small light levels plus starlight + H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) + H << "The light burns you!" + H << 'sound/weapons/sear.ogg' + else if (light_amount < LIGHT_HEAL_THRESHOLD) + H.heal_overall_damage(5,5) + H.adjustToxLoss(-5) + H.adjustBrainLoss(-25) //gibbering shadowlings are hilarious but also bad to have + H.adjustCloneLoss(-1) + H.SetWeakened(0) + H.SetStunned(0) + +/datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind) + var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW] + shadow_hud.join_hud(shadow_mind.current) + set_antag_hud(shadow_mind.current, ((shadow_mind in shadows) ? "shadowling" : "thrall")) + +/datum/game_mode/proc/update_shadow_icons_removed(datum/mind/shadow_mind) //This should never actually occur, but it's here anyway. + var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW] + shadow_hud.leave_hud(shadow_mind.current) + set_antag_hud(shadow_mind.current, null) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm new file mode 100644 index 00000000000..a21f41baa54 --- /dev/null +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -0,0 +1,663 @@ +/obj/effect/proc_holder/spell/targeted/glare + name = "Glare" + desc = "Stuns and mutes a target for a decent duration." + panel = "Shadowling Abilities" + charge_max = 300 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets) + for(var/mob/living/carbon/human/target in targets) + if(!ishuman(target)) + charge_counter = charge_max + return + if(target.stat) + charge_counter = charge_max + return + if(is_shadow_or_thrall(target)) + usr << "You don't see why you would want to paralyze an ally." + charge_counter = charge_max + return + + usr.visible_message("[usr]'s eyes flash a blinding red!") + target.visible_message("[target] freezes in place, their eyes glazing over...") + if(in_range(target, usr)) + target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights..." + else //Only alludes to the shadowling if the target is close by + target << "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights..." + target.Stun(10) + if(target.reagents) + target.reagents.add_reagent("mutetoxin", 4) //This is really bad but it's the only way it works. + + + +/obj/effect/proc_holder/spell/aoe_turf/veil + name = "Veil" + desc = "Extinguishes all electronic lights in a decent radius." + panel = "Shadowling Abilities" + charge_max = 250 //Short cooldown because people can just turn the lights back on + clothes_req = 0 + range = 5 + +/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets) + usr << "You silently disable all nearby lights." + var/list/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime) + for(var/turf/T in targets) + for(var/obj/item/device/flashlight/F in T.contents) + if(is_type_in_list(F, blacklisted_lights)) + F.visible_message("[F] goes slightly dim for a moment.") + return + F.on = 0 + F.visible_message("[F] gutters and falls dark.") + F.update_brightness() + for(var/obj/machinery/light/L in T.contents) + L.on = 0 + L.visible_message("[L] flickers and falls dark.") + L.update(0) + for(var/obj/item/device/pda/P in T.contents) + P.fon = 0 + P.SetLuminosity(0) + for(var/obj/effect/glowshroom/G in orange(2, usr)) //Very small radius + G.visible_message("\The [G] withers away!") + qdel(G) + for(var/mob/living/carbon/human/H in T.contents) + for(var/obj/item/device/flashlight/F in H) + if(is_type_in_list(F, blacklisted_lights)) + F.visible_message("[F] goes slightly dim for a moment.") + return + F.on = 0 + F.visible_message("[F] gutters and falls dark.") + F.update_brightness() + for(var/obj/item/device/pda/P in H) + P.fon = 0 + P.SetLuminosity(0) //failsafe + if(H != usr) + H << "You feel a chill and are plunged into darkness." + H.SetLuminosity(0) //This is required with the object-based lighting + + + +/obj/effect/proc_holder/spell/targeted/shadow_walk + name = "Shadow Walk" + desc = "Phases you into the space between worlds for a short time, allowing movement through walls and invisbility." + panel = "Shadowling Abilities" + charge_max = 600 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets) + for(var/mob/living/user in targets) + playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1) + user.visible_message("[user] vanishes into thin air!", "You enter the space between worlds as a passageway.") + user.SetStunned(0) + user.SetWeakened(0) + user.incorporeal_move = 1 + user.alpha = 0 + if(user.buckled) + user.buckled.unbuckle_mob() + sleep(40) //4 seconds + user.visible_message("[user] appears out of nowhere!", "The pressure becomes too much and you vacate the interdimensional darkness.") + user.incorporeal_move = 0 + user.alpha = 255 + + + +/obj/effect/proc_holder/spell/aoe_turf/flashfreeze + name = "Flash Freeze" + desc = "Instantly freezes the blood of nearby people, stunning them and causing burn damage." + panel = "Shadowling Abilities" + range = 5 + charge_max = 1200 + clothes_req = 0 + +/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets) + usr << "You freeze the nearby air." + playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1) + + for(var/turf/T in targets) + for(var/mob/living/carbon/human/target in T.contents) + if(is_shadow_or_thrall(target)) + if(target == usr) //No message for the user, of course + continue + else + target << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!" + continue + target << "You are hit by a blast of paralyzingly cold air and feel goosebumps break out across your body!" + target.Stun(2) + if(target.bodytemperature) + target.bodytemperature -= 200 //Extreme amount of initial cold + if(target.reagents) + target.reagents.add_reagent("frostoil", 15) //Half of a cryosting + + + +//Enthrall is the single most important spell +/obj/effect/proc_holder/spell/targeted/enthrall + name = "Enthrall" + desc = "Allows you to enslave a conscious, non-braindead, non-catatonic human to your will. This takes some time to cast." + panel = "Shadowling Abilities" + charge_max = 450 + clothes_req = 0 + range = 1 //Adjacent to user + var/enthralling = 0 + +/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets) + for(var/mob/living/carbon/human/target in targets) + if(!in_range(usr, target)) + usr << "You need to be closer to enthrall [target]." + charge_counter = charge_max + return + if(!target.ckey) + usr << "The target has no mind." + charge_counter = charge_max + return + if(target.stat) + usr << "The target must be conscious." + charge_counter = charge_max + return + if(is_shadow_or_thrall(target)) + usr << "You can not enthrall allies." + charge_counter = charge_max + return + if(!ishuman(target)) + usr << "You can only enthrall humans." + charge_counter = charge_max + return + if(enthralling) + usr << "You are already enthralling!" + charge_counter = charge_max + return + enthralling = 1 + usr << "This target is valid. You begin the enthralling." + target << "[usr] focuses in concentration. Your head begins to ache." + + for(var/progress = 0, progress <= 3, progress++) + switch(progress) + if(1) + usr << "You begin allocating energy for the enthralling." + usr.visible_message("[usr]'s eyes begin to throb a piercing red.") + if(2) + usr << "You begin the enthralling of [target]." + usr.visible_message("[usr] leans over [target], their eyes glowing a deep crimson, and stares into their face.") + target << "Your gaze is forcibly drawn into a blinding red light. You fall to the floor as conscious thought is wiped away." + target.Weaken(12) + sleep(20) + if(isloyal(target)) + usr << "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time." + usr.visible_message("[usr] halts for a moment, then begins passing its hand over [target]'s body.") + target << "You feel your loyalties begin to weaken!" + sleep(150) //15 seconds - not spawn() so the enthralling takes longer + usr << "The nanobots composing the loyalty implant have been rendered inert. Now to continue." + usr.visible_message("[usr] halts thier hand and resumes staring into [target]'s face.") + for(var/obj/item/weapon/implant/loyalty/L in target) + if(L && L.implanted) + qdel(L) + target << "Your unwavering loyalty to Nanotrasen falters, dims, dies." + if(3) + usr << "You begin rearranging [target]'s memories." + usr.visible_message("[usr]'s eyes flare brightly, and a horrible grin begins to spread across [target]'s face...") + target << "Your head cries out. The veil of reality begins to crumple and something evil bleeds through." //Ow the edge + if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant + usr << "The enthralling has been interrupted - your target's mind returns to its previous state." + target << "Your thoughts become coherent once more. Already you can barely remember what's happened to you." + enthralling = 0 + return + + enthralling = 0 + usr << "You have enthralled [target]!" + target << "You see the Truth. Reality has been torn away and you realize what a fool you've been." + target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." + target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." + target << "You can communicate with the other enlightened ones by using the Hivemind Commune ability." + target.adjustOxyLoss(-200) //In case the shadowling was choking them out + ticker.mode.add_thrall(target.mind) + target.mind.special_role = "Thrall" + + + +/obj/effect/proc_holder/spell/targeted/shadowling_hivemind + name = "Hivemind Commune" + desc = "Allows you to silently communicate with all other shadowlings and thralls." + panel = "Shadowling Abilities" + charge_max = 25 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/shadowling_hivemind/cast(list/targets) + for(var/mob/living/user in targets) + var/text = stripped_input(user, "What do you want to say to fellow thralls and shadowlings?.", "Hive Chat", "") + if(!text) + return + for(var/mob/M in mob_list) + if(is_shadow_or_thrall(M) || (M in dead_mob_list)) + M << "\[Hive Chat\] [usr.real_name]: [text]" + + + +/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor + name = "Regenerate Chitin" + desc = "Re-forms protective chitin that may be lost during cloning or similar processes." + panel = "Shadowling Abilities" + charge_max = 600 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets) + for(var/mob/living/user in targets) + user.visible_message("[user]'s skin suddenly bubbles and begins to shift around their body!", \ + "You regenerate your protective armor and cleanse your form of defects.") + user.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) + user.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes) + user.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit) + user.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head) + user.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) + user.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) + user.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses) + hardset_dna(user, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling + + + +/obj/effect/proc_holder/spell/targeted/collective_mind + name = "Collective Hivemind" + desc = "Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities." + panel = "Shadowling Abilities" + charge_max = 300 //30 second cooldown to prevent spam + clothes_req = 0 + range = -1 + include_user = 1 + var/blind_smoke_acquired + var/screech_acquired + var/drain_thrall_acquired + var/thrall_swap_acquired + +/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets) + for(var/mob/living/user in targets) + var/thralls = 0 + var/victory_threshold = 15 + var/mob/M + + user << "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls." + + for(M in living_mob_list) + if(is_thrall(M)) + thralls++ + M << "You feel hooks sink into your mind and pull." + + if(!do_after(user, 30)) + user << "Your concentration has been broken. The mental hooks you have sent out now retract into your mind." + return + + if(thralls >= 3 && !blind_smoke_acquired) + blind_smoke_acquired = 1 + user << "The power of your thralls has granted you the Blinding Smoke ability. It will create a choking cloud that will blind any non-thralls who enter. \ + " + user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/blindness_smoke + + if(thralls >= 5 && !drain_thrall_acquired) + drain_thrall_acquired = 1 + user << "The power of your thralls has granted you the Drain Thrall ability. You can now drain nearby thralls to heal yourself." + user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/drain_thralls + + if(thralls >= 7 && !screech_acquired) + screech_acquired = 1 + user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies." + user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech + + if(thralls >= 9 && !thrall_swap_acquired) + thrall_swap_acquired = 1 + user << "The power of your thralls has granted you the Spatial Relocation ability. This will, allow you to instantly swap places with one of your thralls in \ + addition to shattering nearby lights." + user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/spatial_relocation + + if(thralls < victory_threshold) + user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present." + + else if(thralls >= victory_threshold) + usr << "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls." + usr << "You may find Ascendance in the Shadowling Evolution tab." + for(M in living_mob_list) + if(is_shadow(M)) + M.mind.spell_list -= /obj/effect/proc_holder/spell/targeted/collective_mind + M.mind.current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch //In case a shadowling hasn't hatched + M.mind.current.verbs += /mob/living/carbon/human/proc/shadowling_ascendance + if(M == usr) + return + M << "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend." //Tells all the other shadowlings + + + +/obj/effect/proc_holder/spell/targeted/blindness_smoke + name = "Blindness Smoke" + desc = "Spews a cloud of smoke which will blind enemies." + panel = "Shadowling Abilities" + charge_max = 600 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets) //Extremely hacky + for(var/mob/living/user in targets) + user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") + user << "You regurgitate a vast cloud of blinding smoke." + playsound(user, 'sound/effects/bamf.ogg', 50, 1) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc) + B.reagents.clear_reagents() //Just in case! + B.icon_state = null //Invisible + B.reagents.add_reagent("blindness_smoke", 10) + var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + S.attach(B) + if(S) + S.set_up(B.reagents, 10, 0, B.loc) + S.start() + sleep(10) + S.start() + qdel(B) + +datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls + name = "!(%@ ERROR )!@$" + id = "blindness_smoke" + description = "<::ERROR::> CANNOT ANALYZE REAGENT <::ERROR::>" + color = "#000000" //Complete black (RGB: 0, 0, 0) + metabolization_rate = 100 //lel + +datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!is_shadow_or_thrall(M)) + M << "You breathe in the black smoke, and your eyes burn horribly!" + M.eye_blind = 5 + if(prob(25)) + M.visible_message("[M] screams and claws at their eyes!") + M.Stun(2) + else + M << "You breathe in the black smoke, and you feel revitalized!" + M.heal_organ_damage(2,2) + M.adjustOxyLoss(-2) + M.adjustToxLoss(-2) + ..() + return + + + +/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech + name = "Sonic Screech" + desc = "Deafens, stuns, and confuses nearby people. Also shatters windows." + panel = "Shadowling Abilities" + range = 7 + charge_max = 300 + clothes_req = 0 + +/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets) + usr.audible_message("[usr] lets out a horrible scream!") + playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1) + + for(var/turf/T in targets) + for(var/mob/target in T.contents) + if(is_shadow_or_thrall(target)) + if(target == usr) //No message for the user, of course + continue + else + continue + if(iscarbon(target)) + var/mob/living/carbon/M = target + M << "A spike of pain drives into your head and scrambles your thoughts!" + M.confused += 10 + M.setEarDamage(M.ear_damage + 3) + else if(issilicon(target)) + var/mob/living/silicon/S = target + S << "ERROR $!(@ ERROR )#^! SENSOR INTERFERENCE DETECTED" + S << 'sound/misc/interference.ogg' + playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) + var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread + sp.set_up(5, 1, S) + sp.start() + S.Weaken(6) + for(var/obj/structure/window/W in T.contents) + W.hit(rand(50,100)) + + + +/obj/effect/proc_holder/spell/aoe_turf/drain_thralls + name = "Drain Thralls" + desc = "Damages nearby thralls, draining their life and healing yourself." + panel = "Shadowling Abilities" + range = 3 + charge_max = 100 + clothes_req = 0 + var/thralls_drained = 0 + var/list/nearby_thralls = list() + +/obj/effect/proc_holder/spell/aoe_turf/drain_thralls/cast(list/targets) + thralls_drained = 0 + nearby_thralls = list() + for(var/turf/T in targets) + for(var/mob/living/carbon/M in T.contents) + if(is_thrall(M)) + thralls_drained++ + nearby_thralls.Add(M) + M << "You feel a curious draining sensation and a wave of exhaustion washes over you." + for(var/mob/living/carbon/M in nearby_thralls) + nearby_thralls.Remove(M) //To prevent someone dying like a zillion times + M.take_organ_damage(25/thralls_drained,25/thralls_drained) //For every nearby thrall, the damage to each is reduced - 1 thrall = 50 for him, 2 thralls = 25 for each, etc. + usr << "You draw the life from [M] to heal your wounds." + if(thralls_drained) + var/mob/living/carbon/U = usr + U.heal_organ_damage(25, 25) + else + charge_counter = charge_max + usr << "There were no nearby thralls for you to drain." + + + +/obj/effect/proc_holder/spell/targeted/spatial_relocation + name = "Spatial Relocation" + desc = "Swaps places with a thrall and breaks nearby lights." + panel = "Shadowling Abilities" + range = -1 + charge_max = 3000 + clothes_req = 0 + include_user = 1 + var/list/thralls_in_world = list() + +/obj/effect/proc_holder/spell/targeted/spatial_relocation/cast(list/targets, distanceoverride) + for(var/mob/living/carbon/human/M in world) + if(is_thrall(M)) + thralls_in_world += M + if(!thralls_in_world) + charge_counter = charge_max + return + var/mob/living/carbon/thrall_to_swap = input("Who do you wish to swap places with?", "Available Thralls") as null|anything in (thralls_in_world) + var/turf/shadowturf = get_turf(usr) + var/turf/thrallturf = get_turf(thrall_to_swap) + thrall_to_swap.visible_message("[thrall_to_swap] suddenly vanishes in a puff of black smoke!") + thrall_to_swap << "You feel a brief sense of nausea before finding yourself in an entirely new place!" + usr.visible_message("[usr] suddenly goes transparent and vanishes!") + usr << "You experience vertigo as you swap your location with [thrall_to_swap]'s." + thrall_to_swap.loc = shadowturf + usr.loc = thrallturf + thrall_to_swap.Weaken(4) + usr.Weaken(4) + usr.regenerate_icons() + thrall_to_swap.regenerate_icons() + +// ASCENDANT ABILITIES BEYOND THIS POINT // + +/obj/effect/proc_holder/spell/targeted/annihilate + name = "Annihilate" + desc = "Gibs a human after a short time." + panel = "Ascendant" + range = 7 + charge_max = 300 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + usr << "You are not in the same plane of existence. Unphase first." + charge_counter = charge_max + return + + for(var/mob/living/carbon/human/boom in targets) + if(is_shadow_or_thrall(boom)) + usr << "Making an ally explode seems unwise." + charge_counter = charge_max + return + usr.visible_message("[usr]'s eyes flare as they gesture at [boom]!", \ + "You direct a lance of telekinetic energy at [boom].") + boom << "You feel an immense pressure building all across your body!" + boom.Stun(10) + boom.audible_message("[boom] screams!") + sleep(20) + playsound(boom, 'sound/effects/splat.ogg', 100, 1) + boom.visible_message("[boom] explodes!") + boom.gib() + + + +/obj/effect/proc_holder/spell/targeted/hypnosis + name = "Hypnosis" + desc = "Instantly enthralls a human." + panel = "Ascendant" + range = 7 + charge_max = 450 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + charge_counter = charge_max + usr << "You are not in the same plane of existence. Unphase first." + return + + for(var/mob/living/carbon/human/target in targets) + if(is_shadow_or_thrall(target)) + usr << "You cannot enthrall an ally." + charge_counter = charge_max + return + if(!target.ckey) + usr << "The target has no mind." + charge_counter = charge_max + return + if(target.stat) + usr << "The target must be conscious." + charge_counter = charge_max + return + if(!ishuman(target)) + usr << "You can only enthrall humans." + charge_counter = charge_max + return + + usr << "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall." + target << "An agonizing spike of pain drives into your mind, and--" + target << "And you see the Truth. Reality has been torn away and you realize what a fool you've been." + target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." + target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." + target << "You can communicate with the other enlightened ones by using the Hivemind Commune ability." + ticker.mode.add_thrall(target.mind) + target.mind.special_role = "Thrall" + var/datum/mind/thrall_mind = target.mind + thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind + + + +/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift + name = "Phase Shift" + desc = "Phases you into the space between worlds at will, allowing you to move through walls and become invisible." + panel = "Ascendant" + range = -1 + include_user = 1 + charge_max = 15 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + for(SHA in targets) + SHA.phasing = !SHA.phasing + if(SHA.phasing) + SHA.visible_message("[SHA] suddenly vanishes!", \ + "You begin phasing through planes of existence. Use the ability again to return.") + SHA.incorporeal_move = 1 + SHA.alpha = 0 + else + SHA.visible_message("[SHA] suddenly appears from nowhere!", \ + "You return from the space between worlds.") + SHA.incorporeal_move = 0 + SHA.alpha = 255 + + + +/obj/effect/proc_holder/spell/aoe_turf/glacial_blast + name = "Glacial Blast" + desc = "Extremely empowered version of Flash Freeze." + panel = "Ascendant" + range = 5 + charge_max = 600 + clothes_req = 0 + +/obj/effect/proc_holder/spell/aoe_turf/glacial_blast/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + usr << "You are not in the same plane of existence. Unphase first." + return + + usr << "You freeze the nearby air." + playsound(usr.loc, 'sound/effects/ghost2.ogg', 100, 1) + + for(var/turf/T in targets) + for(var/mob/living/carbon/human/target in T.contents) + if(is_shadow_or_thrall(target)) + if(target == usr) //No message for the user, of course + continue + else + target << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!" + continue + target << "You are hit by a blast of cold unlike anything you have ever felt. Your limbs instantly lock in place and you feel ice burns across your body!" + target.Weaken(15) + if(target.bodytemperature) + target.bodytemperature -= INFINITY //:^) + target.take_organ_damage(0,80) + + + +/obj/effect/proc_holder/spell/targeted/vortex + name = "Vortex" + desc = "Tears open a hole in reality. Anyone, INCLUDING YOU, walking through it will be trapped there for eternity." + panel = "Ascendant" + range = -1 + include_user = 1 + charge_max = 1200 + clothes_req = 0 + +/obj/effect/proc_holder/spell/targeted/vortex/cast(list/targets) + var/mob/living/simple_animal/ascendant_shadowling/SHA = usr + if(SHA.phasing) + usr << "You are not in the same plane of existence. Unphase first." + return + + for(SHA in targets) + SHA.visible_message("[SHA] raises their arms upward as the markings on their body flare a blinding red!", \ + "You tear open a rift to the black space between worlds. It would be wise to avoid it.") + + new /obj/structure/shadow_vortex(SHA.loc) + + + +/obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant + name = "Ascendant Commune" + desc = "Allows you to silently communicate with all other shadowlings and thralls." + panel = "Ascendant" + charge_max = 20 + clothes_req = 0 + range = -1 + include_user = 1 + +/obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant/cast(list/targets) + for(var/mob/living/user in targets) + var/text = stripped_input(user, "What do you want to say to fellow thralls and shadowlings?.", "Hive Chat", "") + if(!text) + return + text = "[text]" + for(var/mob/M in mob_list) + if(is_shadow_or_thrall(M) || (M in dead_mob_list)) + M << "\[Hive Chat\] [usr.real_name] (ASCENDANT): [text]" //Bigger text for ascendants. diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm new file mode 100644 index 00000000000..01e0f5ae928 --- /dev/null +++ b/code/game/gamemodes/shadowling/shadowling_items.dm @@ -0,0 +1,103 @@ +/obj/item/clothing/under/shadowling + name = "blackened flesh" + desc = "Black, chitonous skin." + item_state = "golem" + origin_tech = null + icon_state = "golem" + flags = ABSTRACT | NODROP + has_sensor = 0 + unacidable = 1 + + +/obj/item/clothing/suit/space/shadowling + name = "chitin shell" + desc = "Dark, semi-transparent shell. Protects against vacuum, but not against the light of the stars." //Still takes damage from spacewalking but is immune to space itself + icon_state = "golem" + item_state = "golem" + body_parts_covered = FULL_BODY //Shadowlings are immune to space + cold_protection = FULL_BODY + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT + flags = ABSTRACT | NODROP | THICKMATERIAL + slowdown = 0 + unacidable = 1 + heat_protection = null //You didn't expect a light-sensitive creature to have heat resistance, did you? + max_heat_protection_temperature = null + + +/obj/item/clothing/shoes/shadowling + name = "chitin feet" + desc = "Charred-looking feet. They have minature hooks that latch onto flooring." + icon_state = "golem" + unacidable = 1 + flags = NOSLIP | ABSTRACT | NODROP + + +/obj/item/clothing/mask/gas/shadowling + name = "chitin mask" + desc = "A mask-like formation with slots for facial features. A red film covers the eyes." + icon_state = "golem" + item_state = "golem" + origin_tech = null + siemens_coefficient = 0 + unacidable = 1 + flags = ABSTRACT | NODROP + + +/obj/item/clothing/gloves/shadowling + name = "chitin hands" + desc = "An electricity-resistant covering of the hands." + icon_state = "golem" + item_state = null + origin_tech = null + siemens_coefficient = 0 + unacidable = 1 + flags = ABSTRACT | NODROP + + +/obj/item/clothing/head/shadowling + name = "chitin helm" + desc = "A helmet-like enclosure of the head." + icon_state = "golem" + item_state = null + origin_tech = null + unacidable = 1 + flags = ABSTRACT | NODROP + + +/obj/item/clothing/glasses/night/shadowling + name = "crimson eyes" + desc = "A shadowling's eyes. Very light-sensitive and can detect body heat through walls." + icon = null + icon_state = null + item_state = null + origin_tech = null + vision_flags = SEE_MOBS + darkness_view = 3 + invis_view = 2 + flash_protect = -1 + unacidable = 1 + flags = ABSTRACT | NODROP + + +/obj/structure/shadow_vortex + name = "vortex" + desc = "A swirling hole in the fabric of reality. Eye-watering chimes sound from its depths." + density = 0 + anchored = 1 + icon = 'icons/effects/genetics.dmi' + icon_state = "shadow_portal" + +/obj/structure/shadow_vortex/New() + src.audible_message("\The [src] lets out a dismaying screech as dimensional barriers are torn apart!") + playsound(loc, 'sound/effects/supermatter.ogg', 100, 1) + sleep(100) + qdel(src) + +/obj/structure/shadow_vortex/Crossed(var/td) + ..() + if(ismob(td)) + td << "You enter the rift. Sickening chimes begin to jangle in your ears. \ + All around you is endless blackness. After you see something moving, you realize it isn't entirely lifeless." //A bit of spooking before they die + playsound(loc, 'sound/effects/EMPulse.ogg', 25, 1) + qdel(td) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm new file mode 100644 index 00000000000..b1ff12edd22 --- /dev/null +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -0,0 +1,163 @@ +//In here: Hatch and Ascendance + +/mob/living/carbon/human/proc/shadowling_hatch() + set category = "Shadowling Evolution" + set name = "Hatch" + + if(usr.stat) + return + usr.verbs -= /mob/living/carbon/human/proc/shadowling_hatch + switch(alert("Are you sure you want to hatch? You cannot undo this!",,"Yes","No")) + if("No") + usr << "You decide against hatching for now." + usr.verbs += /mob/living/carbon/human/proc/shadowling_hatch + return + if("Yes") + usr.notransform = 1 + usr.visible_message("[usr]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!", \ + "You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.") + + for(var/obj/item/I in usr) //drops all items + usr.unEquip(I) + + sleep(50) + var/turf/simulated/floor/F + var/turf/shadowturf = get_turf(usr) + for(F in orange(1, usr)) + new /obj/structure/alien/resin/wall/shadowling(F) + for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky + qdel(R) + new /obj/structure/alien/weeds/node(shadowturf) //Dim lighting in the chrysalis -- removes itself with the chrysalis + + usr.visible_message("A chrysalis forms around [usr], sealing them inside.", \ + "You create your chrysalis and begin to contort within.") + + sleep(100) + usr.visible_message("The skin on [usr]'s back begins to split apart. Black spines slowly emerge from the divide.", \ + "Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.") + + sleep(90) + usr.visible_message("[usr], now no longer recognizable as human, begins clawing at the resin walls around them.", \ + "Your false skin slips away. You begin tearing at the fragile membrane protecting you.") + + sleep(80) + playsound(usr.loc, 'sound/weapons/slash.ogg', 25, 1) + usr << "You rip and slice." + sleep(10) + playsound(usr.loc, 'sound/weapons/slashmiss.ogg', 25, 1) + usr << "The chrysalis falls like water before you." + sleep(10) + playsound(usr.loc, 'sound/weapons/slice.ogg', 25, 1) + usr << "You are free!" + + sleep(10) + playsound(usr.loc, 'sound/effects/ghost.ogg', 100, 1) + usr.real_name = "Shadowling ([rand(1,1000)])" + usr.name = usr.real_name + usr.notransform = 0 + usr << "YOU LIVE!!!" + + for(var/obj/structure/alien/resin/wall/shadowling/W in orange(usr, 1)) + playsound(W, 'sound/effects/splat.ogg', 50, 1) + qdel(W) + for(var/obj/structure/alien/weeds/node/N in shadowturf) + qdel(N) + usr.visible_message("The chrysalis explodes in a shower of purple flesh and fluid!") + var/mob/living/carbon/human/M = usr + M.underwear = "Nude" + M.undershirt = "Nude" + M.socks = "Nude" + M.faction |= "faithless" + + usr.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) + usr.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes) + usr.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit) + usr.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head) + usr.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) + usr.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) + usr.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses) + hardset_dna(usr, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling + + sleep(10) + usr << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies." + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/glare + usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/veil + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadow_walk + usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/collective_mind + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor + + + +/mob/living/carbon/human/proc/shadowling_ascendance() + set category = "Shadowling Evolution" + set name = "Ascendance" + + if(usr.stat) + return + usr.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance + switch(alert("It is time to ascend. Are you completely sure about this? You cannot undo this!",,"Yes","No")) + if("No") + usr << "You decide against ascending for now." + usr.verbs += /mob/living/carbon/human/proc/shadowling_ascendance + return + if("Yes") + usr.notransform = 1 + usr.visible_message("[usr] rapidly bends and contorts, their eyes flaring a deep crimson!", \ + "You begin unlocking the genetic vault within you and prepare yourself for the power to come.") + + sleep(30) + usr.visible_message("[usr] suddenly shoots up a few inches in the air and begins hovering there, still twisting.", \ + "You hover into the air to make room for your new form.") + + sleep(60) + usr.visible_message("[usr]'s skin begins to pulse red in sync with their eyes. Their form slowly expands outward.", \ + "You feel yourself beginning to mutate.") + + sleep(20) + if(!ticker.mode.shadowling_ascended) + usr << "It isn't enough. Time to draw upon your thralls." + else + usr << "After some telepathic searching, you find the reservoir of life energy from the thralls and tap into it." + + sleep(50) + for(var/mob/M in mob_list) + if(is_thrall(M) && !ticker.mode.shadowling_ascended) + M.visible_message("[M] trembles minutely as their form turns to ash, black smoke pouring from their disintegrating face.", \ + "It's time! Your masters are ascending! Your last thoughts are happy as your body is drained of life.") + + ticker.mode.thralls -= M.mind //To prevent message spam + M.death(0) + M.dust() + + usr << "Drawing upon your thralls, you find the strength needed to finish and rend apart the final barriers to godhood." + + sleep(40) + for(var/mob/living/M in orange(7, src)) + M.Weaken(10) + M << "An immense pressure slams you onto the ground!" + usr << "YOU LIVE!!!" + world << "

A horrible wail echoes in your mind as the world plunges into blackness.


" + world << 'sound/hallucinations/veryfar_noise.ogg' + for(var/obj/machinery/power/apc/A in world) + A.overload_lighting() + var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(usr.loc) + usr.mind.spell_list = list() + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/annihilate + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/hypnosis + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_phase_shift + usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/glacial_blast + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/vortex + usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant + usr.mind.transfer_to(A) + A.name = usr.real_name + if(A.real_name) + A.real_name = usr.real_name + usr.alpha = 0 //This is pretty bad, but is also necessary for the shuttle call to function properly + usr.flags |= GODMODE + usr.notransform = 1 + sleep(50) + if(!ticker.mode.shadowling_ascended) + SSshuttle.emergency.request(null, 0.3) + ticker.mode.shadowling_ascended = 1 + qdel(usr) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index af52f87a109..37e40099e0b 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -81,9 +81,8 @@ if(character.client.prefs.be_special & BE_TRAITOR) if(!jobban_isbanned(character.client, "traitor") && !jobban_isbanned(character.client, "Syndicate")) if(age_check(character.client)) - if(!(character.job in ticker.mode.restricted_jobs)) + if(!(character.job in restricted_jobs)) add_latejoin_traitor(character.mind) - ..() /datum/game_mode/traitor/proc/add_latejoin_traitor(var/datum/mind/character) character.make_Traitor() diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 7df187b1aa6..3d30ba9e242 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -18,9 +18,9 @@ if(istype(O, /obj/item/weapon/antag_spawner/contract)) var/obj/item/weapon/antag_spawner/contract/contract = O if(contract.used) - user << "The contract has been used, you can't get your points back now." + user << "The contract has been used, you can't get your points back now!" else - user << "You feed the contract back into the spellbook, refunding your points." + user << "You feed the contract back into the spellbook, refunding your points." src.max_uses++ src.uses++ qdel(O) @@ -30,11 +30,11 @@ /obj/item/weapon/spellbook/attack_self(mob/user as mob) if(!owner) - user << "You bind the spellbook to yourself." + user << "You bind the spellbook to yourself." owner = user return if(user != owner) - user << "The [name] does not recognize you as it's owner and refuses to open." + user << "The [name] does not recognize you as it's owner and refuses to open!" return user.set_machine(src) var/dat @@ -100,7 +100,7 @@ dat += "Knock (10)
" dat += "This spell opens nearby doors and does not require wizard garb.
" - dat += "Curse of the Barnyward (15)
" + dat += "Curse of the Barnyward (15)
" dat += " This Spell dooms any unlucky soul to the life of a barnyard animal. Well not exactly but you still get to laugh at them when they MOO!. It does not require a wizard garb.
" dat += "Flesh to Stone (60)
" @@ -259,71 +259,71 @@ switch(href_list["spell_choice"]) if("magicmissile") feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)) temp = "You have learned magic missile." if("fireball") feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null)) temp = "You have learned fireball." if("disintegrate") feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(null)) temp = "You have learned disintegrate." if("disabletech") feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(null)) temp = "You have learned disable technology." if("repulse") feedback_add_details("wizard_spell_learned","RP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/repulse(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse(null)) temp = "You have learned repulse." if("smoke") feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/smoke(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/smoke(null)) temp = "You have learned smoke." if("blind") feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/trigger/blind(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/trigger/blind(null)) temp = "You have learned blind." if("mindswap") feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null)) temp = "You have learned mindswap." if("forcewall") feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null)) temp = "You have learned forcewall." if("blink") feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)) temp = "You have learned blink." if("teleport") feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) temp = "You have learned teleport." if("mutate") feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/genetic/mutate(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/genetic/mutate(null)) temp = "You have learned mutate." if("etherealjaunt") feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) temp = "You have learned ethereal jaunt." if("knock") feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) temp = "You have learned knock." if("fleshtostone") feedback_add_details("wizard_spell_learned","FS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone(null)) temp = "You have learned flesh to stone." if("summonitem") feedback_add_details("wizard_spell_learned","IS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/summonitem(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summonitem(null)) temp = "You have learned instant summons." if("lightningbolt") feedback_add_details("wizard_spell_learned","LB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/lightning(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lightning(null)) temp = "You have learned lightning bolt." if("summonguns") feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells @@ -352,7 +352,7 @@ if("soulstone") feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H)) - H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null)) temp = "You have purchased a belt full of soulstones and have learned the artificer spell." max_uses-- if("necrostone") @@ -384,7 +384,7 @@ max_uses-- if("barnyard") feedback_add_details("wizard_spell_learned","BC") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/barnyardcurse(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/barnyardcurse(null)) temp = "You have learned the curse of the barnyard." if("wands") feedback_add_details("wizard_spell_learned","WA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells @@ -439,7 +439,7 @@ if(used) recoil(user) else - user.mind.spell_list += S + user.mind.AddSpell(S) user <<"you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!" user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).") onlearned(user) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b6a7df9996f..ddce2321c47 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -171,42 +171,38 @@ /datum/game_mode/wizard/check_finished() - if(round_converted) - return ..() + if(replacementmode && round_converted == 2) + return replacementmode.check_finished() + + if(round_converted == 1 || !wizards) //No reason to waste resources + return ..() //Check for evacuation/nuke - var/wizards_alive = 0 - var/traitors_alive = 0 for(var/datum/mind/wizard in wizards) - if(!istype(wizard.current,/mob/living/carbon)) + if(!wizard.current) continue - if(wizard.current.stat==2) + if(wizard.current.stat != DEAD) + return ..() + + for(var/datum/mind/traitor in traitors) + if(!traitor.current) continue - wizards_alive++ + if(traitor.current.stat != DEAD) + return ..() - if(!wizards_alive) - for(var/datum/mind/traitor in traitors) - if(!istype(traitor.current,/mob/living/carbon)) - continue - if(traitor.current.stat==2) - continue - traitors_alive++ + if(!config.continuous["wizard"]) + return 1 - if (wizards_alive || traitors_alive) - return ..() + if(SSevent.wizardmode) //If summon events was active, turn it off + SSevent.toggleWizardmode() + SSevent.resetFrequency() - if(config.continuous_round_wiz) + if(config.midround_antag["wizard"]) round_converted = convert_roundtype() if(!round_converted) finished = 1 return 1 - else - if(SSevent.wizardmode) //If summon events was active, turn it off - SSevent.toggleWizardmode() - SSevent.resetFrequency() - return ..() - finished = 1 - return 1 + return ..() /datum/game_mode/wizard/declare_completion() if(finished) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 1cbffbab51d..00bbda4014e 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -194,13 +194,13 @@ if("Centcom Commander") return get_all_centcom_access() if("Emergency Response Team Commander") - return list(access_cent_general) + return get_ert_access("commander") if("Security Response Officer") - return list(access_cent_general) + return get_ert_access("sec") if("Engineer Response Officer") - return list(access_cent_general) + return get_ert_access("eng") if("Medical Response Officer") - return list(access_cent_general) + return get_ert_access("med") /proc/get_all_accesses() return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court, @@ -223,11 +223,11 @@ if("commander") return get_all_centcom_access() if("sec") - return list(access_cent_general, access_cent_specops) + return list(access_cent_general, access_cent_specops, access_cent_living) if("eng") - return list(access_cent_general, access_cent_storage) + return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage) if("med") - return list(access_cent_general, access_cent_medical) + return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_living) /proc/get_all_syndicate_access() return list(access_syndicate, access_syndicate) diff --git a/code/game/jobs/job/cargo_service.dm b/code/game/jobs/job/cargo_service.dm index a3f2f33b3b4..1708474abdf 100644 --- a/code/game/jobs/job/cargo_service.dm +++ b/code/game/jobs/job/cargo_service.dm @@ -42,7 +42,7 @@ Cargo Technician default_headset = /obj/item/device/radio/headset/headset_cargo access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_mineral_storeroom) - minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) + minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting, access_mineral_storeroom) /datum/job/cargo_tech/equip_items(var/mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform) diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index cd2e564b41b..90700b72776 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -78,8 +78,8 @@ Mime H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit) if(H.mind) - H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null) - H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mime/speak(null) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)) + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null)) H.mind.miming = 1 H.rename_self("mime") diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index bb9d5db7eee..c563482d147 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -43,7 +43,7 @@ /obj/machinery/pdapainter/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/device/pda)) if(storedpda) - user << "There is already a PDA inside." + user << "There is already a PDA inside!" return else var/obj/item/device/pda/P = usr.get_active_hand() diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 386c11d09c9..82d9841d328 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -36,7 +36,7 @@ else // trying to unlock the interface if (src.allowed(usr)) locked = !locked - user << "You [ locked ? "lock" : "unlock"] the device." + user << "You [ locked ? "lock" : "unlock"] the device." if (locked) if (user.machine==src) user.unset_machine() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index ce624c2abc7..0b11e742401 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -804,7 +804,7 @@ table tr:first-child th:first-child { border: none;} if(2) if(istype(W, /obj/item/weapon/wirecutters) && panel_open && (wires.wires_status == 27 || wires.wires_status == 31)) //this checks for all wires to be cut, except the syphon wire which is optional. playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You cut the final wires." + user << "You cut the final wires." var/obj/item/stack/cable_coil/cable = new /obj/item/stack/cable_coil( src.loc ) cable.amount = 5 buildstage = 1 @@ -814,7 +814,7 @@ table tr:first-child th:first-child { border: none;} if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up. playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open - user << "The wires have been [panel_open ? "exposed" : "unexposed"]" + user << "The wires have been [panel_open ? "exposed" : "unexposed"]." update_icon() return @@ -822,19 +822,19 @@ table tr:first-child th:first-child { border: none;} return src.attack_hand(user) else if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card if(stat & (NOPOWER|BROKEN)) - user << "It does nothing" + user << "It does nothing!" else if(src.allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked - user << "You [ locked ? "lock" : "unlock"] the Air Alarm interface." + user << "You [ locked ? "lock" : "unlock"] the air alarm interface." src.updateUsrDialog() else - user << "Access denied." + user << "Access denied." return if(1) if(istype(W, /obj/item/weapon/crowbar)) - user.visible_message("[user.name] removes the electronics from [src.name].",\ - "You start prying out the circuit.") + user.visible_message("[user.name] removes the electronics from [src.name].",\ + "You start prying out the circuit...") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) if (do_after(user, 20)) if (buildstage == 1) @@ -848,10 +848,10 @@ table tr:first-child th:first-child { border: none;} if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/cable = W if(cable.get_amount() < 5) - user << "You need five lengths of cable to wire the fire alarm." + user << "You need five lengths of cable to wire the fire alarm!" return - user.visible_message("[user.name] wires the air alarm.", \ - "You start wiring the air alarm.") + user.visible_message("[user.name] wires the air alarm.", \ + "You start wiring the air alarm...") if (do_after(user, 20)) if (cable.get_amount() >= 5 && buildstage == 1) cable.use(5) @@ -867,7 +867,7 @@ table tr:first-child th:first-child { border: none;} return if(0) if(istype(W, /obj/item/weapon/airalarm_electronics)) - user << "You insert the circuit!" + user << "You insert the circuit." buildstage = 1 update_icon() user.drop_item() @@ -875,7 +875,7 @@ table tr:first-child th:first-child { border: none;} return if(istype(W, /obj/item/weapon/wrench)) - user << "You detach \the [src] from the wall!" + user << "You detach \the [src] from the wall." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/alarm_frame( user.loc ) qdel(src) @@ -896,7 +896,7 @@ table tr:first-child th:first-child { border: none;} /obj/machinery/alarm/emag_act(mob/user as mob) if(!emagged) src.emagged = 1 - user.visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its safeties.") + user.visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its safeties.") playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1) return @@ -945,10 +945,10 @@ Code shamelessly copied from apc_frame var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "Air Alarm cannot be placed on this spot." + usr << "Air Alarm cannot be placed on this spot!" return if (A.requires_power == 0 || A.name == "Space") - usr << "Air Alarm cannot be placed in this area." + usr << "Air Alarm cannot be placed in this area!" return if(gotwallitem(loc, ndir)) @@ -1025,7 +1025,7 @@ FIRE ALARM /obj/machinery/firealarm/emag_act(mob/user as mob) if(!emagged) src.emagged = 1 - user.visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its thermal sensors.") + user.visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its thermal sensors.") playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1) return @@ -1056,7 +1056,7 @@ FIRE ALARM if (istype(W, /obj/item/weapon/screwdriver) && buildstage == 2) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open - user << "The wires have been [panel_open ? "exposed" : "unexposed"]" + user << "The wires have been [panel_open ? "exposed" : "unexposed"]." update_icon() return @@ -1066,9 +1066,9 @@ FIRE ALARM if (istype(W, /obj/item/device/multitool)) src.detecting = !( src.detecting ) if (src.detecting) - user.visible_message("[user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") + user.visible_message("[user] has reconnected [src]'s detecting unit!", "You reconnect [src]'s detecting unit.") else - user.visible_message("[user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") + user.visible_message("[user] has disconnected [src]'s detecting unit!", "You disconnect [src]'s detecting unit.") else if (istype(W, /obj/item/weapon/wirecutters)) buildstage = 1 @@ -1076,7 +1076,7 @@ FIRE ALARM var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil() coil.amount = 5 coil.loc = user.loc - user << "You cut the wires from \the [src]" + user << "You cut the wires from \the [src]." update_icon() if(1) if(istype(W, /obj/item/stack/cable_coil)) @@ -1088,32 +1088,32 @@ FIRE ALARM coil.use(5) buildstage = 2 - user << "You wire \the [src]!" + user << "You wire \the [src]." update_icon() else if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user.visible_message("[user.name] removes the electronics from [src.name].", \ - "You start prying out the circuit.") + user.visible_message("[user.name] removes the electronics from [src.name].", \ + "You start prying out the circuit...") if(do_after(user, 20)) if(buildstage == 1) if(stat & BROKEN) - user << "You remove the destroyed circuit!" + user << "You remove the destroyed circuit." else - user << "You pry out the circuit!" + user << "You pry out the circuit." new /obj/item/weapon/firealarm_electronics(user.loc) buildstage = 0 update_icon() if(0) if(istype(W, /obj/item/weapon/firealarm_electronics)) - user << "You insert the circuit!" + user << "You insert the circuit." qdel(W) buildstage = 1 update_icon() else if(istype(W, /obj/item/weapon/wrench)) - user.visible_message("[user] removes the fire alarm assembly from the wall!", \ - "You remove the fire alarm assembly from the wall!") + user.visible_message("[user] removes the fire alarm assembly from the wall.", \ + "You remove the fire alarm assembly from the wall.") var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame() frame.loc = user.loc playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 5450c05c626..3004a7a4389 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -245,7 +245,7 @@ update_flag transfer_moles = pressure_delta*thejetpack.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) thejetpack.merge(removed) - user << "You pulse-pressurize your jetpack from the tank." + user << "You pulse-pressurize your jetpack from the tank." return ..() diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 64f7f4c35b4..059464d70e9 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -92,8 +92,8 @@ if (do_after(user, 40)) user.visible_message( \ "[user] unfastens \the [src].", \ - "You have unfastened \the [src].", \ - "You hear ratchet.") + "You unfasten \the [src].", \ + "You hear ratchet.") new /obj/item/pipe_meter(src.loc) qdel(src) return diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index f264701ea04..d3a59024b15 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -38,7 +38,7 @@ name = "[name] (ID [id])" attack_hand(var/mob/user as mob) - usr << "You can't directly interact with this machine. Use the area atmos computer." + usr << "You can't directly interact with this machine! Use the area atmos computer." update_icon() src.overlays = 0 @@ -51,7 +51,7 @@ attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) if(on) - user << "Turn it off first!" + user << "Turn it off first!" return anchored = !anchored @@ -67,7 +67,7 @@ attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) - user << "The bolts are too tight for you to unscrew!" + user << "The bolts are too tight for you to unscrew!" return ..() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 2b82a9e7b1f..88fa45990a7 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -143,14 +143,14 @@ stack.use(amount) else if(!user.unEquip(O)) - user << "/the [O] is stuck to your hand, you can't put it in \the [src]!" + user << "/the [O] is stuck to your hand, you can't put it in \the [src]!" O.loc = src icon_state = "autolathe" busy = 1 use_power(max(1000, (m_amt+g_amt)*amount/10)) src.m_amount += m_amt * amount src.g_amount += g_amt * amount - user << "You insert [amount] sheet[amount>1 ? "s" : ""] to the autolathe." + user << "You insert [amount] sheet[amount>1 ? "s" : ""] to the autolathe." if (O && O.loc == src) qdel(O) busy = 0 diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 19883679181..9e33f0731db 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -48,8 +48,6 @@ var/beacon_freq = 1445 // navigation beacon frequency var/control_freq = 1447 // bot control frequency - var/bot_filter // The radio filter the bot uses to identify itself on the network. - var/bot_type = 0 //The type of bot it is, for radio control. #define SEC_BOT 1 // Secutritrons (Beepsky) and ED-209s #define MULE_BOT 2 // MULEbots @@ -69,7 +67,7 @@ #define BOT_SUMMON 6 // summoned by PDA #define BOT_CLEANING 7 // cleaning (cleanbots) #define BOT_REPAIRING 8 // repairing hull breaches (floorbots) - #define BOT_MOVING 9 // for clean/floor bots, when moving. + #define BOT_MOVING 9 // for clean/floor/med bots, when moving. #define BOT_HEALING 10 // healing people (medbots) #define BOT_RESPONDING 11 // responding to a call from the AI #define BOT_LOADING 12 // loading/unloading @@ -103,19 +101,19 @@ set_custom_texts() Radio = new /obj/item/device/radio(src) Radio.listening = 0 //Makes bot radios transmit only so no one hears things while adjacent to one. + spawn(5) + add_to_beacons() /obj/machinery/bot/Destroy() if(radio_controller) radio_controller.remove_object(src,beacon_freq) - if(bot_filter) - radio_controller.remove_object(src,control_freq) + radio_controller.remove_object(src,control_freq) ..() -/obj/machinery/bot/proc/add_to_beacons(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots. +/obj/machinery/bot/proc/add_to_beacons() //Master radio control for bots. Must be placed in the bot's local New() to support map spawned bots. if(radio_controller) radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS) - if(bot_filter) - radio_controller.add_object(src, control_freq, filter = bot_filter) + radio_controller.add_object(src, control_freq) /obj/machinery/bot/proc/explode() @@ -130,7 +128,7 @@ if(locked) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again. locked = 0 emagged = 1 - user << "You bypass [src]'s controls." + user << "You bypass [src]'s controls." if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. emagged = 2 remote_disabled = 1 //Manually emagging the bot locks out the AI built in panel. @@ -138,15 +136,15 @@ bot_reset() turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP. else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet. - user << "You need to open maintenance panel first." + user << "You need to open maintenance panel first!" /obj/machinery/bot/examine(mob/user) ..() if (health < maxhealth) if (health > maxhealth/3) - user << "[src]'s parts look loose." + user << "[src]'s parts look loose." else - user << "[src]'s parts look very loose." + user << "[src]'s parts look very loose!" else user << "[src] is in pristine condition." @@ -250,17 +248,17 @@ user.changeNext_move(CLICK_CD_MELEE) if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") if(health >= maxhealth) - user << "[src] does not need a repair." + user << "[src] does not need a repair!" return if(!open) - user << "Unable to repair with the maintenance panel closed." + user << "Unable to repair with the maintenance panel closed!" return var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) health = min(maxhealth, health+10) - user.visible_message("[user] repairs [src]!","You repair [src]!") + user.visible_message("[user] repairs [src]!","You repair [src].") else - user << "The welder must be on for this task." + user << "The welder must be on for this task!" else if(W.force) //if force is non-zero var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -376,12 +374,13 @@ obj/machinery/bot/proc/scan(var/scan_type, var/old_target, var/scan_range = DEFA for (var/scan in view (scan_range, src) ) //Search for something in range! if(!istype(scan, scan_type)) //Check that the thing we found is the type we want! continue //If not, keep searching! - if( !(scan in ignore_list) && (scan != old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness - var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected. - if( scan_result ) - final_result = scan_result - else - continue //The current element failed assessment, move on to the next. + if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness + continue + var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected. + if( scan_result ) + final_result = scan_result + else + continue //The current element failed assessment, move on to the next. return final_result //When the scan finds a target, run bot specific processing to select it for the next step. Empty by default. @@ -405,8 +404,13 @@ obj/machinery/bot/proc/bot_move(var/dest, var/move_speed) if(!dest || !path || path.len == 0) //A-star failed or a path/destination was not set. path = list() return 0 - if(get_turf(src) == get_turf(dest)) //We have arrived, no need to move again. + dest = get_turf(dest) //We must always compare turfs, so get the turf of the dest var if dest was originally something else. + var/turf/last_node = get_turf(path[path.len]) //This is the turf at the end of the path, it should be equal to dest. + if(get_turf(src) == dest) //We have arrived, no need to move again. return 1 + else if (dest != last_node) //The path should lead us to our given destination. If this is not true, we must stop. + path = list() + return 0 var/success var/step_count = move_speed ? move_speed : speed //If a value is passed into move_speed, use that instead of the default speed var. if(step_count >= 1 && tries < 4) @@ -703,8 +707,6 @@ obj/machinery/bot/proc/start_patrol() // send a radio signal with multiple data key/values /obj/machinery/bot/proc/post_signal_multiple(var/freq, var/list/keyval) - if(!z || z != 1) //Bot control will only work on station. - return var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) if(!frequency) return @@ -718,8 +720,6 @@ obj/machinery/bot/proc/start_patrol() // world << "sent [key],[keyval[key]] on [freq]" if(signal.data["findbeacon"]) frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - else if(signal.data["type"] == bot_type) - frequency.post_signal(src, signal, filter = bot_filter) else frequency.post_signal(src, signal) @@ -731,7 +731,8 @@ obj/machinery/bot/proc/start_patrol() "type" = bot_type, "name" = name, "loca" = get_area(src), // area - "mode" = mode + "mode" = mode, + "sect" = z // z-level, or "sector" ) post_signal_multiple(control_freq, kv) diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index b9b28435749..2b327a0da30 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -27,7 +27,6 @@ var/blood = 1 var/list/target_types = list() var/obj/effect/decal/cleanable/target - var/obj/effect/decal/cleanable/oldtarget var/max_targets = 50 //Maximum number of targets a cleanbot can ignore. var/oldloc = null req_one_access = list(access_janitor, access_robotics) @@ -40,7 +39,6 @@ var/next_dest_loc radio_frequency = SERV_FREQ //Service bot_type = CLEAN_BOT - bot_filter = RADIO_CLEANBOT /obj/machinery/bot/cleanbot/New() ..() @@ -51,9 +49,6 @@ botcard.access = J.get_access() prev_access = botcard.access - spawn(5) - add_to_beacons(bot_filter) - /obj/machinery/bot/cleanbot/turn_on() ..() icon_state = "cleanbot[on]" @@ -68,7 +63,6 @@ ..() ignore_list = list() //Allows the bot to clean targets it previously ignored due to being unreachable. target = null - oldtarget = null oldloc = null /obj/machinery/bot/cleanbot/set_custom_texts() @@ -163,21 +157,14 @@ text("[on ? "On" : "Off"]")) visible_message("[src] makes an excited beeping booping sound!") if(!target) //Search for cleanables it can see. - target = scan(/obj/effect/decal/cleanable/, oldtarget) - oldtarget = target + target = scan(/obj/effect/decal/cleanable/) - if(!target) - if(loc != oldloc) - oldtarget = null + if(!target && auto_patrol) //Search for cleanables it can see. + if(mode == BOT_IDLE || mode == BOT_START_PATROL) + start_patrol() - if(auto_patrol) - if(mode == BOT_IDLE || mode == BOT_START_PATROL) - start_patrol() - - if(mode == BOT_PATROL) - bot_patrol() - - return + if(mode == BOT_PATROL) + bot_patrol() if(target) if(!path || path.len == 0) //No path, need a new one diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 87f53d40a0c..c198b798974 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -35,7 +35,6 @@ var/shoot_sound = 'sound/weapons/Taser.ogg' radio_frequency = SEC_FREQ bot_type = SEC_BOT - bot_filter = RADIO_SECBOT /obj/item/weapon/ed209_assembly @@ -62,8 +61,6 @@ botcard.access = J.get_access() prev_access = botcard.access - - add_to_beacons(bot_filter) if(lasercolor) shot_delay = 6//Longer shot delay because JESUS CHRIST check_records = 0//Don't actively target people set to arrest @@ -270,7 +267,7 @@ Auto Patrol[]"}, var/area/location = get_area(src) speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag [target] in [location].", radio_frequency) target.visible_message("[src] has stunned [target]!",\ - "[src] has stunned [target]!
") + "[src] has stunned you!") mode = BOT_PREP_ARREST anchored = 1 @@ -300,7 +297,7 @@ Auto Patrol[]"}, mode = BOT_ARREST playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) target.visible_message("[src] is trying to put zipties on [target]!",\ - "[src] is trying to put zipties on [target]!") + "[src] is trying to put zipties on you!") spawn(60) if( !Adjacent(target) || !isturf(target.loc) ) //if he's in a closet or not adjacent, we cancel cuffing. @@ -588,7 +585,7 @@ Auto Patrol[]"}, if(WT.remove_fuel(0,user)) build_step++ name = "shielded frame assembly" - user << "You welded the vest to [src]." + user << "You weld the vest to [src]." if(4) switch(lasercolor) if("b") @@ -625,7 +622,7 @@ Auto Patrol[]"}, if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) - user << "You need one length of cable to wire the ED-209." + user << "You need one length of cable to wire the ED-209!" return user << "You start to wire [src]..." if (do_after(user, 40)) @@ -662,7 +659,7 @@ Auto Patrol[]"}, if(istype(W, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) var/turf/T = get_turf(user) - user << "Now attaching the gun to the frame..." + user << "You start attaching the gun to the frame..." sleep(40) if(get_turf(user) == T) build_step++ diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index 17ccdcc5830..fb262db136f 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -45,13 +45,11 @@ var/nagged = 0 //Prevents the Floorbot nagging more than once per refill. var/max_targets = 50 var/turf/target - var/turf/oldtarget var/oldloc = null req_one_access = list(access_construction, access_robotics) var/targetdirection radio_frequency = ENG_FREQ //Engineering channel bot_type = FLOOR_BOT - bot_filter = RADIO_FLOORBOT var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details. #define HULL_BREACH 1 #define BRIDGE_MODE 2 @@ -67,9 +65,6 @@ botcard.access = J.get_access() prev_access = botcard.access - spawn(5) - add_to_beacons(bot_filter) - /obj/machinery/bot/floorbot/turn_on() . = ..() updateicon() @@ -83,7 +78,6 @@ /obj/machinery/bot/floorbot/bot_reset() ..() target = null - oldtarget = null oldloc = null ignore_list = list() nagged = 0 @@ -145,7 +139,7 @@ nagged = 0 updateicon() else - user << "You need at least one floor tile to put into [src]" + user << "You need at least one floor tile to put into [src]!" else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(allowed(user) && !open && !emagged) locked = !locked @@ -209,11 +203,11 @@ if(amount <= 0 && !target) //Out of tiles! We must refill! if(eattiles) //Configured to find and consume floortiles! - target = scan(/obj/item/stack/tile/plasteel, oldtarget) + target = scan(/obj/item/stack/tile/plasteel) process_type = null if(!target && maketiles) //We did not manage to find any floor tiles! Scan for metal stacks and make our own! - target = scan(/obj/item/stack/sheet/metal, oldtarget) + target = scan(/obj/item/stack/sheet/metal) process_type = null return else @@ -232,24 +226,24 @@ target = T else //Find a space tile farther way! - target = scan(/turf/space, oldtarget) + target = scan(/turf/space) process_type = BRIDGE_MODE if(!target) process_type = HULL_BREACH //Ensures the floorbot does not try to "fix" space areas or shuttle docking zones. - target = scan(/turf/space, oldtarget) + target = scan(/turf/space) if(!target && replacetiles) //Finds a floor without a tile and gives it one. process_type = REPLACE_TILE //The target must be the floor and not a tile. The floor must not already have a floortile. - target = scan(/turf/simulated/floor, oldtarget) + target = scan(/turf/simulated/floor) if(!target && fixfloors) //Repairs damaged floors and tiles. process_type = FIX_TILE - target = scan(/turf/simulated/floor, oldtarget) + target = scan(/turf/simulated/floor) if(!target && emagged == 2) //We are emagged! Time to rip up the floors! process_type = TILE_EMAG - target = scan(/turf/simulated/floor, oldtarget) + target = scan(/turf/simulated/floor) if(!target) @@ -261,11 +255,6 @@ if(mode == BOT_PATROL) bot_patrol() - if(!target) - if(loc != oldloc) - oldtarget = null - return - if(target) if(path.len == 0) if(!istype(target, /turf/)) @@ -276,12 +265,10 @@ if(!bot_move(target)) add_to_ignore(target) - oldtarget = target target = null mode = BOT_IDLE return else if( !bot_move(target) ) - oldtarget = target target = null mode = BOT_IDLE return @@ -479,7 +466,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target) ..() return if(contents.len >= 1) - user << "They won't fit in, as there is already stuff inside." + user << "They won't fit in, as there is already stuff inside!" return if(T.use(10)) if(user.s_active) @@ -490,7 +477,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target) user.unEquip(src, 1) qdel(src) else - user << "You need 10 floor tiles to start building a floorbot." + user << "You need 10 floor tiles to start building a floorbot!" return /obj/item/weapon/toolbox_tiles/attackby(var/obj/item/W, mob/user as mob, params) @@ -500,7 +487,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target) var/obj/item/weapon/toolbox_tiles_sensor/B = new /obj/item/weapon/toolbox_tiles_sensor() B.created_name = created_name user.put_in_hands(B) - user << "You add the sensor to the toolbox and tiles!" + user << "You add the sensor to the toolbox and tiles." user.unEquip(src, 1) qdel(src) @@ -520,7 +507,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target) var/turf/T = get_turf(user.loc) var/obj/machinery/bot/floorbot/A = new /obj/machinery/bot/floorbot(T) A.name = created_name - user << "You add the robot arm to the odd looking toolbox assembly! Boop beep!" + user << "You add the robot arm to the odd looking toolbox assembly. Boop beep!" user.unEquip(src, 1) qdel(src) else if (istype(W, /obj/item/weapon/pen)) diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 4445626eb5e..3ac38374cc6 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -40,7 +40,6 @@ var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible. var/shut_up = 0 //self explanatory :) bot_type = MED_BOT - bot_filter = RADIO_MEDBOT /obj/machinery/bot/medbot/mysterious name = "\improper Mysterious Medibot" @@ -104,7 +103,6 @@ else botcard.access = botcard_access prev_access = botcard.access - add_to_beacons(bot_filter) /obj/machinery/bot/medbot/turn_on() . = ..() @@ -124,6 +122,12 @@ last_found = world.time declare_cooldown = 0 +/obj/machinery/bot/medbot/proc/soft_reset() //Allows the medibot to still actively perform its medical duties without being completely halted as a hard reset does. + path = list() + patient = null + mode = BOT_IDLE + last_found = world.time + /obj/machinery/bot/medbot/set_custom_texts() text_hack = "You corrupt [name]'s reagent processor circuits." @@ -230,16 +234,16 @@ if(emagged) user << "ERROR" if(open) - user << "Please close the access panel before locking it." + user << "Please close the access panel before locking it!" else user << "Access denied." else if (istype(W, /obj/item/weapon/reagent_containers/glass)) if(locked) - user << "You cannot insert a beaker because the panel is locked." + user << "You cannot insert a beaker because the panel is locked!" return if(!isnull(reagent_glass)) - user << "There is already a beaker loaded." + user << "There is already a beaker loaded!" return user.drop_item() @@ -260,7 +264,7 @@ if(emagged == 2) declare_crit = 0 if(user) - user << "You short out [src]'s reagent synthesis circuits." + user << "You short out [src]'s reagent synthesis circuits." spawn(0) audible_message("[src] buzzes oddly!") flick("medibot_spark", src) @@ -271,7 +275,7 @@ if (H.stat == 2) return - if ((H == oldpatient) && (world.time < last_found + 100)) + if ((H == oldpatient) && (world.time < last_found + 200)) return if(assess_patient(H)) @@ -306,10 +310,7 @@ if(frustration > 8) oldpatient = patient - patient = null - mode = BOT_IDLE - last_found = world.time - path = list() + soft_reset() if(!patient) if(!shut_up && prob(1)) @@ -334,21 +335,19 @@ last_found = world.time else if(stationary_mode && patient) //Since we cannot move in this mode, ignore the patient and wait for another. - patient = null - mode = BOT_IDLE - last_found = world.time + soft_reset() return if(patient && path.len == 0 && (get_dist(src,patient) > 1)) - spawn(0) - path = get_path_to(loc, get_turf(patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 30,id=botcard) + path = get_path_to(loc, get_turf(patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 30,id=botcard) + mode = BOT_MOVING + if(!path.len) //Do not chase a patient we cannot reach. + soft_reset() if(path.len > 0 && patient) if(!bot_move(patient)) oldpatient = patient - patient = null - mode = BOT_IDLE - last_found = world.time + soft_reset() return if(path.len > 8 && patient) @@ -483,7 +482,7 @@ return else C.visible_message("[src] is trying to inject [patient]!", \ - "[src] is trying to inject [patient]!") + "[src] is trying to inject you!") spawn(30) if ((get_dist(src, patient) <= 1) && (on)) @@ -493,8 +492,8 @@ reagent_glass.reagents.reaction(patient, INGEST) else patient.reagents.add_reagent(reagent_id,injection_amount) - C.visible_message("[src] injects [patient] with the syringe!", \ - "[src] injects [patient] with the syringe!") + C.visible_message("[src] injects [patient] with its syringe!", \ + "[src] injects you with its syringe!") patient = null mode = BOT_IDLE @@ -554,7 +553,7 @@ //Making a medibot! if(contents.len >= 1) - user << "You need to empty [src] out first." + user << "You need to empty [src] out first!" return var/obj/item/weapon/firstaid_arm_assembly/A = new /obj/item/weapon/firstaid_arm_assembly @@ -599,7 +598,7 @@ user.drop_item() qdel(W) build_step++ - user << "You complete the Medibot! Beep boop." + user << "You complete the Medibot. Beep boop!" var/turf/T = get_turf(src) var/obj/machinery/bot/medbot/S = new /obj/machinery/bot/medbot(T) S.skin = skin diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index c810c626fbe..17e2305723b 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -23,7 +23,6 @@ var/global/mulebot_count = 0 beacon_freq = 1400 control_freq = 1447 bot_type = MULE_BOT - bot_filter = RADIO_MULEBOT blood_DNA = list() suffix = "" @@ -71,8 +70,6 @@ var/global/mulebot_count = 0 cell.maxcharge = 2000 spawn(5) // must wait for map loading to finish - add_to_beacons(bot_filter) - mulebot_count += 1 if(!suffix) suffix = "#[mulebot_count]" @@ -101,7 +98,7 @@ obj/machinery/bot/mulebot/bot_reset() updateDialog() else if(istype(I,/obj/item/weapon/screwdriver)) if(locked) - user << "The maintenance hatch cannot be opened or closed while the controls are locked." + user << "The maintenance hatch cannot be opened or closed while the controls are locked!" return open = !open @@ -118,8 +115,8 @@ obj/machinery/bot/mulebot/bot_reset() if (health < maxhealth) health = min(maxhealth, health+25) user.visible_message( - "[user] repairs [src]!", - "You repair [src]!" + "[user] repairs [src]!", + "You repair [src]." ) else user << " [src] does not need a repair!" @@ -131,7 +128,7 @@ obj/machinery/bot/mulebot/bot_reset() unload(0) user.visible_message(" [user] knocks [load] off [src] with \the [I]!", " You knock [load] off [src] with \the [I]!") else - user << "You hit [src] with \the [I] but to no effect." + user << "You hit [src] with \the [I] but to no effect!" else ..() return @@ -269,7 +266,7 @@ obj/machinery/bot/mulebot/bot_reset() turn_off() else if (cell && !open) if (!turn_on()) - usr << "You can't switch on [src]." + usr << "You can't switch on [src]!" return else return @@ -284,7 +281,7 @@ obj/machinery/bot/mulebot/bot_reset() cell.add_fingerprint(usr) cell = null - usr.visible_message("[usr] removes the power cell from [src].", "You remove the power cell from [src].") + usr.visible_message("[usr] removes the power cell from [src].", "You remove the power cell from [src].") updateDialog() if("cellinsert") @@ -296,7 +293,7 @@ obj/machinery/bot/mulebot/bot_reset() C.loc = src C.add_fingerprint(usr) - usr.visible_message("[usr] inserts a power cell into [src].", "You insert the power cell into [src].") + usr.visible_message("[usr] inserts a power cell into [src].", "You insert the power cell into [src].") updateDialog() @@ -402,7 +399,7 @@ obj/machinery/bot/mulebot/bot_reset() // called to load a crate /obj/machinery/bot/mulebot/proc/load(var/atom/movable/C) if(wires.LoadCheck() && !istype(C,/obj/structure/closet/crate)) - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") + visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) return // if not emagged, only allow crates to be loaded @@ -596,25 +593,25 @@ obj/machinery/bot/mulebot/bot_reset() blockcount++ mode = BOT_BLOCKED if(blockcount == 3) - visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") + visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) if(blockcount > 10) // attempt 10 times before recomputing // find new path excluding blocked turf - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") + visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) spawn(2) calc_path(next) if(path.len > 0) - visible_message("[src] makes a delighted ping!", "You hear a ping.") + visible_message("[src] makes a delighted ping!", "You hear a ping.") playsound(loc, 'sound/machines/ping.ogg', 50, 0) mode = BOT_BLOCKED mode = BOT_WAIT_FOR_NAV return return else - visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") + visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) //world << "Bad turf." mode = BOT_NAV @@ -634,11 +631,11 @@ obj/machinery/bot/mulebot/bot_reset() if(path.len > 0) blockcount = 0 mode = BOT_BLOCKED - visible_message("[src] makes a delighted ping!", "You hear a ping.") + visible_message("[src] makes a delighted ping!", "You hear a ping.") playsound(loc, 'sound/machines/ping.ogg', 50, 0) else - visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") + visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) mode = BOT_NO_ROUTE @@ -685,7 +682,7 @@ obj/machinery/bot/mulebot/bot_reset() /obj/machinery/bot/mulebot/proc/at_target() if(!reached_target) radio_frequency = SUPP_FREQ //Supply channel - visible_message("[src] makes a chiming sound!", "You hear a chime.") + visible_message("[src] makes a chiming sound!", "You hear a chime.") playsound(loc, 'sound/machines/chime.ogg', 50, 0) reached_target = 1 @@ -883,8 +880,6 @@ obj/machinery/bot/mulebot/bot_reset() //world << "sent [key],[keyval[key]] on [freq]" if (signal.data["findbeacon"]) frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - else if (signal.data["type"] == MULE_BOT) - frequency.post_signal(src, signal, filter = RADIO_MULEBOT) else frequency.post_signal(src, signal) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 0596bbe5b5e..b8a0114fc33 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -25,7 +25,6 @@ var/arrest_type = 0 //If true, don't handcuff radio_frequency = SEC_FREQ //Security channel bot_type = SEC_BOT - bot_filter = RADIO_SECBOT /obj/machinery/bot/secbot/beepsky name = "Officer Beep O'sky" @@ -58,7 +57,6 @@ var/datum/job/detective/J = new/datum/job/detective botcard.access = J.get_access() prev_access = botcard.access - add_to_beacons(bot_filter) /obj/machinery/bot/secbot/turn_on() @@ -232,7 +230,7 @@ Auto Patrol: []"}, var/area/location = get_area(src) speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag [target] in [location].", radio_frequency) target.visible_message("[src] has stunned [target]!",\ - "[src] has stunned [target]!") + "[src] has stunned you!") mode = BOT_PREP_ARREST anchored = 1 @@ -262,7 +260,7 @@ Auto Patrol: []"}, mode = BOT_ARREST playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) target.visible_message("[src] is trying to put zipties on [target]!",\ - "[src] is trying to put zipties on [target]!") + "[src] is trying to put zipties on you!") spawn(60) if( !Adjacent(target) || !isturf(target.loc) ) //if he's in a closet or not adjacent, we cancel cuffing. return @@ -397,10 +395,10 @@ Auto Patrol: []"}, 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." + 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." + user << "The mounted flashlight is in the way, remove it first!" return if(S.secured) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index f93b7f48696..347bb920016 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -133,7 +133,7 @@ //user << "You start to [panel_open ? "close" : "open"] the camera's panel." //if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown panel_open = !panel_open - user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!", + user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!", "You screw the camera's panel [panel_open ? "open" : "closed"].") playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) @@ -142,7 +142,7 @@ else if(istype(W, /obj/item/weapon/weldingtool) && wires.CanDeconstruct()) if(weld(W, user)) - user << "You unweld the camera leaving it as just a frame screwed to the wall." + user << "You unweld the camera leaving it as just a frame screwed to the wall." if(!assembly) assembly = new() assembly.loc = src.loc @@ -191,7 +191,7 @@ P = W itemname = P.name info = P.notehtml - U << "You hold \the [itemname] up to the camera ..." + U << "You hold \the [itemname] up to the camera..." U.changeNext_move(CLICK_CD_MELEE) for(var/mob/O in player_list) if(istype(O, /mob/living/silicon/ai)) @@ -321,7 +321,7 @@ if(!WT.remove_fuel(0, user)) return 0 - user << "You start to weld [src]." + user << "You start to weld [src]..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 100)) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 10d4c1716b6..e5544d1d410 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -30,7 +30,7 @@ // State 0 if(istype(W, /obj/item/weapon/wrench) && isturf(src.loc)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You wrench the assembly into place." + user << "You wrench the assembly into place." anchored = 1 state = 1 update_icon() @@ -41,14 +41,14 @@ // State 1 if(istype(W, /obj/item/weapon/weldingtool)) if(weld(W, user)) - user << "You weld the assembly securely into place." + user << "You weld the assembly securely into place." anchored = 1 state = 2 return else if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You unattach the assembly from its place." + user << "You unattach the assembly from its place." anchored = 0 update_icon() state = 0 @@ -62,14 +62,14 @@ user << "You add wires to the assembly." state = 3 else - user << "You need two lengths of cable to wire a camera." + user << "You need two lengths of cable to wire a camera!" return return else if(istype(W, /obj/item/weapon/weldingtool)) if(weld(W, user)) - user << "You unweld the assembly from its place." + user << "You unweld the assembly from its place." state = 1 anchored = 1 return @@ -82,12 +82,12 @@ var/input = stripped_input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13") if(!input) - usr << "No input found please hang up and try your call again." + usr << "No input found, please hang up and try your call again!" return var/list/tempnetwork = text2list(input, ",") if(tempnetwork.len < 1) - usr << "No network found please hang up and try your call again." + usr << "No network found, please hang up and try your call again!" return state = 4 @@ -115,13 +115,13 @@ new/obj/item/stack/cable_coil(get_turf(src), 2) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You cut the wires from the circuits." + user << "You cut the wires from the circuits." state = 2 return // Upgrades! if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already. - user << "You attach \the [W] into the assembly inner circuits." + user << "You attach \the [W] into the assembly inner circuits." upgrades += W user.drop_item() W.loc = src @@ -131,7 +131,7 @@ else if(istype(W, /obj/item/weapon/crowbar) && upgrades.len) var/obj/U = locate(/obj) in upgrades if(U) - user << "You unattach an upgrade from the assembly." + user << "You unattach an upgrade from the assembly." playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) U.loc = get_turf(src) upgrades -= U @@ -156,7 +156,7 @@ if(!WT.remove_fuel(0, user)) return 0 - user << "You start to weld \the [src].." + user << "You start to weld \the [src]..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 20)) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 59731eaa01b..e1b05f5c6c8 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -38,25 +38,25 @@ if(istype(W, /obj/item/weapon/stock_parts/cell) && anchored) if(charging) - user << "There is already a cell in the charger." + user << "There is already a cell in the charger!" return else var/area/a = loc.loc // Gets our locations location, like a dream within a dream if(!isarea(a)) return if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power! - user << "The [name] blinks red as you try to insert the cell!" + user << "The [name] blinks red as you try to insert the cell!" return user.drop_item() W.loc = src charging = W - user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") + user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") chargelevel = -1 updateicon() else if(istype(W, /obj/item/weapon/wrench)) if(charging) - user << "Remove the cell first!" + user << "Remove the cell first!" return anchored = !anchored @@ -76,7 +76,7 @@ user.put_in_hands(charging) charging.add_fingerprint(user) - user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") + user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") removecell() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ab45982bb34..87be0acbdf5 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -83,7 +83,7 @@ /obj/item/weapon/disk/data/attack_self(mob/user as mob) read_only = !read_only - user << "You flip the write-protect tab to [src.read_only ? "protected" : "unprotected"]." + user << "You flip the write-protect tab to [src.read_only ? "protected" : "unprotected"]." /obj/item/weapon/disk/data/examine(mob/user) ..() @@ -270,7 +270,7 @@ /obj/machinery/clonepod/emag_act(user as mob) if (isnull(src.occupant)) return - user << "You force an emergency ejection." + user << "You force an emergency ejection." src.locked = 0 src.go_out() diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index c96493032e7..6d127808ceb 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -308,7 +308,7 @@ if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) var/obj/item/weapon/grab/G = W if(G.state < GRAB_AGGRESSIVE) - user << " You need a better grip to do that!" + user << " You need a better grip to do that!" return G.affecting.loc = src.loc G.affecting.Weaken(5) @@ -427,7 +427,7 @@ if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) var/obj/item/weapon/grab/G = W if(G.state < GRAB_AGGRESSIVE) - user << "You need a better grip to do that!" + user << "You need a better grip to do that!" return G.affecting.loc = src.loc G.affecting.Weaken(5) @@ -474,7 +474,7 @@ return /obj/machinery/readybutton/attack_paw(mob/user as mob) - user << "You are too primitive to use this device" + user << "You are too primitive to use this device!" return /obj/machinery/readybutton/New() @@ -486,7 +486,7 @@ /obj/machinery/readybutton/attack_hand(mob/user as mob) if(user.stat || stat & (NOPOWER|BROKEN)) - user << "This device is not powered." + user << "This device is not powered!" return currentarea = get_area(src.loc) @@ -494,7 +494,7 @@ qdel(src) if(eventstarted) - usr << "The event has already begun!" + usr << "The event has already begun!" return ready = !ready diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 4e7707f0ead..2be45dacd4c 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -15,6 +15,7 @@ if(0) if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "You start wrenching the frame into place..." if(do_after(user, 20)) user << "You wrench the frame into place." anchored = 1 @@ -22,9 +23,10 @@ if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.isOn()) - user << "The welder must be on for this task." + user << "The welder must be on for this task!" return playsound(loc, 'sound/items/Welder.ogg', 50, 1) + user << "You start to deconstruct the frame..." if(do_after(user, 20)) if(!src || !WT.remove_fuel(0, user)) return user << "You deconstruct the frame." @@ -33,6 +35,7 @@ if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "You start to unfasten the frame..." if(do_after(user, 20)) user << "You unfasten the frame." anchored = 0 @@ -66,6 +69,7 @@ var/obj/item/stack/cable_coil/C = P if(C.get_amount() >= 5) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + user << "You start to add cables to the frame..." if(do_after(user, 20)) if (C.get_amount() >= 5 && state == 2) C.use(5) @@ -73,12 +77,12 @@ state = 3 icon_state = "3" else - user << "You need five lengths of cable to wire the AI core." + user << "You need five lengths of cable to wire the AI core!" return if(3) if(istype(P, /obj/item/weapon/wirecutters)) if (brain) - user << "Get that brain out of there first." + user << "Get that brain out of there first!" else playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) user << "You remove the cables." @@ -91,6 +95,7 @@ var/obj/item/stack/sheet/rglass/G = P if(G.get_amount() >= 2) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) + user << "You start to put in the glass panel..." if(do_after(user, 20)) if (G.get_amount() >= 2 && state == 3) G.use(2) @@ -98,7 +103,7 @@ state = 4 icon_state = "4" else - user << "You need two sheets of reinforced glass to insert them into AI core." + user << "You need two sheets of reinforced glass to insert them into AI core!" return if(istype(P, /obj/item/weapon/aiModule/core/full)) //Allows any full core boards to be applied to AI cores. @@ -123,22 +128,22 @@ if(istype(P, /obj/item/device/mmi)) var/obj/item/device/mmi/M = P if(!M.brainmob) - user << "Sticking an empty MMI into the frame would sort of defeat the purpose." + user << "Sticking an empty MMI into the frame would sort of defeat the purpose!" return if(M.brainmob.stat == 2) - user << "Sticking a dead brain into the frame would sort of defeat the purpose." + user << "Sticking a dead brain into the frame would sort of defeat the purpose!" return if((config) && (!config.allow_ai)) - user << "This MMI does not seem to fit." + user << "This MMI does not seem to fit!" return if(jobban_isbanned(M.brainmob, "AI")) - user << "This MMI does not seem to fit." + user << "This MMI does not seem to fit!" return if(!M.brainmob.mind) - user << "This MMI is mindless." + user << "This MMI is mindless!" return ticker.mode.remove_cultist(M.brainmob.mind, 1) @@ -191,10 +196,12 @@ A.transfer_ai("INACTIVE","AICARD",src,user) if(istype(A, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) + user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \ + "You start to [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor...") switch(anchored) if(0) if(do_after(user, 20)) - user << "You wrench the core into place." + user << "You fasten the core into place." anchored = 1 if(1) if(do_after(user, 20)) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 76d084ffba7..f99fea98baa 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -31,7 +31,8 @@ /obj/item/toy/foamblade = 2, /obj/item/toy/redbutton = 2, /obj/item/toy/owl = 2, - /obj/item/toy/griffin = 2 + /obj/item/toy/griffin = 2, + /obj/item/weapon/coin/antagtoken = 2, ) /obj/machinery/computer/arcade/New() diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 0250b8575d7..c9a01b96900 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -303,31 +303,31 @@ if(0) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You start wrenching the frame into place." + user << "You start wrenching the frame into place..." if(do_after(user, 20)) - user << "You've wrenched the frame into place." + user << "You wrench the frame into place." anchored = 1 state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) if(!WT.isOn()) - user << "The welding tool must be on to complete this task." + user << "The welding tool must be on to complete this task!" return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - user << "You start deconstructing the frame." + user << "You start deconstructing the frame..." if(do_after(user, 20)) if(!src || !WT.isOn()) return - user << "You've deconstructed the frame." + user << "You deconstruct the frame." var/obj/item/stack/sheet/metal/M = new (loc, 5) M.add_fingerprint(user) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You start to unfasten the frame." + user << "You start to unfasten the frame..." if(do_after(user, 20)) - user << "You've unfastened the frame." + user << "You unfasten the frame." anchored = 0 state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) @@ -365,15 +365,15 @@ var/obj/item/stack/cable_coil/C = P if(C.get_amount() >= 5) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "You start adding cables to the frame." + user << "You start adding cables to the frame..." if(do_after(user, 20)) if(C.get_amount() >= 5 && state == 2) C.use(5) - user << "You've added cables to the frame." + user << "You add cables to the frame." state = 3 icon_state = "3" else - user << "You need five lengths of cable to wire the frame." + user << "You need five lengths of cable to wire the frame!" if(3) if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) @@ -387,15 +387,15 @@ if(istype(P, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = P if(G.get_amount() < 2) - user << "You need two glass sheets to continue construction." + user << "You need two glass sheets to continue construction!" return else playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "You start to put in the glass panel." + user << "You start to put in the glass panel..." if(do_after(user, 20)) if(G.get_amount() >= 2 && state == 3) G.use(2) - user << "You've put in the glass panel." + user << "You put in the glass panel." state = 4 src.icon_state = "4" if(4) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm new file mode 100644 index 00000000000..169100a2ab8 --- /dev/null +++ b/code/game/machinery/computer/camera_advanced.dm @@ -0,0 +1,157 @@ +/obj/machinery/computer/camera_advanced + name = "advanced camera console" + desc = "Used to access the various cameras on the station." + icon_state = "cameras" + //circuit = /obj/item/weapon/circuitboard/security + var/mob/camera/aiEye/remote/eyeobj + var/mob/living/carbon/human/current_user = null + var/list/networks = list("SS13") + var/datum/action/camera_off/off_action = new + var/datum/action/camera_jump/jump_action = new + +/obj/machinery/computer/camera_advanced/proc/CreateEye() + eyeobj = new() + eyeobj.origin = src + +/obj/machinery/computer/camera_advanced/proc/GrantActions(var/mob/living/carbon/user) + off_action.target = user + off_action.Grant(user) + jump_action.target = user + jump_action.Grant(user) + +/obj/machinery/computer/camera_advanced/check_eye(var/mob/user as mob) + if (get_dist(user, src) > 1 || user.eye_blind) + off_action.Activate() + return 0 + return 1 + +/obj/machinery/computer/camera_advanced/attack_hand(var/mob/user as mob) + if(..()) + return + if(!iscarbon(user)) + return + var/mob/living/carbon/L = user + + if(!current_user) + if(!eyeobj) + CreateEye() + GrantActions(user) + current_user = user + eyeobj.user = user + eyeobj.name = "Camere Eye ([user.name])" + L.remote_view = 1 + L.remote_control = eyeobj + L.client.perspective = EYE_PERSPECTIVE + if(!eyeobj.initialized) + for(var/obj/machinery/camera/C in cameranet.cameras) + if(!C.can_use()) + continue + if(C.network&networks) + eyeobj.setLoc(get_turf(C)) + break + eyeobj.initialized = 1 + else + eyeobj.setLoc(eyeobj.loc) + else + user << "The console is already in use!" + +/mob/camera/aiEye/remote + name = "Inactive Camera Eye" + var/sprint = 10 + var/cooldown = 0 + var/acceleration = 1 + var/mob/living/carbon/human/user = null + var/obj/machinery/computer/camera_advanced/origin + var/initialized = 0 + var/visible_icon = 0 + var/image/user_image = null + +/mob/camera/aiEye/remote/GetViewerClient() + if(user) + return user.client + return null + +/mob/camera/aiEye/remote/setLoc(var/T) + if(user) + if(!isturf(user.loc)) + return + T = get_turf(T) + loc = T + cameranet.visibility(src) + if(user.client) + if(visible_icon) + user.client.images -= user_image + user_image = image(icon,loc,icon_state,FLY_LAYER) + user.client.images += user_image + user.client.eye = src + +/mob/camera/aiEye/remote/relaymove(mob/user,direct) + var/initial = initial(sprint) + var/max_sprint = 50 + + if(cooldown && cooldown < world.timeofday) // 3 seconds + sprint = initial + + for(var/i = 0; i < max(sprint, initial); i += 20) + var/turf/step = get_turf(get_step(src, direct)) + if(step) + src.setLoc(step) + + cooldown = world.timeofday + 5 + if(acceleration) + sprint = min(sprint + 0.5, max_sprint) + else + sprint = initial + +/datum/action/camera_off + name = "End Camera View" + action_type = AB_INNATE + button_icon_state = "camera_off" + +/datum/action/camera_off/Activate() + if(!target || !iscarbon(target)) + return + var/mob/living/carbon/C = target + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + C.remote_view = 0 + remote_eye.origin.current_user = null + remote_eye.origin.jump_action.Remove(C) + if(C.client) + C.client.perspective = MOB_PERSPECTIVE + C.client.eye = src + C.client.images -= remote_eye.user_image + C.remote_control = null + C.unset_machine() + src.Remove(C) + +/datum/action/camera_jump + name = "Jump To Camera" + action_type = AB_INNATE + button_icon_state = "camera_jump" + +/datum/action/camera_jump/Activate() + if(!target || !iscarbon(target)) + return + var/mob/living/carbon/C = target + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/origin = remote_eye.origin + + var/list/L = list() + + for (var/obj/machinery/camera/cam in cameranet.cameras) + L.Add(cam) + + camera_sort(L) + + var/list/T = list() + + for (var/obj/machinery/camera/netcam in L) + var/list/tempnetwork = netcam.network&origin.networks + if (tempnetwork.len) + T[text("[][]", netcam.c_tag, (netcam.can_use() ? null : " (Deactivated)"))] = netcam + + + var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T + var/obj/machinery/camera/final = T[camera] + if(final) + remote_eye.setLoc(get_turf(final)) \ No newline at end of file diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index acc6cccc4db..180f3dc2fd5 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -354,7 +354,7 @@ var/time_last_changed_position = 0 if(region_access) authenticated = 1 else if ((!( authenticated ) && (istype(usr, /mob/living/silicon))) && (!modify)) - usr << "You can't modify an ID without an ID inserted to modify. Once one is in the modify slot on the computer, you can log in." + usr << "You can't modify an ID without an ID inserted to modify! Once one is in the modify slot on the computer, you can log in." if ("logout") region_access = null head_subordinates = null diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 240cdaa11b7..38489cb1497 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -79,7 +79,7 @@ user.drop_item() W.loc = src src.diskette = W - user << "You insert [W]." + user << "You insert [W]." src.updateUsrDialog() return else diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 1c0138f4c66..c335d4ad6f6 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -103,11 +103,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 feedback_inc("alert_comms_blue",1) tmp_alertlevel = 0 else: - usr << "You are not authorized to do this." + usr << "You are not authorized to do this!" tmp_alertlevel = 0 state = STATE_DEFAULT else - usr << "You need to swipe your ID." + usr << "You need to swipe your ID!" if("announce") if(src.authenticated==2 && !message_cooldown) @@ -333,7 +333,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 src.emagged = 1 if(authenticated == 1) authenticated = 2 - user << "You scramble the communication routing circuits!" + user << "You scramble the communication routing circuits." /obj/machinery/computer/communications/attack_hand(var/mob/user as mob) if(..()) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index a284f291fd0..18f8925050f 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -97,7 +97,7 @@ /obj/machinery/computer/attackby(I as obj, user as mob, params) if(istype(I, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << " You start to disconnect the monitor." + user << " You start to disconnect the monitor..." if(do_after(user, 20)) var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) A.circuit = circuit @@ -127,12 +127,12 @@ if(prob(10)) user.visible_message("[user.name] smashes the [src.name] with its paws.",\ "You smash the [src.name] with your paws.",\ - "You hear a smashing sound.") + "You hear a smashing sound.") set_broken() return user.visible_message("[user.name] smashes against the [src.name] with its paws.",\ "You smash against the [src.name] with your paws.",\ - "You hear a clicking sound.") + "You hear hear a clicking sound.") /obj/machinery/computer/attack_alien(mob/living/user) user.do_attack_animation(src) @@ -140,9 +140,9 @@ if(prob(80)) user.visible_message("[user.name] smashes the [src.name] with its claws.",\ "You smash the [src.name] with your claws.",\ - "You hear a smashing sound.") + "You hear a smashing sound.") set_broken() return user.visible_message("[user.name] smashes against the [src.name] with its claws.",\ "You smash against the [src.name] with your claws.",\ - "You hear a clicking sound.") + "You hear a clicking sound.") diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index c314be68b5e..0ab00973dd5 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -10,7 +10,7 @@ if(src.stat & (NOPOWER|BROKEN|MAINT)) return if(!current) - user << "You haven't selected anything to transmit laws to!" + user << "You haven't selected anything to transmit laws to!" return if(!can_upload_to(current)) user << "Upload failed! Check to make sure [current.name] is functioning properly." @@ -43,7 +43,7 @@ src.current = select_active_ai(user) if (!src.current) - user << "No active AIs detected." + user << "No active AIs detected!" else user << "[src.current.name] selected for law changes." @@ -68,7 +68,7 @@ src.current = select_active_free_borg(user) if(!src.current) - user << "No active unslaved cyborgs detected." + user << "No active unslaved cyborgs detected!" else user << "[src.current.name] selected for law changes." diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index bc686b127d9..8a52e787827 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -24,7 +24,7 @@ usr.drop_item() O.loc = src scan = O - user << "You insert [O]." + user << "You insert [O]." else ..() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index d58f416f99c..c021d2e158a 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -132,7 +132,7 @@ var/obj/item/weapon/implant/I = locate(href_list["warn"]) if((I)&&(I.imp_in)) var/mob/living/carbon/R = I.imp_in - R << "You hear a voice in your head saying: '[warning]'" + R << "You hear a voice in your head saying: '[warning]'" log_say("[usr]/[usr.ckey] sent an implant message to [R]/[R.ckey]: '[warning]'") src.add_fingerprint(usr) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index f4f5f3c9d00..3ac9f1abf03 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -28,7 +28,7 @@ usr.drop_item() O.loc = src scan = O - user << "You insert [O]." + user << "You insert [O]." else ..() diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 692bf826437..ce874f42abc 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -87,7 +87,7 @@ return prob(60) var/obj/structure/stool/bed/B = A - if (istype(A, /obj/structure/stool/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass + if (istype(A, /obj/structure/stool/bed) && (B.buckled_mob || B.density))//if it's a bed/chair and is dense or someone is buckled, it will not pass return 0 else if(istype(A, /mob/living)) // You Shall Not Pass! diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 5c823178fad..c2a98ae7c84 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -55,31 +55,61 @@ /obj/machinery/constructable_frame/machine_frame/attackby(obj/item/P as obj, mob/user as mob, params) if(P.crit_fail) - user << "This part is faulty, you cannot add this to the machine!" + user << "This part is faulty, you cannot add this to the machine!" return switch(state) if(1) + if(istype(P, /obj/item/weapon/circuitboard)) + user << "The frame needs wiring first!" + return if(istype(P, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = P if(C.get_amount() >= 5) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "You start to add cables to the frame." - if(do_after(user, 20)) + user << "You start to add cables to the frame..." + if(do_after(user, 20, target = src)) if(C.get_amount() >= 5 && state == 1) C.use(5) user << "You add cables to the frame." state = 2 icon_state = "box_1" else - user << "You need five length of cable to wire the frame." + user << "You need five length of cable to wire the frame!" return + if(istype(P, /obj/item/weapon/weldingtool) && !anchored) + var/obj/item/weapon/weldingtool/WT = P + if(WT.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + user.visible_message("[user] disassembles the frame.", \ + "You start to disassemble the frame...", "You hear welding and clanking.") + if(do_after(user, 40, target = src)) + if( !WT.isOn() ) + return + if(state == 1) + user << "You disassemble the frame." + var/obj/item/stack/sheet/metal/M = new (loc, 5) + M.add_fingerprint(user) + qdel(src) if(istype(P, /obj/item/weapon/wrench)) + user << "You start [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "You dismantle the frame." - new /obj/item/stack/sheet/metal(src.loc, 5) - qdel(src) + if(do_after(user, 40, target = src)) + if(state == 1) + user << "You [anchored ? "un" : ""]secure [name]." + anchored = !anchored + if(2) + if(istype(P, /obj/item/weapon/wrench)) + user << "You start [anchored ? "un" : ""]securing [name]..." + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + if(do_after(user, 40, target = src)) + user << "You [anchored ? "un" : ""]secure [name]." + anchored = !anchored + if(istype(P, /obj/item/weapon/circuitboard)) + if(!anchored) + user << "The frame needs to be secured first!" + return var/obj/item/weapon/circuitboard/B = P if(B.board_type == "machine") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -94,7 +124,7 @@ update_namelist() update_req_desc() else - user << "This frame does not accept circuit boards of this type!" + user << "This frame does not accept circuit boards of this type!" if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) user << "You remove the cables." @@ -177,7 +207,7 @@ if(istype(P, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CP = P if (CP.get_amount() < 1) - user << "You need more cable!" + user << "You need more cable!" return var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src, 1, CP.item_color) if(CP.use(1)) @@ -192,7 +222,7 @@ update_req_desc() return 1 if(!success) - user << "You cannot add that to the machine!" + user << "You cannot add that to the machine!" return 0 @@ -381,7 +411,7 @@ to destroy them and players will be able to make replacements. /obj/item/weapon/stock_parts/manipulator = 1, /obj/item/weapon/stock_parts/console_screen = 1, /obj/item/weapon/stock_parts/cell = 1) - + /obj/item/weapon/circuitboard/chem_master name = "circuit board (Chem Master 2999)" build_path = /obj/machinery/chem_master/constructable diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 6c57394b1ef..851bf6e643f 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -230,13 +230,13 @@ /obj/machinery/atmospherics/unary/cryo_cell/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "A beaker is already loaded into [src]." + user << "A beaker is already loaded into [src]!" return beaker = I user.drop_item() I.loc = src - user.visible_message("[user] places [I] in [src].", \ + user.visible_message("[user] places [I] in [src].", \ "You place [I] in [src].") if(!(on || occupant || state_open)) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 98c7cf1fff0..471818ca3c4 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -67,11 +67,11 @@ for reference: user.changeNext_move(CLICK_CD_MELEE) if (istype(W, /obj/item/stack/sheet/mineral/wood)) if (src.health < src.maxhealth) - visible_message("[user] begins to repair \the [src]!") + visible_message("[user] begins to repair \the [src]!", "You begin to repair \the [src]...") if(do_after(user,20)) src.health = src.maxhealth W:use(1) - visible_message("[user] repairs \the [src]!") + visible_message("[user] repairs \the [src]!", "You repair \the [src].") return else return @@ -84,7 +84,7 @@ for reference: src.health -= W.force * 0.75 else if (src.health <= 0) - visible_message("The barricade is smashed apart!") + visible_message("The barricade is smashed apart!") new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) @@ -94,13 +94,13 @@ for reference: /obj/structure/barricade/wooden/ex_act(severity, target) switch(severity) if(1.0) - visible_message("The barricade is blown apart!") + visible_message("The barricade is blown apart!") qdel(src) return if(2.0) src.health -= 25 if (src.health <= 0) - visible_message("The barricade is blown apart!") + visible_message("The barricade is blown apart!") new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) @@ -110,7 +110,7 @@ for reference: /obj/structure/barricade/wooden/blob_act() src.health -= 25 if (src.health <= 0) - visible_message("The blob eats through the barricade!") + visible_message("The blob eats through the barricade!") qdel(src) return @@ -196,7 +196,7 @@ for reference: if (src.emagged == 0) src.emagged = 1 src.req_access = null - user << "You break the ID authentication lock on \the [src]." + user << "You break the ID authentication lock on \the [src]." var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() @@ -204,7 +204,7 @@ for reference: return else if (src.emagged == 1) src.emagged = 2 - user << "You short out the anchoring mechanism on \the [src]." + user << "You short out the anchoring mechanism on \the [src]." var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 2b1ef80ccff..64117c66660 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -215,7 +215,7 @@ /obj/machinery/door/airlock/uranium/proc/radiate() for(var/mob/living/L in range (3,src)) - L.apply_effect(15,IRRADIATE,0) + L.irradiate(15) return /obj/machinery/door/airlock/plasma @@ -640,7 +640,7 @@ About the new airlock wires panel: playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) if(!istype(H.head, /obj/item/clothing/head/helmet)) H.visible_message("[user] headbutts the airlock.", \ - "[user] headbutts the airlock!") + "You headbutt the airlock!") var/obj/item/organ/limb/affecting = H.get_organ("head") H.Stun(5) H.Weaken(5) @@ -889,9 +889,9 @@ About the new airlock wires panel: if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) var/obj/item/weapon/weldingtool/W = C if(W.remove_fuel(0,user)) - user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \ - "You begin [welded ? "unwelding":"welding"] the airlock...", \ - "You hear welding.") + user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \ + "You begin [welded ? "unwelding":"welding"] the airlock...", \ + "You hear welding.") playsound(loc, 'sound/items/Welder.ogg', 40, 1) if(do_after(user,40,5,1)) if(density && !operating)//Door must be closed to weld. @@ -899,8 +899,8 @@ About the new airlock wires panel: return playsound(loc, 'sound/items/Welder2.ogg', 50, 1) welded = !welded - user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \ - "You've [welded ? "welded the airlock shut":"unwelded the airlock"].") + user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \ + "You [welded ? "weld the airlock shut":"unweld the airlock"].") update_icon() return else if(istype(C, /obj/item/weapon/screwdriver)) @@ -924,8 +924,8 @@ About the new airlock wires panel: beingcrowbarred = 0 if( beingcrowbarred && (density && welded && !operating && src.p_open && (!hasPower()) && !src.locked) ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", \ - "You start to remove electronics from the airlock assembly.") + user.visible_message("[user] removes the electronics from the airlock assembly.", \ + "You start to remove electronics from the airlock assembly...") if(do_after(user,40)) if(src.loc) if(src.doortype) @@ -935,7 +935,7 @@ About the new airlock wires panel: user << "You discard the damaged electronics." qdel(src) return - user << "You removed the airlock electronics!" + user << "You remove the airlock electronics." var/obj/item/weapon/airlock_electronics/ae if(!electronics) @@ -953,9 +953,9 @@ About the new airlock wires panel: qdel(src) return else if(hasPower()) - user << " The airlock's motors resist your efforts to force it." + user << " The airlock's motors resist your efforts to force it!" else if(locked) - user << " The airlock's bolts prevent it from being forced." + user << " The airlock's bolts prevent it from being forced!" else if( !welded && !operating) if(density) if(beingcrowbarred == 0) //being fireaxe'd @@ -963,7 +963,7 @@ About the new airlock wires panel: if(F:wielded) spawn(0) open(2) else - user << "You need to be wielding the Fire axe to do that." + user << "You need to be wielding the fire axe to do that!" else spawn(0) open(2) else @@ -972,7 +972,7 @@ About the new airlock wires panel: if(F:wielded) spawn(0) close(2) else - user << "You need to be wielding the Fire axe to do that." + user << "You need to be wielding the fire axe to do that!" else spawn(0) close(2) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 9e51ce6bcf3..21a4ba0fff2 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -42,15 +42,15 @@ pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0)) spawn(20) - for(var/obj/machinery/door/window/brigdoor/M in world) + for(var/obj/machinery/door/window/brigdoor/M in range(20, src)) if (M.id == src.id) targets += M - for(var/obj/machinery/flasher/F in world) + for(var/obj/machinery/flasher/F in range(20, src)) if(F.id == src.id) targets += F - for(var/obj/structure/closet/secure_closet/brig/C in world) + for(var/obj/structure/closet/secure_closet/brig/C in range(20, src)) if(C.id == src.id) targets += C diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 412048bb8a5..93331e30e07 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -213,8 +213,8 @@ return user.changeNext_move(CLICK_CD_MELEE) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - user.visible_message("[user] smashes against the [src.name].", \ - "[user] smashes against the [src.name].") + user.visible_message("[user] smashes against the [src.name]!", \ + "You smash against the [src.name]!") take_damage(damage) /obj/machinery/door/window/attack_alien(mob/living/user as mob) @@ -264,7 +264,7 @@ if(istype(I, /obj/item/weapon/screwdriver)) if(src.density || src.operating) - user << "You need to open the door to access the maintenance panel." + user << "You need to open the door to access the maintenance panel!" return playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) src.p_open = !( src.p_open ) @@ -274,8 +274,8 @@ if(istype(I, /obj/item/weapon/crowbar)) if(p_open && !src.density && !src.operating) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user.visible_message("[user] removes the electronics from the [src.name].", \ - "You start to remove electronics from the [src.name].") + user.visible_message("[user] removes the electronics from the [src.name].", \ + "You start to remove electronics from the [src.name]...") if(do_after(user,40)) if(src.p_open && !src.density && !src.operating && src.loc) var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc) @@ -302,7 +302,7 @@ qdel(src) return - user << "You removed the airlock electronics!" + user << "You remove the airlock electronics." var/obj/item/weapon/airlock_electronics/ae if(!electronics) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index f575ccd7778..fdea6d8469f 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -40,23 +40,23 @@ /obj/machinery/flasher/attackby(obj/item/weapon/W, mob/user, params) if (istype(W, /obj/item/weapon/wirecutters)) if (bulb) - user.visible_message("[user] begins to disconnect [src]'s flashbulb.", "You begin to disconnect [src]'s flashbulb.") + user.visible_message("[user] begins to disconnect [src]'s flashbulb.", "You begin to disconnect [src]'s flashbulb...") playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) if(do_after(user, 30) && bulb) - user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb!") + user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb.") bulb.loc = src.loc bulb = null power_change() else if (istype(W, /obj/item/device/flash/handheld)) if (!bulb) - user.visible_message("[user] installs [W] into [src].", "You install [W] into [src].") + user.visible_message("[user] installs [W] into [src].", "You install [W] into [src].") user.drop_item() W.loc = src bulb = W power_change() else - user << "A flashbulb is already installed in [src]." + user << "A flashbulb is already installed in [src]!" add_fingerprint(user) //Let the AI trigger them directly. diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index b713085f801..6f20b8ce9f6 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -40,23 +40,47 @@ var/const/HOLOPAD_MODE = RANGE_BASED var/list/masters = list()//List of AIs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. + var/temp = "" /obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return - if(alert(user,"Would you like to request an AI's presence?",,"Yes","No") == "Yes") - if(!Adjacent(user)) //also prevents request spam! - user << "You are too far from the holopad." - return - if(last_request + 200 < world.time) //don't spam the AI with requests you jerk! + if(user.stat || stat & (NOPOWER|BROKEN)) + return + user.set_machine(src) + var/dat + if(temp) + dat = temp + else + dat = "request an AI's presence." + + var/datum/browser/popup = new(user, "holopad", name, 300, 130) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/hologram/holopad/Topic(href, href_list) + if(..()) + return + if (href_list["AIrequest"]) + if(last_request + 200 < world.time) last_request = world.time - user << "You request an AI's presence." + temp = "You requested an AI's presence.
" + temp += "Main Menu" var/area/area = get_area(src) for(var/mob/living/silicon/ai/AI in living_mob_list) - if(!AI.client) continue + if(!AI.client) + continue AI << "Your presence is requested at \the [area]." else - user << "A request for AI presence was already sent recently." + temp = "A request for AI presence was already sent recently.
" + temp += "Main Menu" + + else if(href_list["mainmenu"]) + temp = "" + + updateUsrDialog() + add_fingerprint(usr) /obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index aa9be627ab2..0354e94eac4 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -76,10 +76,10 @@ add_fingerprint(user) src.disable = !src.disable if (src.disable) - user.visible_message("[user] has disabled \the [src]!", "You disable the connection to \the [src].") + user.visible_message("[user] has disabled \the [src]!", "You disable the connection to \the [src].") icon_state = "[base_state]-d" if (!src.disable) - user.visible_message("[user] has reconnected \the [src]!", "You fix the connection to \the [src].") + user.visible_message("[user] has reconnected \the [src]!", "You fix the connection to \the [src].") if(src.powered()) icon_state = "[base_state]" else diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index b56321f9588..2255f1c0017 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -53,35 +53,35 @@ return if(attached) - visible_message("[attached] is detached from \the [src]") + visible_message("[attached] is detached from \the [src].") attached = null update_icon() return if(!ishuman(target)) - usr << "The drip beeps: Warning, human patients only!" + usr << "The drip beeps: Warning, human patients only!" return if(Adjacent(target) && usr.Adjacent(target)) if(beaker) - visible_message("[usr] attaches \the [src] to \the [target].") + usr.visible_message("[usr] attaches \the [src] to \the [target].", "You attach \the [src] to \the [target].") attached = target SSmachine.processing.Add(src) update_icon() else - usr << "There's nothing attached to the IV drip!" + usr << "There's nothing attached to the IV drip!" /obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/reagent_containers)) if(!isnull(beaker)) - user << "There is already a reagent container loaded!" + user << "There is already a reagent container loaded!" return user.drop_item() W.loc = src beaker = W - user << "You attach \the [W] to \the [src]." + user << "You attach \the [W] to \the [src]." update_icon() return else @@ -163,7 +163,7 @@ set src in view(1) if(!istype(usr, /mob/living)) - usr << "You can't do that." + usr << "You can't do that!" return if(usr.stat) @@ -180,7 +180,7 @@ set src in view(1) if(!istype(usr, /mob/living)) - usr << "You can't do that." + usr << "You can't do that!" return if(usr.stat) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index bfa9f68ef65..4949aa3024b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -227,7 +227,7 @@ Class Procs: if(be_close && in_range(M, src)) return 1 else - src << "You don't have the dexterity to do this!" + src << "You don't have the dexterity to do this!" return /mob/living/carbon/human/canUseTopic(atom/movable/M, be_close = 0) @@ -284,7 +284,7 @@ Class Procs: if(user.lying || user.stat) return 1 if(!user.IsAdvancedToolUser()) - usr << "You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return 1 /* //distance checks are made by atom/proc/DblClick @@ -297,7 +297,7 @@ Class Procs: visible_message("[H] stares cluelessly at [src] and drools.") return 1 else if(prob(H.getBrainLoss())) - user << "You momentarily forget how to use [src]." + user << "You momentarily forget how to use [src]!" return 1 src.add_fingerprint(user) @@ -361,10 +361,10 @@ Class Procs: /obj/machinery/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) if(istype(W)) - user << "Now [anchored ? "un" : ""]securing [name]." + user << "You begin [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, time)) - user << "You've [anchored ? "un" : ""]secured [name]." + user << "You [anchored ? "un" : ""]secure [name]." anchored = !anchored playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) return 1 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 3851c577c72..7c2a44e115c 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -112,7 +112,7 @@ if(istype(I, /obj/item/weapon/screwdriver)) open = !open - user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") + user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") updateicon() @@ -120,12 +120,12 @@ if(open) if (src.allowed(user)) src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" + user << "Controls are now [src.locked ? "locked" : "unlocked"]." else user << "Access denied." updateDialog() else - user << "You must open the cover first!" + user << "You must open the cover first!" return /obj/machinery/navbeacon/attack_ai(var/mob/user) @@ -143,7 +143,7 @@ return // prevent intraction when T-scanner revealed if(!open && !ai) // can't alter controls if not open, unless you're an AI - user << "The beacon's control cover is closed." + user << "The beacon's control cover is closed!" return diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index a69a1526de8..d374dfb6480 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -103,13 +103,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "Newscaster cannot be placed on this spot." + usr << "Newscaster cannot be placed on this spot!" return if (A.requires_power == 0 || A.name == "Space") - usr << "Newscaster cannot be placed in this area." + usr << "Newscaster cannot be placed in this area!" return for(var/obj/machinery/newscaster/T in loc) - usr << "There is another newscaster here." + usr << "There is another newscaster here!" return var/obj/machinery/newscaster/N = new(loc) N.pixel_y -= (loc.y - on_wall.y) * 32 @@ -793,9 +793,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params) if(istype(I, /obj/item/weapon/wrench)) - user << "Now [anchored ? "un" : ""]securing [name]" + user << "You start [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 60)) + user << "You [anchored ? "un" : ""]secure [name]." new /obj/item/newscaster_frame(loc) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) qdel(src) @@ -823,12 +824,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co audible_message("[user.name] forcefully slams the [src.name] with the [I.name]!", null, 5 ) playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) else - user << "This does nothing." + user << "This does nothing!" src.update_icon() /obj/machinery/newscaster/attack_paw(mob/user as mob) - user << "The newscaster controls are far too complicated for your tiny brain!" + user << "The newscaster controls are far too complicated for your tiny brain!" return /obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) @@ -860,7 +861,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else targetcam = R.aicamera else - user << "You cannot interface with silicon photo uploading" //gtfo pAIs + user << "You cannot interface with silicon photo uploading!" //gtfo pAIs if(targetcam.aipictures.len == 0) usr << "No images saved" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 6e277a7ece8..a4db08cf85b 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -310,7 +310,7 @@ var/global/list/pipeID2State = list( for(var/obj/machinery/atmospherics/M in src.loc) if(M.initialize_directions & pipe_dir) // matches at least one direction on either type of pipe - user << "There is already a pipe at that location." + user << "There is already a pipe at that location!" return 1 // no conflicts found @@ -405,8 +405,8 @@ var/global/list/pipeID2State = list( playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user.visible_message( \ "[user] fastens \the [src].", \ - "You have fastened \the [src].", \ - "You hear ratchet.") + "You fasten \the [src].", \ + "You hear ratchet.") qdel(src) // remove the pipe item @@ -431,9 +431,9 @@ var/global/list/pipeID2State = list( if (!istype(W, /obj/item/weapon/wrench)) return ..() if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) - user << "You need to fasten it to a pipe." + user << "You need to fasten it to a pipe!" return 1 new/obj/machinery/meter( src.loc ) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You have fastened the meter to the pipe." + user << "You fasten the meter to the pipe." qdel(src) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 7c68419557b..ed9680d8988 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -86,8 +86,8 @@ add_fingerprint(user) user.visible_message( \ "[user] fastens \the [src].", \ - "You have fastened \the [src]. Now it can dispense pipes.", \ - "You hear ratchet.") + "You fasten \the [src]. Now it can dispense pipes.", \ + "You hear ratchet.") anchored = 1 stat &= MAINT if (usr.machine==src) @@ -99,8 +99,8 @@ add_fingerprint(user) user.visible_message( \ "[user] unfastens \the [src].", \ - "You have unfastened \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") + "You unfasten \the [src]. Now it can be pulled somewhere else.", \ + "You hear ratchet.") anchored = 0 stat |= ~MAINT power_change() diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 900edaf63ea..714d70e0907 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -253,7 +253,7 @@ if(istype(I, /obj/item/weapon/crowbar)) //If the turret is destroyed, you can remove it with a crowbar to //try and salvage its components - user << "You begin prying the metal coverings off." + user << "You begin prying the metal coverings off..." sleep(20) if(prob(70)) user << "You remove the turret and salvage some components." @@ -680,7 +680,7 @@ build_step = 2 icon_state = "turret_frame2" else - user << "You need two sheets of metal to continue construction." + user << "You need two sheets of metal to continue construction!" return else if(istype(I, /obj/item/weapon/wrench)) @@ -703,14 +703,15 @@ if(!WT.isOn()) return if(WT.get_fuel() < 5) //uses up 5 fuel. - user << "You need more fuel to complete this task." + user << "You need more fuel to complete this task!" return playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + user << "You start to remove the turret's interior metal armor..." if(do_after(user, 20)) if(!src || !WT.remove_fuel(5, user)) return build_step = 1 - user << "You remove the turret's interior metal armor." + user << "You remove the turret's interior metal armor." new /obj/item/stack/sheet/metal( loc, 2) return @@ -722,7 +723,7 @@ return var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun if(!user.unEquip(I)) - user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [I] is stuck to your hand, you cannot put it in \the [src]!" return installation = I.type //installation becomes I.type gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge @@ -741,9 +742,9 @@ if(isprox(I)) build_step = 5 if(!user.unEquip(I)) - user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [I] is stuck to your hand, you cannot put it in \the [src]!" return - user << "You add the prox sensor to the turret." + user << "You add the proximity sensor to the turret." qdel(I) return @@ -765,7 +766,7 @@ user << "You add some metal armor to the exterior frame." build_step = 7 else - user << "You need two sheets of metal to continue construction." + user << "You need two sheets of metal to continue construction!" return else if(istype(I, /obj/item/weapon/screwdriver)) @@ -779,9 +780,10 @@ var/obj/item/weapon/weldingtool/WT = I if(!WT.isOn()) return if(WT.get_fuel() < 5) - user << "You need more fuel to complete this task." + user << "You need more fuel to complete this task!" playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + user << "You begin to weld the turret's armor down..." if(do_after(user, 30)) if(!src || !WT.remove_fuel(5, user)) return diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 00d896cc6c0..7c7d9efb9a4 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -181,7 +181,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() if (Console.department == department) Console.newmessagepriority = 0 Console.update_icon() - Console.luminosity = 1 + Console.SetLuminosity(1) newmessagepriority = 0 update_icon() var/messageComposite = "" @@ -317,7 +317,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() else // Normal priority Console.createmessage(src, "Message from [department]", sending, 1, 1) screen = 6 - Console.luminosity = 2 + Console.SetLuminosity(2) switch(priority) if(2) @@ -431,16 +431,16 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/obj/item/weapon/paper/slip = new /obj/item/weapon/paper(src.loc) slip.info = "From: [unlinkedsender]
[message]" slip.name = "Message - [unlinkedsender]" - src.luminosity = 2 + SetLuminosity(2) /obj/machinery/requests_console/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob, params) if (istype(O, /obj/item/weapon/crowbar)) if(open) - user << "You close the maintenance panel." + user << "You close the maintenance panel." open = 0 icon_state="req_comp0" else - user << "You open the maintenance panel." + user << "You open the maintenance panel." open = 1 if(hackState == 0) icon_state="req_comp_open" @@ -449,15 +449,15 @@ var/list/obj/machinery/requests_console/allConsoles = list() if (istype(O, /obj/item/weapon/screwdriver)) if(open) if(hackState == 0) - user << "You modify the wiring." + user << "You modify the wiring." hackState = 1 icon_state="req_comp_rewired" else if(hackState == 1) - user << "You reset the wiring." + user << "You reset the wiring." hackState = 0 icon_state="req_comp_open" else - user << "You can't do much with that." + user << "You can't do much with that!" update_icon() var/obj/item/weapon/card/id/ID = O.GetID() @@ -470,7 +470,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() announceAuth = 1 else announceAuth = 0 - user << "You are not authorized to send announcements." + user << "You are not authorized to send announcements!" updateUsrDialog() if (istype(O, /obj/item/weapon/stamp)) if(screen == 9) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 85c818f2fd8..2e1c8275332 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -28,7 +28,7 @@ if (O:amount < 1) qdel(O) - user << "You insert [count] metal sheet\s into \the [src]." + user << "You insert [count] metal sheet\s into \the [src]." src.overlays -= "fab-load-metal" updateDialog() else diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 1b1e68bbf6e..9692acc5ca6 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -210,25 +210,25 @@ /obj/machinery/shieldgen/attack_hand(mob/user as mob) if(locked) - user << "The machine is locked, you are unable to use it." + user << "The machine is locked, you are unable to use it!" return if(is_open) - user << "The panel must be closed before operating this machine." + user << "The panel must be closed before operating this machine!" return if (src.active) - user.visible_message("\icon[src] [user] deactivated the shield generator.", \ - "\icon[src] You deactivate the shield generator.", \ - "You hear heavy droning fade out.") + user.visible_message("[src] [user] deactivated the shield generator.", \ + "[src] You deactivate the shield generator.", \ + "You hear heavy droning fade out.") src.shields_down() else if(anchored) - user.visible_message("\icon[src] [user] activated the shield generator.", \ - "\icon[src] You activate the shield generator.", \ - "You hear heavy droning.") + user.visible_message("[src] [user] activated the shield generator.", \ + "[src] You activate the shield generator.", \ + "You hear heavy droning.") src.shields_up() else - user << "The device must first be secured to the floor." + user << "The device must first be secured to the floor!" return /obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob, params) @@ -244,21 +244,21 @@ else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) - user << "You need one length of cable to repair [src]." + user << "You need one length of cable to repair [src]!" return - user << "You begin to replace the wires." + user << "You begin to replace the wires..." if(do_after(user, 30)) if(coil.get_amount() < 1) return coil.use(1) health = max_health malfunction = 0 - user << "You repair \the [src]!" + user << "You repair \the [src]." update_icon() else if(istype(W, /obj/item/weapon/wrench)) if(locked) - user << "The bolts are covered, unlocking this would retract the covers." + user << "The bolts are covered! Unlocking this would retract the covers." return if(!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) @@ -276,7 +276,7 @@ else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(src.allowed(user)) src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + user << "You [src.locked ? "lock" : "unlock"] the controls." else user << "Access denied." @@ -348,13 +348,13 @@ /obj/machinery/shieldwallgen/attack_hand(mob/user as mob) if(!anchored) - user << "The shield generator needs to be firmly secured to the floor first." + user << "The shield generator needs to be firmly secured to the floor first!" return 1 if(locked && !istype(user, /mob/living/silicon)) - user << "The controls are locked!" + user << "The controls are locked!" return 1 if(power != 1) - user << "The shield generator needs to be powered by wire underneath." + user << "The shield generator needs to be powered by wire underneath!" return 1 if(src.active >= 1) @@ -362,15 +362,15 @@ icon_state = "Shield_Gen" user.visible_message("[user] turned the shield generator off.", \ - "You turn off the shield generator.", \ - "You hear heavy droning fade out.") + "You turn off the shield generator.", \ + "You hear heavy droning fade out.") src.cleanup() else src.active = 1 icon_state = "Shield_Gen +a" user.visible_message("[user] turned the shield generator on.", \ - "You turn on the shield generator.", \ - "You hear heavy droning.") + "You turn on the shield generator.", \ + "You hear heavy droning.") src.add_fingerprint(user) /obj/machinery/shieldwallgen/process() @@ -396,7 +396,7 @@ if(src.active >= 1) if(src.power == 0) src.visible_message("The [src.name] shuts down due to lack of power!", \ - "You hear heavy droning fade out") + "You hear heavy droning fade out.") icon_state = "Shield_Gen" src.active = 0 src.cleanup(1) @@ -452,7 +452,7 @@ /obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/wrench)) if(active) - user << "Turn off the field generator first." + user << "Turn off the field generator first!" return else if(!anchored && !isinspace()) //Can't fasten this thing in space @@ -470,7 +470,7 @@ if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (src.allowed(user)) src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" + user << "You [src.locked ? "lock" : "unlock"] the controls." else user << "Access denied." diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 223472818c6..da7f6a82c53 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -48,7 +48,7 @@ if(istype(I, /obj/item/weapon/stock_parts/cell)) if(open) if(cell) - user << "There is already a power cell inside." + user << "There is already a power cell inside!" return else // insert cell @@ -59,13 +59,13 @@ C.loc = src C.add_fingerprint(usr) - user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") + user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") else - user << "The hatch must be open to insert a power cell." + user << "The hatch must be open to insert a power cell!" return else if(istype(I, /obj/item/weapon/screwdriver)) open = !open - user.visible_message("[user] [open ? "opens" : "closes"] the hatch on \the [src].", "You [open ? "open" : "close"] the hatch on \the [src].") + user.visible_message("[user] [open ? "opens" : "closes"] the hatch on \the [src].", "You [open ? "open" : "close"] the hatch on \the [src].") update_icon() if(!open && user.machine == src) user << browse(null, "window=spaceheater") @@ -103,7 +103,7 @@ else on = !on - user.visible_message("[user] switches [on ? "on" : "off"] \the [src].","You switch [on ? "on" : "off"] \the [src].") + user.visible_message("[user] switches [on ? "on" : "off"] \the [src].","You switch [on ? "on" : "off"] \the [src].") update_icon() return @@ -127,7 +127,7 @@ usr.put_in_hands(cell) cell.add_fingerprint(usr) cell = null - usr.visible_message("[usr] removes the power cell from \the [src].", "You remove the power cell from \the [src].") + usr.visible_message("[usr] removes the power cell from \the [src].", "You remove the power cell from \the [src].") if("cellinstall") @@ -139,7 +139,7 @@ C.loc = src C.add_fingerprint(usr) - usr.visible_message("[usr] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") + usr.visible_message("[usr] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") updateDialog() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index e1755317dce..cc5c8e96fb8 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -277,10 +277,10 @@ return*/ else //welp, the guy is protected, we can continue if(src.issuperUV) - user << "You slide the dial back towards \"185nm\"." + user << "You slide the dial back towards \"185nm\"." src.issuperUV = 0 else - user << "You crank the dial all the way up to \"15nm\"." + user << "You crank the dial all the way up to \"15nm\"." src.issuperUV = 1 return @@ -302,7 +302,7 @@ user << "You try to touch the controls but you get zapped. There must be a short circuit somewhere." return*/ else - user << "You push the button. The coloured LED next to it changes." + user << "You push the button. The coloured LED next to it changes." src.safetieson = !src.safetieson @@ -339,7 +339,7 @@ /obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob) if(src.islocked || src.isUV) - user << "Unable to open unit." + user << "You're unable to open unit!" return 0 if(src.OCCUPANT) src.eject_occupant(user) @@ -350,7 +350,7 @@ /obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob) if(src.OCCUPANT && src.safetieson) - user << "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments." + user << "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments." return if(src.isopen) return @@ -367,7 +367,7 @@ if(!src.HELMET && !src.MASK && !src.SUIT && !src.STORAGE && !src.OCCUPANT ) //shit's empty yo user << "Unit storage bays empty. Nothing to disinfect -- Aborting." return - user << "You start the Unit's cauterisation cycle." + user << "You start the Unit's cauterisation cycle." src.cycletime_left = 20 src.isUV = 1 if(src.OCCUPANT && !src.islocked) @@ -447,7 +447,7 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT var/breakout_time = 2 - user << "You start kicking against the doors to escape! (This will take about [breakout_time] minutes.)" + user << "You start kicking against the doors to escape... (This will take about [breakout_time] minutes.)" visible_message("You see [user] kicking against the doors of \the [src]!") if(do_after(user,(breakout_time*60*10))) if(!user || user.stat != CONSCIOUS || user.loc != src || isopen || !islocked) @@ -455,7 +455,7 @@ else isopen = 1 islocked = 0 - visible_message("[user] successfully broke out of [src]!") + visible_message("[user] successfully broke out of [src]!") else return @@ -475,18 +475,18 @@ if (user.stat != 0) return if (!src.isopen) - user << "The unit's doors are shut." + user << "The unit's doors are shut!" return if (!src.ispowered || src.isbroken) - user << "The unit is not operational." + user << "The unit is not operational!" return if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) || (src.STORAGE)) - user << "It's too cluttered inside to fit in!" + user << "It's too cluttered inside to fit in!" return if(M == user) visible_message("[user] starts squeezing into the suit storage unit!", 3) else - visible_message("[user] starts putting [M.name] into the Suit Storage Unit.", 3) + visible_message("[user] starts putting [M.name] into the Suit Storage Unit!", 3) if(do_mob(user, M, 10)) user.stop_pulling() if(M.client) @@ -529,9 +529,9 @@ user << "The unit already contains a suit." return if(!user.drop_item()) - user << "\The [S] is stuck to your hand, you cannot put it in the Suit Storage Unit!" + user << "\The [S] is stuck to your hand, you cannot put it in the Suit Storage Unit!" return - user << "You load the [S.name] into the suit storage compartment." + user << "You load the [S.name] into the suit storage compartment." S.loc = src src.SUIT = S src.update_icon() @@ -542,12 +542,12 @@ return var/obj/item/clothing/head/helmet/H = I if(src.HELMET) - user << "The unit already contains a helmet." + user << "The unit already contains a helmet!" return if(!user.drop_item()) - user << "\The [H] is stuck to your hand, you cannot put it in the Suit Storage Unit!" + user << "\The [H] is stuck to your hand, you cannot put it in the Suit Storage Unit!" return - user << "You load the [H.name] into the helmet storage compartment." + user << "You load the [H.name] into the helmet storage compartment." H.loc = src src.HELMET = H src.update_icon() @@ -558,12 +558,12 @@ return var/obj/item/clothing/mask/M = I if(src.MASK) - user << "The unit already contains a mask." + user << "The unit already contains a mask!" return if(!user.drop_item()) - user << "\The [M] is stuck to your hand, you cannot put it in the Suit Storage Unit!" + user << "\The [M] is stuck to your hand, you cannot put it in the Suit Storage Unit!" return - user << "You load the [M.name] into the mask storage compartment." + user << "You load the [M.name] into the mask storage compartment." M.loc = src src.MASK = M src.update_icon() @@ -574,12 +574,12 @@ return var/obj/item/ITEM = I if(src.STORAGE) - user << "The auxiliary storage compartment is full." + user << "The auxiliary storage compartment is full!" return if(!user.drop_item()) - user << "\The [ITEM] is stuck to your hand, you cannot put it in the Suit Storage Unit!" + user << "\The [ITEM] is stuck to your hand, you cannot put it in the Suit Storage Unit!" return - user << "You load the [ITEM.name] into the auxiliary storage compartment." + user << "You load the [ITEM.name] into the auxiliary storage compartment." ITEM.loc = src src.STORAGE = ITEM src.update_icon() @@ -592,7 +592,7 @@ /obj/machinery/suit_storage_unit/attack_paw(mob/user as mob) - user << "The console controls are far too complicated for your tiny brain!" + user << "The console controls are far too complicated for your tiny brain!" return diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 85107a4deb7..d8ed227bb51 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -111,7 +111,7 @@ anchored = 0 density = 1 - layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS + layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS stat = 0 var/active = 0 @@ -150,14 +150,14 @@ if(anchored) return active ? Deactivate(user) : Activate(user) else - user << "You need to screw the beacon to the floor first!" + user << "You need to screw the beacon to the floor first!" return /obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weapon/screwdriver)) if(active) - user << "You need to deactivate the beacon first!" + user << "You need to deactivate the beacon first!" return if(anchored) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 18e6e16ebac..bea3f1e054d 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -6,7 +6,7 @@ anchored = 0 density = 0 - layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS + layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 var/datum/wires/syndicatebomb/wires = null @@ -52,16 +52,16 @@ if(istype(I, /obj/item/weapon/wrench)) if(!anchored) if(!isturf(src.loc) || istype(src.loc, /turf/space)) - user << "The bomb must be placed on solid ground to attach it" + user << "The bomb must be placed on solid ground to attach it." else - user << "You firmly wrench the bomb to the floor" + user << "You firmly wrench the bomb to the floor." playsound(loc, 'sound/items/ratchet.ogg', 50, 1) anchored = 1 if(active) - user << "The bolts lock in place" + user << "The bolts lock in place." else if(!active) - user << "You wrench the bomb from the floor" + user << "You wrench the bomb from the floor." playsound(loc, 'sound/items/ratchet.ogg', 50, 1) anchored = 0 else @@ -83,11 +83,11 @@ payload.loc = user.loc payload = null else - user << "There isn't anything in here to remove!" + user << "There isn't anything in here to remove!" else if (open_panel) - user << "The wires conneting the shell to the explosives are holding it down!" + user << "The wires connecting the shell to the explosives are holding it down!" else - user << "The cover is screwed on, it won't pry off!" + user << "The cover is screwed on, it won't pry off!" else if(istype(I, /obj/item/weapon/bombcore)) if(!payload) payload = I @@ -95,7 +95,7 @@ user.drop_item() payload.loc = src else - user << "[payload] is already loaded into [src], you'll have to remove it first." + user << "[payload] is already loaded into [src]! You'll have to remove it first." else ..() @@ -114,7 +114,7 @@ settings(user) return else if(anchored) - user << "The bomb is bolted to the floor!" + user << "The bomb is bolted to the floor!" return /obj/machinery/syndicatebomb/proc/settings(var/mob/user) @@ -126,7 +126,7 @@ if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) if(defused) - src.loc.visible_message("\icon[src] Device error: User intervention required.") + src.loc.visible_message("\icon[src] Device error: User intervention required.") return else src.loc.visible_message("\icon[src] [timer] seconds until detonation, please clear the area.") @@ -274,6 +274,14 @@ /obj/item/weapon/bombcore/badmin/explosion/detonate() explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion, flame_range = Flames) +/obj/item/weapon/bombcore/miniature + name = "small bomb core" + w_class = 2 + +/obj/item/weapon/bombcore/miniature/detonate() + explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb + qdel(src) + ///Syndicate Detonator (aka the big red button)/// /obj/item/device/syndicatedetonator diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 27f39329e7c..064361f2614 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -1,572 +1,572 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/* - The broadcaster sends processed messages to all radio devices in the game. They - do not have to be headsets; intercoms and station-bounced radios suffice. - - They receive their message from a server after the message has been logged. -*/ - -var/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam -var/message_delay = 0 // To make sure restarting the recentmessages list is kept in sync - -/obj/machinery/telecomms/broadcaster - name = "subspace broadcaster" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "broadcaster" - desc = "A dish-shaped machine used to broadcast processed subspace signals." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 25 - machinetype = 5 - /*heatgen = 0 - delay = 7*/ - circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" - -/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - // Don't broadcast rejected signals - if(signal.data["reject"]) - return - - if(signal.data["message"]) - - - // Prevents massive radio spam - signal.data["done"] = 1 // mark the signal as being broadcasted - // Search for the original signal and mark it as done as well - var/datum/signal/original = signal.data["original"] - if(original) - original.data["done"] = 1 - original.data["compression"] = signal.data["compression"] - original.data["level"] = signal.data["level"] - - var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]" - if(signal_message in recentmessages) - return - recentmessages.Add(signal_message) - - if(signal.data["slow"] > 0) - sleep(signal.data["slow"]) // simulate the network lag if necessary - - signal.data["level"] |= listening_level - - /** #### - Normal Broadcast - #### **/ - - if(signal.data["type"] == 0) - - /* ###### Broadcast a message using signal.data ###### */ - 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, signal.data["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - - /** #### - Simple Broadcast - #### **/ - - if(signal.data["type"] == 1) - - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_SimpleMessage(signal.data["name"], signal.frequency, - signal.data["message"],null, null, - signal.data["compression"], listening_level) - - - /** #### - Artificial Broadcast - #### **/ - // (Imitates a mob) - - if(signal.data["type"] == 2) - - /* ###### Broadcast a message using signal.data ###### */ - // Parameter "data" as 4: AI can't track this person/mob - Broadcast_Message(signal.data["mob"], - 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["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - if(!message_delay) - message_delay = 1 - spawn(10) - message_delay = 0 - recentmessages = list() - - /* --- Do a snazzy animation! --- */ - flick("broadcaster_send", src) - -/obj/machinery/telecomms/broadcaster/Destroy() - // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. - if(message_delay) - message_delay = 0 - ..() - - -/* - Basically just an empty shell for receiving and broadcasting radio messages. Not - very flexible, but it gets the job done. -*/ - -/obj/machinery/telecomms/allinone - name = "telecommunications mainframe" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "comm_server" - desc = "A compact machine used for portable subspace telecommuniations processing." - density = 1 - anchored = 1 - use_power = 0 - idle_power_usage = 0 - machinetype = 6 - //heatgen = 0 - var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel - -/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal) - - if(!on) // has to be on to receive messages - return - - if(is_freq_listening(signal)) // detect subspace signals - - signal.data["done"] = 1 // mark the signal as being broadcasted - signal.data["compression"] = 0 - - // Search for the original signal and mark it as done as well - var/datum/signal/original = signal.data["original"] - if(original) - original.data["done"] = 1 - - if(signal.data["slow"] > 0) - sleep(signal.data["slow"]) // simulate the network lag if necessary - - /* ###### Broadcast a message using signal.data ###### */ - if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just - Broadcast_Message(signal.data["mob"], - 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["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - -/** - - Here is the big, bad function that broadcasts a message given the appropriate - parameters. - - @param M: - Reference to the mob/speaker, stored in signal.data["mob"] - - @param vmask: - Boolean value if the mob is "hiding" its identity via voice mask, stored in - signal.data["vmask"] - - @param vmessage: - If specified, will display this as the message; such as "chimpering" - for monkeys if the mob is not understood. Stored in signal.data["vmessage"]. - - @param radio: - Reference to the radio broadcasting the message, stored in signal.data["radio"] - - @param message: - The actual string message to display to mobs who understood mob M. Stored in - signal.data["message"] - - @param name: - The name to display when a mob receives the message. signal.data["name"] - - @param job: - The name job to display for the AI when it receives the message. signal.data["job"] - - @param realname: - The "real" name associated with the mob. signal.data["realname"] - - @param vname: - If specified, will use this name when mob M is not understood. signal.data["vname"] - - @param data: - If specified: - 1 -- Will only broadcast to intercoms - 2 -- Will only broadcast to intercoms and station-bounced radios - 3 -- Broadcast to syndicate frequency - 4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob - - @param compression: - If 0, the signal is audible - If nonzero, the signal may be partially inaudible or just complete gibberish. - - @param level: - The list of Z levels that the sending radio is broadcasting to. Having 0 in the list broadcasts on all levels - - @param freq - The frequency of the signal - -**/ - - -/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/list/spans, - var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell) - - message = copytext(message, 1, MAX_BROADCAST_LEN) - - if(!message) - return - - var/list/radios = list() - - var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null) - virt.name = name - virt.job = job - virt.languages = AM.languages - virt.source = AM - virt.faketrack = data == 4 ? 1 : 0 - virt.radio = radio - virt.verb_say = verb_say - virt.verb_ask = verb_ask - virt.verb_exclaim = verb_exclaim - virt.verb_yell = verb_yell - - if(compression > 0) - message = Gibberish(message, compression + 40) - - // --- Broadcast only to intercom devices --- - - if(data == 1) - for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"]) - if(R.receive_range(freq, level) > -1) - radios += R - - // --- Broadcast only to intercoms and station-bounced radios --- - - else if(data == 2) - - for(var/obj/item/device/radio/R in all_radios["[freq]"]) - if(istype(R, /obj/item/device/radio/headset)) - continue - - if(R.receive_range(freq, level) > -1) - radios += R - - // --- Broadcast to ALL radio devices --- - - else - for(var/obj/item/device/radio/R in all_radios["[freq]"]) - if(R.receive_range(freq, level) > -1) - radios += R - - var/freqtext = num2text(freq) - for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. - if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse) - radios |= R - - // Get a list of mobs who can hear from the radios we collected. - var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers. - - for(var/mob/R in receive) //Filter receiver list. - if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - receive -= R - - for(var/mob/M in player_list) - if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO)) - receive |= M - - 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, 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, spans)]" - if(istype(blackbox)) - switch(freq) - if(1459) - blackbox.msg_common += blackbox_msg - if(1351) - blackbox.msg_science += blackbox_msg - if(1353) - blackbox.msg_command += blackbox_msg - if(1355) - blackbox.msg_medical += blackbox_msg - if(1357) - blackbox.msg_engineering += blackbox_msg - if(1359) - blackbox.msg_security += blackbox_msg - if(1441) - blackbox.msg_deathsquad += blackbox_msg - if(1213) - blackbox.msg_syndicate += blackbox_msg - if(1349) - blackbox.msg_service += blackbox_msg - if(1347) - blackbox.msg_cargo += blackbox_msg - else - blackbox.messages += blackbox_msg - - spawn(50) - PlaceInPool(virt) - -/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) - - /* ###### Prepare the radio connection ###### */ - - if(!M) - var/mob/living/carbon/human/H = new - M = H - - var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency) - - var/display_freq = connection.frequency - - var/list/receive = list() - - - // --- Broadcast only to intercom devices --- - - if(data == 1) - for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(display_freq, level) - - - // --- Broadcast only to intercoms and station-bounced radios --- - - else if(data == 2) - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - - if(istype(R, /obj/item/device/radio/headset)) - continue - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(display_freq) - - - // --- Broadcast to syndicate radio! --- - - else if(data == 3) - var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) - - for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(SYND_FREQ) - - - // --- Broadcast to ALL radio devices --- - - else - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(display_freq) - - - /* ###### Organize the receivers into categories for displaying the message ###### */ - - // Understood the message: - var/list/heard_normal = list() // normal message - - // Did not understand the message: - var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!") - var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!") - - for (var/mob/R in receive) - - /* --- Loop through the receivers and categorize them --- */ - - if (R.client && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - continue - - - // --- Check for compression --- - if(compression > 0) - - heard_gibberish += R - continue - - // --- Can understand the speech --- - - if (R.languages & M.languages) - - heard_normal += R - - // --- Can't understand the speech --- - - else - // - Just display a garbled message - - - heard_garbled += R - - - /* ###### Begin formatting and sending the message ###### */ - if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish)) - - /* --- Some miscellaneous variables to format the string output --- */ - var/part_a = "" // goes in the actual output - var/freq_text // the name of the channel - - // --- Set the name of the channel --- - switch(display_freq) - - if(SYND_FREQ) - freq_text = "#unkn" - if(COMM_FREQ) - freq_text = "Command" - if(SCI_FREQ) - freq_text = "Science" - if(MED_FREQ) - freq_text = "Medical" - if(ENG_FREQ) - freq_text = "Engineering" - if(SEC_FREQ) - freq_text = "Security" - if(SERV_FREQ) - freq_text = "Service" - if(SUPP_FREQ) - freq_text = "Supply" - if(AIPRIV_FREQ) - freq_text = "AI Private" - //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO - - - // --- If the frequency has not been assigned a name, just use the frequency as the name --- - - if(!freq_text) - freq_text = format_frequency(display_freq) - - // --- Some more pre-message formatting --- - - var/part_b_extra = "" - if(data == 3) // intercepted radio message - part_b_extra = " (Intercepted)" - - // Create a radio headset for the sole purpose of using its icon - var/obj/item/device/radio/headset/radio = new - - var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " - var/part_c = "" - - if (display_freq==SYND_FREQ) - part_a = "" - else if (display_freq==COMM_FREQ) - part_a = "" - else if (display_freq==SCI_FREQ) - part_a = "" - else if (display_freq==MED_FREQ) - part_a = "" - else if (display_freq==ENG_FREQ) - part_a = "" - else if (display_freq==SEC_FREQ) - part_a = "" - else if (display_freq==SERV_FREQ) - part_a = "" - else if (display_freq==SUPP_FREQ) - part_a = "" - else if (display_freq==CENTCOM_FREQ) - part_a = "" - else if (display_freq==AIPRIV_FREQ) - part_a = "" - - // --- This following recording is intended for research and feedback in the use of department radio channels --- - - var/part_blackbox_b = " \[[freq_text]\] " - var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]" - //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" - - //BR.messages_admin += blackbox_admin_msg - if(istype(blackbox)) - switch(display_freq) - if(1459) - blackbox.msg_common += blackbox_msg - if(1351) - blackbox.msg_science += blackbox_msg - if(1353) - blackbox.msg_command += blackbox_msg - if(1355) - blackbox.msg_medical += blackbox_msg - if(1357) - blackbox.msg_engineering += blackbox_msg - if(1359) - blackbox.msg_security += blackbox_msg - if(1441) - blackbox.msg_deathsquad += blackbox_msg - if(1213) - blackbox.msg_syndicate += blackbox_msg - if(1349) - blackbox.msg_service += blackbox_msg - if(1347) - blackbox.msg_cargo += blackbox_msg - else - blackbox.messages += blackbox_msg - - //End of research and feedback code. - - /* ###### Send the message ###### */ - - /* --- Process all the mobs that heard the voice normally (understood) --- */ - - if (length(heard_normal)) - var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]" - - for (var/mob/R in heard_normal) - R.show_message(rendered, 2) - - /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ - // Displays garbled message (ie "f*c* **u, **i*er!") - - if (length(heard_garbled)) - var/quotedmsg = "\"[stars(text)]\"" - var/rendered = "[part_a][source][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_garbled) - R.show_message(rendered, 2) - - - /* --- Complete gibberish. Usually happens when there's a compressed message --- */ - - if (length(heard_gibberish)) - var/quotedmsg = "\"[Gibberish(text, compression + 50)]\"" - var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]" - - for (var/mob/R in heard_gibberish) - R.show_message(rendered, 2) - -//Use this to test if an obj can communicate with a Telecommunications Network - -/atom/proc/test_telecomms() - var/datum/signal/signal = src.telecomms_process() - var/turf/position = get_turf(src) - return (position.z in signal.data["level"] && signal.data["done"]) - -/atom/proc/telecomms_process() - - // First, we want to generate a new radio signal - var/datum/signal/signal = new - signal.transmission_method = 2 // 2 would be a subspace transmission. - var/turf/pos = get_turf(src) - - // --- Finally, tag the actual signal with the appropriate values --- - signal.data = list( - "slow" = 0, // how much to sleep() before broadcasting - simulates net lag - "message" = "TEST", - "compression" = rand(45, 50), // If the signal is compressed, compress our message too. - "traffic" = 0, // dictates the total traffic sum that the signal went through - "type" = 4, // determines what type of radio input it is: test broadcast - "reject" = 0, - "done" = 0, - "level" = pos.z // The level it is being broadcasted at. - ) - signal.frequency = 1459// Common channel - - //#### Sending the signal to all subspace receivers ####// - for(var/obj/machinery/telecomms/receiver/R in telecomms_list) - R.receive_signal(signal) - - sleep(rand(10,25)) - - return signal - +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/* + The broadcaster sends processed messages to all radio devices in the game. They + do not have to be headsets; intercoms and station-bounced radios suffice. + + They receive their message from a server after the message has been logged. +*/ + +var/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam +var/message_delay = 0 // To make sure restarting the recentmessages list is kept in sync + +/obj/machinery/telecomms/broadcaster + name = "subspace broadcaster" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "broadcaster" + desc = "A dish-shaped machine used to broadcast processed subspace signals." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 25 + machinetype = 5 + /*heatgen = 0 + delay = 7*/ + circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" + +/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + // Don't broadcast rejected signals + if(signal.data["reject"]) + return + + if(signal.data["message"]) + + + // Prevents massive radio spam + signal.data["done"] = 1 // mark the signal as being broadcasted + // Search for the original signal and mark it as done as well + var/datum/signal/original = signal.data["original"] + if(original) + original.data["done"] = 1 + original.data["compression"] = signal.data["compression"] + original.data["level"] = signal.data["level"] + + var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]" + if(signal_message in recentmessages) + return + recentmessages.Add(signal_message) + + if(signal.data["slow"] > 0) + sleep(signal.data["slow"]) // simulate the network lag if necessary + + signal.data["level"] |= listening_level + + /** #### - Normal Broadcast - #### **/ + + if(signal.data["type"] == 0) + + /* ###### Broadcast a message using signal.data ###### */ + 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, signal.data["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + + + /** #### - Simple Broadcast - #### **/ + + if(signal.data["type"] == 1) + + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_SimpleMessage(signal.data["name"], signal.frequency, + signal.data["message"],null, null, + signal.data["compression"], listening_level) + + + /** #### - Artificial Broadcast - #### **/ + // (Imitates a mob) + + if(signal.data["type"] == 2) + + /* ###### Broadcast a message using signal.data ###### */ + // Parameter "data" as 4: AI can't track this person/mob + Broadcast_Message(signal.data["mob"], + 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["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + + if(!message_delay) + message_delay = 1 + spawn(10) + message_delay = 0 + recentmessages = list() + + /* --- Do a snazzy animation! --- */ + flick("broadcaster_send", src) + +/obj/machinery/telecomms/broadcaster/Destroy() + // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. + if(message_delay) + message_delay = 0 + ..() + + +/* + Basically just an empty shell for receiving and broadcasting radio messages. Not + very flexible, but it gets the job done. +*/ + +/obj/machinery/telecomms/allinone + name = "telecommunications mainframe" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "comm_server" + desc = "A compact machine used for portable subspace telecommuniations processing." + density = 1 + anchored = 1 + use_power = 0 + idle_power_usage = 0 + machinetype = 6 + //heatgen = 0 + var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel + +/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal) + + if(!on) // has to be on to receive messages + return + + if(is_freq_listening(signal)) // detect subspace signals + + signal.data["done"] = 1 // mark the signal as being broadcasted + signal.data["compression"] = 0 + + // Search for the original signal and mark it as done as well + var/datum/signal/original = signal.data["original"] + if(original) + original.data["done"] = 1 + + if(signal.data["slow"] > 0) + sleep(signal.data["slow"]) // simulate the network lag if necessary + + /* ###### Broadcast a message using signal.data ###### */ + if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just + Broadcast_Message(signal.data["mob"], + 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["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + + +/** + + Here is the big, bad function that broadcasts a message given the appropriate + parameters. + + @param M: + Reference to the mob/speaker, stored in signal.data["mob"] + + @param vmask: + Boolean value if the mob is "hiding" its identity via voice mask, stored in + signal.data["vmask"] + + @param vmessage: + If specified, will display this as the message; such as "chimpering" + for monkeys if the mob is not understood. Stored in signal.data["vmessage"]. + + @param radio: + Reference to the radio broadcasting the message, stored in signal.data["radio"] + + @param message: + The actual string message to display to mobs who understood mob M. Stored in + signal.data["message"] + + @param name: + The name to display when a mob receives the message. signal.data["name"] + + @param job: + The name job to display for the AI when it receives the message. signal.data["job"] + + @param realname: + The "real" name associated with the mob. signal.data["realname"] + + @param vname: + If specified, will use this name when mob M is not understood. signal.data["vname"] + + @param data: + If specified: + 1 -- Will only broadcast to intercoms + 2 -- Will only broadcast to intercoms and station-bounced radios + 3 -- Broadcast to syndicate frequency + 4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob + + @param compression: + If 0, the signal is audible + If nonzero, the signal may be partially inaudible or just complete gibberish. + + @param level: + The list of Z levels that the sending radio is broadcasting to. Having 0 in the list broadcasts on all levels + + @param freq + The frequency of the signal + +**/ + + +/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/list/spans, + var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell) + + message = copytext(message, 1, MAX_BROADCAST_LEN) + + if(!message) + return + + var/list/radios = list() + + var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null) + virt.name = name + virt.job = job + virt.languages = AM.languages + virt.source = AM + virt.faketrack = data == 4 ? 1 : 0 + virt.radio = radio + virt.verb_say = verb_say + virt.verb_ask = verb_ask + virt.verb_exclaim = verb_exclaim + virt.verb_yell = verb_yell + + if(compression > 0) + message = Gibberish(message, compression + 40) + + // --- Broadcast only to intercom devices --- + + if(data == 1) + for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) + radios += R + + // --- Broadcast only to intercoms and station-bounced radios --- + + else if(data == 2) + + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(istype(R, /obj/item/device/radio/headset)) + continue + + if(R.receive_range(freq, level) > -1) + radios += R + + // --- Broadcast to ALL radio devices --- + + else + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) + radios += R + + var/freqtext = num2text(freq) + for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. + if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse) + radios |= R + + // Get a list of mobs who can hear from the radios we collected. + var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers. + + for(var/mob/R in receive) //Filter receiver list. + if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + receive -= R + + for(var/mob/M in player_list) + if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO)) + receive |= M + + 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, 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, spans)]" + if(istype(blackbox)) + switch(freq) + if(1459) + blackbox.msg_common += blackbox_msg + if(1351) + blackbox.msg_science += blackbox_msg + if(1353) + blackbox.msg_command += blackbox_msg + if(1355) + blackbox.msg_medical += blackbox_msg + if(1357) + blackbox.msg_engineering += blackbox_msg + if(1359) + blackbox.msg_security += blackbox_msg + if(1441) + blackbox.msg_deathsquad += blackbox_msg + if(1213) + blackbox.msg_syndicate += blackbox_msg + if(1349) + blackbox.msg_service += blackbox_msg + if(1347) + blackbox.msg_cargo += blackbox_msg + else + blackbox.messages += blackbox_msg + + spawn(50) + PlaceInPool(virt) + +/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) + + /* ###### Prepare the radio connection ###### */ + + if(!M) + var/mob/living/carbon/human/H = new + M = H + + var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency) + + var/display_freq = connection.frequency + + var/list/receive = list() + + + // --- Broadcast only to intercom devices --- + + if(data == 1) + for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq, level) + + + // --- Broadcast only to intercoms and station-bounced radios --- + + else if(data == 2) + for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) + + if(istype(R, /obj/item/device/radio/headset)) + continue + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq) + + + // --- Broadcast to syndicate radio! --- + + else if(data == 3) + var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) + + for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(SYND_FREQ) + + + // --- Broadcast to ALL radio devices --- + + else + for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq) + + + /* ###### Organize the receivers into categories for displaying the message ###### */ + + // Understood the message: + var/list/heard_normal = list() // normal message + + // Did not understand the message: + var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!") + var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!") + + for (var/mob/R in receive) + + /* --- Loop through the receivers and categorize them --- */ + + if (R.client && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + continue + + + // --- Check for compression --- + if(compression > 0) + + heard_gibberish += R + continue + + // --- Can understand the speech --- + + if (R.languages & M.languages) + + heard_normal += R + + // --- Can't understand the speech --- + + else + // - Just display a garbled message - + + heard_garbled += R + + + /* ###### Begin formatting and sending the message ###### */ + if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish)) + + /* --- Some miscellaneous variables to format the string output --- */ + var/part_a = "" // goes in the actual output + var/freq_text // the name of the channel + + // --- Set the name of the channel --- + switch(display_freq) + + if(SYND_FREQ) + freq_text = "#unkn" + if(COMM_FREQ) + freq_text = "Command" + if(SCI_FREQ) + freq_text = "Science" + if(MED_FREQ) + freq_text = "Medical" + if(ENG_FREQ) + freq_text = "Engineering" + if(SEC_FREQ) + freq_text = "Security" + if(SERV_FREQ) + freq_text = "Service" + if(SUPP_FREQ) + freq_text = "Supply" + if(AIPRIV_FREQ) + freq_text = "AI Private" + //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO + + + // --- If the frequency has not been assigned a name, just use the frequency as the name --- + + if(!freq_text) + freq_text = format_frequency(display_freq) + + // --- Some more pre-message formatting --- + + var/part_b_extra = "" + if(data == 3) // intercepted radio message + part_b_extra = " (Intercepted)" + + // Create a radio headset for the sole purpose of using its icon + var/obj/item/device/radio/headset/radio = new + + var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " + var/part_c = "" + + if (display_freq==SYND_FREQ) + part_a = "" + else if (display_freq==COMM_FREQ) + part_a = "" + else if (display_freq==SCI_FREQ) + part_a = "" + else if (display_freq==MED_FREQ) + part_a = "" + else if (display_freq==ENG_FREQ) + part_a = "" + else if (display_freq==SEC_FREQ) + part_a = "" + else if (display_freq==SERV_FREQ) + part_a = "" + else if (display_freq==SUPP_FREQ) + part_a = "" + else if (display_freq==CENTCOM_FREQ) + part_a = "" + else if (display_freq==AIPRIV_FREQ) + part_a = "" + + // --- This following recording is intended for research and feedback in the use of department radio channels --- + + var/part_blackbox_b = " \[[freq_text]\] " + var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]" + //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" + + //BR.messages_admin += blackbox_admin_msg + if(istype(blackbox)) + switch(display_freq) + if(1459) + blackbox.msg_common += blackbox_msg + if(1351) + blackbox.msg_science += blackbox_msg + if(1353) + blackbox.msg_command += blackbox_msg + if(1355) + blackbox.msg_medical += blackbox_msg + if(1357) + blackbox.msg_engineering += blackbox_msg + if(1359) + blackbox.msg_security += blackbox_msg + if(1441) + blackbox.msg_deathsquad += blackbox_msg + if(1213) + blackbox.msg_syndicate += blackbox_msg + if(1349) + blackbox.msg_service += blackbox_msg + if(1347) + blackbox.msg_cargo += blackbox_msg + else + blackbox.messages += blackbox_msg + + //End of research and feedback code. + + /* ###### Send the message ###### */ + + /* --- Process all the mobs that heard the voice normally (understood) --- */ + + if (length(heard_normal)) + var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]" + + for (var/mob/R in heard_normal) + R.show_message(rendered, 2) + + /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ + // Displays garbled message (ie "f*c* **u, **i*er!") + + if (length(heard_garbled)) + var/quotedmsg = "\"[stars(text)]\"" + var/rendered = "[part_a][source][part_b][quotedmsg][part_c]" + + for (var/mob/R in heard_garbled) + R.show_message(rendered, 2) + + + /* --- Complete gibberish. Usually happens when there's a compressed message --- */ + + if (length(heard_gibberish)) + var/quotedmsg = "\"[Gibberish(text, compression + 50)]\"" + var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]" + + for (var/mob/R in heard_gibberish) + R.show_message(rendered, 2) + +//Use this to test if an obj can communicate with a Telecommunications Network + +/atom/proc/test_telecomms() + var/datum/signal/signal = src.telecomms_process() + var/turf/position = get_turf(src) + return (position.z in signal.data["level"] && signal.data["done"]) + +/atom/proc/telecomms_process() + + // First, we want to generate a new radio signal + var/datum/signal/signal = new + signal.transmission_method = 2 // 2 would be a subspace transmission. + var/turf/pos = get_turf(src) + + // --- Finally, tag the actual signal with the appropriate values --- + signal.data = list( + "slow" = 0, // how much to sleep() before broadcasting - simulates net lag + "message" = "TEST", + "compression" = rand(45, 50), // If the signal is compressed, compress our message too. + "traffic" = 0, // dictates the total traffic sum that the signal went through + "type" = 4, // determines what type of radio input it is: test broadcast + "reject" = 0, + "done" = 0, + "level" = pos.z // The level it is being broadcasted at. + ) + signal.frequency = 1459// Common channel + + //#### Sending the signal to all subspace receivers ####// + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + R.receive_signal(signal) + + sleep(rand(10,25)) + + return signal + diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm new file mode 100644 index 00000000000..b6ab78b9fc1 --- /dev/null +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -0,0 +1,441 @@ + +/** + + Here is the big, bad function that broadcasts a message given the appropriate + parameters. + + @param M: + Reference to the mob/speaker, stored in signal.data["mob"] + + @param vmask: + Boolean value if the mob is "hiding" its identity via voice mask, stored in + signal.data["vmask"] + + @param vmessage: + If specified, will display this as the message; such as "chimpering" + for monkeys if the mob is not understood. Stored in signal.data["vmessage"]. + + @param radio: + Reference to the radio broadcasting the message, stored in signal.data["radio"] + + @param message: + The actual string message to display to mobs who understood mob M. Stored in + signal.data["message"] + + @param name: + The name to display when a mob receives the message. signal.data["name"] + + @param job: + The name job to display for the AI when it receives the message. signal.data["job"] + + @param realname: + The "real" name associated with the mob. signal.data["realname"] + + @param vname: + If specified, will use this name when mob M is not understood. signal.data["vname"] + + @param data: + If specified: + 1 -- Will only broadcast to intercoms + 2 -- Will only broadcast to intercoms and station-bounced radios + 3 -- Broadcast to syndicate frequency + 4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob + + @param compression: + If 0, the signal is audible + If nonzero, the signal may be partially inaudible or just complete gibberish. + + @param level: + The list of Z levels that the sending radio is broadcasting to. Having 0 in the list broadcasts on all levels + + @param freq + The frequency of the signal + +**/ + + +/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/list/spans, + var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell) + + message = copytext(message, 1, MAX_BROADCAST_LEN) + + if(!message) + return + + var/list/radios = list() + + var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null) + virt.name = name + virt.job = job + virt.languages = AM.languages + virt.source = AM + virt.faketrack = data == 4 ? 1 : 0 + virt.radio = radio + virt.verb_say = verb_say + virt.verb_ask = verb_ask + virt.verb_exclaim = verb_exclaim + virt.verb_yell = verb_yell + + if(compression > 0) + message = Gibberish(message, compression + 40) + + // --- Broadcast only to intercom devices --- + + if(data == 1) + for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) + radios += R + + // --- Broadcast only to intercoms and station-bounced radios --- + + else if(data == 2) + + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(R.subspace_transmission) + continue + + if(R.receive_range(freq, level) > -1) + radios += R + + // --- This space left blank for Syndicate data --- + + // --- Centcom radio, yo. --- + + else if(data == 4) + + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(!R.centcom) + continue + + if(R.receive_range(freq, level) > -1) + radios += R + + // --- Broadcast to ALL radio devices --- + + else + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) + radios += R + + var/freqtext = num2text(freq) + for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. + if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse) + radios |= R + + // Get a list of mobs who can hear from the radios we collected. + var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers. + + for(var/mob/R in receive) //Filter receiver list. + if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + receive -= R + + for(var/mob/M in player_list) + if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO)) + receive |= M + + 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, 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, spans)]" + if(istype(blackbox)) + switch(freq) + if(1459) + blackbox.msg_common += blackbox_msg + if(1351) + blackbox.msg_science += blackbox_msg + if(1353) + blackbox.msg_command += blackbox_msg + if(1355) + blackbox.msg_medical += blackbox_msg + if(1357) + blackbox.msg_engineering += blackbox_msg + if(1359) + blackbox.msg_security += blackbox_msg + if(1441) + blackbox.msg_deathsquad += blackbox_msg + if(1213) + blackbox.msg_syndicate += blackbox_msg + if(1349) + blackbox.msg_service += blackbox_msg + if(1347) + blackbox.msg_cargo += blackbox_msg + else + blackbox.messages += blackbox_msg + + spawn(50) + PlaceInPool(virt) + +/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) + + /* ###### Prepare the radio connection ###### */ + + if(!M) + var/mob/living/carbon/human/H = new + M = H + + var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency) + + var/display_freq = connection.frequency + + var/list/receive = list() + + + // --- Broadcast only to intercom devices --- + + if(data == 1) + for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq, level) + + + // --- Broadcast only to intercoms and station-bounced radios --- + + else if(data == 2) + for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) + if(R.subspace_transmission) + continue + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq) + + + // --- Broadcast to syndicate radio! --- + + else if(data == 3) + var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) + + for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(SYND_FREQ) + + // --- Centcom radio, yo. --- + + else if(data == 4) + + for(var/obj/item/device/radio/R in all_radios["[RADIO_CHAT]"]) + if(R.centcom) + receive |= R.send_hear(CENTCOM_FREQ) + + // --- Broadcast to ALL radio devices --- + + else + for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq) + + + /* ###### Organize the receivers into categories for displaying the message ###### */ + + // Understood the message: + var/list/heard_normal = list() // normal message + + // Did not understand the message: + var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!") + var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!") + + for (var/mob/R in receive) + + /* --- Loop through the receivers and categorize them --- */ + + if (R.client && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + continue + + + // --- Check for compression --- + if(compression > 0) + + heard_gibberish += R + continue + + // --- Can understand the speech --- + + if (R.languages & M.languages) + + heard_normal += R + + // --- Can't understand the speech --- + + else + // - Just display a garbled message - + + heard_garbled += R + + + /* ###### Begin formatting and sending the message ###### */ + if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish)) + + /* --- Some miscellaneous variables to format the string output --- */ + var/part_a = "" // goes in the actual output + var/freq_text // the name of the channel + + // --- Set the name of the channel --- + switch(display_freq) + + if(SYND_FREQ) + freq_text = "#unkn" + if(COMM_FREQ) + freq_text = "Command" + if(SCI_FREQ) + freq_text = "Science" + if(MED_FREQ) + freq_text = "Medical" + if(ENG_FREQ) + freq_text = "Engineering" + if(SEC_FREQ) + freq_text = "Security" + if(SERV_FREQ) + freq_text = "Service" + if(SUPP_FREQ) + freq_text = "Supply" + if(AIPRIV_FREQ) + freq_text = "AI Private" + //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO + + + // --- If the frequency has not been assigned a name, just use the frequency as the name --- + + if(!freq_text) + freq_text = format_frequency(display_freq) + + // --- Some more pre-message formatting --- + + var/part_b_extra = "" + if(data == 3) // intercepted radio message + part_b_extra = " (Intercepted)" + + // Create a radio headset for the sole purpose of using its icon + var/obj/item/device/radio/headset/radio = new + + var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " + var/part_c = "" + + if (display_freq==SYND_FREQ) + part_a = "" + else if (display_freq==COMM_FREQ) + part_a = "" + else if (display_freq==SCI_FREQ) + part_a = "" + else if (display_freq==MED_FREQ) + part_a = "" + else if (display_freq==ENG_FREQ) + part_a = "" + else if (display_freq==SEC_FREQ) + part_a = "" + else if (display_freq==SERV_FREQ) + part_a = "" + else if (display_freq==SUPP_FREQ) + part_a = "" + else if (display_freq==CENTCOM_FREQ) + part_a = "" + else if (display_freq==AIPRIV_FREQ) + part_a = "" + + // --- This following recording is intended for research and feedback in the use of department radio channels --- + + var/part_blackbox_b = " \[[freq_text]\] " + var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]" + //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" + + //BR.messages_admin += blackbox_admin_msg + if(istype(blackbox)) + switch(display_freq) + if(1459) + blackbox.msg_common += blackbox_msg + if(1351) + blackbox.msg_science += blackbox_msg + if(1353) + blackbox.msg_command += blackbox_msg + if(1355) + blackbox.msg_medical += blackbox_msg + if(1357) + blackbox.msg_engineering += blackbox_msg + if(1359) + blackbox.msg_security += blackbox_msg + if(1441) + blackbox.msg_deathsquad += blackbox_msg + if(1213) + blackbox.msg_syndicate += blackbox_msg + if(1349) + blackbox.msg_service += blackbox_msg + if(1347) + blackbox.msg_cargo += blackbox_msg + else + blackbox.messages += blackbox_msg + + //End of research and feedback code. + + /* ###### Send the message ###### */ + + /* --- Process all the mobs that heard the voice normally (understood) --- */ + + if (length(heard_normal)) + var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]" + + for (var/mob/R in heard_normal) + R.show_message(rendered, 2) + + /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ + // Displays garbled message (ie "f*c* **u, **i*er!") + + if (length(heard_garbled)) + var/quotedmsg = "\"[stars(text)]\"" + var/rendered = "[part_a][source][part_b][quotedmsg][part_c]" + + for (var/mob/R in heard_garbled) + R.show_message(rendered, 2) + + + /* --- Complete gibberish. Usually happens when there's a compressed message --- */ + + if (length(heard_gibberish)) + var/quotedmsg = "\"[Gibberish(text, compression + 50)]\"" + var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]" + + for (var/mob/R in heard_gibberish) + R.show_message(rendered, 2) + +//Use this to test if an obj can communicate with a Telecommunications Network + +/atom/proc/test_telecomms() + var/datum/signal/signal = src.telecomms_process() + var/turf/position = get_turf(src) + return (position.z in signal.data["level"] && signal.data["done"]) + +/atom/proc/telecomms_process() + + // First, we want to generate a new radio signal + var/datum/signal/signal = new + signal.transmission_method = 2 // 2 would be a subspace transmission. + var/turf/pos = get_turf(src) + + // --- Finally, tag the actual signal with the appropriate values --- + signal.data = list( + "slow" = 0, // how much to sleep() before broadcasting - simulates net lag + "message" = "TEST", + "compression" = rand(45, 50), // If the signal is compressed, compress our message too. + "traffic" = 0, // dictates the total traffic sum that the signal went through + "type" = 4, // determines what type of radio input it is: test broadcast + "reject" = 0, + "done" = 0, + "level" = pos.z // The level it is being broadcasted at. + ) + signal.frequency = 1459// Common channel + + //#### Sending the signal to all subspace receivers ####// + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + R.receive_signal(signal) + + sleep(rand(10,25)) + + return signal + diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm new file mode 100644 index 00000000000..8798f07c20c --- /dev/null +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -0,0 +1,232 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/obj/machinery/computer/telecomms/server + name = "telecommunications server monitoring console" + icon_state = "comm_logs" + + var/screen = 0 // the screen number: + var/list/servers = list() // the servers located by the computer + var/obj/machinery/telecomms/server/SelectedServer + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/universal_translate = 0 // set to 1 if it can translate nonhuman speech + + req_access = list(access_tcomsat) + circuit = "/obj/item/weapon/circuitboard/comm_server" + +/obj/machinery/computer/telecomms/server/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunication Server Monitor
Telecommunications Server Monitor
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(servers.len) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]" + + if(SelectedServer.totaltraffic >= 1024) + dat += "
Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes

" + else + dat += "
Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes

" + + dat += "Stored Logs:
    " + + var/i = 0 + for(var/datum/comm_log_entry/C in SelectedServer.log_entries) + i++ + + + // If the log is a speech file + if(C.input_type == "Speech File") + + dat += "
  1. [C.name] \[X\]
    " + + // -- Determine race of orator -- + + var/race // The actual race of the mob + var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human + var/mobtype = C.parameters["mobtype"] + + var/list/humans = typesof(/mob/living/carbon/human, /mob/living/carbon/brain) + var/list/monkeys = typesof(/mob/living/carbon/monkey) + var/list/silicons = typesof(/mob/living/silicon) + var/list/slimes = typesof(/mob/living/simple_animal/slime) + var/list/animals = typesof(/mob/living/simple_animal) + + if(mobtype in humans) + race = "Human" + language = race + + else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes + race = "Slime" + language = race + + else if(mobtype in monkeys) + race = "Monkey" + language = race + + else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job + race = "Artificial Life" + language = race + + else if(istype(mobtype, /obj)) + race = "Machinery" + language = race + + else if(mobtype in animals) + race = "Domestic Animal" + language = race + + else + race = "Unidentifiable" + language = race + + // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- + + if(language == "Human" || universal_translate || C.parameters["uspeech"]) + dat += "Data type: [C.input_type]
    " + dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " + dat += "Class: [race]
    " + dat += "Contents: \"[C.parameters["message"]]\"
    " + + + // -- Orator is not human and universal translate not active -- + + else + dat += "Data type: Audio File
    " + dat += "Source: Unidentifiable
    " + dat += "Class: [race]
    " + dat += "Contents: Unintelligble
    " + + dat += "

  2. " + + else if(C.input_type == "Execution Error") + + dat += "
  3. [C.name] \[X\]
    " + dat += "Output: \"[C.parameters["message"]]\"
    " + dat += "

  4. " + + + dat += "
" + + + + user << browse(dat, "window=comm_monitor;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/server/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + + screen = 0 + + if(href_list["delete"]) + + if(!src.allowed(usr) && !emagged) + usr << "ACCESS DENIED." + return + + if(SelectedServer) + + var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] + + temp = "- DELETED ENTRY: [D.name] -" + + SelectedServer.log_entries.Remove(D) + del(D) + + else + temp = "- FAILED: NO SELECTED MACHINE -" + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/server/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/server/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm new file mode 100644 index 00000000000..432604dc15e --- /dev/null +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -0,0 +1,134 @@ + +/* + Telecomms monitor tracks the overall trafficing of a telecommunications network + and displays a heirarchy of linked machines. +*/ + + +/obj/machinery/computer/telecomms/monitor + name = "telecommunications monitoring console" + icon_state = "comm_monitor" + + var/screen = 0 // the screen number: + var/list/machinelist = list() // the machines located by the computer + var/obj/machinery/telecomms/SelectedMachine + + var/network = "NULL" // the network to probe + + var/temp = "" // temporary feedback messages + circuit = "/obj/item/weapon/circuitboard/comm_monitor" + +/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunications Monitor
Telecommunications Monitor
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]

" + dat += "
Current Network: [network]
" + if(machinelist.len) + dat += "
Detected Network Entities:
    " + for(var/obj/machinery/telecomms/T in machinelist) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + else + dat += "\[Probe Network\]" + + + // --- Viewing Machine --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\]
" + dat += "
Current Network: [network]
" + dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
" + dat += "Linked Entities:
    " + for(var/obj/machinery/telecomms/T in SelectedMachine.links) + if(!T.hide) + dat += "
  1. \ref[T.id] [T.name] ([T.id])
  2. " + dat += "
" + + + + user << browse(dat, "window=comm_monitor;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/monitor/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["viewmachine"]) + screen = 1 + for(var/obj/machinery/telecomms/T in machinelist) + if(T.id == href_list["viewmachine"]) + SelectedMachine = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + machinelist = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("probe") + if(machinelist.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/T in range(25, src)) + if(T.network == network) + machinelist.Add(T) + + if(!machinelist.len) + temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" + else + temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" + + screen = 0 + + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + network = newnet + screen = 0 + machinelist = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/monitor/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/monitor/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/computers/traffic_control.dm b/code/game/machinery/telecomms/computers/traffic_control.dm new file mode 100644 index 00000000000..3edb25ff551 --- /dev/null +++ b/code/game/machinery/telecomms/computers/traffic_control.dm @@ -0,0 +1,286 @@ + + +/obj/machinery/computer/telecomms/traffic + name = "telecommunications traffic control console" + icon_state = "computer_generic" + + var/screen = 0 // the screen number: + var/list/servers = list() // the servers located by the computer + var/mob/editingcode + var/mob/lasteditor + var/list/viewingcode = list() + var/obj/machinery/telecomms/server/SelectedServer + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/storedcode = "" // code stored + var/obj/item/weapon/card/id/auth = null + var/list/access_log = list() + var/process = 0 + circuit = "/obj/item/weapon/circuitboard/comm_traffic" + + req_access = list(access_tcomsat) + +/obj/machinery/computer/telecomms/traffic/proc/stop_editing() + if(editingcode) + if(editingcode.client) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode.unset_machine() + editingcode = null + +/obj/machinery/computer/telecomms/traffic/process() + + if(stat & (NOPOWER|BROKEN)) + stop_editing() + return + + if(editingcode && editingcode.machine != src) + stop_editing() + return + + if(!editingcode) + if(length(viewingcode) > 0) + editingcode = pick(viewingcode) + viewingcode.Remove(editingcode) + return + + process = !process + if(!process) + return + + // loop if there's someone manning the keyboard + if(!editingcode.client) + stop_editing() + return + + // For the typer, the input is enabled. Buffer the typed text + storedcode = "[winget(editingcode, "tcscode", "text")]" + winset(editingcode, "tcscode", "is-disabled=false") + + // If the player's not manning the keyboard anymore, adjust everything + if(!in_range(editingcode, src) && !issilicon(editingcode) || editingcode.machine != src) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode = null + return + + // For other people viewing the typer type code, the input is disabled and they can only view the code + // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) + + if(length(viewingcode)) + // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + + for(var/mob/M in viewingcode) + + if( (M.machine == src && in_range(M, src) ) || issilicon(M)) + winset(M, "tcscode", "is-disabled=true") + winset(M, "tcscode", "text=\"[showcode]\"") + else + viewingcode.Remove(M) + winshow(M, "Telecomms IDE", 0) // hide the windows + + +/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" + dat += "
[(auth ? "AUTHED" : "NOT AUTHED")]: [(!auth ? "Insert ID" : auth)]
" + dat += "View System Log
" + + if(issilicon(user) || auth) + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(servers.len) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + if(SelectedServer) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]

" + dat += "
\[Edit Code\]" + dat += "
Signal Execution: " + if(SelectedServer.autoruncode) + dat += "ALWAYS" + else + dat += "NEVER" + else + screen = 0 + return + + + user << browse(dat, "window=traffic_control;size=575x400") + onclose(user, "server_control") + + temp = "" + return + +/obj/machinery/computer/telecomms/traffic/proc/create_log(var/entry, var/mob/user) + var/id = null + if(issilicon(user)) + id = "System Administrator" + else + if(auth) + id = "[auth.registered_name] ([auth.assignment])" + else + ERROR("There is a null auth while the user isn't a silicon! ([user.name], [user.type])") + return + access_log += "\[[get_timestamp()]\] [id] [entry]" + +/obj/machinery/computer/telecomms/traffic/proc/print_logs() + . = "

Traffic Control Telecomms System Log


" + for(var/entry in access_log) + . += entry + "
" + return . + +/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["auth"]) + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(!auth) + var/obj/item/weapon/card/id/I = C.get_active_hand() + if(istype(I)) + if(check_access(I)) + C.drop_item() + I.loc = src + auth = I + create_log("has logged in.", usr) + else + create_log("has logged out.", usr) + auth.loc = src.loc + C.put_in_hands(auth) + auth = null + updateUsrDialog() + return + + if(href_list["print"]) + usr << browse(print_logs(), "window=traffic_logs") + return + + if(!auth && !issilicon(usr) && !emagged) + usr << "ACCESS DENIED." + return + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + create_log("selected server [T.name]", usr) + break + + + if(href_list["operation"]) + create_log("has performed action: [href_list["operation"]].", usr) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + + screen = 0 + + if("editcode") + if(editingcode == usr) return + if(usr in viewingcode) return + + if(!editingcode) + lasteditor = usr + editingcode = usr + winshow(editingcode, "Telecomms IDE", 1) // show the IDE + winset(editingcode, "tcscode", "is-disabled=false") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + winset(editingcode, "tcscode", "text=\"[showcode]\"") + + else + viewingcode.Add(usr) + winshow(usr, "Telecomms IDE", 1) // show the IDE + winset(usr, "tcscode", "is-disabled=true") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\"", "\\\"") + winset(usr, "tcscode", "text=\"[showcode]\"") + + if("togglerun") + SelectedServer.autoruncode = !(SelectedServer.autoruncode) + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + + if(newnet && canAccess(usr)) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + create_log("has set the network to [network].", usr) + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/traffic/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/traffic/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols." + +/obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) + if(issilicon(user) || in_range(user, src)) + return 1 + return 0 \ No newline at end of file diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index b7ebd4314ac..8798f07c20c 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -1,232 +1,232 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/obj/machinery/computer/telecomms/server - name = "telecommunications server monitoring console" - icon_state = "comm_logs" - - var/screen = 0 // the screen number: - var/list/servers = list() // the servers located by the computer - var/obj/machinery/telecomms/server/SelectedServer - - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - - var/universal_translate = 0 // set to 1 if it can translate nonhuman speech - - req_access = list(access_tcomsat) - circuit = "/obj/item/weapon/circuitboard/comm_server" - -/obj/machinery/computer/telecomms/server/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunication Server Monitor
Telecommunications Server Monitor
" - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(servers.len) - dat += "
Detected Telecommunication Servers:
    " - for(var/obj/machinery/telecomms/T in servers) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - - else - dat += "
No servers detected. Scan for servers: \[Scan\]" - - - // --- Viewing Server --- - - if(1) - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]" - - if(SelectedServer.totaltraffic >= 1024) - dat += "
Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes

" - else - dat += "
Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes

" - - dat += "Stored Logs:
    " - - var/i = 0 - for(var/datum/comm_log_entry/C in SelectedServer.log_entries) - i++ - - - // If the log is a speech file - if(C.input_type == "Speech File") - - dat += "
  1. [C.name] \[X\]
    " - - // -- Determine race of orator -- - - var/race // The actual race of the mob - var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human - var/mobtype = C.parameters["mobtype"] - - var/list/humans = typesof(/mob/living/carbon/human, /mob/living/carbon/brain) - var/list/monkeys = typesof(/mob/living/carbon/monkey) - var/list/silicons = typesof(/mob/living/silicon) - var/list/slimes = typesof(/mob/living/simple_animal/slime) - var/list/animals = typesof(/mob/living/simple_animal) - - if(mobtype in humans) - race = "Human" - language = race - - else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes - race = "Slime" - language = race - - else if(mobtype in monkeys) - race = "Monkey" - language = race - - else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job - race = "Artificial Life" - language = race - - else if(istype(mobtype, /obj)) - race = "Machinery" - language = race - - else if(mobtype in animals) - race = "Domestic Animal" - language = race - - else - race = "Unidentifiable" - language = race - - // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- - - if(language == "Human" || universal_translate || C.parameters["uspeech"]) - dat += "Data type: [C.input_type]
    " - dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " - dat += "Class: [race]
    " - dat += "Contents: \"[C.parameters["message"]]\"
    " - - - // -- Orator is not human and universal translate not active -- - - else - dat += "Data type: Audio File
    " - dat += "Source: Unidentifiable
    " - dat += "Class: [race]
    " - dat += "Contents: Unintelligble
    " - - dat += "

  2. " - - else if(C.input_type == "Execution Error") - - dat += "
  3. [C.name] \[X\]
    " - dat += "Output: \"[C.parameters["message"]]\"
    " - dat += "

  4. " - - - dat += "
" - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/server/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if(href_list["delete"]) - - if(!src.allowed(usr) && !emagged) - usr << "ACCESS DENIED." - return - - if(SelectedServer) - - var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] - - temp = "- DELETED ENTRY: [D.name] -" - - SelectedServer.log_entries.Remove(D) - del(D) - - else - temp = "- FAILED: NO SELECTED MACHINE -" - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/server/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/server/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/obj/machinery/computer/telecomms/server + name = "telecommunications server monitoring console" + icon_state = "comm_logs" + + var/screen = 0 // the screen number: + var/list/servers = list() // the servers located by the computer + var/obj/machinery/telecomms/server/SelectedServer + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/universal_translate = 0 // set to 1 if it can translate nonhuman speech + + req_access = list(access_tcomsat) + circuit = "/obj/item/weapon/circuitboard/comm_server" + +/obj/machinery/computer/telecomms/server/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunication Server Monitor
Telecommunications Server Monitor
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(servers.len) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]" + + if(SelectedServer.totaltraffic >= 1024) + dat += "
Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes

" + else + dat += "
Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes

" + + dat += "Stored Logs:
    " + + var/i = 0 + for(var/datum/comm_log_entry/C in SelectedServer.log_entries) + i++ + + + // If the log is a speech file + if(C.input_type == "Speech File") + + dat += "
  1. [C.name] \[X\]
    " + + // -- Determine race of orator -- + + var/race // The actual race of the mob + var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human + var/mobtype = C.parameters["mobtype"] + + var/list/humans = typesof(/mob/living/carbon/human, /mob/living/carbon/brain) + var/list/monkeys = typesof(/mob/living/carbon/monkey) + var/list/silicons = typesof(/mob/living/silicon) + var/list/slimes = typesof(/mob/living/simple_animal/slime) + var/list/animals = typesof(/mob/living/simple_animal) + + if(mobtype in humans) + race = "Human" + language = race + + else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes + race = "Slime" + language = race + + else if(mobtype in monkeys) + race = "Monkey" + language = race + + else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job + race = "Artificial Life" + language = race + + else if(istype(mobtype, /obj)) + race = "Machinery" + language = race + + else if(mobtype in animals) + race = "Domestic Animal" + language = race + + else + race = "Unidentifiable" + language = race + + // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- + + if(language == "Human" || universal_translate || C.parameters["uspeech"]) + dat += "Data type: [C.input_type]
    " + dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " + dat += "Class: [race]
    " + dat += "Contents: \"[C.parameters["message"]]\"
    " + + + // -- Orator is not human and universal translate not active -- + + else + dat += "Data type: Audio File
    " + dat += "Source: Unidentifiable
    " + dat += "Class: [race]
    " + dat += "Contents: Unintelligble
    " + + dat += "

  2. " + + else if(C.input_type == "Execution Error") + + dat += "
  3. [C.name] \[X\]
    " + dat += "Output: \"[C.parameters["message"]]\"
    " + dat += "

  4. " + + + dat += "
" + + + + user << browse(dat, "window=comm_monitor;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/server/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + + screen = 0 + + if(href_list["delete"]) + + if(!src.allowed(usr) && !emagged) + usr << "ACCESS DENIED." + return + + if(SelectedServer) + + var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] + + temp = "- DELETED ENTRY: [D.name] -" + + SelectedServer.log_entries.Remove(D) + del(D) + + else + temp = "- FAILED: NO SELECTED MACHINE -" + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/server/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/server/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index f1dd4b2acb2..4884051a16c 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - /* @@ -12,87 +10,28 @@ /obj/machinery/telecomms var/temp = "" // output message - var/construct_op = 0 /obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob, params) + var/icon_closed = initial(icon_state) + var/icon_open = "[initial(icon_state)]_o" + if(!on) + icon_closed = "[initial(icon_state)]_off" + icon_open = "[initial(icon_state)]_o_off" + + if(default_deconstruction_screwdriver(user, icon_open, icon_closed, P)) + updateUsrDialog() + return + + if(exchange_parts(user, P)) + return + // Using a multitool lets you access the receiver's interface if(istype(P, /obj/item/device/multitool)) attack_hand(user) - switch(construct_op) - if(0) - if(istype(P, /obj/item/weapon/screwdriver)) - user << "You unfasten the bolts." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - construct_op ++ - if(1) - if(istype(P, /obj/item/weapon/screwdriver)) - user << "You fasten the bolts." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - construct_op -- - if(istype(P, /obj/item/weapon/wrench)) - user << "You dislodge the external plating." - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - construct_op ++ - if(2) - if(istype(P, /obj/item/weapon/wrench)) - user << "You secure the external plating." - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - construct_op -- - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." - construct_op ++ - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) - A.amount = 5 - stat |= BROKEN // the machine's been borked! - if(3) - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - if(A.use(5)) - user << "You insert the cables." - construct_op -- - stat &= ~BROKEN // the machine's not borked anymore! - else - user << "You need five lengths of cable for this machine." - if(istype(P, /obj/item/weapon/crowbar)) - user << "You begin prying out the circuit board and components..." - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - if(do_after(user,60)) - user << "You finish prying out the components." - - // Drop all the component stuff - if(component_parts) - for(var/obj/item/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 - I.loc = src.loc - - else - - // If the machine wasn't made during runtime, probably doesn't have components: - // manually find the components and drop them! - var/newpath = text2path(circuitboard) - var/obj/item/weapon/circuitboard/C = new newpath - for(var/I in C.req_components) - for(var/i = 1, i <= C.req_components[I], i++) - newpath = text2path(I) - var/obj/item/s = new newpath - s.loc = src.loc - if(istype(s, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = s - A.amount = 1 - A.update_icon() - - // Drop a circuit board too - C.loc = src.loc - - // Create a machine frame and delete the current machine - var/obj/machinery/constructable_frame/machine_frame/F = new - F.loc = src.loc - qdel(src) + default_deconstruction_crowbar(P) /obj/machinery/telecomms/attack_ai(var/mob/user as mob) @@ -207,25 +146,11 @@ /obj/machinery/telecomms/proc/Options_Menu() return "" -/* -// Add an option to the processor to switch processing mode. (COMPRESS -> UNCOMPRESS or UNCOMPRESS -> COMPRESS) -/obj/machinery/telecomms/processor/Options_Menu() - var/dat = "
Processing Mode: [process_mode ? "UNCOMPRESS" : "COMPRESS"]" - return dat -*/ // The topic for Additional Options. Use this for checking href links for your specific option. // Example of how to use below. /obj/machinery/telecomms/proc/Options_Topic(href, href_list) return -/* -/obj/machinery/telecomms/processor/Options_Topic(href, href_list) - - if(href_list["process"]) - temp = "-% Processing mode changed. %-" - src.process_mode = !src.process_mode -*/ - // RELAY /obj/machinery/telecomms/relay/Options_Menu() diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm new file mode 100644 index 00000000000..b592d1bf720 --- /dev/null +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -0,0 +1,47 @@ +/* + Basically just an empty shell for receiving and broadcasting radio messages. Not + very flexible, but it gets the job done. +*/ + +/obj/machinery/telecomms/allinone + name = "telecommunications mainframe" + icon_state = "comm_server" + desc = "A compact machine used for portable subspace telecommuniations processing." + density = 1 + anchored = 1 + use_power = 0 + idle_power_usage = 0 + machinetype = 6 + var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel + +/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal) + + if(!on) // has to be on to receive messages + return + + if(is_freq_listening(signal)) // detect subspace signals + + signal.data["done"] = 1 // mark the signal as being broadcasted + signal.data["compression"] = 0 + + // Search for the original signal and mark it as done as well + var/datum/signal/original = signal.data["original"] + if(original) + original.data["done"] = 1 + + if(signal.data["slow"] > 0) + sleep(signal.data["slow"]) // simulate the network lag if necessary + + /* ###### Broadcast a message using signal.data ###### */ + if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just + Broadcast_Message(signal.data["mob"], + 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["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + +/obj/machinery/telecomms/allinone/attackby(obj/item/P as obj, mob/user as mob, params) + + if(istype(P, /obj/item/device/multitool)) + attack_hand(user) diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm new file mode 100644 index 00000000000..181d9a11bbf --- /dev/null +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -0,0 +1,131 @@ +/* + The broadcaster sends processed messages to all radio devices in the game. They + do not have to be headsets; intercoms and station-bounced radios suffice. + + They receive their message from a server after the message has been logged. +*/ + +var/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam +var/message_delay = 0 // To make sure restarting the recentmessages list is kept in sync + +/obj/machinery/telecomms/broadcaster + name = "subspace broadcaster" + icon_state = "broadcaster" + desc = "A dish-shaped machine used to broadcast processed subspace signals." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 25 + machinetype = 5 + /*heatgen = 0 + delay = 7*/ + circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" + +/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + // Don't broadcast rejected signals + if(signal.data["reject"]) + return + + if(signal.data["message"]) + + + // Prevents massive radio spam + signal.data["done"] = 1 // mark the signal as being broadcasted + // Search for the original signal and mark it as done as well + var/datum/signal/original = signal.data["original"] + if(original) + original.data["done"] = 1 + original.data["compression"] = signal.data["compression"] + original.data["level"] = signal.data["level"] + + var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]" + if(signal_message in recentmessages) + return + recentmessages.Add(signal_message) + + if(signal.data["slow"] > 0) + sleep(signal.data["slow"]) // simulate the network lag if necessary + + signal.data["level"] |= listening_level + + /** #### - Normal Broadcast - #### **/ + + if(signal.data["type"] == 0) + + /* ###### Broadcast a message using signal.data ###### */ + 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, signal.data["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + + + /** #### - Simple Broadcast - #### **/ + + if(signal.data["type"] == 1) + + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_SimpleMessage(signal.data["name"], signal.frequency, + signal.data["message"],null, null, + signal.data["compression"], listening_level) + + + /** #### - Artificial Broadcast - #### **/ + // (Imitates a mob) + + if(signal.data["type"] == 2) + + /* ###### Broadcast a message using signal.data ###### */ + // Parameter "data" as 4: AI can't track this person/mob + Broadcast_Message(signal.data["mob"], + 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["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + + if(!message_delay) + message_delay = 1 + spawn(10) + message_delay = 0 + recentmessages = list() + + /* --- Do a snazzy animation! --- */ + flick("broadcaster_send", src) + +/obj/machinery/telecomms/broadcaster/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/broadcaster(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + +/obj/machinery/telecomms/broadcaster/Destroy() + // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. + if(message_delay) + message_delay = 0 + ..() + + + +//Preset Broadcasters + +//--PRESET LEFT--// + +/obj/machinery/telecomms/broadcaster/preset_left + id = "Broadcaster A" + network = "tcommsat" + autolinkers = list("broadcasterA") + +//--PRESET RIGHT--// + +/obj/machinery/telecomms/broadcaster/preset_right + id = "Broadcaster B" + network = "tcommsat" + autolinkers = list("broadcasterB") \ No newline at end of file diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm new file mode 100644 index 00000000000..c81ecec4b32 --- /dev/null +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -0,0 +1,97 @@ +/* + The bus mainframe idles and waits for hubs to relay them signals. They act + as junctions for the network. + + They transfer uncompressed subspace packets to processor units, and then take + the processed packet to a server for logging. + + Link to a subspace hub if it can't send to a server. +*/ + +/obj/machinery/telecomms/bus + name = "bus mainframe" + icon_state = "bus" + desc = "A mighty piece of hardware used to send massive amounts of data quickly." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 50 + machinetype = 2 + //heatgen = 20 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/bus" + netspeed = 40 + var/change_frequency = 0 + +/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + + if(is_freq_listening(signal)) + if(change_frequency) + signal.frequency = change_frequency + + if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it + // send to one linked processor unit + var/send_to_processor = relay_information(signal, "/obj/machinery/telecomms/processor") + + if(send_to_processor) + return + // failed to send to a processor, relay information anyway + signal.data["slow"] += rand(1, 5) // slow the signal down only slightly + src.receive_information(signal, src) + + // Try sending it! + var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster", "/obj/machinery/telecomms/bus") + var/i = 0 + for(var/send in try_send) + if(i) + signal.data["slow"] += rand(0, 1) // slow the signal down only slightly + i++ + var/can_send = relay_information(signal, send) + if(can_send) + break + +/obj/machinery/telecomms/bus/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/bus(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + + + + + + +//Preset Buses + +/obj/machinery/telecomms/bus/preset_one + id = "Bus 1" + network = "tcommsat" + freq_listening = list(SCI_FREQ, MED_FREQ) + autolinkers = list("processor1", "science", "medical") + +/obj/machinery/telecomms/bus/preset_two + id = "Bus 2" + network = "tcommsat" + freq_listening = list(SUPP_FREQ,SERV_FREQ) + autolinkers = list("processor2", "supply", "service") + +/obj/machinery/telecomms/bus/preset_three + id = "Bus 3" + network = "tcommsat" + freq_listening = list(SEC_FREQ, COMM_FREQ) + autolinkers = list("processor3", "security", "command") + +/obj/machinery/telecomms/bus/preset_four + id = "Bus 4" + network = "tcommsat" + freq_listening = list(ENG_FREQ) + autolinkers = list("processor4", "engineering", "common") + +/obj/machinery/telecomms/bus/preset_four/New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm new file mode 100644 index 00000000000..b52adc8cb8d --- /dev/null +++ b/code/game/machinery/telecomms/machines/hub.dm @@ -0,0 +1,61 @@ + +/* + The HUB idles until it receives information. It then passes on that information + depending on where it came from. + + This is the heart of the Telecommunications Network, sending information where it + is needed. It mainly receives information from long-distance Relays and then sends + that information to be processed. Afterwards it gets the uncompressed information + from Servers/Buses and sends that back to the relay, to then be broadcasted. +*/ + +/obj/machinery/telecomms/hub + name = "telecommunication hub" + icon_state = "hub" + desc = "A mighty piece of hardware used to send/receive massive amounts of data." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 80 + machinetype = 7 + //heatgen = 40 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/hub" + long_range_link = 1 + netspeed = 40 + + +/obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + if(is_freq_listening(signal)) + if(istype(machine_from, /obj/machinery/telecomms/receiver)) + //If the signal is compressed, send it to the bus. + relay_information(signal, "/obj/machinery/telecomms/bus", 1) // ideally relay the copied information to bus units + else + // Get a list of relays that we're linked to, then send the signal to their levels. + relay_information(signal, "/obj/machinery/telecomms/relay", 1) + relay_information(signal, "/obj/machinery/telecomms/broadcaster", 1) // Send it to a broadcaster. + +/obj/machinery/telecomms/hub/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/hub(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + + + + + + +//Preset HUB + +/obj/machinery/telecomms/hub/preset + id = "Hub" + network = "tcommsat" + autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical", + "supply", "service", "common", "command", "engineering", "security", + "receiverA", "receiverB", "broadcasterA", "broadcasterB") + diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm new file mode 100644 index 00000000000..18f8ee4d3e0 --- /dev/null +++ b/code/game/machinery/telecomms/machines/processor.dm @@ -0,0 +1,80 @@ + +/* + The processor is a very simple machine that decompresses subspace signals and + transfers them back to the original bus. It is essential in producing audible + data. + + Link to servers if bus is not present +*/ + +/obj/machinery/telecomms/processor + name = "processor unit" + icon_state = "processor" + desc = "This machine is used to process large quantities of information." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 30 + machinetype = 3 + //heatgen = 100 + //delay = 5 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/processor" + var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals + +/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + + if(is_freq_listening(signal)) + + if(process_mode) + signal.data["compression"] = 0 // uncompress subspace signal + else + signal.data["compression"] = 100 // even more compressed signal + + if(istype(machine_from, /obj/machinery/telecomms/bus)) + relay_direct_information(signal, machine_from) // send the signal back to the machine + else // no bus detected - send the signal to servers instead + signal.data["slow"] += rand(5, 10) // slow the signal down + relay_information(signal, "/obj/machinery/telecomms/server") + +/obj/machinery/telecomms/processor/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/processor(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/analyzer(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/amplifier(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + + + + + + +//Preset Processors + +/obj/machinery/telecomms/processor/preset_one + id = "Processor 1" + network = "tcommsat" + autolinkers = list("processor1") // processors are sort of isolated; they don't need backward links + +/obj/machinery/telecomms/processor/preset_two + id = "Processor 2" + network = "tcommsat" + autolinkers = list("processor2") + +/obj/machinery/telecomms/processor/preset_three + id = "Processor 3" + network = "tcommsat" + autolinkers = list("processor3") + +/obj/machinery/telecomms/processor/preset_four + id = "Processor 4" + network = "tcommsat" + autolinkers = list("processor4") + diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm new file mode 100644 index 00000000000..071828fced2 --- /dev/null +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -0,0 +1,95 @@ + +/* + The receiver idles and receives messages from subspace-compatible radio equipment; + primarily headsets. They then just relay this information to all linked devices, + which can would probably be network hubs. + + Link to Processor Units in case receiver can't send to bus units. +*/ + +/obj/machinery/telecomms/receiver + name = "subspace receiver" + icon_state = "broadcast receiver" + desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 30 + machinetype = 1 + //heatgen = 0 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver" + +/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) + + if(!on) // has to be on to receive messages + return + if(!signal) + return + if(!check_receive_level(signal)) + return + if(signal.transmission_method == 2) + + if(is_freq_listening(signal)) // detect subspace signals + + //Remove the level and then start adding levels that it is being broadcasted in. + signal.data["level"] = list() + + var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub") // ideally relay the copied information to relays + if(!can_send) + relay_information(signal, "/obj/machinery/telecomms/bus") // Send it to a bus instead, if it's linked to one + +/obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/signal) + + if(signal.data["level"] != listening_level) + for(var/obj/machinery/telecomms/hub/H in links) + var/list/connected_levels = list() + for(var/obj/machinery/telecomms/relay/R in H.links) + if(R.can_receive(signal)) + connected_levels |= R.listening_level + if(signal.data["level"] in connected_levels) + return 1 + return 0 + return 1 + + +/obj/machinery/telecomms/receiver/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/receiver(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + + + + + + +//Preset Receivers + +//--PRESET LEFT--// + +/obj/machinery/telecomms/receiver/preset_left + id = "Receiver A" + network = "tcommsat" + autolinkers = list("receiverA") // link to relay + freq_listening = list(SCI_FREQ, MED_FREQ, SUPP_FREQ, SERV_FREQ) // science, medical, supply, service + + +//--PRESET RIGHT--// + +/obj/machinery/telecomms/receiver/preset_right + id = "Receiver B" + network = "tcommsat" + autolinkers = list("receiverB") // link to relay + freq_listening = list(COMM_FREQ, ENG_FREQ, SEC_FREQ) //command, engineering, security + + //Common and other radio frequencies for people to freely use + New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm new file mode 100644 index 00000000000..51d76d47255 --- /dev/null +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -0,0 +1,86 @@ +/* + The relay idles until it receives information. It then passes on that information + depending on where it came from. + + The relay is needed in order to send information pass Z levels. It must be linked + with a HUB, the only other machine that can send/receive pass Z levels. +*/ + +/obj/machinery/telecomms/relay + name = "telecommunication relay" + icon_state = "relay" + desc = "A mighty piece of hardware used to send massive amounts of data far away." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 30 + machinetype = 8 + //heatgen = 0 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay" + netspeed = 5 + long_range_link = 1 + var/broadcasting = 1 + var/receiving = 1 + +/obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + // Add our level and send it back + if(can_send(signal)) + signal.data["level"] |= listening_level + +// Checks to see if it can send/receive. + +/obj/machinery/telecomms/relay/proc/can(datum/signal/signal) + if(!on) + return 0 + if(!is_freq_listening(signal)) + return 0 + return 1 + +/obj/machinery/telecomms/relay/proc/can_send(datum/signal/signal) + if(!can(signal)) + return 0 + return broadcasting + +/obj/machinery/telecomms/relay/proc/can_receive(datum/signal/signal) + if(!can(signal)) + return 0 + return receiving + +/obj/machinery/telecomms/relay/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/relay(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + + + + + +//Preset Relay + +/obj/machinery/telecomms/relay/preset + network = "tcommsat" + +/obj/machinery/telecomms/relay/preset/station + id = "Station Relay" + listening_level = 1 + autolinkers = list("s_relay") + +/obj/machinery/telecomms/relay/preset/telecomms + id = "Telecomms Relay" + autolinkers = list("relay") + +/obj/machinery/telecomms/relay/preset/mining + id = "Mining Relay" + autolinkers = list("m_relay") + +/obj/machinery/telecomms/relay/preset/ruskie + id = "Ruskie Relay" + hide = 1 + toggled = 0 + autolinkers = list("r_relay") diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm new file mode 100644 index 00000000000..322b635e3ca --- /dev/null +++ b/code/game/machinery/telecomms/machines/server.dm @@ -0,0 +1,224 @@ + +/* + The server logs all traffic and signal data. Once it records the signal, it sends + it to the subspace broadcaster. + + Store a maximum of 100 logs and then deletes them. +*/ + + +/obj/machinery/telecomms/server + name = "telecommunication server" + icon_state = "comm_server" + desc = "A machine used to store data and network statistics." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 15 + machinetype = 4 + //heatgen = 50 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/server" + var/list/log_entries = list() + var/list/stored_names = list() + var/list/TrafficActions = list() + var/logs = 0 // number of logs + var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes) + + var/list/memory = list() // stored memory + var/rawcode = "" // the code to compile (raw text) + + var/datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code + var/autoruncode = 0 // 1 if the code is set to run every time a signal is picked up + + var/encryption = "null" // encryption key: ie "password" + var/salt = "null" // encryption salt: ie "123comsat" + // would add up to md5("password123comsat") + var/language = "human" + var/obj/item/device/radio/headset/server_radio = null + var/last_signal = 0 // Last time it sent a signal + +/obj/machinery/telecomms/server/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/server(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + Compiler = new() + Compiler.Holder = src + server_radio = new() + +/obj/machinery/telecomms/server/Destroy() + // Garbage collects all the NTSL datums. + if(Compiler) + Compiler.GC() + Compiler = null + ..() + +/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + if(signal.data["message"]) + + if(is_freq_listening(signal)) + + if(traffic > 0) + totaltraffic += traffic // add current traffic to total traffic + + //Is this a test signal? Bypass logging + if(signal.data["type"] != 4) + + // If signal has a message and appropriate frequency + + update_logs() + + var/datum/comm_log_entry/log = new + + // Copy the signal.data entries we want + log.parameters["mobtype"] = signal.data["mobtype"] + log.parameters["job"] = signal.data["job"] + log.parameters["key"] = signal.data["key"] + log.parameters["message"] = signal.data["message"] + log.parameters["name"] = signal.data["name"] + log.parameters["realname"] = signal.data["realname"] + + log.parameters["uspeech"] = signal.data["languages"] & HUMAN //good enough + + // If the signal is still compressed, make the log entry gibberish + if(signal.data["compression"] > 0) + log.parameters["message"] = Gibberish(signal.data["message"], signal.data["compression"] + 50) + log.parameters["job"] = Gibberish(signal.data["job"], signal.data["compression"] + 50) + log.parameters["name"] = Gibberish(signal.data["name"], signal.data["compression"] + 50) + log.parameters["realname"] = Gibberish(signal.data["realname"], signal.data["compression"] + 50) + log.input_type = "Corrupt File" + + // Log and store everything that needs to be logged + log_entries.Add(log) + if(!(signal.data["name"] in stored_names)) + stored_names.Add(signal.data["name"]) + logs++ + signal.data["server"] = src + + // Give the log a name + var/identifier = num2text( rand(-1000,1000) + world.time ) + log.name = "data packet ([md5(identifier)])" + + if(Compiler && autoruncode) + Compiler.Run(signal) // execute the code + + var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub") + if(!can_send) + relay_information(signal, "/obj/machinery/telecomms/broadcaster") + + +/obj/machinery/telecomms/server/proc/setcode(var/t) + if(t) + if(istext(t)) + rawcode = t + +/obj/machinery/telecomms/server/proc/admin_log(var/mob/mob) + + var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:" + diary << msg + diary << rawcode + src.investigate_log("[msg]
[rawcode]", "ntsl") + if(length(rawcode)) // Let's not bother the admins for empty code. + message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) + +/obj/machinery/telecomms/server/proc/compile(var/mob/user) + + if(Compiler) + admin_log(user) + return Compiler.Compile(rawcode) + +/obj/machinery/telecomms/server/proc/update_logs() + // start deleting the very first log entry + if(logs >= 400) + for(var/i = 1, i <= logs, i++) // locate the first garbage collectable log entry and remove it + var/datum/comm_log_entry/L = log_entries[i] + if(L.garbage_collector) + log_entries.Remove(L) + logs-- + break + +/obj/machinery/telecomms/server/proc/add_entry(var/content, var/input) + var/datum/comm_log_entry/log = new + var/identifier = num2text( rand(-1000,1000) + world.time ) + log.name = "[input] ([md5(identifier)])" + log.input_type = input + log.parameters["message"] = content + log_entries.Add(log) + update_logs() + + + +// Simple log entry datum + +/datum/comm_log_entry + var/parameters = list() // carbon-copy to signal.data[] + var/name = "data packet (#)" + var/garbage_collector = 1 // if set to 0, will not be garbage collected + var/input_type = "Speech File" + + + + +//Preset Servers + +/obj/machinery/telecomms/server/presets + network = "tcommsat" + +/obj/machinery/telecomms/server/presets/New() + ..() + name = id + + +/obj/machinery/telecomms/server/presets/science + id = "Science Server" + freq_listening = list(SCI_FREQ) + autolinkers = list("science") + +/obj/machinery/telecomms/server/presets/medical + id = "Medical Server" + freq_listening = list(MED_FREQ) + autolinkers = list("medical") + +/obj/machinery/telecomms/server/presets/supply + id = "Supply Server" + freq_listening = list(SUPP_FREQ) + autolinkers = list("supply") + +/obj/machinery/telecomms/server/presets/service + id = "Service Server" + freq_listening = list(SERV_FREQ) + autolinkers = list("service") + +/obj/machinery/telecomms/server/presets/common + id = "Common Server" + freq_listening = list() + autolinkers = list("common") + + //Common and other radio frequencies for people to freely use + // 1441 to 1489 +/obj/machinery/telecomms/server/presets/common/New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + +/obj/machinery/telecomms/server/presets/command + id = "Command Server" + freq_listening = list(COMM_FREQ) + autolinkers = list("command") + +/obj/machinery/telecomms/server/presets/engineering + id = "Engineering Server" + freq_listening = list(ENG_FREQ) + autolinkers = list("engineering") + +/obj/machinery/telecomms/server/presets/security + id = "Security Server" + freq_listening = list(SEC_FREQ) + autolinkers = list("security") + + + diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 7d2a8f32019..42d752ee079 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -1,187 +1,187 @@ -// ### Preset machines ### - -//Relay - -/obj/machinery/telecomms/relay/preset - network = "tcommsat" - -/obj/machinery/telecomms/relay/preset/station - id = "Station Relay" - listening_level = 1 - autolinkers = list("s_relay") - -/obj/machinery/telecomms/relay/preset/telecomms - id = "Telecomms Relay" - autolinkers = list("relay") - -/obj/machinery/telecomms/relay/preset/mining - id = "Mining Relay" - autolinkers = list("m_relay") - -/obj/machinery/telecomms/relay/preset/ruskie - id = "Ruskie Relay" - hide = 1 - toggled = 0 - autolinkers = list("r_relay") - -//HUB - -/obj/machinery/telecomms/hub/preset - id = "Hub" - network = "tcommsat" - autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical", - "supply", "service", "common", "command", "engineering", "security", - "receiverA", "receiverB", "broadcasterA", "broadcasterB") - -//Receivers - -//--PRESET LEFT--// - -/obj/machinery/telecomms/receiver/preset_left - id = "Receiver A" - network = "tcommsat" - autolinkers = list("receiverA") // link to relay - freq_listening = list(1351, 1355, 1347, 1349) // science, medical, supply, service - - -//--PRESET RIGHT--// - -/obj/machinery/telecomms/receiver/preset_right - id = "Receiver B" - network = "tcommsat" - autolinkers = list("receiverB") // link to relay - freq_listening = list(1353, 1357, 1359) //command, engineering, security - - //Common and other radio frequencies for people to freely use - New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - - -//Buses - -/obj/machinery/telecomms/bus/preset_one - id = "Bus 1" - network = "tcommsat" - freq_listening = list(1351, 1355) - autolinkers = list("processor1", "science", "medical") - -/obj/machinery/telecomms/bus/preset_two - id = "Bus 2" - network = "tcommsat" - freq_listening = list(1347,1349) - autolinkers = list("processor2", "supply", "service") - -/obj/machinery/telecomms/bus/preset_three - id = "Bus 3" - network = "tcommsat" - freq_listening = list(1359, 1353) - autolinkers = list("processor3", "security", "command") - -/obj/machinery/telecomms/bus/preset_four - id = "Bus 4" - network = "tcommsat" - freq_listening = list(1357) - autolinkers = list("processor4", "engineering", "common") - -/obj/machinery/telecomms/bus/preset_four/New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - -//Processors - -/obj/machinery/telecomms/processor/preset_one - id = "Processor 1" - network = "tcommsat" - autolinkers = list("processor1") // processors are sort of isolated; they don't need backward links - -/obj/machinery/telecomms/processor/preset_two - id = "Processor 2" - network = "tcommsat" - autolinkers = list("processor2") - -/obj/machinery/telecomms/processor/preset_three - id = "Processor 3" - network = "tcommsat" - autolinkers = list("processor3") - -/obj/machinery/telecomms/processor/preset_four - id = "Processor 4" - network = "tcommsat" - autolinkers = list("processor4") - -//Servers - -/obj/machinery/telecomms/server/presets - network = "tcommsat" - -/obj/machinery/telecomms/server/presets/New() - ..() - name = id - - -/obj/machinery/telecomms/server/presets/science - id = "Science Server" - freq_listening = list(1351) - autolinkers = list("science") - -/obj/machinery/telecomms/server/presets/medical - id = "Medical Server" - freq_listening = list(1355) - autolinkers = list("medical") - -/obj/machinery/telecomms/server/presets/supply - id = "Supply Server" - freq_listening = list(1347) - autolinkers = list("supply") - -/obj/machinery/telecomms/server/presets/service - id = "Service Server" - freq_listening = list(1349) - autolinkers = list("service") - -/obj/machinery/telecomms/server/presets/common - id = "Common Server" - freq_listening = list() - autolinkers = list("common") - - //Common and other radio frequencies for people to freely use - // 1441 to 1489 -/obj/machinery/telecomms/server/presets/common/New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - -/obj/machinery/telecomms/server/presets/command - id = "Command Server" - freq_listening = list(1353) - autolinkers = list("command") - -/obj/machinery/telecomms/server/presets/engineering - id = "Engineering Server" - freq_listening = list(1357) - autolinkers = list("engineering") - -/obj/machinery/telecomms/server/presets/security - id = "Security Server" - freq_listening = list(1359) - autolinkers = list("security") - - -//Broadcasters - -//--PRESET LEFT--// - -/obj/machinery/telecomms/broadcaster/preset_left - id = "Broadcaster A" - network = "tcommsat" - autolinkers = list("broadcasterA") - -//--PRESET RIGHT--// - -/obj/machinery/telecomms/broadcaster/preset_right - id = "Broadcaster B" - network = "tcommsat" - autolinkers = list("broadcasterB") +// ### Preset machines ### + +//Relay + +/obj/machinery/telecomms/relay/preset + network = "tcommsat" + +/obj/machinery/telecomms/relay/preset/station + id = "Station Relay" + listening_level = 1 + autolinkers = list("s_relay") + +/obj/machinery/telecomms/relay/preset/telecomms + id = "Telecomms Relay" + autolinkers = list("relay") + +/obj/machinery/telecomms/relay/preset/mining + id = "Mining Relay" + autolinkers = list("m_relay") + +/obj/machinery/telecomms/relay/preset/ruskie + id = "Ruskie Relay" + hide = 1 + toggled = 0 + autolinkers = list("r_relay") + +//HUB + +/obj/machinery/telecomms/hub/preset + id = "Hub" + network = "tcommsat" + autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical", + "supply", "service", "common", "command", "engineering", "security", + "receiverA", "receiverB", "broadcasterA", "broadcasterB") + +//Receivers + +//--PRESET LEFT--// + +/obj/machinery/telecomms/receiver/preset_left + id = "Receiver A" + network = "tcommsat" + autolinkers = list("receiverA") // link to relay + freq_listening = list(1351, 1355, 1347, 1349) // science, medical, supply, service + + +//--PRESET RIGHT--// + +/obj/machinery/telecomms/receiver/preset_right + id = "Receiver B" + network = "tcommsat" + autolinkers = list("receiverB") // link to relay + freq_listening = list(1353, 1357, 1359) //command, engineering, security + + //Common and other radio frequencies for people to freely use + New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + + +//Buses + +/obj/machinery/telecomms/bus/preset_one + id = "Bus 1" + network = "tcommsat" + freq_listening = list(1351, 1355) + autolinkers = list("processor1", "science", "medical") + +/obj/machinery/telecomms/bus/preset_two + id = "Bus 2" + network = "tcommsat" + freq_listening = list(1347,1349) + autolinkers = list("processor2", "supply", "service") + +/obj/machinery/telecomms/bus/preset_three + id = "Bus 3" + network = "tcommsat" + freq_listening = list(1359, 1353) + autolinkers = list("processor3", "security", "command") + +/obj/machinery/telecomms/bus/preset_four + id = "Bus 4" + network = "tcommsat" + freq_listening = list(1357) + autolinkers = list("processor4", "engineering", "common") + +/obj/machinery/telecomms/bus/preset_four/New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + +//Processors + +/obj/machinery/telecomms/processor/preset_one + id = "Processor 1" + network = "tcommsat" + autolinkers = list("processor1") // processors are sort of isolated; they don't need backward links + +/obj/machinery/telecomms/processor/preset_two + id = "Processor 2" + network = "tcommsat" + autolinkers = list("processor2") + +/obj/machinery/telecomms/processor/preset_three + id = "Processor 3" + network = "tcommsat" + autolinkers = list("processor3") + +/obj/machinery/telecomms/processor/preset_four + id = "Processor 4" + network = "tcommsat" + autolinkers = list("processor4") + +//Servers + +/obj/machinery/telecomms/server/presets + network = "tcommsat" + +/obj/machinery/telecomms/server/presets/New() + ..() + name = id + + +/obj/machinery/telecomms/server/presets/science + id = "Science Server" + freq_listening = list(1351) + autolinkers = list("science") + +/obj/machinery/telecomms/server/presets/medical + id = "Medical Server" + freq_listening = list(1355) + autolinkers = list("medical") + +/obj/machinery/telecomms/server/presets/supply + id = "Supply Server" + freq_listening = list(1347) + autolinkers = list("supply") + +/obj/machinery/telecomms/server/presets/service + id = "Service Server" + freq_listening = list(1349) + autolinkers = list("service") + +/obj/machinery/telecomms/server/presets/common + id = "Common Server" + freq_listening = list() + autolinkers = list("common") + + //Common and other radio frequencies for people to freely use + // 1441 to 1489 +/obj/machinery/telecomms/server/presets/common/New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + +/obj/machinery/telecomms/server/presets/command + id = "Command Server" + freq_listening = list(1353) + autolinkers = list("command") + +/obj/machinery/telecomms/server/presets/engineering + id = "Engineering Server" + freq_listening = list(1357) + autolinkers = list("engineering") + +/obj/machinery/telecomms/server/presets/security + id = "Security Server" + freq_listening = list(1359) + autolinkers = list("security") + + +//Broadcasters + +//--PRESET LEFT--// + +/obj/machinery/telecomms/broadcaster/preset_left + id = "Broadcaster A" + network = "tcommsat" + autolinkers = list("broadcasterA") + +//--PRESET RIGHT--// + +/obj/machinery/telecomms/broadcaster/preset_right + id = "Broadcaster B" + network = "tcommsat" + autolinkers = list("broadcasterB") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index c0c8d3abbf9..71a042441d8 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -1,11 +1,10 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 /* Hello, friends, this is Doohl from sexylands. You may be wondering what this monstrous code file is. Sit down, boys and girls, while I tell you the tale. - The machines defined in this file were designed to be compatible with any radio + The telecom machines were designed to be compatible with any radio signals, provided they use subspace transmission. Currently they are only used for headsets, but they can eventually be outfitted for real COMPUTER networks. This is just a skeleton, ladies and gentlemen. @@ -16,6 +15,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms + icon = 'icons/obj/machines/telecomms.dmi' var/list/links = list() // list of machines this machine is linked to var/traffic = 0 // value increases as traffic increases var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed) @@ -28,10 +28,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/machinetype = 0 // just a hacky way of preventing alike machines from pairing var/toggled = 1 // Is it toggled on var/on = 1 - /*var/integrity = 100 // basically HP, loses integrity by heat - var/heatgen = 20 // how much heat to transfer to the environment - var/delay = 10 // how many process() ticks to delay per heat - var/heating_power = 40000*/ var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub) var/circuitboard = null // string pointing to a circuitboard type var/hide = 0 // Is it a hidden machine? @@ -45,8 +41,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() return var/send_count = 0 - //signal.data["slow"] == 0 // apply some lag based on integrity - // Apply some lag based on traffic rates var/netlag = round(traffic / 50) if(netlag > signal.data["slow"]) @@ -179,9 +173,15 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/update_icon() if(on) - icon_state = initial(icon_state) + if(panel_open) + icon_state = "[initial(icon_state)]_o" + else + icon_state = initial(icon_state) else - icon_state = "[initial(icon_state)]_off" + if(panel_open) + icon_state = "[initial(icon_state)]_o_off" + else + icon_state = "[initial(icon_state)]_off" /obj/machinery/telecomms/proc/update_power() @@ -196,9 +196,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/process() update_power() - // Check heat and generate some - //checkheat() - // Update the icon update_icon() @@ -213,438 +210,3 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot. stat &= ~EMPED ..() - -/*/obj/machinery/telecomms/proc/checkheat() - // Checks heat from the environment and applies any integrity damage - var/datum/gas_mixture/environment = loc.return_air() - switch(environment.temperature) - if(T0C to (T20C + 20)) - integrity = Clamp(integrity, 0, 100) - if((T20C + 20) to (T0C + 70)) - integrity = max(0, integrity - 1) - if(delay) - delay-- - else - // If the machine is on, ready to produce heat, and has positive traffic, genn some heat - if(on && traffic > 0) - produce_heat(heatgen) - delay = initial(delay) - -/obj/machinery/telecomms/proc/produce_heat(heat_amt) - if(heatgen == 0) - return - - if(!(stat & (NOPOWER|BROKEN))) //Blatently stolen from space heater. - var/turf/simulated/L = loc - if(istype(L)) - var/datum/gas_mixture/env = L.return_air() - if(env.temperature < (heat_amt+T0C)) - - var/transfer_moles = 0.25 * env.total_moles() - - var/datum/gas_mixture/removed = env.remove(transfer_moles) - - if(removed) - - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) - - env.merge(removed) -*/ -/* - The receiver idles and receives messages from subspace-compatible radio equipment; - primarily headsets. They then just relay this information to all linked devices, - which can would probably be network hubs. - - Link to Processor Units in case receiver can't send to bus units. -*/ - -/obj/machinery/telecomms/receiver - name = "subspace receiver" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "broadcast receiver" - desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 30 - machinetype = 1 - //heatgen = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver" - -/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) - - if(!on) // has to be on to receive messages - return - if(!signal) - return - if(!check_receive_level(signal)) - return - if(signal.transmission_method == 2) - - if(is_freq_listening(signal)) // detect subspace signals - - //Remove the level and then start adding levels that it is being broadcasted in. - signal.data["level"] = list() - - var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub") // ideally relay the copied information to relays - if(!can_send) - relay_information(signal, "/obj/machinery/telecomms/bus") // Send it to a bus instead, if it's linked to one - -/obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/signal) - - if(signal.data["level"] != listening_level) - for(var/obj/machinery/telecomms/hub/H in links) - var/list/connected_levels = list() - for(var/obj/machinery/telecomms/relay/R in H.links) - if(R.can_receive(signal)) - connected_levels |= R.listening_level - if(signal.data["level"] in connected_levels) - return 1 - return 0 - return 1 - - -/* - The HUB idles until it receives information. It then passes on that information - depending on where it came from. - - This is the heart of the Telecommunications Network, sending information where it - is needed. It mainly receives information from long-distance Relays and then sends - that information to be processed. Afterwards it gets the uncompressed information - from Servers/Buses and sends that back to the relay, to then be broadcasted. -*/ - -/obj/machinery/telecomms/hub - name = "telecommunication hub" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "hub" - desc = "A mighty piece of hardware used to send/receive massive amounts of data." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 80 - machinetype = 7 - //heatgen = 40 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/hub" - long_range_link = 1 - netspeed = 40 - - -/obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - if(is_freq_listening(signal)) - if(istype(machine_from, /obj/machinery/telecomms/receiver)) - //If the signal is compressed, send it to the bus. - relay_information(signal, "/obj/machinery/telecomms/bus", 1) // ideally relay the copied information to bus units - else - // Get a list of relays that we're linked to, then send the signal to their levels. - relay_information(signal, "/obj/machinery/telecomms/relay", 1) - relay_information(signal, "/obj/machinery/telecomms/broadcaster", 1) // Send it to a broadcaster. - - -/* - The relay idles until it receives information. It then passes on that information - depending on where it came from. - - The relay is needed in order to send information pass Z levels. It must be linked - with a HUB, the only other machine that can send/receive pass Z levels. -*/ - -/obj/machinery/telecomms/relay - name = "telecommunication relay" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "relay" - desc = "A mighty piece of hardware used to send massive amounts of data far away." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 30 - machinetype = 8 - //heatgen = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay" - netspeed = 5 - long_range_link = 1 - var/broadcasting = 1 - var/receiving = 1 - -/obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - // Add our level and send it back - if(can_send(signal)) - signal.data["level"] |= listening_level - -// Checks to see if it can send/receive. - -/obj/machinery/telecomms/relay/proc/can(datum/signal/signal) - if(!on) - return 0 - if(!is_freq_listening(signal)) - return 0 - return 1 - -/obj/machinery/telecomms/relay/proc/can_send(datum/signal/signal) - if(!can(signal)) - return 0 - return broadcasting - -/obj/machinery/telecomms/relay/proc/can_receive(datum/signal/signal) - if(!can(signal)) - return 0 - return receiving - -/* - The bus mainframe idles and waits for hubs to relay them signals. They act - as junctions for the network. - - They transfer uncompressed subspace packets to processor units, and then take - the processed packet to a server for logging. - - Link to a subspace hub if it can't send to a server. -*/ - -/obj/machinery/telecomms/bus - name = "bus mainframe" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "bus" - desc = "A mighty piece of hardware used to send massive amounts of data quickly." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 50 - machinetype = 2 - //heatgen = 20 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/bus" - netspeed = 40 - var/change_frequency = 0 - -/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - - if(is_freq_listening(signal)) - if(change_frequency) - signal.frequency = change_frequency - - if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it - // send to one linked processor unit - var/send_to_processor = relay_information(signal, "/obj/machinery/telecomms/processor") - - if(send_to_processor) - return - // failed to send to a processor, relay information anyway - signal.data["slow"] += rand(1, 5) // slow the signal down only slightly - src.receive_information(signal, src) - - // Try sending it! - var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster", "/obj/machinery/telecomms/bus") - var/i = 0 - for(var/send in try_send) - if(i) - signal.data["slow"] += rand(0, 1) // slow the signal down only slightly - i++ - var/can_send = relay_information(signal, send) - if(can_send) - break - - - -/* - The processor is a very simple machine that decompresses subspace signals and - transfers them back to the original bus. It is essential in producing audible - data. - - Link to servers if bus is not present -*/ - -/obj/machinery/telecomms/processor - name = "processor unit" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "processor" - desc = "This machine is used to process large quantities of information." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 30 - machinetype = 3 - //heatgen = 100 - //delay = 5 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/processor" - var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals - - receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - - if(is_freq_listening(signal)) - - if(process_mode) - signal.data["compression"] = 0 // uncompress subspace signal - else - signal.data["compression"] = 100 // even more compressed signal - - if(istype(machine_from, /obj/machinery/telecomms/bus)) - relay_direct_information(signal, machine_from) // send the signal back to the machine - else // no bus detected - send the signal to servers instead - signal.data["slow"] += rand(5, 10) // slow the signal down - relay_information(signal, "/obj/machinery/telecomms/server") - - -/* - The server logs all traffic and signal data. Once it records the signal, it sends - it to the subspace broadcaster. - - Store a maximum of 100 logs and then deletes them. -*/ - - -/obj/machinery/telecomms/server - name = "telecommunication server" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "comm_server" - desc = "A machine used to store data and network statistics." - density = 1 - anchored = 1 - use_power = 1 - idle_power_usage = 15 - machinetype = 4 - //heatgen = 50 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/server" - var/list/log_entries = list() - var/list/stored_names = list() - var/list/TrafficActions = list() - var/logs = 0 // number of logs - var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes) - - var/list/memory = list() // stored memory - var/rawcode = "" // the code to compile (raw text) - - var/datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code - var/autoruncode = 0 // 1 if the code is set to run every time a signal is picked up - - var/encryption = "null" // encryption key: ie "password" - var/salt = "null" // encryption salt: ie "123comsat" - // would add up to md5("password123comsat") - var/language = "human" - var/obj/item/device/radio/headset/server_radio = null - var/last_signal = 0 // Last time it sent a signal - -/obj/machinery/telecomms/server/New() - ..() - Compiler = new() - Compiler.Holder = src - server_radio = new() - -/obj/machinery/telecomms/server/Destroy() - // Garbage collects all the NTSL datums. - if(Compiler) - Compiler.GC() - Compiler = null - ..() - -/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - if(signal.data["message"]) - - if(is_freq_listening(signal)) - - if(traffic > 0) - totaltraffic += traffic // add current traffic to total traffic - - //Is this a test signal? Bypass logging - if(signal.data["type"] != 4) - - // If signal has a message and appropriate frequency - - update_logs() - - var/datum/comm_log_entry/log = new - - // Copy the signal.data entries we want - log.parameters["mobtype"] = signal.data["mobtype"] - log.parameters["job"] = signal.data["job"] - log.parameters["key"] = signal.data["key"] - log.parameters["message"] = signal.data["message"] - log.parameters["name"] = signal.data["name"] - log.parameters["realname"] = signal.data["realname"] - - log.parameters["uspeech"] = signal.data["languages"] & HUMAN //good enough - - // If the signal is still compressed, make the log entry gibberish - if(signal.data["compression"] > 0) - log.parameters["message"] = Gibberish(signal.data["message"], signal.data["compression"] + 50) - log.parameters["job"] = Gibberish(signal.data["job"], signal.data["compression"] + 50) - log.parameters["name"] = Gibberish(signal.data["name"], signal.data["compression"] + 50) - log.parameters["realname"] = Gibberish(signal.data["realname"], signal.data["compression"] + 50) - log.input_type = "Corrupt File" - - // Log and store everything that needs to be logged - log_entries.Add(log) - if(!(signal.data["name"] in stored_names)) - stored_names.Add(signal.data["name"]) - logs++ - signal.data["server"] = src - - // Give the log a name - var/identifier = num2text( rand(-1000,1000) + world.time ) - log.name = "data packet ([md5(identifier)])" - - if(Compiler && autoruncode) - Compiler.Run(signal) // execute the code - - var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub") - if(!can_send) - relay_information(signal, "/obj/machinery/telecomms/broadcaster") - - -/obj/machinery/telecomms/server/proc/setcode(var/t) - if(t) - if(istext(t)) - rawcode = t - -/obj/machinery/telecomms/server/proc/admin_log(var/mob/mob) - - var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:" - diary << msg - diary << rawcode - src.investigate_log("[msg]
[rawcode]", "ntsl") - if(length(rawcode)) // Let's not bother the admins for empty code. - message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) - -/obj/machinery/telecomms/server/proc/compile(var/mob/user) - - if(Compiler) - admin_log(user) - return Compiler.Compile(rawcode) - -/obj/machinery/telecomms/server/proc/update_logs() - // start deleting the very first log entry - if(logs >= 400) - for(var/i = 1, i <= logs, i++) // locate the first garbage collectable log entry and remove it - var/datum/comm_log_entry/L = log_entries[i] - if(L.garbage_collector) - log_entries.Remove(L) - logs-- - break - -/obj/machinery/telecomms/server/proc/add_entry(var/content, var/input) - var/datum/comm_log_entry/log = new - var/identifier = num2text( rand(-1000,1000) + world.time ) - log.name = "[input] ([md5(identifier)])" - log.input_type = input - log.parameters["message"] = content - log_entries.Add(log) - update_logs() - - - - -// Simple log entry datum - -/datum/comm_log_entry - var/parameters = list() // carbon-copy to signal.data[] - var/name = "data packet (#)" - var/garbage_collector = 1 // if set to 0, will not be garbage collected - var/input_type = "Speech File" - - - - - - - diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 4943a70429a..4623e39a7a1 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -1,136 +1,136 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - -/* - Telecomms monitor tracks the overall trafficing of a telecommunications network - and displays a heirarchy of linked machines. -*/ - - -/obj/machinery/computer/telecomms/monitor - name = "telecommunications monitoring console" - icon_state = "comm_monitor" - - var/screen = 0 // the screen number: - var/list/machinelist = list() // the machines located by the computer - var/obj/machinery/telecomms/SelectedMachine - - var/network = "NULL" // the network to probe - - var/temp = "" // temporary feedback messages - circuit = "/obj/item/weapon/circuitboard/comm_monitor" - -/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunications Monitor
Telecommunications Monitor
" - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]

" - dat += "
Current Network: [network]
" - if(machinelist.len) - dat += "
Detected Network Entities:
    " - for(var/obj/machinery/telecomms/T in machinelist) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - else - dat += "\[Probe Network\]" - - - // --- Viewing Machine --- - - if(1) - dat += "
[temp]
" - dat += "
\[Main Menu\]
" - dat += "
Current Network: [network]
" - dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
" - dat += "Linked Entities:
    " - for(var/obj/machinery/telecomms/T in SelectedMachine.links) - if(!T.hide) - dat += "
  1. \ref[T.id] [T.name] ([T.id])
  2. " - dat += "
" - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/monitor/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewmachine"]) - screen = 1 - for(var/obj/machinery/telecomms/T in machinelist) - if(T.id == href_list["viewmachine"]) - SelectedMachine = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - machinelist = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("probe") - if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/T in range(25, src)) - if(T.network == network) - machinelist.Add(T) - - if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" - else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" - - screen = 0 - - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - network = newnet - screen = 0 - machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/monitor/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/monitor/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + + +/* + Telecomms monitor tracks the overall trafficing of a telecommunications network + and displays a heirarchy of linked machines. +*/ + + +/obj/machinery/computer/telecomms/monitor + name = "telecommunications monitoring console" + icon_state = "comm_monitor" + + var/screen = 0 // the screen number: + var/list/machinelist = list() // the machines located by the computer + var/obj/machinery/telecomms/SelectedMachine + + var/network = "NULL" // the network to probe + + var/temp = "" // temporary feedback messages + circuit = "/obj/item/weapon/circuitboard/comm_monitor" + +/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunications Monitor
Telecommunications Monitor
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]

" + dat += "
Current Network: [network]
" + if(machinelist.len) + dat += "
Detected Network Entities:
    " + for(var/obj/machinery/telecomms/T in machinelist) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + else + dat += "\[Probe Network\]" + + + // --- Viewing Machine --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\]
" + dat += "
Current Network: [network]
" + dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
" + dat += "Linked Entities:
    " + for(var/obj/machinery/telecomms/T in SelectedMachine.links) + if(!T.hide) + dat += "
  1. \ref[T.id] [T.name] ([T.id])
  2. " + dat += "
" + + + + user << browse(dat, "window=comm_monitor;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/monitor/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["viewmachine"]) + screen = 1 + for(var/obj/machinery/telecomms/T in machinelist) + if(T.id == href_list["viewmachine"]) + SelectedMachine = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + machinelist = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("probe") + if(machinelist.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/T in range(25, src)) + if(T.network == network) + machinelist.Add(T) + + if(!machinelist.len) + temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" + else + temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" + + screen = 0 + + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + network = newnet + screen = 0 + machinelist = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/monitor/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/monitor/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index d00a030350c..11cf378195a 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -1,290 +1,290 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - - - - -/obj/machinery/computer/telecomms/traffic - name = "telecommunications traffic control console" - icon_state = "computer_generic" - - var/screen = 0 // the screen number: - var/list/servers = list() // the servers located by the computer - var/mob/editingcode - var/mob/lasteditor - var/list/viewingcode = list() - var/obj/machinery/telecomms/server/SelectedServer - - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - - var/storedcode = "" // code stored - var/obj/item/weapon/card/id/auth = null - var/list/access_log = list() - var/process = 0 - circuit = "/obj/item/weapon/circuitboard/comm_traffic" - - req_access = list(access_tcomsat) - -/obj/machinery/computer/telecomms/traffic/proc/stop_editing() - if(editingcode) - if(editingcode.client) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode.unset_machine() - editingcode = null - -/obj/machinery/computer/telecomms/traffic/process() - - if(stat & (NOPOWER|BROKEN)) - stop_editing() - return - - if(editingcode && editingcode.machine != src) - stop_editing() - return - - if(!editingcode) - if(length(viewingcode) > 0) - editingcode = pick(viewingcode) - viewingcode.Remove(editingcode) - return - - process = !process - if(!process) - return - - // loop if there's someone manning the keyboard - if(!editingcode.client) - stop_editing() - return - - // For the typer, the input is enabled. Buffer the typed text - storedcode = "[winget(editingcode, "tcscode", "text")]" - winset(editingcode, "tcscode", "is-disabled=false") - - // If the player's not manning the keyboard anymore, adjust everything - if(!in_range(editingcode, src) && !issilicon(editingcode) || editingcode.machine != src) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode = null - return - - // For other people viewing the typer type code, the input is disabled and they can only view the code - // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) - - if(length(viewingcode)) - // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - - for(var/mob/M in viewingcode) - - if( (M.machine == src && in_range(M, src) ) || issilicon(M)) - winset(M, "tcscode", "is-disabled=true") - winset(M, "tcscode", "text=\"[showcode]\"") - else - viewingcode.Remove(M) - winshow(M, "Telecomms IDE", 0) // hide the windows - - -/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" - dat += "
[(auth ? "AUTHED" : "NOT AUTHED")]: [(!auth ? "Insert ID" : auth)]
" - dat += "View System Log
" - - if(issilicon(user) || auth) - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(servers.len) - dat += "
Detected Telecommunication Servers:
    " - for(var/obj/machinery/telecomms/T in servers) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - - else - dat += "
No servers detected. Scan for servers: \[Scan\]" - - - // --- Viewing Server --- - - if(1) - if(SelectedServer) - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]

" - dat += "
\[Edit Code\]" - dat += "
Signal Execution: " - if(SelectedServer.autoruncode) - dat += "ALWAYS" - else - dat += "NEVER" - else - screen = 0 - return - - - user << browse(dat, "window=traffic_control;size=575x400") - onclose(user, "server_control") - - temp = "" - return - -/obj/machinery/computer/telecomms/traffic/proc/create_log(var/entry, var/mob/user) - var/id = null - if(issilicon(user)) - id = "System Administrator" - else - if(auth) - id = "[auth.registered_name] ([auth.assignment])" - else - ERROR("There is a null auth while the user isn't a silicon! ([user.name], [user.type])") - return - access_log += "\[[get_timestamp()]\] [id] [entry]" - -/obj/machinery/computer/telecomms/traffic/proc/print_logs() - . = "

Traffic Control Telecomms System Log


" - for(var/entry in access_log) - . += entry + "
" - return . - -/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["auth"]) - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!auth) - var/obj/item/weapon/card/id/I = C.get_active_hand() - if(istype(I)) - if(check_access(I)) - C.drop_item() - I.loc = src - auth = I - create_log("has logged in.", usr) - else - create_log("has logged out.", usr) - auth.loc = src.loc - C.put_in_hands(auth) - auth = null - updateUsrDialog() - return - - if(href_list["print"]) - usr << browse(print_logs(), "window=traffic_logs") - return - - if(!auth && !issilicon(usr) && !emagged) - usr << "ACCESS DENIED." - return - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - create_log("selected server [T.name]", usr) - break - - - if(href_list["operation"]) - create_log("has performed action: [href_list["operation"]].", usr) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if("editcode") - if(editingcode == usr) return - if(usr in viewingcode) return - - if(!editingcode) - lasteditor = usr - editingcode = usr - winshow(editingcode, "Telecomms IDE", 1) // show the IDE - winset(editingcode, "tcscode", "is-disabled=false") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - winset(editingcode, "tcscode", "text=\"[showcode]\"") - - else - viewingcode.Add(usr) - winshow(usr, "Telecomms IDE", 1) // show the IDE - winset(usr, "tcscode", "is-disabled=true") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\"", "\\\"") - winset(usr, "tcscode", "text=\"[showcode]\"") - - if("togglerun") - SelectedServer.autoruncode = !(SelectedServer.autoruncode) - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - - if(newnet && canAccess(usr)) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - create_log("has set the network to [network].", usr) - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/traffic/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/traffic/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "You you disable the security protocols." - -/obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) - if(issilicon(user) || in_range(user, src)) - return 1 +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + + + + + +/obj/machinery/computer/telecomms/traffic + name = "telecommunications traffic control console" + icon_state = "computer_generic" + + var/screen = 0 // the screen number: + var/list/servers = list() // the servers located by the computer + var/mob/editingcode + var/mob/lasteditor + var/list/viewingcode = list() + var/obj/machinery/telecomms/server/SelectedServer + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/storedcode = "" // code stored + var/obj/item/weapon/card/id/auth = null + var/list/access_log = list() + var/process = 0 + circuit = "/obj/item/weapon/circuitboard/comm_traffic" + + req_access = list(access_tcomsat) + +/obj/machinery/computer/telecomms/traffic/proc/stop_editing() + if(editingcode) + if(editingcode.client) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode.unset_machine() + editingcode = null + +/obj/machinery/computer/telecomms/traffic/process() + + if(stat & (NOPOWER|BROKEN)) + stop_editing() + return + + if(editingcode && editingcode.machine != src) + stop_editing() + return + + if(!editingcode) + if(length(viewingcode) > 0) + editingcode = pick(viewingcode) + viewingcode.Remove(editingcode) + return + + process = !process + if(!process) + return + + // loop if there's someone manning the keyboard + if(!editingcode.client) + stop_editing() + return + + // For the typer, the input is enabled. Buffer the typed text + storedcode = "[winget(editingcode, "tcscode", "text")]" + winset(editingcode, "tcscode", "is-disabled=false") + + // If the player's not manning the keyboard anymore, adjust everything + if(!in_range(editingcode, src) && !issilicon(editingcode) || editingcode.machine != src) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode = null + return + + // For other people viewing the typer type code, the input is disabled and they can only view the code + // (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once) + + if(length(viewingcode)) + // This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + + for(var/mob/M in viewingcode) + + if( (M.machine == src && in_range(M, src) ) || issilicon(M)) + winset(M, "tcscode", "is-disabled=true") + winset(M, "tcscode", "text=\"[showcode]\"") + else + viewingcode.Remove(M) + winshow(M, "Telecomms IDE", 0) // hide the windows + + +/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" + dat += "
[(auth ? "AUTHED" : "NOT AUTHED")]: [(!auth ? "Insert ID" : auth)]
" + dat += "View System Log
" + + if(issilicon(user) || auth) + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(servers.len) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + if(SelectedServer) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]

" + dat += "
\[Edit Code\]" + dat += "
Signal Execution: " + if(SelectedServer.autoruncode) + dat += "ALWAYS" + else + dat += "NEVER" + else + screen = 0 + return + + + user << browse(dat, "window=traffic_control;size=575x400") + onclose(user, "server_control") + + temp = "" + return + +/obj/machinery/computer/telecomms/traffic/proc/create_log(var/entry, var/mob/user) + var/id = null + if(issilicon(user)) + id = "System Administrator" + else + if(auth) + id = "[auth.registered_name] ([auth.assignment])" + else + ERROR("There is a null auth while the user isn't a silicon! ([user.name], [user.type])") + return + access_log += "\[[get_timestamp()]\] [id] [entry]" + +/obj/machinery/computer/telecomms/traffic/proc/print_logs() + . = "

Traffic Control Telecomms System Log


" + for(var/entry in access_log) + . += entry + "
" + return . + +/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["auth"]) + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(!auth) + var/obj/item/weapon/card/id/I = C.get_active_hand() + if(istype(I)) + if(check_access(I)) + C.drop_item() + I.loc = src + auth = I + create_log("has logged in.", usr) + else + create_log("has logged out.", usr) + auth.loc = src.loc + C.put_in_hands(auth) + auth = null + updateUsrDialog() + return + + if(href_list["print"]) + usr << browse(print_logs(), "window=traffic_logs") + return + + if(!auth && !issilicon(usr) && !emagged) + usr << "ACCESS DENIED." + return + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + create_log("selected server [T.name]", usr) + break + + + if(href_list["operation"]) + create_log("has performed action: [href_list["operation"]].", usr) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + + screen = 0 + + if("editcode") + if(editingcode == usr) return + if(usr in viewingcode) return + + if(!editingcode) + lasteditor = usr + editingcode = usr + winshow(editingcode, "Telecomms IDE", 1) // show the IDE + winset(editingcode, "tcscode", "is-disabled=false") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + winset(editingcode, "tcscode", "text=\"[showcode]\"") + + else + viewingcode.Add(usr) + winshow(usr, "Telecomms IDE", 1) // show the IDE + winset(usr, "tcscode", "is-disabled=true") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\"", "\\\"") + winset(usr, "tcscode", "text=\"[showcode]\"") + + if("togglerun") + SelectedServer.autoruncode = !(SelectedServer.autoruncode) + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + + if(newnet && canAccess(usr)) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + create_log("has set the network to [network].", usr) + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/traffic/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/traffic/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols." + +/obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) + if(issilicon(user) || in_range(user, src)) + return 1 return 0 \ No newline at end of file diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index e04ae94a755..0c31ede202a 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -34,7 +34,7 @@ var/obj/item/device/gps/L = I if(L.locked_location && !(stat & (NOPOWER|BROKEN))) if(!user.unEquip(L)) - user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [I] is stuck to your hand, you cannot put it in \the [src]!" return L.loc = src locked = L @@ -117,10 +117,10 @@ target = get_turf(locked.locked_location) if(href_list["calibrate"]) if(!target) - usr << "Error: No target set to calibrate to." + usr << "Error: No target set to calibrate to." return if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) - usr << "Hub is already calibrated." + usr << "Hub is already calibrated!" return src.visible_message("Processing hub calibration to target...") @@ -131,7 +131,7 @@ power_station.teleporter_hub.calibrated = 1 src.visible_message("Calibration complete.") else - src.visible_message("Error: Unable to detect hub.") + src.visible_message("Error: Unable to detect hub.") updateDialog() updateDialog() @@ -293,7 +293,7 @@ if (!com) return if (!com.target) - visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") + visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return if (istype(M, /atom/movable)) if(do_teleport(M, com.target)) @@ -301,7 +301,7 @@ if(ishuman(M))//don't remove people from the round randomly you jerks var/mob/living/carbon/human/human = M if(human.dna && human.dna.species.id == "human") - M << "You hear a buzzing in your ears." + M << "You hear a buzzing in your ears." human.dna.species = new /datum/species/fly() human.regenerate_icons() human.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), IRRADIATE, 0) @@ -384,7 +384,7 @@ M.buffer = null user << "You upload the data from the [W.name]'s buffer." else - user << "This station cant hold more information, try to use better parts." + user << "This station can't hold more information, try to use better parts." if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) update_icon() return diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 0fb0bb0bd43..b1c356a0982 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -419,7 +419,7 @@ /obj/machinery/gun_turret/attack_alien(mob/living/user as mob) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) - user.visible_message("[user] slashes at [src]", "You slash at [src]") + user.visible_message("[user] slashes at [src]!", "You slash at [src]!") take_damage(15) return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d5be45d6338..405abb48ddc 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -246,7 +246,7 @@ if(istype(W, /obj/item/weapon/screwdriver) && anchored) panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance panel." + user << "You [panel_open ? "open" : "close"] the maintenance panel." overlays.Cut() if(panel_open) overlays += image(icon, "[initial(icon_state)]-panel") @@ -285,7 +285,7 @@ /obj/machinery/vending/emag_act(user as mob) if(!emagged) emagged = 1 - user << "You short out the product lock on [src]." + user << "You short out the product lock on [src]." /obj/machinery/vending/attack_paw(mob/user) return attack_hand(user) @@ -431,7 +431,7 @@ return else if(R in coin_records) if(!coin) - usr << "You need to insert a coin to get this item." + usr << "You need to insert a coin to get this item!" vend_ready = 1 return if(coin.string_attached) @@ -440,11 +440,11 @@ usr << "You successfully pull [coin] out before [src] could swallow it." coin = null else - usr << "You couldn't pull [coin] out because your hands are full." + usr << "You couldn't pull [coin] out because your hands are full!" qdel(coin) coin = null else - usr << "You weren't able to pull [coin] out fast enough, the machine ate it, string and all." + usr << "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!" qdel(coin) coin = null else @@ -779,6 +779,7 @@ products = list(/obj/item/weapon/restraints/handcuffs = 8,/obj/item/weapon/restraints/handcuffs/cable/zipties = 10,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash/handheld = 5, /obj/item/weapon/reagent_containers/food/snacks/donut = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4) contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2) + premium = list(/obj/item/weapon/coin/antagtoken = 1) /obj/machinery/vending/hydronutrients name = "\improper NutriMax" @@ -844,14 +845,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, - /obj/item/clothing/suit/whitedress = 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) + 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 @@ -860,7 +861,7 @@ desc = "A kitchen and restaurant equipment vendor" product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" - products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/glass/bowl = 10) + products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/kitchen/rollingpin = 2,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/apron/chef = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,/obj/item/weapon/reagent_containers/glass/bowl = 20) contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchenknife/butcher = 2) /obj/machinery/vending/sovietsoda diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 2079cf376e7..0288d3c3fba 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -248,7 +248,7 @@ user << "This item does not fit." return if(W.flags & NODROP) //if "can't drop" item - user << "\The [W] is stuck to your hand, you cannot put it in the washing machine!" + user << "\The [W] is stuck to your hand, you cannot put it in the washing machine!" return if(contents.len < 5) @@ -257,9 +257,9 @@ W.loc = src state = 3 else - user << "You can't put the item in right now." + user << "You can't put the item in right now!" else - user << "The washing machine is full." + user << "The washing machine is full!" else ..() update_icon() diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 486d47a003c..adef813adc0 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -42,24 +42,24 @@ if(!istype(target)) return if(target.buckled) - occupant_message("[target] will not fit into the sleeper because they are buckled to [target.buckled].") + occupant_message("[target] will not fit into the sleeper because they are buckled to [target.buckled]!") return if(occupant) - occupant_message("The sleeper is already occupied") + occupant_message("The sleeper is already occupied!") return for(var/mob/living/simple_animal/slime/M in range(1,target)) if(M.Victim == target) - occupant_message("[target] will not fit into the sleeper because they have a slime latched onto their head.") + occupant_message("[target] will not fit into the sleeper because they have a slime latched onto their head!") return - occupant_message("You start putting [target] into [src].") - chassis.visible_message("[chassis] starts putting [target] into \the [src].") + occupant_message("You start putting [target] into [src]...") + chassis.visible_message("[chassis] starts putting [target] into \the [src].") var/C = chassis.loc var/T = target.loc if(do_after_cooldown(target)) if(chassis.loc!=C || target.loc!=T) return if(occupant) - occupant_message("The sleeper is already occupied!") + occupant_message("The sleeper is already occupied!") return target.forceMove(src) occupant = target @@ -72,7 +72,7 @@ set_ready_state(0) pr_mech_sleeper.start() occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") - chassis.visible_message("[chassis] loads [target] into [src].") + chassis.visible_message("[chassis] loads [target] into [src].") log_message("[target] loaded. Life support functions engaged.") return @@ -95,7 +95,7 @@ /obj/item/mecha_parts/mecha_equipment/tool/sleeper/detach() if(occupant) - occupant_message("Unable to detach [src] - equipment occupied.") + occupant_message("Unable to detach [src] - equipment occupied!") return pr_mech_sleeper.stop() return ..() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 05cb1cb48a4..fb3c28a3d27 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -47,12 +47,12 @@ occupant_message("[target] successfully loaded.") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") else - occupant_message("You must hold still while handling objects.") + occupant_message("You must hold still while handling objects!") O.anchored = initial(O.anchored) else - occupant_message("Not enough room in cargo compartment.") + occupant_message("Not enough room in cargo compartment!") else - occupant_message("[target] is firmly secured.") + occupant_message("[target] is firmly secured!") else if(istype(target,/mob/living)) var/mob/living/M = target @@ -65,7 +65,7 @@ M.updatehealth() target.visible_message("[chassis] squeezes [target].", \ "[chassis] squeezes [target].",\ - "You hear something crack") + "You hear something crack.") add_logs(chassis.occupant, M, "attacked", object="[name]", addition="(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") else step_away(M,chassis) @@ -93,9 +93,9 @@ return set_ready_state(0) chassis.use_power(energy_drain) - target.visible_message("[chassis] starts to drill [target]", \ - "[chassis] starts to drill [target]", \ - "You hear drilling.") + target.visible_message("[chassis] starts to drill [target].", \ + "[chassis] starts to drill [target]...", \ + "You hear drilling.") var/T = chassis.loc var/C = target.loc //why are these backwards? we may never know -Pete if(do_after_cooldown(target)) @@ -176,6 +176,34 @@ return 1 return 0 +/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner + name = "exosuit mining scanner" + desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals." + icon_state = "mecha_analyzer" + origin_tech = "materials=3;engineering=2" + equip_cooldown = 30 + var/scanning = 0 + +/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner/New() + SSobj.processing |= src + +/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner/process() + if(!loc) + SSobj.processing.Remove(src) + qdel(src) + if(scanning) + return + if(istype(loc,/obj/mecha/working)) + var/obj/mecha/working/mecha = loc + if(!mecha.occupant) + return + var/list/occupant = list() + occupant |= mecha.occupant + scanning = 1 + mineral_scan_pulse(occupant,get_turf(loc)) + spawn(equip_cooldown) + scanning = 0 + /obj/item/mecha_parts/mecha_equipment/tool/extinguisher name = "exosuit extinguisher" desc = "Equipment for engineering exosuits. A rapid-firing high capacity fire extinguisher." @@ -1028,7 +1056,7 @@ var/result = load_fuel(target) var/message if(isnull(result)) - message = "[fuel] traces in target minimal. [target] cannot be used as fuel." + message = "[fuel] traces in target minimal! [target] cannot be used as fuel." else if(!result) message = "Unit is full." else @@ -1138,9 +1166,9 @@ if(..()) for(var/mob/living/carbon/M in view(EG.chassis)) if(istype(M,/mob/living/carbon/human)) - M.apply_effect((EG.rad_per_cycle*3),IRRADIATE,0) + M.irradiate(EG.rad_per_cycle*3) else - M.radiation += EG.rad_per_cycle + M.irradiate(EG.rad_per_cycle) return 1 @@ -1186,12 +1214,12 @@ chassis.occupant_message("[target] successfully loaded.") chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") else - chassis.occupant_message("You must hold still while handling objects.") + chassis.occupant_message("You must hold still while handling objects!") O.anchored = initial(O.anchored) else - chassis.occupant_message("Not enough room in cargo compartment.") + chassis.occupant_message("Not enough room in cargo compartment!") else - chassis.occupant_message("[target] is firmly secured.") + chassis.occupant_message("[target] is firmly secured!") else if(istype(target,/mob/living)) var/mob/living/M = target diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index e8fe2378646..40389aae5a9 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -102,19 +102,19 @@ fire_sound = 'sound/weapons/marauder.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma - equip_cooldown = 8 + equip_cooldown = 20 name = "217-D Heavy Plasma Cutter" desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demloishing solid obstacles." icon_state = "mecha_plasmacutter" item_state = "plasmacutter" - energy_drain = 45 + energy_drain = 60 origin_tech = "materials=3;combat=2;powerstorage=3;plasma=3" projectile = /obj/item/projectile/plasma/adv/mech - fire_sound = 'sound/weapons/pulse.ogg' + fire_sound = 'sound/weapons/Laser.ogg' /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/M as obj) if(istype(M, /obj/mecha/working)) - if(M.equipment.lenYou can't load \the [name] while it's opened.
" + user << "You can't load \the [name] while it's opened!" return 1 if(istype(W, /obj/item/stack)) @@ -526,10 +526,10 @@ return ..() if(being_built) - user << "\The [src] is currently processing. Please wait until completion." + user << "\The [src] is currently processing! Please wait until completion." return if(res_max_amount - resources[material] < MINERAL_MATERIAL_AMOUNT) //overstuffing the fabricator - user << "\The [src] [material2name(material)] storage is full." + user << "\The [src] [material2name(material)] storage is full!" return var/obj/item/stack/sheet/stack = W var/sname = "[stack.name]" @@ -539,12 +539,12 @@ var/transfer_amount = min(stack.amount, round((res_max_amount - resources[material])/MINERAL_MATERIAL_AMOUNT,1)) resources[material] += transfer_amount * MINERAL_MATERIAL_AMOUNT stack.use(transfer_amount) - user << "You insert [transfer_amount] [sname] sheet\s into \the [src]." + user << "You insert [transfer_amount] [sname] sheet\s into \the [src]." sleep(10) updateUsrDialog() overlays -= "fab-load-[material2name(material)]" //No matter what the overlay shall still be deleted else - user << "\The [src] cannot hold any more [sname] sheet\s." + user << "\The [src] cannot hold any more [sname] sheet\s!" return /obj/machinery/mecha_part_fabricator/proc/material2name(var/ID) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 88b7cc77e2d..42d25b93a92 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -16,7 +16,7 @@ opacity = 1 ///opaque. Menacing. anchored = 1 //no pulling around. unacidable = 1 //and no deleting hoomans inside - layer = MOB_LAYER //icon draw layer + layer = MOB_LAYER - 0.2//icon draw layer infra_luminosity = 15 //byond implementation is bugged. force = 5 var/can_move = 1 @@ -348,15 +348,15 @@ obj/mecha/proc/can_use(mob/user) return if(user != src.occupant) //While not "realistic", this piece is player friendly. user.forceMove(get_turf(src)) - user << "You climb out from [src]" + user << "You climb out from [src]." return 0 if(connected_port) if(world.time - last_message > 20) - src.occupant_message("Unable to move while connected to the air system port") + src.occupant_message("Unable to move while connected to the air system port!") last_message = world.time return 0 if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect.") return return domove(direction) @@ -677,9 +677,9 @@ obj/mecha/proc/can_use(mob/user) if(E.can_attach(src)) user.drop_item() E.attach(src) - user.visible_message("[user] attaches [W] to [src]", "You attach [W] to [src]") + user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") else - user << "You were unable to attach [W] to [src]" + user << "You were unable to attach [W] to [src]!" return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(add_req_access || maint_access) @@ -699,18 +699,18 @@ obj/mecha/proc/can_use(mob/user) else if(istype(W, /obj/item/weapon/wrench)) if(state==1) state = 2 - user << "You undo the securing bolts." + user << "You undo the securing bolts." else if(state==2) state = 1 - user << "You tighten the securing bolts." + user << "You tighten the securing bolts." return else if(istype(W, /obj/item/weapon/crowbar)) if(state==2) state = 3 - user << "You open the hatch to the power unit" + user << "You open the hatch to the power unit." else if(state==3) state=2 - user << "You close the hatch to the power unit" + user << "You close the hatch to the power unit." return else if(istype(W, /obj/item/stack/cable_coil)) if(state == 3 && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT)) @@ -719,35 +719,35 @@ obj/mecha/proc/can_use(mob/user) clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) user << "You replace the fused wires." else - user << "You need two lengths of cable to fix this mecha." + user << "You need two lengths of cable to fix this mech!" return else if(istype(W, /obj/item/weapon/screwdriver)) if(hasInternalDamage(MECHA_INT_TEMP_CONTROL)) clearInternalDamage(MECHA_INT_TEMP_CONTROL) - user << "You repair the damaged temperature controller." + user << "You repair the damaged temperature controller." else if(state==3 && src.cell) src.cell.forceMove(src.loc) src.cell = null state = 4 - user << "You unscrew and pry out the powercell." + user << "You unscrew and pry out the powercell." src.log_message("Powercell removed") else if(state==4 && src.cell) state=3 - user << "You screw the cell in place" + user << "You screw the cell in place." return else if(istype(W, /obj/item/weapon/stock_parts/cell)) if(state==4) if(!src.cell) var/obj/item/weapon/stock_parts/cell/C = W - user << "You install the powercell" + user << "You install the powercell." user.drop_item() C.forceMove(src) C.use(C.charge * 0.8) src.cell = C src.log_message("Powercell installed") else - user << "There's already a powercell installed." + user << "There's already a powercell installed." return else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") @@ -762,18 +762,18 @@ obj/mecha/proc/can_use(mob/user) user.visible_message("[user] repairs some damage to [src.name].") src.health += min(10, initial(src.health)-src.health) else - user << "The welder must be on for this task." + user << "The welder must be on for this task!" return 1 else - user << "The [src.name] is at full integrity." + user << "The [src.name] is at full integrity!" return 1 else if(istype(W, /obj/item/mecha_parts/mecha_tracking)) if(!user.unEquip(W)) - user << "\the [W] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [W] is stuck to your hand, you cannot put it in \the [src]!" return W.forceMove(src) - user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]") + user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") return else if(!(W.flags&NOBLUDGEON)) @@ -949,20 +949,20 @@ obj/mecha/proc/can_use(mob/user) return for(var/mob/living/simple_animal/slime/S in range(1,user)) if(S.Victim == user) - user << "You're too busy getting your life sucked out of you." + user << "You're too busy getting your life sucked out of you!" return - visible_message("[user] starts to climb into [src.name]") + visible_message("[user] starts to climb into [src.name].") if(enter_after(40,user)) if(src.health <= 0) - user << "You cannot get in the [src.name], it has been destroyed." + user << "You cannot get in the [src.name], it has been destroyed!" else if(!src.occupant) moved_inside(user) else if(src.occupant!=user) - user << "[src.occupant] was faster. Try better next time, loser." + user << "[src.occupant] was faster! Try better next time, loser." else - user << "You stop entering the exosuit." + user << "You stop entering the exosuit!" return /obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob) @@ -993,41 +993,41 @@ obj/mecha/proc/can_use(mob/user) /obj/mecha/proc/mmi_move_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) - user << "Consciousness matrix not detected." + user << "Consciousness matrix not detected!" return 0 else if(mmi_as_oc.brainmob.stat) - user << "Beta-rhythm below acceptable level." + user << "Beta-rhythm below acceptable level!" return 0 else if(occupant) - user << "Occupant detected." + user << "Occupant detected!" return 0 else if(dna && dna!=mmi_as_oc.brainmob.dna.unique_enzymes) - user << "Stop it!" + user << "Stop it!" return 0 //Added a message here since people assume their first click failed or something./N // user << "Installing MMI, please stand by." - visible_message("[user] starts to insert an MMI into [src.name]") + visible_message("[user] starts to insert an MMI into [src.name].") if(enter_after(40,user)) if(!occupant) return mmi_moved_inside(mmi_as_oc,user) else - user << "Occupant detected." + user << "Occupant detected!" else - user << "You stop inserting the MMI." + user << "You stop inserting the MMI." return 0 /obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) if(mmi_as_oc && user in range(1)) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) - user << "Consciousness matrix not detected." + user << "Consciousness matrix not detected!" return 0 else if(mmi_as_oc.brainmob.stat) - user << "Beta-rhythm below acceptable level." + user << "Beta-rhythm below acceptable level!" return 0 if(!user.unEquip(mmi_as_oc)) - user << "\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]!" return var/mob/brainmob = mmi_as_oc.brainmob brainmob.reset_view(src) @@ -1527,7 +1527,7 @@ var/year_integer = text2num(year) // = 2013??? src.dna = null if(href_list["repair_int_control_lost"]) if(usr != src.occupant) return - src.occupant_message("Recalibrating coordination system.") + src.occupant_message("Recalibrating coordination system...") src.log_message("Recalibration of coordination system started.") var/T = src.loc if(do_after(100)) @@ -1536,7 +1536,7 @@ var/year_integer = text2num(year) // = 2013??? src.occupant_message("Recalibration successful.") src.log_message("Recalibration of coordination system finished with 0 errors.") else - src.occupant_message("Recalibration failed.") + src.occupant_message("Recalibration failed!") src.log_message("Recalibration of coordination system failed with 1 error.",1) //debug diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index e7b20468d4d..12977e75648 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -23,12 +23,12 @@ if(C.use(4)) playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1) else - user << ("There's not enough cable to finish the task.") + user << ("There's not enough cable to finish the task!") return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) - user << ("There's not enough material in this stack.") + user << ("There's not enough material in this stack!") return 0 else S.use(5) @@ -55,12 +55,12 @@ if (C.use(4)) playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1) else - user << ("There's not enough cable to finish the task.") + user << ("There's not enough cable to finish the task!") return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) - user << ("There's not enough material in this stack.") + user << ("There's not enough material in this stack!") return 0 else S.use(5) @@ -76,7 +76,7 @@ ) /datum/construction/mecha/ripley_chassis/custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]") + user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder].") holder.overlays += used_atom.icon_state+"+o" qdel(used_atom) return 1 @@ -165,107 +165,107 @@ //TODO: better messages. switch(index) if(14) - user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") + user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "ripley1" if(13) if(diff==FORWARD) - user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") + user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "ripley2" else - user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") + user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "ripley0" if(12) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") + user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "ripley3" else - user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") + user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "ripley1" if(11) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") + user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "ripley4" else - user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") + user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "ripley2" if(10) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") + user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) holder.icon_state = "ripley5" else - user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") + user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "ripley3" if(9) if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "ripley6" else - user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") + user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder)) holder.icon_state = "ripley4" if(8) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") + user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) holder.icon_state = "ripley7" else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "ripley5" if(7) if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "ripley8" else - user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") + user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder)) holder.icon_state = "ripley6" if(6) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") holder.icon_state = "ripley9" else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "ripley7" if(5) if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") holder.icon_state = "ripley10" else - user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") + user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "ripley8" if(4) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") + user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") holder.icon_state = "ripley11" else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") holder.icon_state = "ripley9" if(3) if(diff==FORWARD) - user.visible_message("[user] installs the external reinforced armor layer to the [holder].", "You install the external reinforced armor layer to the [holder].") + user.visible_message("[user] installs the external reinforced armor layer to the [holder].", "You install the external reinforced armor layer to the [holder].") holder.icon_state = "ripley12" else - user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") + user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") holder.icon_state = "ripley10" if(2) if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") + user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") holder.icon_state = "ripley13" else - user.visible_message("[user] pries external armor layer from the [holder].", "You pry external armor layer from the [holder].") + user.visible_message("[user] pries external armor layer from the [holder].", "You pry external armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "ripley11" if(1) if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") + user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") holder.icon_state = "ripley12" return 1 @@ -286,7 +286,7 @@ ) /datum/construction/mecha/gygax_chassis/custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]") + user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder].") holder.overlays += used_atom.icon_state+"+o" qdel(used_atom) return 1 @@ -398,155 +398,155 @@ //TODO: better messages. switch(index) if(20) - user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") + user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "gygax1" if(19) if(diff==FORWARD) - user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") + user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "gygax2" else - user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") + user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "gygax0" if(18) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") + user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "gygax3" else - user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") + user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "gygax1" if(17) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") + user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "gygax4" else - user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") + user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "gygax2" if(16) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") + user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) holder.icon_state = "gygax5" else - user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") + user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "gygax3" if(15) if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "gygax6" else - user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") + user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/weapon/circuitboard/mecha/gygax/main(get_turf(holder)) holder.icon_state = "gygax4" if(14) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") + user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) holder.icon_state = "gygax7" else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "gygax5" if(13) if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "gygax8" else - user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") + user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/gygax/peripherals(get_turf(holder)) holder.icon_state = "gygax6" if(12) if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") + user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) holder.icon_state = "gygax9" else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "gygax7" if(11) if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") holder.icon_state = "gygax10" else - user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") + user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/gygax/targeting(get_turf(holder)) holder.icon_state = "gygax8" if(10) if(diff==FORWARD) - user.visible_message("[user] installs advanced scanner module to the [holder].", "You install advanced scanner module to the [holder].") + user.visible_message("[user] installs advanced scanner module to the [holder].", "You install advanced scanner module to the [holder].") qdel(used_atom) holder.icon_state = "gygax11" else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") holder.icon_state = "gygax9" if(9) if(diff==FORWARD) - user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") + user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") holder.icon_state = "gygax12" else - user.visible_message("[user] removes the advanced scanner module from the [holder].", "You remove the advanced scanner module from the [holder].") + user.visible_message("[user] removes the advanced scanner module from the [holder].", "You remove the advanced scanner module from the [holder].") new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder)) holder.icon_state = "gygax10" if(8) if(diff==FORWARD) - user.visible_message("[user] installs advanced capacitor to the [holder].", "You install advanced capacitor to the [holder].") + user.visible_message("[user] installs advanced capacitor to the [holder].", "You install advanced capacitor to the [holder].") qdel(used_atom) holder.icon_state = "gygax13" else - user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") + user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") holder.icon_state = "gygax11" if(7) if(diff==FORWARD) - user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") + user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") holder.icon_state = "gygax14" else - user.visible_message("[user] removes the advanced capacitor from the [holder].", "You remove the advanced capacitor from the [holder].") + user.visible_message("[user] removes the advanced capacitor from the [holder].", "You remove the advanced capacitor from the [holder].") new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder)) holder.icon_state = "gygax12" if(6) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") holder.icon_state = "gygax15" else - user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") + user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") holder.icon_state = "gygax13" if(5) if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") holder.icon_state = "gygax16" else - user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") + user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "gygax14" if(4) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") + user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") holder.icon_state = "gygax17" else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") holder.icon_state = "gygax15" if(3) if(diff==FORWARD) - user.visible_message("[user] installs Gygax Armor Plates to the [holder].", "You install Gygax Armor Plates to the [holder].") + user.visible_message("[user] installs Gygax Armor Plates to the [holder].", "You install Gygax Armor Plates to the [holder].") qdel(used_atom) holder.icon_state = "gygax18" else - user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") + user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") holder.icon_state = "gygax16" if(2) if(diff==FORWARD) - user.visible_message("[user] secures Gygax Armor Plates.", "You secure Gygax Armor Plates.") + user.visible_message("[user] secures Gygax Armor Plates.", "You secure Gygax Armor Plates.") holder.icon_state = "gygax19" else - user.visible_message("[user] pries Gygax Armor Plates from the [holder].", "You pry Gygax Armor Plates from the [holder].") + user.visible_message("[user] pries Gygax Armor Plates from the [holder].", "You pry Gygax Armor Plates from the [holder].") new /obj/item/mecha_parts/part/gygax_armor(get_turf(holder)) holder.icon_state = "gygax17" if(1) if(diff==FORWARD) - user.visible_message("[user] welds Gygax Armor Plates to the [holder].", "You weld Gygax Armor Plates to the [holder].") + user.visible_message("[user] welds Gygax Armor Plates to the [holder].", "You weld Gygax Armor Plates to the [holder].") else - user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Gygax Armor Plates.") + user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Gygax Armor Plates.") holder.icon_state = "gygax18" return 1 @@ -565,7 +565,7 @@ ) /datum/construction/mecha/firefighter_chassis/custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]") + user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder].") holder.overlays += used_atom.icon_state+"+o" qdel(used_atom) return 1 @@ -658,117 +658,117 @@ //TODO: better messages. switch(index) if(15) - user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") + user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "fireripley1" if(14) if(diff==FORWARD) - user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") + user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "fireripley2" else - user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") + user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "fireripley0" if(13) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") + user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "fireripley3" else - user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") + user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "fireripley1" if(12) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") + user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "fireripley4" else - user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") + user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "fireripley2" if(11) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") + user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) holder.icon_state = "fireripley5" else - user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") + user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "fireripley3" if(10) if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "fireripley6" else - user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") + user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder)) holder.icon_state = "fireripley4" if(9) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") + user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) holder.icon_state = "fireripley7" else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "fireripley5" if(8) if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "fireripley8" else - user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") + user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder)) holder.icon_state = "fireripley6" if(7) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") holder.icon_state = "fireripley9" else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "fireripley7" if(6) if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") holder.icon_state = "fireripley10" else - user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") + user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "fireripley8" if(5) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") + user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") holder.icon_state = "fireripley11" else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") holder.icon_state = "fireripley9" if(4) if(diff==FORWARD) - user.visible_message("[user] starts to install the external armor layer to the [holder].", "You start to install the external armor layer to the [holder].") + user.visible_message("[user] starts to install the external armor layer to the [holder].", "You install the external armor layer to the [holder].") holder.icon_state = "fireripley12" else - user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") + user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") holder.icon_state = "fireripley10" if(3) if(diff==FORWARD) - user.visible_message("[user] installs the external reinforced armor layer to the [holder].", "You install the external reinforced armor layer to the [holder].") + user.visible_message("[user] installs the external reinforced armor layer to the [holder].", "You install the external reinforced armor layer to the [holder].") holder.icon_state = "fireripley13" else - user.visible_message("[user] removes the external armor from the [holder].", "You remove the external armor from the [holder].") + user.visible_message("[user] removes the external armor from the [holder].", "You remove the external armor from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "fireripley11" if(2) if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") + user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") holder.icon_state = "fireripley14" else - user.visible_message("[user] pries external armor layer from the [holder].", "You pry external armor layer from the [holder].") + user.visible_message("[user] pries external armor layer from the [holder].", "You pry external armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "fireripley12" if(1) if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") + user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") holder.icon_state = "fireripley13" return 1 @@ -792,7 +792,7 @@ return check_all_steps(used_atom,user) /datum/construction/mecha/honker_chassis/custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]") + user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder].") holder.overlays += used_atom.icon_state+"+o" qdel(used_atom) return 1 @@ -834,19 +834,19 @@ //TODO: better messages. switch(step) if(10) - user.visible_message("[user] installs the central control module into the [holder].", "You install the central control module into the [holder].") + user.visible_message("[user] installs the central control module into the [holder].", "You install the central control module into the [holder].") qdel(used_atom) if(8) - user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") + user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) if(6) - user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") + user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) if(4) - user.visible_message("[user] puts clown wig and mask on the [holder].", "You put clown wig and mask on the [holder].") + user.visible_message("[user] puts clown wig and mask on the [holder].", "You put clown wig and mask on the [holder].") qdel(used_atom) if(2) - user.visible_message("[user] puts clown boots on the [holder].", "You put clown boots on the [holder].") + user.visible_message("[user] puts clown boots on the [holder].", "You put clown boots on the [holder].") qdel(used_atom) return 1 @@ -977,155 +977,155 @@ //TODO: better messages. switch(index) if(20) - user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") + user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "durand1" if(19) if(diff==FORWARD) - user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") + user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "durand2" else - user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") + user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "durand0" if(18) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") + user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "durand3" else - user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") + user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "durand1" if(17) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") + user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "durand4" else - user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") + user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "durand2" if(16) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") + user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) holder.icon_state = "durand5" else - user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") + user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "durand3" if(15) if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "durand6" else - user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") + user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/weapon/circuitboard/mecha/durand/main(get_turf(holder)) holder.icon_state = "durand4" if(14) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") + user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) holder.icon_state = "durand7" else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "durand5" if(13) if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "durand8" else - user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") + user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/durand/peripherals(get_turf(holder)) holder.icon_state = "durand6" if(12) if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") + user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) holder.icon_state = "durand9" else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "durand7" if(11) if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") holder.icon_state = "durand10" else - user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") + user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/durand/targeting(get_turf(holder)) holder.icon_state = "durand8" if(10) if(diff==FORWARD) - user.visible_message("[user] installs phasic scanner module to the [holder].", "You install phasic scanner module to the [holder].") + user.visible_message("[user] installs phasic scanner module to the [holder].", "You install phasic scanner module to the [holder].") qdel(used_atom) holder.icon_state = "durand11" else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") holder.icon_state = "durand9" if(9) if(diff==FORWARD) - user.visible_message("[user] secures the phasic scanner module.", "You secure the phasic scanner module.") + user.visible_message("[user] secures the phasic scanner module.", "You secure the phasic scanner module.") holder.icon_state = "durand12" else - user.visible_message("[user] removes the phasic scanner module from the [holder].", "You remove the phasic scanner module from the [holder].") + user.visible_message("[user] removes the phasic scanner module from the [holder].", "You remove the phasic scanner module from the [holder].") new /obj/item/weapon/stock_parts/scanning_module/phasic(get_turf(holder)) holder.icon_state = "durand10" if(8) if(diff==FORWARD) - user.visible_message("[user] installs super capacitor to the [holder].", "You install super capacitor to the [holder].") + user.visible_message("[user] installs super capacitor to the [holder].", "You install super capacitor to the [holder].") qdel(used_atom) holder.icon_state = "durand13" else - user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the phasic scanner module.") + user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the phasic scanner module.") holder.icon_state = "durand11" if(7) if(diff==FORWARD) - user.visible_message("[user] secures the super capacitor.", "You secure the super capacitor.") + user.visible_message("[user] secures the super capacitor.", "You secure the super capacitor.") holder.icon_state = "durand14" else - user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the super capacitor from the [holder].") + user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the super capacitor from the [holder].") new /obj/item/weapon/stock_parts/capacitor/super(get_turf(holder)) holder.icon_state = "durand12" if(6) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") holder.icon_state = "durand15" else - user.visible_message("[user] unfastens the super capacitor.", "You unfasten the super capacitor.") + user.visible_message("[user] unfastens the super capacitor.", "You unfasten the super capacitor.") holder.icon_state = "durand13" if(5) if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") holder.icon_state = "durand16" else - user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") + user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "durand14" if(4) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") + user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") holder.icon_state = "durand17" else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") holder.icon_state = "durand15" if(3) if(diff==FORWARD) - user.visible_message("[user] installs Durand Armor Plates to the [holder].", "You install Durand Armor Plates to the [holder].") + user.visible_message("[user] installs Durand Armor Plates to the [holder].", "You install Durand Armor Plates to the [holder].") qdel(used_atom) holder.icon_state = "durand18" else - user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") + user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") holder.icon_state = "durand16" if(2) if(diff==FORWARD) - user.visible_message("[user] secures Durand Armor Plates.", "You secure Durand Armor Plates.") + user.visible_message("[user] secures Durand Armor Plates.", "You secure Durand Armor Plates.") holder.icon_state = "durand19" else - user.visible_message("[user] pries Durand Armor Plates from the [holder].", "You pry Durand Armor Plates from the [holder].") + user.visible_message("[user] pries Durand Armor Plates from the [holder].", "You pry Durand Armor Plates from the [holder].") new /obj/item/mecha_parts/part/durand_armor(get_turf(holder)) holder.icon_state = "durand17" if(1) if(diff==FORWARD) - user.visible_message("[user] welds Durand Armor Plates to the [holder].", "You weld Durand Armor Plates to the [holder].") + user.visible_message("[user] welds Durand Armor Plates to the [holder].", "You weld Durand Armor Plates to the [holder].") else - user.visible_message("[user] unfastens Durand Armor Plates.", "You unfasten Durand Armor Plates.") + user.visible_message("[user] unfastens Durand Armor Plates.", "You unfasten Durand Armor Plates.") holder.icon_state = "durand18" return 1 @@ -1147,7 +1147,7 @@ ) /datum/construction/mecha/phazon_chassis/custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]") + user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder].") holder.overlays += used_atom.icon_state+"+o" qdel(used_atom) return 1 @@ -1276,182 +1276,182 @@ //TODO: better messages. switch(index) if(24) - user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") + user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "phazon1" if(23) if(diff==FORWARD) - user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") + user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "phazon2" else - user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") + user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "phazon0" if(22) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") + user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "phazon3" else - user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") + user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "phazon1" if(21) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") + user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "phazon4" else - user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") + user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "phazon2" if(20) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") + user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) holder.icon_state = "phazon5" else - user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") + user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "phazon3" if(19) if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "phazon6" else - user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") + user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/weapon/circuitboard/mecha/phazon/main(get_turf(holder)) holder.icon_state = "phazon4" if(18) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") + user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) holder.icon_state = "phazon7" else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "phazon5" if(17) if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "phazon8" else - user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") + user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/phazon/peripherals(get_turf(holder)) holder.icon_state = "phazon6" if(16) if(diff==FORWARD) - user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") + user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) holder.icon_state = "phazon9" else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "phazon7" if(15) if(diff==FORWARD) - user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") holder.icon_state = "phazon10" else - user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") + user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/phazon/targeting(get_turf(holder)) holder.icon_state = "phazon8" if(14) if(diff==FORWARD) - user.visible_message("[user] installs phasic scanner module to the [holder].", "You install phasic scanner module to the [holder].") + user.visible_message("[user] installs phasic scanner module to the [holder].", "You install phasic scanner module to the [holder].") qdel(used_atom) holder.icon_state = "phazon11" else - user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") holder.icon_state = "phazon9" if(13) if(diff==FORWARD) - user.visible_message("[user] secures the phasic scanner module.", "You secure the phasic scanner module.") + user.visible_message("[user] secures the phasic scanner module.", "You secure the phasic scanner module.") holder.icon_state = "phazon12" else - user.visible_message("[user] removes the phasic scanner module from the [holder].", "You remove the phasic scanner module from the [holder].") + user.visible_message("[user] removes the phasic scanner module from the [holder].", "You remove the phasic scanner module from the [holder].") new /obj/item/weapon/stock_parts/scanning_module/phasic(get_turf(holder)) holder.icon_state = "phazon10" if(12) if(diff==FORWARD) - user.visible_message("[user] installs super capacitor to the [holder].", "You install super capacitor to the [holder].") + user.visible_message("[user] installs super capacitor to the [holder].", "You install super capacitor to the [holder].") qdel(used_atom) holder.icon_state = "phazon13" else - user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the phasic scanner module.") + user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the phasic scanner module.") holder.icon_state = "phazon11" if(11) if(diff==FORWARD) - user.visible_message("[user] secures the super capacitor.", "You secure the super capacitor.") + user.visible_message("[user] secures the super capacitor.", "You secure the super capacitor.") holder.icon_state = "phazon14" else - user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the super capacitor from the [holder].") + user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the super capacitor from the [holder].") new /obj/item/weapon/stock_parts/capacitor/super(get_turf(holder)) holder.icon_state = "phazon12" if(10) if(diff==FORWARD) - user.visible_message("[user] installs the bluespace crystal.", "You install the bluespace crystal.") + user.visible_message("[user] installs the bluespace crystal.", "You install the bluespace crystal.") qdel(used_atom) holder.icon_state = "phazon15" else - user.visible_message("[user] unsecures the super capacitor from the [holder].", "You unsecure the super capacitor from the [holder].") + user.visible_message("[user] unsecures the super capacitor from the [holder].", "You unsecure the super capacitor from the [holder].") holder.icon_state = "phazon13" if(9) if(diff==FORWARD) - user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.") + user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.") holder.icon_state = "phazon16" else - user.visible_message("[user] removes the bluespace crystal from the [holder].", "You remove the bluespace crystal from the [holder].") + user.visible_message("[user] removes the bluespace crystal from the [holder].", "You remove the bluespace crystal from the [holder].") new /obj/item/bluespace_crystal(get_turf(holder)) holder.icon_state = "phazon14" if(8) if(diff==FORWARD) - user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.") + user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.") holder.icon_state = "phazon17" else - user.visible_message("[user] disconnects the bluespace crystal from the [holder].", "You disconnect the bluespace crystal from the [holder].") + user.visible_message("[user] disconnects the bluespace crystal from the [holder].", "You disconnect the bluespace crystal from the [holder].") holder.icon_state = "phazon15" if(7) if(diff==FORWARD) - user.visible_message("[user] installs the phase armor layer to the [holder].", "You install the phase armor layer to the [holder].") + user.visible_message("[user] installs the phase armor layer to the [holder].", "You install the phase armor layer to the [holder].") holder.icon_state = "phazon18" else - user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.") + user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.") holder.icon_state = "phazon16" if(6) if(diff==FORWARD) - user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.") + user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.") holder.icon_state = "phazon19" else - user.visible_message("[user] pries the phase armor layer from the [holder].", "You pry the phase armor layer from the [holder].") + user.visible_message("[user] pries the phase armor layer from the [holder].", "You pry the phase armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "phazon17" if(5) if(diff==FORWARD) - user.visible_message("[user] welds the phase armor layer to the [holder].", "You weld the phase armor layer to the [holder].") + user.visible_message("[user] welds the phase armor layer to the [holder].", "You weld the phase armor layer to the [holder].") holder.icon_state = "phazon20" else - user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.") + user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.") holder.icon_state = "phazon18" if(4) if(diff==FORWARD) - user.visible_message("[user] installs Phazon Armor Plates to the [holder].", "You install Phazon Armor Plates to the [holder].") + user.visible_message("[user] installs Phazon Armor Plates to the [holder].", "You install Phazon Armor Plates to the [holder].") qdel(used_atom) holder.icon_state = "phazon21" else - user.visible_message("[user] cuts phase armor layer from the [holder].", "You cut the phase armor layer from the [holder].") + user.visible_message("[user] cuts phase armor layer from the [holder].", "You cut the phase armor layer from the [holder].") holder.icon_state = "phazon19" if(3) if(diff==FORWARD) - user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.") + user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.") holder.icon_state = "phazon22" else - user.visible_message("[user] pries Phazon Armor Plates from the [holder].", "You pry Phazon Armor Plates from the [holder].") + user.visible_message("[user] pries Phazon Armor Plates from the [holder].", "You pry Phazon Armor Plates from the [holder].") new /obj/item/mecha_parts/part/phazon_armor(get_turf(holder)) holder.icon_state = "phazon20" if(2) if(diff==FORWARD) - user.visible_message("[user] welds Phazon Armor Plates to the [holder].", "You weld Phazon Armor Plates to the [holder].") + user.visible_message("[user] welds Phazon Armor Plates to the [holder].", "You weld Phazon Armor Plates to the [holder].") else - user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.") + user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.") holder.icon_state = "phazon21" if(1) if(diff==FORWARD) - user.visible_message("[user] carefully inserts the anomaly core into \the [holder] and secures it.", "You slowly place the anomaly core into its socket and close its chamber.") + user.visible_message("[user] carefully inserts the anomaly core into \the [holder] and secures it.", "You slowly place the anomaly core into its socket and close its chamber.") qdel(used_atom) return 1 @@ -1472,7 +1472,7 @@ ) /datum/construction/mecha/odysseus_chassis/custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder]") + user.visible_message("[user] has connected [used_atom] to the [holder].", "You connect [used_atom] to the [holder].") holder.overlays += used_atom.icon_state+"+o" qdel(used_atom) return 1 @@ -1560,109 +1560,109 @@ //TODO: better messages. switch(index) if(14) - user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") + user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "odysseus1" if(13) if(diff==FORWARD) - user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") + user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "odysseus2" else - user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") + user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "odysseus0" if(12) if(diff==FORWARD) - user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") + user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "odysseus3" else - user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") + user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "odysseus1" if(11) if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") + user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "odysseus4" else - user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") + user.visible_message("[user] removes the wiring from the [holder].", "You remove the wiring from the [holder].") var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "odysseus2" if(10) if(diff==FORWARD) - user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") + user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) holder.icon_state = "odysseus5" else - user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") + user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "odysseus3" if(9) if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "odysseus6" else - user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") + user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/weapon/circuitboard/mecha/odysseus/main(get_turf(holder)) holder.icon_state = "odysseus4" if(8) if(diff==FORWARD) - user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") + user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) holder.icon_state = "odysseus7" else - user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "odysseus5" if(7) if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "odysseus8" else - user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") + user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/weapon/circuitboard/mecha/odysseus/peripherals(get_turf(holder)) holder.icon_state = "odysseus6" if(6) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") holder.icon_state = "odysseus9" else - user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "odysseus7" if(5) if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") + user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") holder.icon_state = "odysseus10" else - user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") + user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "odysseus8" if(4) if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") + user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") holder.icon_state = "odysseus11" else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") holder.icon_state = "odysseus9" if(3) if(diff==FORWARD) - user.visible_message("[user] installs [used_atom] layer to the [holder].", "You install the external reinforced armor layer to the [holder].") + user.visible_message("[user] installs [used_atom] layer to the [holder].", "You install the external reinforced armor layer to the [holder].") holder.icon_state = "odysseus12" else - user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") + user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") holder.icon_state = "odysseus10" if(2) if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") + user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") holder.icon_state = "odysseus13" else var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - user.visible_message("[user] pries [MS] from the [holder].", "You pry [MS] from the [holder].") + user.visible_message("[user] pries [MS] from the [holder].", "You pry [MS] from the [holder].") holder.icon_state = "odysseus11" if(1) if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") + user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") holder.icon_state = "odysseus14" else - user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") holder.icon_state = "odysseus12" return 1 diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index feeb4b6c56e..96504721e0c 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -18,34 +18,34 @@ /obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/weldingtool)) if(salvage_num <= 0) - user << "You don't see anything that can be cut with [I]." + user << "You don't see anything that can be cut with [I]!" return var/obj/item/weapon/weldingtool/WT = I if(welder_salvage && welder_salvage.len && WT.remove_fuel(0, user)) var/type = prob(70) ? pick(welder_salvage) : null if(type) var/N = new type(get_turf(user)) - user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") + user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") if(istype(N, /obj/item/mecha_parts/part)) welder_salvage -= type salvage_num-- else - user << "You failed to salvage anything valuable from [src]." + user << "You fail to salvage anything valuable from [src]!" else return if(istype(I, /obj/item/weapon/wirecutters)) if(salvage_num <= 0) - user << "You don't see anything that can be cut with [I]." + user << "You don't see anything that can be cut with [I]!" return else if(wirecutters_salvage && wirecutters_salvage.len) var/type = prob(70) ? pick(wirecutters_salvage) : null if(type) var/N = new type(get_turf(user)) - user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") + user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") salvage_num-- else - user << "You failed to salvage anything valuable from [src]." + user << "You fail to salvage anything valuable from [src]!" if(istype(I, /obj/item/weapon/crowbar)) if(crowbar_salvage && crowbar_salvage.len) @@ -53,10 +53,10 @@ if(S) S.loc = get_turf(user) crowbar_salvage -= S - user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") + user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") return else - user << "You don't see anything that can be pried with [I]." + user << "You don't see anything that can be pried with [I]!" else ..() diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index f015c1f346a..78fcf6d541a 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -26,6 +26,7 @@ if(ore_box) for(var/obj/item/weapon/ore/ore in get_turf(src)) ore.Move(ore_box) + update_pressure() /obj/mecha/working/ripley/Destroy() while(src.damage_absorption.["brute"] < 0.6) @@ -119,6 +120,9 @@ for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily qdel(B) + var/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/tool/mining_scanner + scanner.attach(src) + /obj/mecha/working/ripley/Exit(atom/movable/O) if(O in cargo) return 0 @@ -148,4 +152,16 @@ output += "" return output +/obj/mecha/working/ripley/proc/update_pressure() + var/turf/T = get_turf(loc) + var/datum/gas_mixture/environment = T.return_air() + var/pressure = environment.return_pressure() + if(pressure < 20) + step_in = 3 + for(var/obj/item/mecha_parts/mecha_equipment/tool/drill/drill in equipment) + drill.equip_cooldown = initial(drill.equip_cooldown)/2 + else + step_in = 5 + for(var/obj/item/mecha_parts/mecha_equipment/tool/drill/drill in equipment) + drill.equip_cooldown = initial(drill.equip_cooldown) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index ffc4db6400c..be8d9fccbc3 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -74,14 +74,14 @@ if(buckle_mob(M)) if(M == user) M.visible_message(\ - "[M.name] buckles themselves to [src].",\ + "[M.name] buckles themselves to [src].",\ "You buckle yourself to [src].",\ - "You hear metal clanking.") + "You hear metal clanking.") else M.visible_message(\ - "[M.name] is buckled to [src] by [user.name]!",\ + "[M.name] is buckled to [src] by [user.name]!",\ "You are buckled to [src] by [user.name]!",\ - "You heat metal clanking.") + "You heat metal clanking.") /obj/proc/user_unbuckle_mob(mob/user) var/mob/living/M = unbuckle_mob() @@ -89,14 +89,14 @@ if(M) if(M != user) M.visible_message(\ - "[M.name] was unbuckled by [user.name]!",\ + "[M.name] was unbuckled by [user.name].",\ "You were unbuckled from [src] by [user.name].",\ - "You hear metal clanking.") + "You hear metal clanking.") else M.visible_message(\ "[M.name] unbuckled themselves!",\ "You unbuckled yourself from [src].",\ - "You hear metal clanking.") + "You hear metal clanking.") add_fingerprint(user) return M diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 1bafea2ff6d..6d62cbeebfb 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -56,6 +56,11 @@ /obj/structure/alien/resin/wall/BlockSuperconductivity() return 1 +/obj/structure/alien/resin/wall/shadowling //For chrysalis + name = "chrysalis wall" + desc = "Some sort of purple substance in an egglike shape. It pulses and throbs from within and seems impenetrable." + health = INFINITY + /obj/structure/alien/resin/membrane name = "resin membrane" desc = "Resin just thin enough to let light pass through." diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 00615da6e0e..2fbe83f9bf5 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -322,7 +322,7 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) if("Yes") if( user.loc != temp_loc || ruined ) return - visible_message("[user] rips [src] in a single, decisive motion!" ) + visible_message("[user] rips [src] in a single, decisive motion!" ) playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) ruined = 1 icon_state = "poster_ripped" @@ -346,11 +346,11 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) var/stuff_on_wall = 0 for(var/obj/O in contents) //Let's see if it already has a poster on it or too much stuff if(istype(O,/obj/structure/sign/poster)) - user << "The wall is far too cluttered to place a poster!" + user << "The wall is far too cluttered to place a poster!" return stuff_on_wall++ if(stuff_on_wall == 3) - user << "The wall is far too cluttered to place a poster!" + user << "The wall is far too cluttered to place a poster!" return user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 0ff875dd2f7..8aca6f11748 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -18,6 +18,9 @@ name = e_name desc = "A [name] drawn in crayon." + if(type == "poseur tag") + gang_name() //Generate gang names so they get removed from the pool + type = pick(gang_name_pool) icon_state = type var/matrix/M = matrix() @@ -25,3 +28,40 @@ src.transform = M color = main + +/obj/effect/decal/cleanable/crayon/gang + layer = 3.6 //Harder to hide + var/gang + +/obj/effect/decal/cleanable/crayon/gang/New(location, var/type, var/e_name = "gang tag", var/rotation = 0) + if(!type) + qdel(src) + + var/area/territory = get_area(location) + var/color + + if(type == "A") + gang = type + color = "#00b4ff" + icon_state = gang_name("A") + ticker.mode.A_territory_new |= list(territory.type = territory.name) + ticker.mode.A_territory_lost -= territory.type + else if(type == "B") + gang = type + color = "#ff3232" + icon_state = gang_name("B") + ticker.mode.B_territory_new |= list(territory.type = territory.name) + ticker.mode.B_territory_lost -= territory.type + + ..(location, color, icon_state, e_name, rotation) + +/obj/effect/decal/cleanable/crayon/gang/Destroy() + var/area/territory = get_area(src) + + if(gang == "A") + ticker.mode.A_territory_new -= territory.type + ticker.mode.A_territory_lost |= list(territory.type = territory.name) + if(gang == "B") + ticker.mode.B_territory_new -= territory.type + ticker.mode.B_territory_lost |= list(territory.type = territory.name) + ..() \ No newline at end of file diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 8bb92d6e51e..a116645b9d5 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -222,14 +222,14 @@ /obj/structure/foamedmetal/attack_hulk(mob/living/carbon/human/user) ..(user, 1) if(prob(75 - metal*25)) - user.visible_message("[user] smashes through the foamed metal.", \ - "You smash through the metal foam wall.") + user.visible_message("[user] smashes through the foamed metal!", \ + "You smash through the metal foam wall!") qdel(src) return 1 /obj/structure/foamedmetal/attack_hand(var/mob/user) - user << "You hit the metal foam but bounce off it." + user << "You hit the metal foam but bounce off it!" /obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user, params) @@ -242,11 +242,11 @@ return if(prob(I.force*20 - metal*25)) - user.visible_message("[user] smashes through the foamed metal.", \ - "You smash through the foamed metal with \the [I].") + user.visible_message("[user] smashes through the foamed metal!", \ + "You smash through the foamed metal with \the [I]!") qdel(src) else - user << "You hit the metal foam to no effect." + user << "You hit the metal foam to no effect!" /obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5) diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm index 0b54d310233..30f2be1dd2d 100644 --- a/code/game/objects/effects/effect_system/effects_other.dm +++ b/code/game/objects/effects/effect_system/effects_other.dm @@ -57,9 +57,11 @@ var/amount // TNT equivalent var/flashing = 0 // does explosion creates flash effect? var/flashing_factor = 0 // factor of how powerful the flash effect relatively to the explosion + var/explosion_message = 1 //whether we show a message to mobs. -/datum/effect/effect/system/reagents_explosion/set_up (amt, loc, flash = 0, flash_fact = 0) +/datum/effect/effect/system/reagents_explosion/set_up (amt, loc, flash = 0, flash_fact = 0, message = 1) amount = amt + explosion_message = message if(istype(loc, /turf/)) location = loc else @@ -71,13 +73,14 @@ return /datum/effect/effect/system/reagents_explosion/start() + if(explosion_message) + location.visible_message("The solution violently explodes!", \ + "You hear an explosion!") if (amount <= 2) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, location) s.start() - location.visible_message("The solution violently explodes!", \ - "You hear an explosion!") for(var/mob/M in viewers(1, location)) if (prob (50 * amount)) M << "The explosion knocks you down." @@ -99,10 +102,7 @@ if (round(amount/3) > 0) light = min (MAX_EX_LIGHT_RANGE, light + round(amount/3)) - if (flash && flashing_factor) + if (flashing && flashing_factor) flash += (round(amount/4) * flashing_factor) - location.visible_message("The solution violently explodes!", \ - "You hear an explosion!") - explosion(location, devastation, heavy, light, flash) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 7d401160b80..e1c0f16074a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -1,16 +1,15 @@ /obj/effect/mine - name = "proximity mine" + name = "dummy mine" desc = "Better stay away from that thing." density = 0 anchored = 1 layer = 3 icon = 'icons/obj/weapons.dmi' icon_state = "uglymine" - var/minepayload = "explosive" var/triggered = 0 -/obj/effect/mine/New() - icon_state = "uglyminearmed" +/obj/effect/mine/proc/mineEffect(mob/victim) + victim << "*click*" /obj/effect/mine/Crossed(AM as mob|obj) if(isanimal(AM)) @@ -24,48 +23,72 @@ if(triggered) return visible_message("[AM] sets off \icon[src] [src]!") - triggermine(AM, minepayload) + triggermine(AM) -/obj/effect/mine/proc/triggermine(mob/victim, var/triggertype) +/obj/effect/mine/proc/triggermine(mob/victim) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - - switch(triggertype) - if("explosive") - explosion(loc, 0, 1, 2, 3) - if("triggerkick") - if(isliving(victim) && victim.client) - victim << "You have been kicked FOR NO REISIN!" - del(victim.client) - if("triggerplasma") - atmos_spawn_air(SPAWN_TOXINS, 360) - if("triggern2o") - atmos_spawn_air(SPAWN_N2O, 360) - if("triggerstun") - if(isliving(victim)) - victim.Weaken(8) - - + mineEffect(victim) triggered = 1 qdel(src) -/obj/effect/mine/plasma - name = "plasma mine" - icon_state = "uglymine" - minepayload = "triggerplasma" -/obj/effect/mine/n2o - name = "\improper N2O mine" - icon_state = "uglymine" - minepayload = "triggern2o" +/obj/effect/mine/explosive + name = "explosive mine" + var/range_devastation = 0 + var/range_heavy = 1 + var/range_light = 2 + var/range_flash = 3 + +/obj/effect/mine/explosive/mineEffect(mob/victim) + explosion(loc, range_devastation, range_heavy, range_light, range_flash) + /obj/effect/mine/stun name = "stun mine" - icon_state = "uglymine" - minepayload = "triggerstun" + var/stun_time = 8 + +/obj/effect/mine/stun/mineEffect(mob/victim) + if(isliving(victim)) + victim.Weaken(stun_time) /obj/effect/mine/kickmine name = "kick mine" - icon_state = "uglymine" - minepayload = "triggerkick" \ No newline at end of file + +/obj/effect/mine/kickmine/mineEffect(mob/victim) + if(isliving(victim) && victim.client) + victim << "You have been kicked FOR NO REISIN!" + del(victim.client) + + +/obj/effect/mine/gas + name = "oxygen mine" + var/gas_amount = 360 + var/gas_type = SPAWN_OXYGEN + +/obj/effect/mine/gas/mineEffect(mob/victim) + atmos_spawn_air(gas_type, gas_amount) + + +/obj/effect/mine/gas/plasma + name = "plasma mine" + gas_type = SPAWN_TOXINS + + +/obj/effect/mine/gas/n2o + name = "\improper N2O mine" + gas_type = SPAWN_N2O + + +/obj/effect/mine/sound + name = "honkblaster 1000" + var/sound = 'sound/items/bikehorn.ogg' + +/obj/effect/mine/sound/mineEffect(mob/victim) + playsound(loc, sound, 100, 1) + + +/obj/effect/mine/sound/bwoink + name = "bwoink mine" + sound = 'sound/effects/adminhelp.ogg' diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index e68ef779d94..b680e468d13 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -141,7 +141,7 @@ var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents) if(prob(50)) visible_message("[src] scrambles into the ventillation ducts!", \ - "You hear something squeezing through the ventilation ducts.") + "You hear something scampering through the ventilation ducts.") spawn(rand(20,60)) loc = exit_vent @@ -154,7 +154,7 @@ return if(prob(50)) - audible_message("You hear something squeezing through the ventilation ducts.") + audible_message("You hear something scampering through the ventilation ducts.") sleep(travel_time) if(!exit_vent || exit_vent.welded) @@ -190,13 +190,35 @@ var/mob/living/simple_animal/hostile/poison/giant_spider/S = new grow_as(src.loc) if(player_spiders) var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET) - var/client/C = null - if(candidates.len) - C = pick(candidates) + shuffle(candidates) + + var/time_passed = world.time + var/list/consenting_candidates = list() + + for(var/candidate in candidates) + + spawn(0) + switch(alert(candidate, "Would you like to play as [S.name]? Please choose quickly!","Confirmation","Yes","No")) + if("Yes") + if((world.time-time_passed)>=50 || !src) + return + consenting_candidates += candidate + + sleep(50) + + if(!src) + return + + if(consenting_candidates.len) + var/client/C = null + C = pick(consenting_candidates) S.key = C.key qdel(src) + + + /obj/effect/spider/cocoon name = "cocoon" desc = "Something wrapped in silky spider web" @@ -211,7 +233,7 @@ var/breakout_time = 2 user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - user << "You struggle against the tight bonds! (This will take about [breakout_time] minutes.)" + user << "You struggle against the tight bonds... (This will take about [breakout_time] minutes.)" visible_message("You see something struggling and writhing in \the [src]!") if(do_after(user,(breakout_time*60*10))) if(!user || user.stat != CONSCIOUS || user.loc != src) @@ -221,7 +243,7 @@ /obj/effect/spider/cocoon/Destroy() - src.visible_message("\The [src] splits open.") + src.visible_message("\The [src] splits open.") for(var/atom/movable/A in contents) A.loc = src.loc ..() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 20706d966fb..dc0c3825375 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -24,6 +24,7 @@ //If this is set, The item will make an action button on the player's HUD when picked up. var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. var/action_button_is_hands_free = 0 //If 1, bypass the restrained, lying, and stunned checks action buttons normally test for + var/datum/action/item_action/action = null //Since any item can now be a piece of clothing, this has to be put here so all items share it. var/flags_inv //This flag is used to determine when items in someone's inventory cover others. IE helmets making it so you can't see glasses, etc. @@ -192,7 +193,7 @@ if(!A.has_fine_manipulation || w_class >= 4) if(src in A.contents) // To stop Aliens having items stuck in their pockets A.unEquip(src) - user << "Your claws aren't capable of such fine manipulation." + user << "Your claws aren't capable of such fine manipulation!" return attack_paw(A) @@ -234,7 +235,7 @@ else if(success) user << "You put some things [S.preposition] [S]." else - user << "You fail to pick anything up with [S]." + user << "You fail to pick anything up with [S]!" else if(S.can_be_inserted(src)) S.handle_item_insertion(src) @@ -301,15 +302,13 @@ usr << "\red You already have something in your hand." */ else - usr << "This mob type can't use this verb." + usr << "This mob type can't use this verb!" //This proc is executed when someone clicks the on-screen UI button. To make the UI button show, set the 'action_button_name'. //The default action is attack_self(). //Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob. /obj/item/proc/ui_action_click() - if(src in usr) - attack_self(usr) - + attack_self(usr) /obj/item/proc/IsShield() return 0 @@ -326,7 +325,7 @@ (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ )) // you can't stab someone in the eyes wearing a mask! - user << "You're going to need to remove that mask/helmet/glasses first." + user << "You're going to need to remove that mask/helmet/glasses first!" return var/mob/living/carbon/monkey/Mo = M @@ -334,11 +333,11 @@ (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ )) // you can't stab someone in the eyes wearing a mask! - user << "You're going to need to remove that mask/helmet/glasses first." + user << "You're going to need to remove that mask/helmet/glasses first!" return if(isalien(M))//Aliens don't have eyes./N slimes also don't have eyes! - user << "You cannot locate any eyes on this creature!" + user << "You cannot locate any eyes on this creature!" return add_logs(user, M, "attacked", object="[src.name]", addition="(INTENT: [uppertext(user.a_intent)])") @@ -441,4 +440,4 @@ //Reset regardless of if we hit a human. throw_speed = initial(throw_speed) //explosions change this. - ..() + ..() \ No newline at end of file diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index af2552dded1..be9e287bb22 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -22,22 +22,22 @@ var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "APC cannot be placed on this spot." + usr << "APC cannot be placed on this spot!" return if (A.requires_power == 0 || istype(A, /area/space)) - usr << "APC cannot be placed in this area." + usr << "APC cannot be placed in this area!" return if (A.get_apc()) - usr << "This area already has APC." + usr << "This area already has APC!" return //only one APC per area for(var/obj/machinery/power/terminal/T in loc) if (T.master) - usr << "There is another network terminal here." + usr << "There is another network terminal here!" return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc) C.amount = 10 - usr << "You cut the cables and disassemble the unused power terminal." + usr << "You cut the cables and disassemble the unused power terminal." qdel(T) new /obj/machinery/power/apc(loc, ndir, 1) qdel(src) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 0c5002a60f5..819bcc01339 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -148,7 +148,6 @@ return var/area/A = new A.name = str - A.tagbase="[A.type]_[md5(str)]" // without this dynamic light system ruin everithing //var/ma //ma = A.master ? "[A.master]" : "(null)" //world << "DEBUG: create_area:
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]" @@ -156,6 +155,7 @@ A.power_light = 0 A.power_environ = 0 A.always_unpowered = 0 + A.valid_territory = 0 move_turfs_to_area(turfs, A) A.SetDynamicLighting() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 87505d593e7..2013d180b59 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -88,23 +88,35 @@ /obj/item/toy/crayon/spraycan icon_state = "spraycan_cap" + item_state = "spraycan" desc = "A metallic container containing tasty paint." var/capped = 1 instant = 1 + edible = 0 validSurfaces = list(/turf/simulated/floor,/turf/simulated/wall) /obj/item/toy/crayon/spraycan/New() ..() - name = "NanoTrasen-brand Rapid Paint Applicator" + if(gang) + name = "Modified Paint Applicator" + else + name = "NanoTrasen-brand Rapid Paint Applicator" update_icon() +/obj/item/toy/crayon/spraycan/examine(mob/user) + ..() + if(uses) + user << "It has [uses] uses left." + else + user << "It is empty." + /obj/item/toy/crayon/spraycan/attack_self(mob/living/user as mob) - var/choice = input(user,"Spraycan options") in list("Toggle Cap","Change Drawing","Change Color") + var/choice = input(user,"Spraycan options") in list("Toggle Cap","Change Drawing","Change Color","Cancel") switch(choice) if("Toggle Cap") user << "You [capped ? "Remove" : "Replace"] the cap of the [src]" capped = capped ? 0 : 1 - icon_state = "spraycan[capped ? "_cap" : ""]" + icon_state = "spraycan[gang ? "_gang" : ""][capped ? "_cap" : ""]" update_icon() if("Change Drawing") ..() @@ -113,20 +125,27 @@ update_icon() /obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user as mob, proximity) + if(!proximity) + return if(capped) return else if(iscarbon(target)) - var/mob/living/carbon/human/C = target - user.visible_message(" [user] sprays [src] into the face of [target]!") - if(C.client) - C.eye_blurry = max(C.eye_blurry, 3) - C.eye_blind = max(C.eye_blind, 1) - C.confused = max(C.confused, 3) - C.Weaken(3) - C.lip_style = "spray_face" - C.update_body() - playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + if(uses) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + var/mob/living/carbon/human/C = target + user.visible_message("[user] sprays [src] into the face of [target]!") + target << "[user] sprays [src] into your face!" + if(C.client) + C.eye_blurry = max(C.eye_blurry, 3) + C.eye_blind = max(C.eye_blind, 1) + if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. + C.confused = max(C.confused, 3) + C.Weaken(3) + C.lip_style = "spray_face" + C.lip_color = colour + C.update_body() + uses = max(0,uses-10) ..() /obj/item/toy/crayon/spraycan/update_icon() @@ -134,3 +153,10 @@ var/image/I = image('icons/obj/crayons.dmi',icon_state = "[capped ? "spraycan_cap_colors" : "spraycan_colors"]") I.color = colour overlays += I + +/obj/item/toy/crayon/spraycan/gang + desc = "A suspicious-looking spraycan modified to use special paint used by gangsters to mark territory." + icon_state = "spraycan_gang_cap" + gang = 1 + uses = 15 + instant = -1 diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm new file mode 100644 index 00000000000..f69e9025637 --- /dev/null +++ b/code/game/objects/items/dehy_carp.dm @@ -0,0 +1,43 @@ +/* + * Dehydrated Carp + * Instant carp, just add water + */ + +// Child of carpplushie because this should do everything the toy does and more +/obj/item/toy/carpplushie/dehy_carp + var/mob/owner = null // Carp doesn't attack owner, set when using in hand + var/owned = 1 // Boolean, no owner to begin with + +// Attack self +/obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user as mob) + src.add_fingerprint(user) // Anyone can add their fingerprints to it with this + if(owned) + user << "[src] stares up at you with friendly eyes." + owner = user + owned = 0 + return ..() + + +/obj/item/toy/carpplushie/dehy_carp/afterattack(obj/O, mob/user,proximity) + if(!proximity) return + if(istype(O,/obj/structure/sink)) + user << "You place [src] under a stream of water..." + user.drop_item() + loc = get_turf(O) + return Swell() + ..() + +/obj/item/toy/carpplushie/dehy_carp/proc/Swell() + desc = "It's growing!" + visible_message("[src] swells up!") + + // Animation + icon = 'icons/mob/animal.dmi' + flick("carp_swell", src) + // Wait for animation to end + sleep(6) + // Make space carp + var/mob/living/simple_animal/hostile/carp/C = new /mob/living/simple_animal/hostile/carp(get_turf(src)) + // Make carp non-hostile to user, yes this means + C.faction |= "\ref[owner]" + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 46d41aff01f..4ef33585421 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -195,6 +195,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/ai icon_state = "NONE" ttone = "data" + fon = 0 mode = 5 noreturn = 1 detonate = 0 @@ -223,6 +224,12 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/New() ..() + if(fon) + if(!isturf(loc)) + loc.AddLuminosity(f_lum) + SetLuminosity(0) + else + SetLuminosity(f_lum) PDAs += src if(default_cartridge) cartridge = new default_cartridge(src) @@ -311,7 +318,7 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "

Engineering Functions

" dat += "
    " dat += "
  • Power Monitor
  • " - if(istype(cartridge.radio, /obj/item/radio/integrated/floorbot)) + if(cartridge.access_floorbots) dat += "
  • Floorbot Access
  • " dat += "
" if (cartridge.access_medical) @@ -319,7 +326,7 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "" else @@ -328,7 +335,7 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "

Security Functions

" dat += "" else dat += "" @@ -343,10 +350,12 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "

Utilities

" dat += "
    " if (cartridge) + if(cartridge.access_multibots) + dat += "
  • Bots Access
  • " if (cartridge.access_janitor) dat += "
  • Custodial Locator
  • " - if(istype(cartridge.radio, /obj/item/radio/integrated/cleanbot)) - dat += "
  • Cleanbot Access
  • " + if(cartridge.access_cleanbots) + dat += "
  • Cleanbot Access
  • " if (istype(cartridge.radio, /obj/item/radio/integrated/signal)) dat += "
  • Signaler System
  • " if (cartridge.access_newscaster) @@ -855,9 +864,9 @@ var/global/list/obj/item/device/pda/PDAs = list() if(id) remove_id() else - usr << "This PDA does not have an ID in it." + usr << "This PDA does not have an ID in it!" else - usr << "You cannot do this while restrained." + usr << "You cannot do that while restrained!" /obj/item/device/pda/verb/verb_remove_id() set category = "Object" @@ -871,9 +880,9 @@ var/global/list/obj/item/device/pda/PDAs = list() if(id) remove_id() else - usr << "This PDA does not have an ID in it." + usr << "This PDA does not have an ID in it!" else - usr << "You cannot do this while restrained." + usr << "You cannot do that while restrained!" /obj/item/device/pda/verb/verb_remove_pen() @@ -895,9 +904,9 @@ var/global/list/obj/item/device/pda/PDAs = list() return O.loc = get_turf(src) else - usr << "This PDA does not have a pen in it." + usr << "This PDA does not have a pen in it!" else - usr << "You cannot do this while restrained." + usr << "You cannot do that while restrained!" /obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use. if(choice == 1) @@ -933,7 +942,7 @@ var/global/list/obj/item/device/pda/PDAs = list() else if(istype(C, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/idcard = C if(!idcard.registered_name) - user << "\The [src] rejects the ID." + user << "\The [src] rejects the ID!" return if(!owner) owner = idcard.registered_name @@ -958,7 +967,7 @@ var/global/list/obj/item/device/pda/PDAs = list() else if(istype(C, /obj/item/weapon/pen)) var/obj/item/weapon/pen/O = locate() in src if(O) - user << "There is already a pen in \the [src]." + user << "There is already a pen in \the [src]!" else user.drop_item() C.loc = src @@ -1021,7 +1030,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) if (!A:info) - user << "Unable to scan. Paper is blank." + user << "Unable to scan! Paper is blank." return notehtml = A:info note = replacetext(notehtml, "
    ", "\[br\]") diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 9f9b4164c3e..12cf2d1f3bb 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -23,6 +23,11 @@ var/access_status_display = 0 var/access_quartermaster = 0 var/access_hydroponics = 0 + var/access_secbots = 0 + var/access_medbots = 0 + var/access_floorbots = 0 + var/access_cleanbots = 0 + var/access_multibots = 0 var/mode = null var/menu var/datum/data/record/active1 = null //General @@ -39,6 +44,7 @@ name = "\improper Power-ON cartridge" icon_state = "cart-e" access_engine = 1 + access_floorbots = 1 /obj/item/weapon/cartridge/engineering/New() ..() @@ -48,6 +54,7 @@ name = "\improper BreatheDeep cartridge" icon_state = "cart-a" access_atmos = 1 + access_floorbots = 1 /obj/item/weapon/cartridge/atmos/New() ..() @@ -57,6 +64,7 @@ name = "\improper Med-U cartridge" icon_state = "cart-m" access_medical = 1 + access_medbots = 1 /obj/item/weapon/cartridge/medical/New() ..() @@ -66,6 +74,7 @@ name = "\improper ChemWhiz cartridge" icon_state = "cart-chem" access_reagent_scanner = 1 + access_medbots = 1 /obj/item/weapon/cartridge/chemistry/New() ..() @@ -75,6 +84,7 @@ name = "\improper R.O.B.U.S.T. cartridge" icon_state = "cart-s" access_security = 1 + access_secbots = 1 /obj/item/weapon/cartridge/security/New() ..() @@ -86,6 +96,7 @@ access_security = 1 access_medical = 1 access_manifest = 1 + access_secbots = 1 /obj/item/weapon/cartridge/detective/New() ..() @@ -96,6 +107,7 @@ desc = "The ultimate in clean-room design." icon_state = "cart-j" access_janitor = 1 + access_cleanbots = 1 /obj/item/weapon/cartridge/janitor/New() ..() @@ -171,6 +183,7 @@ access_quartermaster = 1 access_janitor = 1 access_security = 1 + access_newscaster = 1 /obj/item/weapon/cartridge/hop/New() ..() @@ -182,6 +195,7 @@ access_manifest = 1 access_status_display = 1 access_security = 1 + access_medbots = 1 /obj/item/weapon/cartridge/hos/New() ..() @@ -194,6 +208,7 @@ access_status_display = 1 access_engine = 1 access_atmos = 1 + access_floorbots = 1 /obj/item/weapon/cartridge/ce/New() ..() @@ -206,6 +221,7 @@ access_status_display = 1 access_reagent_scanner = 1 access_medical = 1 + access_medbots = 1 /obj/item/weapon/cartridge/cmo/New() ..() @@ -225,7 +241,7 @@ /obj/item/weapon/cartridge/captain name = "\improper Value-PAK cartridge" - desc = "Now with 200% more value!" + desc = "Now with 250% more value!" icon_state = "cart-c" access_manifest = 1 access_engine = 1 @@ -234,10 +250,12 @@ access_reagent_scanner = 1 access_status_display = 1 access_atmos = 1 + access_newscaster = 1 + access_multibots = 1 /obj/item/weapon/cartridge/captain/New() ..() - radio = new /obj/item/radio/integrated/beepsky(src) + radio = new /obj/item/radio/integrated/multi(src) /obj/item/weapon/cartridge/syndicate name = "\improper Detomatix cartridge" @@ -346,7 +364,7 @@ return menu -/obj/item/weapon/cartridge/proc/generate_menu() +/obj/item/weapon/cartridge/proc/generate_menu(mob/user) switch(mode) if(40) //signaller menu = "

    Remote Signaling System

    " @@ -689,7 +707,7 @@ Code: menu += "

    Located Cleanbots:

    " ldat = null - for (var/obj/machinery/bot/cleanbot/B in world) + for (var/obj/machinery/bot/cleanbot/B in SSbot.processing) var/turf/bl = get_turf(B) if(bl) @@ -732,10 +750,23 @@ Code: if(!current) menu += "
    ERROR : NO CHANNEL FOUND
    " return + var/i = 1 for(var/datum/feed_message/msg in current.messages) menu +="-[msg.body]
    \[Story by [msg.author]\]
    " + menu +="[msg.comments.len] comment[msg.comments.len > 1 ? "s" : ""]
    " + if(msg.img) + user << browse_rsc(msg.img, "tmp_photo[i].png") + menu +="
    " + i++ + for(var/datum/feed_comment/comment in msg.comments) + menu +="[comment.body]
    [comment.author] [comment.time_stamp]
    " menu += "
    Post Message" + if (54) // Beepsky, Medibot, Floorbot, and Cleanbot access + menu = "

    Multi-Bot Interlink

    " + var/obj/item/radio/integrated/multi/SC = radio + bot_control(SC) + /obj/item/weapon/cartridge/Topic(href, href_list) ..() @@ -825,5 +856,5 @@ Code: - generate_menu() + generate_menu(usr) print_to_host(menu) diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 27e2b1613af..368bacc2bd1 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -8,7 +8,6 @@ var/obj/machinery/bot/active // the active bot; if null, show bot list var/list/botstatus // the status signal sent by the bot var/bot_type //The type of bot it is. - var/bot_filter //Determines which radio filter to use. var/control_freq = 1447 @@ -19,9 +18,8 @@ ..() if (istype(loc.loc, /obj/item/device/pda)) hostpda = loc.loc - if (bot_filter) - spawn(5) - add_to_radio(bot_filter) + spawn(5) + add_to_radio() /obj/item/radio/integrated/Destroy() if(radio_controller) @@ -30,7 +28,6 @@ /obj/item/radio/integrated/proc/post_signal(var/freq, var/key, var/value, var/key2, var/value2, var/key3, var/value3,var/key4, var/value4, s_filter) - //world << "Post: [freq]: [key]=[value], [key2]=[value2]" var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) if(!frequency) @@ -63,13 +60,14 @@ /obj/item/radio/integrated/receive_signal(datum/signal/signal) /*var/obj/item/device/pda/P = src.loc - world << "recvd:[P] : [signal.source]" for(var/d in signal.data) world << "- [d] = [signal.data[d]]" */ + if(signal.data["sect"] != ZLEVEL_STATION) //Only detect bots on the station! (Getting the current Z-level is too costly) + return - if (signal.data["type"] == bot_type) + if (signal.data["type"] & bot_type) if(!botlist) botlist = new() @@ -88,44 +86,43 @@ if("control") active = locate(href_list["bot"]) - post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter) + post_signal(control_freq, "command", "bot_status", "active", active) if("scanbots") // find all bots botlist = null - post_signal(control_freq, "command", "bot_status", s_filter = bot_filter) + post_signal(control_freq, "command", "bot_status") if("botlist") active = null if("stop", "go") - post_signal(control_freq, "command", href_list["op"], "active", active, s_filter = bot_filter) - post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter) + post_signal(control_freq, "command", href_list["op"], "active", active) + post_signal(control_freq, "command", "bot_status", "active", active) if("summon") - post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , "useraccess", PDA.GetAccess(), s_filter = bot_filter) - post_signal(control_freq, "command", "bot_status", "active", active, s_filter = bot_filter) + post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , "useraccess", PDA.GetAccess()) + post_signal(control_freq, "command", "bot_status", "active", active) PDA.cartridge.unlock() -/obj/item/radio/integrated/proc/add_to_radio(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots. +/obj/item/radio/integrated/proc/add_to_radio() if(radio_controller) - radio_controller.add_object(src, control_freq, filter = bot_filter) + radio_controller.add_object(src, control_freq) /obj/item/radio/integrated/beepsky - bot_filter = RADIO_SECBOT bot_type = SEC_BOT /obj/item/radio/integrated/medbot - bot_filter = RADIO_MEDBOT bot_type = MED_BOT /obj/item/radio/integrated/floorbot - bot_filter = RADIO_FLOORBOT bot_type = FLOOR_BOT /obj/item/radio/integrated/cleanbot - bot_filter = RADIO_CLEANBOT bot_type = CLEAN_BOT +/obj/item/radio/integrated/multi + bot_type = SEC_BOT|CLEAN_BOT|MED_BOT|FLOOR_BOT + /obj/item/radio/integrated/mule //var/list/botlist = null // list of bots @@ -141,7 +138,7 @@ ..() spawn(5) if(radio_controller) - radio_controller.add_object(src, control_freq, filter = RADIO_MULEBOT) + radio_controller.add_object(src, control_freq) radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS) spawn(10) post_signal(beacon_freq, "findbeacon", "delivery", s_filter = RADIO_NAVBEACONS) @@ -203,28 +200,28 @@ active = null if("unload") - post_signal(control_freq, cmd, "unload", s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, "unload") if("setdest") if(beacons) var/dest = input("Select Bot Destination", "Mulebot [active.suffix] Interlink", active.destination) as null|anything in beacons if(dest) - post_signal(control_freq, cmd, "target", "destination", dest, s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, "target", "destination", dest) if("retoff") - post_signal(control_freq, cmd, "autoret", "value", 0, s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, "autoret", "value", 0) if("reton") - post_signal(control_freq, cmd, "autoret", "value", 1, s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, "autoret", "value", 1) if("pickoff") - post_signal(control_freq, cmd, "autopick", "value", 0, s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, "autopick", "value", 0) if("pickon") - post_signal(control_freq, cmd, "autopick", "value", 1, s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, "autopick", "value", 1) if("stop", "go", "home") - post_signal(control_freq, cmd, href_list["op"], s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, href_list["op"]) - post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT) + post_signal(control_freq, cmd, "bot_status") PDA.cartridge.unlock() diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 6d5c687803b..64c7c3d270f 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -249,11 +249,11 @@ var/obj/machinery/camera/C = locate(href_list["view"]) if(istype(C)) if(!C.can_use()) - usr << "Something's wrong with that camera. You can't get a feed." + usr << "Something's wrong with that camera! You can't get a feed." return var/turf/T = get_turf(loc) if(!T || C.z != T.z) - usr << "You can't get a signal." + usr << "You can't get a signal!" return current = C spawn(6) @@ -311,7 +311,7 @@ /obj/item/device/camera_bug/attackby(var/obj/item/W as obj,var/mob/living/user as mob, params) if(istype(W,/obj/item/weapon/screwdriver) && expansion) expansion.loc = get_turf(loc) - user << "You unscrew [expansion]." + user << "You unscrew [expansion]." user.put_in_inactive_hand(expansion) expansion = null bugtype = VANILLA_BUG @@ -352,7 +352,7 @@ user.drop_item() W.loc = src expansion = W - user << "You add [W] to [src]." + user << "You add [W] to [src]." get_cameras() // the tracking code will want to know the new camera list if(bugtype in list(UNIVERSAL_BUG,NETWORK_BUG,ADMIN_BUG)) skip_bugcheck = 1 diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 3e9018cb1bb..8901d2dd0ad 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -25,7 +25,7 @@ /obj/item/device/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something. broken = 1 icon_state = "[initial(icon_state)]burnt" - visible_message("The [src.name] burns out!") + visible_message("The [src.name] burns out!") /obj/item/device/flash/proc/flash_recharge(var/mob/user) @@ -66,12 +66,16 @@ M.confused += power terrible_conversion_proc(M, user) M.Stun(1) - user.visible_message("[user] blinds [M] with the flash!") + visible_message("[user] blinds [M] with the flash!") + user << "You blind [M] with the flash!" + M << "[user] blinds you with the flash!" if(M.weakeyes) M.Stun(2) - M.visible_message("[M] gasps and shields their eyes!") + M.visible_message("[M] gasps and shields their eyes!", "You gasp and shields your eyes!") else - user.visible_message("[user] fails to blind [M] with the flash!") + visible_message("[user] fails to blind [M] with the flash!") + user << "You fail to blind [M] with the flash!" + M << "[user] fails to blind you with the flash!" else if(M.flash_eyes()) M.confused += power @@ -88,16 +92,16 @@ add_logs(user, M, "flashed", object="[src.name]") flick("e_flash", M.flash) M.Weaken(rand(5,10)) - user.visible_message("[user] overloads [M]'s sensors with the flash!") + user.visible_message("[user] overloads [M]'s sensors with the flash!", "You overload [M]'s sensors with the flash!") return 1 - user.visible_message("[user] fails to blind [M] with the flash!") + user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!") /obj/item/device/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) if(!try_use_flash(user)) return 0 - user.visible_message("[user]'s flash emits a blinding light!") + user.visible_message("[user]'s flash emits a blinding light!", "Your flash emits a blinding light!") for(var/mob/living/carbon/M in oviewers(3, null)) flash_carbon(M, user, 3, 0) @@ -113,7 +117,7 @@ /obj/item/device/flash/proc/terrible_conversion_proc(var/mob/M, var/mob/user) if(ishuman(M) && ishuman(user) && M.stat != DEAD) - if(user.mind && ((user.mind in ticker.mode.head_revolutionaries) || (user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.B_bosses))) + if(user.mind && (user.mind in ticker.mode.head_revolutionaries)) if(M.client) if(M.stat == CONSCIOUS) M.mind_initialize() //give them a mind datum if they don't have one. @@ -122,12 +126,6 @@ if(user.mind in ticker.mode.head_revolutionaries) if(!ticker.mode.add_revolutionary(M.mind)) resisted = 1 - if(user.mind in ticker.mode.A_bosses) - if(!ticker.mode.add_gangster(M.mind,"A")) - resisted = 1 - if(user.mind in ticker.mode.B_bosses) - if(!ticker.mode.add_gangster(M.mind,"B")) - resisted = 1 else resisted = 1 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 14409f8c738..5e8555d13ad 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -38,7 +38,7 @@ /obj/item/device/flashlight/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. + user << "You cannot turn the light on while in this [user.loc]!" //To prevent some lighting anomalities. return 0 on = !on update_brightness(user) @@ -53,7 +53,7 @@ return ..() //just hit them in the head if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return var/mob/living/carbon/human/H = M //mob has protective eyewear @@ -64,21 +64,22 @@ if(M == user) //they're using it on themselves if(!M.eye_blind) flick("flash", M.flash) - M.visible_message("[M] directs [src] to \his eyes.", \ + M.visible_message("[M] directs [src] to \his eyes.", \ "You wave the light in front of your eyes! Trippy!") else - M.visible_message("[M] directs [src] to \his eyes.", \ + M.visible_message("[M] directs [src] to \his eyes.", \ "You wave the light in front of your eyes.") return - user.visible_message("[user] directs [src] to [M]'s eyes.", \ - "You direct [src] to [M]'s eyes.") + user.visible_message("[user] directs [src] to [M]'s eyes.", \ + "You direct [src] to [M]'s eyes.") + M << "[user] directs [src] to your eyes." if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) //robots and aliens are unaffected if(M.stat == DEAD || M.disabilities & BLIND) //mob is dead or fully blind - user << "[M] pupils does not react to the light!" + user << "[M] pupils don't react to the light!" else if(M.dna.check_mutation(XRAY)) //mob has X-RAY vision - user << "[M] pupils give an eerie glow!" + user << "[M] pupils give an eerie glow!" else //they're okay! if(!M.eye_blind) flick("flash", M.flash) //flash the affected mob @@ -111,7 +112,7 @@ /obj/item/device/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag) if(!proximity_flag) if(holo_cooldown) - user << "[src] is not ready yet." + user << "[src] is not ready yet!" return var/T = get_turf(target) if(locate(/mob/living) in T) @@ -237,7 +238,7 @@ obj/item/device/flashlight/lamp/bananalamp // Usual checks if(!fuel) - user << "It's out of fuel." + user << "It's out of fuel!" return if(on) return diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm new file mode 100644 index 00000000000..6ecc1a86125 --- /dev/null +++ b/code/game/objects/items/devices/instruments.dm @@ -0,0 +1,57 @@ +//copy pasta of the space piano, don't hurt me -Pete +/obj/item/device/instrument + name = "generic instrument" + var/datum/song/handheld/song + var/instrumentId = "generic" + var/instrumentExt = "ogg" + +/obj/item/device/instrument/New() + song = new(instrumentId, src) + song.instrumentExt = instrumentExt + +/obj/item/device/instrument/Destroy() + qdel(song) + song = null + ..() + +/obj/item/device/instrument/initialize() + song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded + ..() + +/obj/item/device/instrument/attack_self(mob/user as mob) + if(!user.IsAdvancedToolUser()) + user << "You don't have the dexterity to do this!" + return 1 + interact(user) + +/obj/item/device/instrument/interact(mob/user as mob) + if(!user) + return + + if(!isliving(user) || user.stat || user.restrained() || user.lying) + return + + user.set_machine(src) + song.interact(user) + +/obj/item/device/instrument/violin + name = "space violin" + desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" + icon = 'icons/obj/musician.dmi' + icon_state = "violin" + item_state = "violin" + force = 10 + hitsound = "swing_hit" + instrumentId = "violin" + +/obj/item/device/instrument/guitar + name = "guitar" + desc = "It's made of wood and has bronze strings." + icon = 'icons/obj/musician.dmi' + icon_state = "guitar" + item_state = "guitar" + force = 10 + attack_verb = list("played metal on", "serenaded", "crashed", "smashed") + hitsound = "swing_hit" + instrumentId = "guitar" + diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index d773852de9b..c66a93aa4ad 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -112,7 +112,7 @@ if(C.weakeyes) C.Stun(1) else - outmsg = "You fail to blind [C] by shining [src] at their eyes." + outmsg = "You fail to blind [C] by shining [src] at their eyes!" //robots and AI else if(issilicon(target)) @@ -121,11 +121,11 @@ if(prob(effectchance * diode.rating)) flick("e_flash", S.flash) S.Weaken(rand(5,10)) - S << "Your sensors were overloaded by a laser!" + S << "Your sensors were overloaded by a laser!" outmsg = "You overload [S] by shining [src] at their sensors." add_logs(user, S, "shone in the sensors", object="laser pointer") else - outmsg = "You fail to overload [S] by shining [src] at their sensors." + outmsg = "You fail to overload [S] by shining [src] at their sensors!" //cameras else if(istype(target, /obj/machinery/camera)) @@ -135,7 +135,7 @@ outmsg = "You hit the lens of [C] with [src], temporarily disabling the camera!" add_logs(user, C, "EMPed", object="laser pointer") else - outmsg = "You missed the lens of [C] with [src]." + outmsg = "You miss the lens of [C] with [src]!" //laser pointer image icon_state = "pointer_[pointer_icon_state]" @@ -158,7 +158,7 @@ recharging = 1 SSobj.processing |= src if(energy <= 0) - user << "You've overused the battery of [src], now it needs time to recharge!" + user << "The [src]'s battery is overused, it needs time to recharge!" recharge_locked = 1 flick_overlay(I, showto, 10) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index d4f37fa97e5..4580e823eba 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -82,19 +82,19 @@ user << "You insert a piece of glass into the [src.name]. You have [uses] lights remaining." return else - user << "You need one sheet of glass to replace lights." + user << "You need one sheet of glass to replace lights!" if(istype(W, /obj/item/weapon/light)) var/obj/item/weapon/light/L = W if(L.status == 0) // LIGHT OKAY if(uses < max_uses) AddUses(1) - user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining." + user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining." user.drop_item() qdel(L) return else - user << "You need a working light." + user << "You need a working light!" return /obj/item/device/lightreplacer/emag_act() @@ -170,7 +170,7 @@ U << failmsg return else - U << "There is a working [target.fitting] already inserted." + U << "There is a working [target.fitting] already inserted!" return /obj/item/device/lightreplacer/proc/Emag() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 4f2f912edc8..3b307fc00cf 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -32,18 +32,18 @@ message = capitalize(message) if(!user.can_speak(message)) - user << "You find yourself unable to speak at all." + user << "You find yourself unable to speak at all!" return if ((src.loc == user && user.stat == 0)) if(emagged) if(insults) - user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"", null, 1) // 2 stands for hearable message + user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"") insults-- else user << "*BZZZZzzzzzt*" else - user.audible_message("[user] broadcasts, \"[message]\"", null, 1) // 2 stands for hearable message + user.audible_message("[user] broadcasts, \"[message]\"") playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1) spamcheck = world.time + 50 diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 9d656406bbf..f827375582a 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -69,7 +69,7 @@ if(pai.master_dna) return if(!istype(usr, /mob/living/carbon)) - usr << "You don't have any DNA, or your DNA is incompatible with this device." + usr << "You don't have any DNA, or your DNA is incompatible with this device!" else var/mob/living/carbon/M = usr pai.master = M.real_name diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm new file mode 100644 index 00000000000..cbf2bb7d193 --- /dev/null +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -0,0 +1,101 @@ +/obj/item/device/pizza_bomb + name = "pizza box" + desc = "A box suited for pizzas." + icon = 'icons/obj/food/containers.dmi' + icon_state = "pizzabox1" + var/timer = 10 //Adjustable timer + var/timer_set = 0 + var/primed = 0 + var/disarmed = 0 + var/wires = list("orange", "green", "blue", "yellow", "aqua", "purple") + var/correct_wire + var/armer //Used for admin purposes + +/obj/item/device/pizza_bomb/attack_self(mob/user) + if(disarmed) + user << "\The [src] is disarmed." + return + if(!timer_set) + name = "pizza bomb" + desc = "It seems inactive." + icon_state = "pizzabox_bomb" + timer_set = 1 + timer = (input(user, "Set a timer, from one second to ten seconds.", "Timer", "[timer]") as num) * 10 + if(!user.canUseTopic(src)) + timer_set = 0 + name = "pizza box" + desc = "A box suited for pizzas." + icon_state = "pizzabox1" + return + timer = Clamp(timer, 10, 100) + icon_state = "pizzabox1" + user << "You set the timer to [timer / 10] before activating the payload and closing \the [src]." + message_admins("[key_name(usr)]? has set a timer on a pizza bomb to [timer/10] seconds at (JMP).") + log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer/10] seconds ([loc.x],[loc.y],[loc.z]).") + armer = usr + name = "pizza box" + desc = "A box suited for pizzas." + return + if(!primed) + name = "pizza bomb" + desc = "OH GOD THAT'S NOT A PIZZA" + icon_state = "pizzabox_bomb" + audible_message("\icon[src] *beep* *beep*") + user << "That's no pizza! That's a bomb!" + message_admins("[key_name(usr)]? has triggered a pizza bomb armed by [armer] at (JMP).") + log_game("[key_name(usr)] has triggered a pizza bomb armed by [armer] ([loc.x],[loc.y],[loc.z]).") + primed = 1 + sleep(timer) + return go_boom() + +/obj/item/device/pizza_bomb/proc/go_boom() + if(disarmed) + visible_message("\icon[src] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!") + return + src.audible_message("\icon[src] [src] beeps, \"Enjoy the pizza!\"") + src.visible_message("\The [src] violently explodes!") + explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb + qdel(src) + +/obj/item/device/pizza_bomb/attackby(var/obj/item/I, var/mob/user, params) + if(istype(I, /obj/item/weapon/wirecutters) && primed) + user << "Oh God, what wire do you cut?!" + var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires + if(!user.canUseTopic(src)) + return + playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1) + user.visible_message("[user] cuts the [chosen_wire] wire!", "You cut the [chosen_wire] wire!") + sleep(5) + if(chosen_wire == correct_wire) + src.audible_message("\icon[src] \The [src] suddenly stops beeping and seems lifeless.") + user << "You did it!" + icon_state = "pizzabox_bomb_[correct_wire]" + name = "pizza bomb" + desc = "A devious contraption, made of a small explosive payload hooked up to pressure-sensitive wires. It's disarmed." + disarmed = 1 + primed = 0 + return + else + user << "WRONG WIRE!" + go_boom() + return + if(istype(I, /obj/item/weapon/wirecutters) && disarmed) + if(!in_range(user, src)) + user << "You can't see the box well enough to cut the wires out!" + return + user.visible_message("[user] starts removing the payload and wires from \the [src].", "You start removing the payload and wires from \the [src]...") + if(do_after(user, 40)) + playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1) + user.unEquip(src) + user.visible_message("[user] removes the insides of \the [src]!", "You remove the insides of \the [src].") + var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(src.loc) + C.amount = 3 + new /obj/item/weapon/bombcore/miniature(src.loc) + new /obj/item/pizzabox(src.loc) + qdel(src) + return + ..() + +/obj/item/device/pizza_bomb/New() + ..() + correct_wire = pick(wires) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 746dfaea182..970e7550699 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -61,21 +61,21 @@ if(isturf(T) && !T.intact) attached = locate() in T if(!attached) - user << "No exposed cable here to attach to." + user << "No exposed cable here to attach to!" else set_mode(CLAMPED_OFF) user.visible_message( \ "[user] attaches \the [src] to the cable.", \ - "You attach \the [src] to the cable.", - "You hear some wires being connected to something.") + "You attach \the [src] to the cable.", + "You hear some wires being connected to something.") else - user << "Device must be placed over an exposed cable to attach to it." + user << "Device must be placed over an exposed cable to attach to it!" else set_mode(DISCONNECTED) user.visible_message( \ "[user] detaches \the [src] from the cable.", \ - "You detach \the [src] from the cable.", - "You hear some wires being disconnected from something.") + "You detach \the [src] from the cable.", + "You hear some wires being disconnected from something.") else ..() @@ -93,8 +93,8 @@ if(CLAMPED_OFF) user.visible_message( \ "[user] activates \the [src]!", \ - "You activate \the [src]!", - "You hear a click.") + "You activate \the [src].", + "You hear a click.") message_admins("Power sink activated by [key_name(user, user.client)](?) at ([x],[y],[z] - JMP)") log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") set_mode(OPERATING) @@ -102,8 +102,8 @@ if(OPERATING) user.visible_message( \ "[user] deactivates \the [src]!", \ - "You deactivate \the [src]!", - "You hear a click.") + "You deactivate \the [src].", + "You hear a click.") set_mode(CLAMPED_OFF) /obj/item/device/powersink/process() diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 06922665771..3af3ab07841 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -27,7 +27,7 @@ if(iscarbon(user)) var/mob/living/carbon/C = user if(src == C.back) - user << "You need help taking this off!" + user << "You need help taking this off!" return ..() @@ -38,7 +38,7 @@ A.icon = 'icons/obj/assemblies.dmi' if(!user.unEquip(W)) - user << "\the [W] is stuck to your hand, you cannot attach it to \the [src]!" + user << "\the [W] is stuck to your hand, you cannot attach it to \the [src]!" return W.loc = A W.master = A diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index ceec8b34cf9..55fa4cd6179 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -8,6 +8,7 @@ var/translate_binary = 0 var/translate_hive = 0 var/syndie = 0 + var/centcom = 0 var/list/channels = list() @@ -118,5 +119,12 @@ icon_state = "srv_cypherkey" channels = list("Service" = 1) +/obj/item/device/encryptionkey/headset_cent + name = "centcom radio encryption key" + desc = "An encryption key for a radio headset. To access the centcom channel, use :y." + icon_state = "cent_cypherkey" + centcom = 1 + channels = list("Centcom" = 1) + /obj/item/device/encryptionkey/ai //ported from NT, this goes 'inside' the AI. channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index c054a5de007..92ad5697dc7 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -188,17 +188,18 @@ /obj/item/device/radio/headset/headset_cent name = "\improper Centcom headset" - desc = "A headset used by the upper echelons of Nanotrasen. \nTo access the command channel, use :c." + desc = "A headset used by the upper echelons of Nanotrasen. \nTo access the centcom channel, use :y." icon_state = "cent_headset" item_state = "headset" keyslot = new /obj/item/device/encryptionkey/headset_com + keyslot2 = new /obj/item/device/encryptionkey/headset_cent /obj/item/device/radio/headset/headset_cent/commander keyslot = new /obj/item/device/encryptionkey/heads/captain /obj/item/device/radio/headset/headset_cent/alt name = "\improper Centcom bowman headset" - desc = "A headset especially for emergency response personnel. Protects ears from flashbangs." + desc = "A headset especially for emergency response personnel. Protects ears from flashbangs. \nTo access the centcom channel, use :y." flags = EARBANGPROTECT icon_state = "cent_headset_alt" item_state = "cent_headset_alt" @@ -241,14 +242,14 @@ keyslot2 = null recalculateChannels() - user << "You pop out the encryption keys in the headset!" + user << "You pop out the encryption keys in the headset." else - user << "This headset doesn't have any unique encryption keys! How useless..." + user << "This headset doesn't have any unique encryption keys! How useless..." if(istype(W, /obj/item/device/encryptionkey/)) if(keyslot && keyslot2) - user << "The headset can't hold another key!" + user << "The headset can't hold another key!" return if(!keyslot) @@ -285,6 +286,9 @@ if(keyslot2.syndie) src.syndie = 1 + if (keyslot2.centcom) + centcom = 1 + for(var/ch_name in channels) secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name]) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 816c0f37b0a..978b09390b0 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -23,7 +23,9 @@ var/obj/item/device/encryptionkey/keyslot //To allow the radio to accept encryption keys. var/subspace_transmission = 0 var/syndie = 0//Holder to see if it's a syndicate encrpyed radio + var/centcom = 0//Bleh, more dirty booleans var/maxf = 1499 + var/freqlock = 0 //Frequency lock to stop the user from untuning specialist radios. var/emped = 0 //Highjacked to track the number of consecutive EMPs on the radio, allowing consecutive EMP's to stack properly. // "Example" = FREQ_LISTENING|FREQ_BROADCASTING flags = CONDUCT | HEAR @@ -58,6 +60,7 @@ translate_binary = 0 translate_hive = 0 syndie = 0 + centcom = 0 if(keyslot) for(var/ch_name in keyslot.channels) @@ -75,6 +78,9 @@ if(keyslot.syndie) syndie = 1 + if (keyslot.centcom) + centcom = 1 + for(var/ch_name in channels) secure_radio_connections[ch_name] = add_radio(src, radiochannels[ch_name]) @@ -132,14 +138,17 @@ "} else //Headsets dont get a mic button, speaker controls both dat += "Power: [listening ? "Engaged" : "Disengaged"]
    " - dat += {" - Frequency: - - - - - [format_frequency(frequency)] - + - +
    - "} + if (freqlock) + dat += "Frequency: LOCKED
    " + else + dat += {" + Frequency: + - + - + [format_frequency(frequency)] + + + +
    + "} for (var/ch_name in channels) dat+=text_sec_channel(ch_name, channels[ch_name]) @@ -198,14 +207,15 @@ return else if (href_list["freq"]) - var/new_frequency = (frequency + text2num(href_list["freq"])) - if (!freerange || (frequency < 1200 || frequency > 1600)) - new_frequency = sanitize_frequency(new_frequency, maxf) - set_frequency(new_frequency) - if(hidden_uplink) - if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) - usr << browse(null, "window=radio") - return + if (!freqlock) + var/new_frequency = (frequency + text2num(href_list["freq"])) + if (!freerange || (frequency < 1200 || frequency > 1600)) + new_frequency = sanitize_frequency(new_frequency, maxf) + set_frequency(new_frequency) + if(hidden_uplink) + if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) + usr << browse(null, "window=radio") + return else if (href_list["talk"]) broadcasting = text2num(href_list["talk"]) @@ -273,6 +283,7 @@ freq = frequency channel = null + var/freqnum = text2num(freq) //Why should we call text2num three times when we can just do it here? var/turf/position = get_turf(src) //#### Tagging the signal with all appropriate identity values ####// @@ -328,6 +339,43 @@ else jobname = "Unknown" + /* ###### Centcom channel bypasses all comms relays. ###### */ + + if (freqnum == CENTCOM_FREQ && centcom) + var/datum/signal/signal = new + signal.transmission_method = 2 + signal.data = list( + "mob" = M, // store a reference to the mob + "mobtype" = M.type, // the mob's type + "realname" = real_name, // the mob's real name + "name" = voice, // the mob's voice name + "job" = jobname, // the mob's job + "key" = mobkey, // the mob's key + "vmask" = voicemask, // 1 if the mob is using a voice gas mas + + "compression" = 0, // uncompressed radio signal + "message" = message, // the actual sent message + "radio" = src, // stores the radio used for transmission + "slow" = 0, + "traffic" = 0, + "type" = 0, + "server" = null, + "reject" = 0, + "level" = 0, + "languages" = languages, + "spans" = spans, + "verb_say" = M.verb_say, + "verb_ask" = M.verb_ask, + "verb_exclaim" = M.verb_exclaim, + "verb_yell" = M.verb_yell + ) + signal.frequency = freqnum // Quick frequency set + Broadcast_Message(M, voicemask, + src, message, voice, jobname, real_name, + 4, signal.data["compression"], list(position.z, 0), freq, spans, + verb_say, verb_ask, verb_exclaim, verb_yell) + return + /* ###### Radio headsets can only broadcast through subspace ###### */ if(subspace_transmission) @@ -416,7 +464,7 @@ "verb_exclaim" = M.verb_exclaim, "verb_yell" = M.verb_yell ) - signal.frequency = text2num(freq) // Quick frequency set + signal.frequency = freqnum // Quick frequency set for(var/obj/machinery/telecomms/receiver/R in telecomms_list) R.receive_signal(signal) @@ -469,6 +517,9 @@ if(freq == SYND_FREQ) if(!(src.syndie)) //Checks to see if it's allowed on that frequency, based on the encryption keys return -1 + if(freq == CENTCOM_FREQ) + if (!(src.centcom)) + return -1 if (!on) return -1 if (!freq) //received on main frequency @@ -570,14 +621,14 @@ keyslot = null recalculateChannels() - user << "You pop out the encryption key in the radio!" + user << "You pop out the encryption key in the radio." else - user << "This radio doesn't have any encryption keys!" + user << "This radio doesn't have any encryption keys!" if(istype(W, /obj/item/device/encryptionkey/)) if(keyslot) - user << "The radio can't hold another key!" + user << "The radio can't hold another key!" return if(!keyslot) diff --git a/code/game/objects/items/devices/recaller.dm b/code/game/objects/items/devices/recaller.dm index c6e43c89717..ed4750d62fa 100644 --- a/code/game/objects/items/devices/recaller.dm +++ b/code/game/objects/items/devices/recaller.dm @@ -1,6 +1,5 @@ -//Recaller device -//Allows gang leaders to recall the shuttle -/obj/item/device/recaller +//gangtool device +/obj/item/device/gangtool name = "suspicious device" desc = "A strange device of sorts. Hard to really make out what it actually does just by looking." icon_state = "recaller" @@ -10,31 +9,215 @@ throw_speed = 3 throw_range = 7 flags = CONDUCT + var/gang //Which gang uses this? + var/boss = 1 //If it has the power to promote gang members var/recalling = 0 + var/promotion_cost = 20 -/obj/item/device/recaller/attack_self(mob/user) - if(recalling) +/obj/item/device/gangtool/New() //Initialize supply point income if it hasn't already been started + if(!ticker.mode.gang_points) + ticker.mode.gang_points = new /datum/gang_points(ticker.mode) + ticker.mode.gang_points.start() + if(boss) + desc += " Looks important." + +/obj/item/device/gangtool/attack_self(mob/user) + if (!can_use(user)) return - if((user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.B_bosses)) - var/turf/userturf = get_turf(user) - if(userturf.z != 1) - user << "\icon[src]Error: Device out of range of station communication arrays." - return - switch(SSshuttle.emergency.mode) - if(SHUTTLE_CALL) - recalling = 1 - loc << "\icon[src]Generating shuttle recall order with codes retrieved from last call signal..." - sleep(rand(10,30)) - loc << "\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays..." - sleep(rand(10,30)) - loc << "\icon[src]Comm arrays accessed. Broadcasting recall signal..." - sleep(rand(10,30)) - recalling = 0 - log_game("[key_name(user)] has recalled the shuttle with a recaller.") - message_admins("[key_name_admin(user)] has recalled the shuttle with a recaller.", 1) - if(!SSshuttle.cancelEvac(user)) - loc << "\icon[src]No response received. Emergency shuttle cannot be recalled at this time." - return + var/dat + if(!gang) + dat += "This device is not registered.
    " + if(user.mind in (ticker.mode.A_bosses | ticker.mode.B_bosses)) + dat += "Give this device to another member of your organization to use.
    " + else + dat += "Register Device
    " + else + var/gang_size = ((gang == "A")? (ticker.mode.A_gang.len + ticker.mode.A_bosses.len) : (ticker.mode.B_gang.len + ticker.mode.B_bosses.len)) + var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len) + var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B) - user << "\icon[src]Emergency shuttle cannot be recalled at this time." \ No newline at end of file + dat += "Registration: [(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Member"]
    " + dat += "Organization Size: [gang_size]
    " + dat += "Station Control: [round((gang_territory/start_state.num_territories)*100, 1)]%
    " + dat += "Recall Emergency Shuttle
    " + dat += "
    " + dat += "Influence: [points]
    " + dat += "Time until Influence grows: [(points >= 100) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
    " + dat += "Purchase Items:
    " + + if(points >= 10) + dat += "(10 Influence) Territory Spraycan
    " + else + dat += "(10 Influence) Territory Spraycan
    " + + if(points >= 25) + dat += "(25 Influence) 10mm Pistol
    " + else + dat += "(25 Influence) 10mm Pistol
    " + + if(points >= 10) + dat += "(10 Influence) 10mm Ammo
    " + else + dat += "(10 Influence) 10mm Ammo
    " + + if(points >= 10) + dat += "(10 Influence) Switchblade
    " + else + dat += "(10 Influence) Switchblade
    " + + if(points >= 50) + dat += "(50 Influence) Recruitment Pen
    " + else + dat += "(50 Influence) Recruitment Pen
    " + + if(boss) + if(promotion_cost > 100) + dat += "(Maximum Reached) Promote a Gangster
    " + else if(points >= promotion_cost) + dat += "([promotion_cost] Influence) Promote a Gangster
    " + else + dat += "([promotion_cost] Influence) Promote a Gangster
    " + + dat += "
    " + dat += "Refresh
    " + + var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4") + popup.set_content(dat) + popup.open() + +/obj/item/device/gangtool/Topic(href, href_list) + if(!can_use(usr)) + return + + add_fingerprint(usr) + + if(href_list["purchase"]) + var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B) + var/item_type + switch(href_list["purchase"]) + if("spraycan") + if(points >= 10) + item_type = /obj/item/toy/crayon/spraycan/gang + points = 10 + if("pistol") + if(points >= 25) + item_type = /obj/item/weapon/gun/projectile/automatic/pistol + points = 25 + if("ammo") + if(points >= 10) + item_type = /obj/item/ammo_box/magazine/m10mm + points = 10 + if("switchblade") + if(points >= 10) + item_type = /obj/item/weapon/switchblade + points = 10 + if("pen") + if(points >= 50) + item_type = /obj/item/weapon/pen/gang + points = 50 + if("gangtool") + if(points >= promotion_cost) + item_type = /obj/item/device/gangtool/lt + points = promotion_cost + promotion_cost += 30 + + if(item_type) + if(gang == "A") + ticker.mode.gang_points.A -= points + else if(gang == "B") + ticker.mode.gang_points.B -= points + var/obj/purchased = new item_type(get_turf(usr)) + var/mob/living/carbon/human/H = usr + H.put_in_any_hand_if_possible(purchased) + ticker.mode.message_gangtools(((gang=="A")? ticker.mode.A_tools : ticker.mode.B_tools), "A [href_list["purchase"]] was purchased by [usr] for [points] Influence.") + log_game("A [href_list["purchase"]] was purchased by [key_name(usr)] for [points] Influence.") + + else if(href_list["choice"]) + switch(href_list["choice"]) + if("recall") + recall(usr) + if("register") + register_device(usr) + + attack_self(usr) + +/obj/item/device/gangtool/proc/register_device(var/mob/user) + var/promoted + if(user.mind in (ticker.mode.A_gang | ticker.mode.A_bosses)) + ticker.mode.A_tools += src + gang = "A" + if(!(user.mind in ticker.mode.A_bosses)) + ticker.mode.remove_gangster(user.mind, 0, 2) + ticker.mode.A_bosses += user.mind + user.mind.special_role = "[gang_name("A")] Gang (A) Lieutenant" + ticker.mode.update_gang_icons_added(user.mind, "A") + log_game("[key_name(user)] has been promoted to Lieutenant in the [gang_name("A")] Gang (A)") + promoted = 1 + else if(user.mind in (ticker.mode.B_gang | ticker.mode.B_bosses)) + ticker.mode.B_tools += src + gang = "B" + if(!(user.mind in ticker.mode.B_bosses)) + ticker.mode.remove_gangster(user.mind, 0, 2) + ticker.mode.B_bosses += user.mind + user.mind.special_role = "[gang_name("B")] Gang (B) Lieutenant" + ticker.mode.update_gang_icons_added(user.mind, "B") + log_game("[key_name(user)] has been promoted to Lieutenant in the [gang_name("B")] Gang (B)") + promoted = 1 + if(promoted) + ticker.mode.message_gangtools(((gang=="A")? ticker.mode.A_tools : ticker.mode.B_tools), "[user] has been promoted to Lieutenant.") + user << "You have been promoted to Lieutenant!" + user << "The Gangtool you registered will allow you to use your gang's influence to purchase items and prevent the station from evacuating before your gang can take over. Use it to recall the emergency shuttle from anywhere on the station." + user << "You may also now use recruitment pens to grow your gang membership. Use them on unsuspecting crew members to recruit them." + if(!gang) + usr << "ACCESS DENIED: Unauthorized user." + +/obj/item/device/gangtool/proc/recall(mob/user) + if(recalling || !can_use(user)) + return + + var/turf/userturf = get_turf(user) + if(userturf.z != 1) + user << "\icon[src]Error: Device out of range of station communication arrays." + return + + if(SSshuttle.emergency.mode == SHUTTLE_CALL) + recalling = 1 + loc << "\icon[src]Generating shuttle recall order with codes retrieved from last call signal..." + sleep(rand(10,30)) + loc << "\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays..." + sleep(rand(10,30)) + loc << "\icon[src]Comm arrays accessed. Broadcasting recall signal..." + sleep(rand(10,30)) + recalling = 0 + log_game("[key_name(user)] has recalled the shuttle with a gangtool.") + message_admins("[key_name_admin(user)] has recalled the shuttle with a gangtool.", 1) + if(!SSshuttle.cancelEvac(user)) + loc << "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time." + return + user << "\icon[src]Emergency shuttle cannot be recalled at this time." + +/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user) + if(!istype(user)) + return + if(user.restrained() || user.lying || user.stat || user.stunned || user.weakened) + return + if(!(src in user.contents)) + return + + var/success + if(user.mind) + if(gang) + if((gang == "A") && (user.mind in ticker.mode.A_bosses)) + success = 1 + else if((gang == "B") && (user.mind in ticker.mode.B_bosses)) + success = 1 + else + success = 1 + if(success) + return 1 + user << "\icon[src] ACCESS DENIED: Unauthorized user." + return 0 + +/obj/item/device/gangtool/lt + boss = 0 \ No newline at end of file diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 8258d6dc4e2..2a8ef3cae0b 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -69,7 +69,7 @@ /obj/item/device/taperecorder/proc/can_use(mob/user) if(user && ismob(user)) - if(!user.stat && user.canmove && !user.restrained()) + if(!user.incapacitated()) return 1 return 0 @@ -282,9 +282,9 @@ /obj/item/device/tape/attackby(obj/item/I, mob/user, params) if(ruined && istype(I, /obj/item/weapon/screwdriver)) - user << "You start winding the tape back in." + user << "You start winding the tape back in..." if(do_after(user, 120)) - user << "You wound the tape back in!" + user << "You wound the tape back in." fix() diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 3594c570e2e..a9d6ec760ed 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -98,7 +98,7 @@ effective or pretty fucking useless. if(M) if(intensity >= 5) M.apply_effect(round(intensity/1.5), PARALYZE) - M.apply_effect(intensity*10, IRRADIATE) + M.irradiate(intensity*10) else user << "The radioactive microlaser is still recharging." diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 85c5c9ceb4a..8437cf7c12e 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -16,7 +16,7 @@ /obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/weapon/tank)) if(tank_one && tank_two) - user << "There are already two tanks attached, remove one first." + user << "There are already two tanks attached, remove one first!" return if(!tank_one) @@ -42,7 +42,7 @@ user << "The device is secured." return if(attached_device) - user << "There is already a device attached to the valve, remove it first." + user << "There is already a device attached to the valve, remove it first!" return user.remove_from_mob(item) attached_device = A diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index d72e28e591e..3807998cbc9 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -180,7 +180,7 @@ var/list/world_uplinks = list() qdel(S) user << "Teleporter refunded." else - user << "This teleporter is already used." + user << "This teleporter is already used!" // PRESET UPLINKS // A collection of preset uplinks. diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm deleted file mode 100644 index e8481778326..00000000000 --- a/code/game/objects/items/devices/violin.dm +++ /dev/null @@ -1,40 +0,0 @@ -//copy pasta of the space piano, don't hurt me -Pete - -/obj/item/device/violin - name = "space violin" - desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" - icon = 'icons/obj/musician.dmi' - icon_state = "violin" - item_state = "violin" - force = 10 - var/datum/song/handheld/song - hitsound = "swing_hit" - -/obj/item/device/violin/New() - song = new("violin", src) - song.instrumentExt = "ogg" - -/obj/item/device/violin/Destroy() - qdel(song) - song = null - ..() - -/obj/item/device/violin/initialize() - song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded - ..() - -/obj/item/device/violin/attack_self(mob/user as mob) - if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" - return 1 - interact(user) - -/obj/item/device/violin/interact(mob/user as mob) - if(!user) - return - - if(!isliving(user) || user.stat || user.restrained() || user.lying) - return - - user.set_machine(src) - song.interact(user) diff --git a/code/game/objects/items/holotape.dm b/code/game/objects/items/holotape.dm index c517faaa381..bd10a107cad 100644 --- a/code/game/objects/items/holotape.dm +++ b/code/game/objects/items/holotape.dm @@ -113,8 +113,7 @@ P.icon_state = "[P.icon_base]_[dir]" cur = get_step_towards(cur,end) - usr << "You finish project the legnth of [icon_base] holotape." - user.visible_message("[user] finishes projecting the length of [icon_base] holotape.") + user.visible_message("[user] finishes projecting the length of [icon_base] holotape.", "You finish projecting the length of [icon_base] holotape.") charging = 1 spawn(40) @@ -138,7 +137,7 @@ if(!(W.dir == 5) || !(W.fulltile == 1)) return - user << "You start projecting the [icon_base] holotape onto [target]." + user << "You start projecting the [icon_base] holotape onto [target]..." if(!do_mob(user, target, 30)) return @@ -177,8 +176,8 @@ user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1) - user.visible_message("[user] hits [src].", \ - "You hit [src]." ) + user.visible_message("[user] hits [src].", \ + "You hit [src]." ) health -= rand(1,2) healthcheck() diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 4a56ab7b1f8..7e38de5879d 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -21,7 +21,7 @@ for(var/mob/O in viewers(M, null)) if (O.client) O.show_message("[user] has prodded [M] with an electrically-charged arm!", 1, - " You hear someone fall", 2) + "You hear someone fall.", 2) add_logs(user, M, "stunned", object="[src.name]", addition="(INTENT: [uppertext(user.a_intent)])") /obj/item/borg/overdrive diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 9641f540d89..2ea78ce58f9 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -92,13 +92,13 @@ if (M.use(1)) var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly B.loc = get_turf(src) - user << "You armed the robot frame." + user << "You arm the robot frame." if (user.get_inactive_hand()==src) user.unEquip(src) user.put_in_inactive_hand(B) qdel(src) else - user << "You need one sheet of metal to start building ED-209." + user << "You need one sheet of metal to start building ED-209!" return if(istype(W, /obj/item/robot_parts/l_leg)) if(src.l_leg) return @@ -136,9 +136,9 @@ src.chest = W src.updateicon() else if(!W:wires) - user << "You need to attach wires to it first!" + user << "You need to attach wires to it first!" else - user << "You need to attach a cell to it first!" + user << "You need to attach a cell to it first!" if(istype(W, /obj/item/robot_parts/head)) if(src.head) return @@ -148,22 +148,22 @@ src.head = W src.updateicon() else - user << "You need to attach a flash to it first!" + user << "You need to attach a flash to it first!" if (istype(W, /obj/item/device/multitool)) if(check_completion()) Interact(user) else - user << "The endoskeleton must be assembled before debugging can begin." + user << "The endoskeleton must be assembled before debugging can begin!" if(istype(W, /obj/item/device/mmi)) var/obj/item/device/mmi/M = W if(check_completion()) if(!istype(loc,/turf)) - user << "You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise." + user << "You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise!" return if(!M.brainmob) - user << "Sticking an empty MMI into the frame would sort of defeat the purpose." + user << "Sticking an empty MMI into the frame would sort of defeat the purpose!" return if(!M.brainmob.key) var/ghost_can_reenter = 0 @@ -173,19 +173,19 @@ ghost_can_reenter = 1 break if(!ghost_can_reenter) - user << "The mmi indicates that their mind is completely unresponsive; there's no point." + user << "The MMI indicates that their mind is completely unresponsive; there's no point!" return if(M.brainmob.stat == DEAD) - user << "Sticking a dead brain into the frame would sort of defeat the purpose." + user << "Sticking a dead brain into the frame would sort of defeat the purpose!" return if((M.brainmob.mind in ticker.mode.head_revolutionaries) || (M.brainmob.mind in ticker.mode.A_bosses) || (M.brainmob.mind in ticker.mode.B_bosses)) - user << "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI." + user << "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI!" return if(jobban_isbanned(M.brainmob, "Cyborg")) - user << "This MMI does not seem to fit." + user << "This MMI does not seem to fit!" return var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc)) @@ -235,10 +235,10 @@ O << "Error: Servo motors unresponsive." else - user << "The MMI must go in after everything else!" + user << "The MMI must go in after everything else!" if(istype(W,/obj/item/weapon/pen)) - user << "You need to use a multitool to name [src]." + user << "You need to use a multitool to name [src]!" return /obj/item/robot_parts/robot_suit/proc/Interact(mob/user) @@ -260,7 +260,7 @@ var/mob/living/living_user = usr var/obj/item/item_in_hand = living_user.get_active_hand() if(!istype(item_in_hand, /obj/item/device/multitool)) - living_user << "You need a multitool!" + living_user << "You need a multitool!" return if(href_list["Name"]) @@ -294,23 +294,23 @@ ..() if(istype(W, /obj/item/weapon/stock_parts/cell)) if(src.cell) - user << "You have already inserted a cell!" + user << "You have already inserted a cell!" return else user.drop_item() W.loc = src src.cell = W - user << "You insert the cell!" + user << "You insert the cell." if(istype(W, /obj/item/stack/cable_coil)) if(src.wires) - user << "You have already inserted wire." + user << "You have already inserted wire!" return var/obj/item/stack/cable_coil/coil = W if (coil.use(1)) src.wires = 1.0 user << "You insert the wire." else - user << "You need one length of coil to wire it." + user << "You need one length of coil to wire it!" return /obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob, params) @@ -318,10 +318,10 @@ if(istype(W, /obj/item/device/flash/handheld)) var/obj/item/device/flash/handheld/F = W if(src.flash1 && src.flash2) - user << "You have already inserted the eyes!" + user << "You have already inserted the eyes!" return else if(F.broken) - user << "You can't use a broken flash!" + user << "You can't use a broken flash!" return else user.drop_item() @@ -330,6 +330,6 @@ src.flash2 = F else src.flash1 = F - user << "You insert the flash into the eye socket!" + user << "You insert the flash into the eye socket." return diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 01dc031a466..55c1be2ac5a 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -66,7 +66,7 @@ /obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) if(R.health < 0) - usr << "You have to repair the cyborg before using this module!" + usr << "You have to repair the cyborg before using this module!" return 0 if(!R.key) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index ad9da7a8362..bffb0d948e7 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -37,7 +37,7 @@ var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) overlays.Cut() - usr << "You slice off [src]'s uneven chunks of aluminium and scorch marks." + usr << "You slice off [src]'s uneven chunks of aluminium and scorch marks." return @@ -59,10 +59,10 @@ if(ishuman(user)) if(!user.get_active_hand()) user.put_in_hands(src) - user << "You take the target out of the stake." + user << "You take the target out of the stake." else src.loc = get_turf(user) - user << "You take the target out of the stake." + user << "You take the target out of the stake." stake.pinned_target = null return @@ -95,7 +95,7 @@ hp -= Proj.damage if(hp <= 0) - visible_message("[src] breaks into tiny pieces and collapses!") + visible_message("[src] breaks into tiny pieces and collapses!") qdel(src) // Create a temporary object to represent the damage diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 0e90d30f526..47b6c6d4723 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -28,17 +28,17 @@ return 1 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 1 if(ishuman(M)) var/mob/living/carbon/human/H = M if(stop_bleeding) if(H.bleedsuppress) - user << "[H]'s bleeding is already bandaged." + user << "[H]'s bleeding is already bandaged!" return else if(!H.blood_max) - user << "[H] isn't bleeding." + user << "[H] isn't bleeding!" return if(isliving(M)) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index eb2bd629f67..7a2a2a5146a 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -38,15 +38,15 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \ var/obj/item/weapon/weldingtool/WT = W if(get_amount() < 2) - user << "You need at least two rods to do this." + user << "You need at least two rods to do this!" return if(WT.remove_fuel(0,user)) var/obj/item/stack/sheet/metal/new_item = new(usr.loc) new_item.add_to_stacks(usr) - user.visible_message("[user.name] shaped [src] into metal with the weldingtool.", \ - "You shaped [src] into metal with the weldingtool.", \ - "You hear welding.") + user.visible_message("[user.name] shaped [src] into metal with the welding tool.", \ + "You shape [src] into metal with the welding tool.", \ + "You hear welding.") var/obj/item/stack/rods/R = src src = null var/replace = (user.get_inactive_hand()==R) @@ -58,9 +58,9 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \ if(istype(W,/obj/item/weapon/reagent_containers/food/snacks)) var/obj/item/weapon/reagent_containers/food/snacks/S = W if(amount != 1) - user << "You must use a single rod." + user << "You must use a single rod!" else if(S.w_class > 2) - user << "The ingredient is too big for [src]." + user << "The ingredient is too big for [src]!" else var/obj/item/weapon/reagent_containers/food/snacks/customizable/A = new/obj/item/weapon/reagent_containers/food/snacks/customizable/kebab(get_turf(src)) A.initialize_custom_food(src, S, user) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index e30fe1dda80..dcea59701ea 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -30,7 +30,7 @@ if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if (get_amount() < 1 || CC.get_amount() < 5) - user << "You need five lengths of coil and one sheet of glass to make wired glass!" return CC.use(5) use(1) @@ -51,7 +51,7 @@ if (!G && replace) user.put_in_hands(RG) else - user << "You need one rod and one sheet of glass to make reinforced glass." + user << "You need one rod and one sheet of glass to make reinforced glass!" return else return ..() @@ -60,7 +60,7 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 0 if(zero_amount()) return 0 var/title = "Sheet-Glass" @@ -75,7 +75,7 @@ for (var/obj/structure/window/win in user.loc) i++ if(i >= 4) - user << "There are too many windows in this location." + user << "There are too many windows in this location." return 1 directions-=win.dir if(!(win.ini_dir in cardinal)) @@ -105,15 +105,13 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.get_amount() < 2) - user << "You need more glass to do that." + user << "You need more glass to do that!" return 1 if(locate(/obj/structure/window) in user.loc) - user << "There is a window in the way." + user << "There is a window in the way!" return 1 var/obj/structure/window/W W = new /obj/structure/window/fulltile( user.loc, 0 ) - W.dir = SOUTHWEST - W.ini_dir = SOUTHWEST W.anchored = 0 W.air_update_turf(1) W.add_fingerprint(user) @@ -161,7 +159,7 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 0 var/title = "Sheet Reinf. Glass" title += " ([src.get_amount()] sheet\s left)" @@ -205,16 +203,14 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.get_amount() < 2) - user << "You need more glass to do that." + user << "You need more glass to do that!" return 1 if(locate(/obj/structure/window) in user.loc) - user << "There is a window in the way." + user << "There is a window in the way!" return 1 var/obj/structure/window/W W = new /obj/structure/window/reinforced/fulltile(user.loc, 1) W.state = 0 - W.dir = SOUTHWEST - W.ini_dir = SOUTHWEST W.anchored = 0 W.add_fingerprint(user) src.use(2) @@ -225,16 +221,16 @@ for(var/obj/structure/windoor_assembly/WA in user.loc) if(WA.dir == user.dir) - user << "There is already a windoor assembly in that location." + user << "There is already a windoor assembly in that location!" return 1 for(var/obj/machinery/door/window/W in user.loc) if(W.dir == user.dir) - user << "There is already a windoor in that location." + user << "There is already a windoor in that location!" return 1 if(src.get_amount() < 5) - user << "You need more glass to do that." + user << "You need more glass to do that!" return 1 var/obj/structure/windoor_assembly/WD = new(user.loc) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 4c4fa99a3e5..1795cb3a607 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -115,9 +115,9 @@ var/global/list/datum/stack_recipe/xeno_recipes = list ( \ istype(W, /obj/item/weapon/hatchet) ) //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) - usr.visible_message("\the [usr] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") + usr.visible_message("\the [usr] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.") if(do_after(user,50)) - usr << "You cut the hair from this [src.singular_name]" + usr << "You cut the hair from this [src.singular_name]." //Try locating an exisitng stack on the tile and add to there if possible for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc) if(HS.amount < 50) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index 200718edd3e..1992e75ab6c 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -32,5 +32,5 @@ user << "You make a light tile." L.add_fingerprint(user) else - user << "You need one metal sheet to finish the light tile." + user << "You need one metal sheet to finish the light tile!" return diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index b941b9228d7..f758904770d 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -122,7 +122,7 @@ if(!building_checks(R, multiplier)) return if (R.time) - usr << "Building [R.title] ..." + usr.visible_message("[usr] starts building [R.title].", "You start building [R.title]...") if (!do_after(usr, R.time)) return if(!building_checks(R, multiplier)) @@ -160,15 +160,15 @@ /obj/item/stack/proc/building_checks(datum/stack_recipe/R, multiplier) if (src.get_amount() < R.req_amount*multiplier) if (R.req_amount*multiplier>1) - usr << "You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!" + usr << "You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!" else - usr << "You haven't got enough [src] to build \the [R.title]!" + usr << "You haven't got enough [src] to build \the [R.title]!" return 0 if (R.one_per_turf && (locate(R.result_type) in usr.loc)) - usr << "There is another [R.title] here!" + usr << "There is another [R.title] here!" return 0 if (R.on_floor && !istype(usr.loc, /turf/simulated/floor)) - usr << "\The [R.title] must be constructed on the floor!" + usr << "\The [R.title] must be constructed on the floor!" return 0 return 1 @@ -210,7 +210,7 @@ if (item.amount>=item.max_amount) continue oldsrc.attackby(item, usr) - usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s." + usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s." if(oldsrc.amount <= 0) break oldsrc.update_icon() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index fd477f005ce..6d81c36bb2c 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -22,18 +22,18 @@ var/obj/item/weapon/weldingtool/WT = W if(get_amount() < 4) - user << "You need at least four tiles to do this." + user << "You need at least four tiles to do this!" return if(is_hot(WT) && !mineralType) - user << "You can not reform this." + user << "You can not reform this!" return if(WT.remove_fuel(0,user)) if(mineralType == "plasma") atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5) - user.visible_message("[user.name] set the plasma tiles on fire!", \ + user.visible_message("[user.name] sets the plasma tiles on fire!", \ "You set the plasma tiles on fire!") qdel(src) return @@ -41,9 +41,9 @@ if (mineralType == "metal") var/obj/item/stack/sheet/metal/new_item = new(user.loc) new_item.add_to_stacks(user) - user.visible_message("[user.name] shaped [src] into metal with the weldingtool.", \ + user.visible_message("[user.name] shaped [src] into metal with the weldingtool.", \ "You shaped [src] into metal with the weldingtool.", \ - "You hear welding.") + "You hear welding.") var/obj/item/stack/rods/R = src src = null var/replace = (user.get_inactive_hand()==R) @@ -55,9 +55,9 @@ var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]") var/obj/item/stack/sheet/mineral/new_item = new sheet_type(user.loc) new_item.add_to_stacks(user) - user.visible_message("[user.name] shaped [src] into a sheet with the weldingtool.", \ + user.visible_message("[user.name] shaped [src] into a sheet with the weldingtool.", \ "You shaped [src] into a sheet with the weldingtool.", \ - "You hear welding.") + "You hear welding.") var/obj/item/stack/rods/R = src src = null var/replace = (user.get_inactive_hand()==R) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index dda26b4fef4..07fe7a7defc 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -54,10 +54,10 @@ if(istype(O, /obj/item/weapon/reagent_containers/glass)) if(O.reagents) if(O.reagents.total_volume < 1) - user << "The [O] is empty." + user << "The [O] is empty." else if(O.reagents.total_volume >= 1) if(O.reagents.has_reagent("facid", 1)) - user << "The acid chews through the balloon!" + user << "The acid chews through the balloon!" O.reagents.reaction(user) qdel(src) else @@ -69,7 +69,7 @@ /obj/item/toy/balloon/throw_impact(atom/hit_atom) if(src.reagents.total_volume >= 1) - src.visible_message("\The [src] bursts!","You hear a pop and a splash.") + src.visible_message("\The [src] bursts!","You hear a pop and a splash.") src.reagents.reaction(get_turf(hit_atom)) for(var/atom/A in get_turf(hit_atom)) src.reagents.reaction(A) @@ -135,17 +135,17 @@ if (istype(A, /obj/item/toy/ammo/gun)) if (src.bullets >= 7) - user << "It's already fully loaded!" + user << "It's already fully loaded!" return 1 if (A.amount_left <= 0) - user << "There are no more caps!" + user << "There are no more caps!" return 1 if (A.amount_left < (7 - src.bullets)) src.bullets += A.amount_left - user << text("You reload [] cap\s!", A.amount_left) + user << text("You reload [] cap\s.", A.amount_left) A.amount_left = 0 else - user << text("You reload [] cap\s!", 7 - src.bullets) + user << text("You reload [] cap\s.", 7 - src.bullets) A.amount_left -= 7 - src.bullets src.bullets = 7 A.update_icon() @@ -156,7 +156,7 @@ if (flag) return if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return src.add_fingerprint(user) if (src.bullets < 1) @@ -167,7 +167,7 @@ src.bullets-- user.visible_message("[user] fires [src] at [target]!", \ "You fire [src] at [target]!", \ - " You hear a gunshot.") + " You hear a gunshot!") /obj/item/toy/ammo/gun name = "capgun ammo" @@ -227,11 +227,11 @@ ..() if(istype(W, /obj/item/toy/sword)) if(W == src) - user << "You try to attach the end of the plastic sword to... itself. You're not very smart, are you?" + user << "You try to attach the end of the plastic sword to... itself. You're not very smart, are you?" if(ishuman(user)) user.adjustBrainLoss(10) else if((W.flags & NODROP) || (flags & NODROP)) - user << "\the [flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [flags & NODROP ? W : src]!" + user << "\the [flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [flags & NODROP ? W : src]!" else user << "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool." var/obj/item/weapon/twohanded/dualsaber/toy/newSaber = new /obj/item/weapon/twohanded/dualsaber/toy(user.loc) @@ -320,7 +320,7 @@ attack_verb = list("attacked", "coloured") var/colour = "#FF0000" //RGB var/drawtype = "rune" - var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow") + var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","poseur tag") var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer var/uses = 30 //0 for unlimited uses @@ -328,6 +328,8 @@ var/colourName = "red" //for updateIcon purposes var/dat var/list/validSurfaces = list(/turf/simulated/floor) + var/gang = 0 //For marking territory + var/edible = 1 /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.") @@ -397,12 +399,54 @@ /obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity) if(!proximity) return + if(!uses) + user << "There is no more of [src.name] left!" + if(!instant) + qdel(src) + return + if(istype(target, /obj/effect/decal/cleanable)) + target = target.loc if(is_type_in_list(target,validSurfaces)) var/temp = "rune" if(letters.Find(drawtype)) temp = "letter" else if(graffiti.Find(drawtype)) temp = "graffiti" + + ////////////////////////// GANG FUNCTIONS + var/area/territory + var/gangID + if(gang) + //Determine gang affiliation + if(user.mind in (ticker.mode.A_bosses | ticker.mode.A_gang)) + temp = "[gang_name("A")] gang tag" + gangID = "A" + else if(user.mind in (ticker.mode.B_bosses | ticker.mode.B_gang)) + temp = "[gang_name("B")] gang tag" + gangID = "B" + + //Check area validity. Reject space, player-created areas, and non-station z-levels. + if (gangID) + var/area/user_area = get_area(user.loc) + territory = get_area(target) + if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory) + //Check if this area is already tagged by a gang + if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag + if(territory_claimed(territory, user)) + return + //Prevent people spraying from outside of the territory (ie. Maint walls) + if(istype(user_area) && (user_area.type == territory.type)) + if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents)) + user << "You cannot tag here." + return + else + user << "You cannot tag [territory] from the outside." + return + else + user << "[territory] is unsuitable for tagging." + return + ///////////////////////////////////////// + var/graf_rot if(oriented.Find(drawtype)) switch(user.dir) @@ -414,30 +458,58 @@ graf_rot = 270 else graf_rot = 0 - user << "You start drawing a [temp] on the [target.name]." - if(instant || do_after(user, 50)) - new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp,graf_rot) - user << "You finish drawing [temp]." - if(uses) - uses-- - if(!uses) - user << "You used up your [src.name]!" + + user << "You start [instant ? "spraying" : "drawing"] a [temp] on the [target.name]..." + if(instant) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + if((instant>0) || do_after(user, 50)) + + //Gang functions + if(gangID) + //Delete any old markings on this tile, including other gang tags + if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag + if(territory_claimed(territory, user)) + return + for(var/obj/effect/decal/cleanable/crayon/old_marking in target) + qdel(old_marking) + new /obj/effect/decal/cleanable/crayon/gang(target,gangID,temp,graf_rot) + user << "You tagged [territory] for your gang!" + + else + new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp,graf_rot) + + user << "You finish [instant ? "spraying" : "drawing"] [temp]." + if(instant<0) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + uses = max(0,uses-1) + if(!uses) + user << "There is no more of [src.name] left!" + if(!instant) qdel(src) return /obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) - var/huffable = istype(src,/obj/item/toy/crayon/spraycan) - if(M == user) - user << "You take a [huffable ? "huff" : "bite"] of the [src.name]. Delicious!" + if(edible && (M == user)) + user << "You take a bite of the [src.name]. Delicious!" user.nutrition += 5 - if(uses) - uses -= 5 - if(uses <= 0) - user << "There is no more of [src.name] left!" - qdel(src) + uses = max(0,uses-5) + if(!uses) + user << "There is no more of [src.name] left!" + qdel(src) else ..() +/obj/item/toy/crayon/proc/territory_claimed(var/area/territory,mob/user) + var/occupying_gang + if(territory.type in (ticker.mode.A_territory | ticker.mode.A_territory_new)) + occupying_gang = gang_name("A") + if(territory.type in (ticker.mode.B_territory | ticker.mode.B_territory_new)) + occupying_gang = gang_name("B") + if(occupying_gang) + user << "[territory] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!" + return 1 + return 0 + /* * Snap pops */ @@ -455,7 +527,7 @@ s.set_up(3, 1, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message(" The [src.name] explodes!"," You hear a snap!") + src.visible_message(" The [src.name] explodes!","You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) @@ -469,7 +541,7 @@ s.set_up(2, 0, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message("The [src.name] explodes!","You hear a snap!") + src.visible_message("The [src.name] explodes!","You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) @@ -688,7 +760,7 @@ obj/item/toy/cards/deck/attack_hand(mob/user as mob) var/choice = null if(cards.len == 0) src.icon_state = "deck_[deckstyle]_empty" - user << "There are no more cards to draw." + user << "There are no more cards to draw!" return var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc) choice = cards[1] @@ -699,7 +771,7 @@ obj/item/toy/cards/deck/attack_hand(mob/user as mob) src.cards -= choice H.pickup(user) user.put_in_active_hand(H) - user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.") + user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.") if(cards.len > 26) src.icon_state = "deck_[deckstyle]_full" else if(cards.len > 10) @@ -711,7 +783,7 @@ obj/item/toy/cards/deck/attack_self(mob/user as mob) if(cooldown < world.time - 50) cards = shuffle(cards) playsound(user, 'sound/items/cardshuffle.ogg', 50, 1) - user.visible_message("[user] shuffles the deck.", "You shuffle the deck.") + user.visible_message("[user] shuffles the deck.", "You shuffle the deck.") cooldown = world.time obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/user, params) @@ -719,13 +791,13 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use if(istype(C)) if(C.parentdeck == src) if(!user.unEquip(C)) - user << "The card is stuck to your hand, you can't add it to the deck!" + user << "The card is stuck to your hand, you can't add it to the deck!" return src.cards += C.cardname - user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") + user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") qdel(C) else - user << "You can't mix cards from other decks." + user << "You can't mix cards from other decks!" if(cards.len > 26) src.icon_state = "deck_[deckstyle]_full" else if(cards.len > 10) @@ -739,13 +811,13 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, if(istype(C)) if(C.parentdeck == src) if(!user.unEquip(C)) - user << "The hand of cards is stuck to your hand, you can't add it to the deck!" + user << "The hand of cards is stuck to your hand, you can't add it to the deck!" return src.cards += C.currenthand - user.visible_message("[user] puts their hand of cards in the deck.", "You put the hand of cards in the deck.") + user.visible_message("[user] puts their hand of cards in the deck.", "You put the hand of cards in the deck.") qdel(C) else - user << "You can't mix cards from other decks." + user << "You can't mix cards from other decks!" if(cards.len > 26) src.icon_state = "deck_[deckstyle]_full" else if(cards.len > 10) @@ -770,7 +842,7 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, M.put_in_r_hand(src) usr << "You pick up the deck." else - usr << "You can't reach it from here." + usr << "You can't reach it from here!" @@ -843,7 +915,7 @@ obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living if(C.parentdeck == src.parentdeck) src.currenthand += C.cardname user.unEquip(C) - user.visible_message("[user] adds a card to their hand.", "You add the [C.cardname] to your hand.") + user.visible_message("[user] adds a card to their hand.", "You add the [C.cardname] to your hand.") interact(user) if(currenthand.len > 4) src.icon_state = "[deckstyle]_hand5" @@ -853,7 +925,7 @@ obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living src.icon_state = "[deckstyle]_hand3" qdel(C) else - user << "You can't mix cards from other decks." + user << "You can't mix cards from other decks!" obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj,obj/item/toy/cards/sourceobj) ..() @@ -882,9 +954,9 @@ obj/item/toy/cards/singlecard/examine(mob/user) if(ishuman(user)) var/mob/living/carbon/human/cardUser = user if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src) - cardUser.visible_message("[cardUser] checks \his card.", "The card reads: [src.cardname]") + cardUser.visible_message("[cardUser] checks \his card.", "The card reads: [src.cardname]") else - cardUser << "You need to have the card in your hand to check it." + cardUser << "You need to have the card in your hand to check it!" obj/item/toy/cards/singlecard/verb/Flip() @@ -924,14 +996,14 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params) qdel(C) qdel(src) else - user << "You can't mix cards from other decks." + user << "You can't mix cards from other decks!" if(istype(I, /obj/item/toy/cards/cardhand/)) var/obj/item/toy/cards/cardhand/H = I if(H.parentdeck == parentdeck) H.currenthand += cardname user.unEquip(src) - user.visible_message("[user] adds a card to \his hand.", "You add the [cardname] to your hand.") + user.visible_message("[user] adds a card to \his hand.", "You add the [cardname] to your hand.") H.interact(user) if(H.currenthand.len > 4) H.icon_state = "[deckstyle]_hand5" @@ -941,7 +1013,7 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params) H.icon_state = "[deckstyle]_hand3" qdel(src) else - user << "You can't mix cards from other decks." + user << "You can't mix cards from other decks!" obj/item/toy/cards/singlecard/attack_self(mob/user) @@ -997,7 +1069,7 @@ obj/item/toy/cards/deck/syndicate /obj/item/toy/nuke/attack_self(mob/user) if (cooldown < world.time) cooldown = world.time + 1800 //3 minutes - user.visible_message("[user] presses a button on [src]", "You activate [src], it plays a loud noise!", "You hear the click of a button.") + user.visible_message("[user] presses a button on [src].", "You activate [src], it plays a loud noise!", "You hear the click of a button.") spawn(5) //gia said so icon_state = "nuketoy" playsound(src, 'sound/machines/Alarm.ogg', 100, 0, surround = 0) @@ -1015,7 +1087,7 @@ obj/item/toy/cards/deck/syndicate /obj/item/toy/minimeteor name = "\improper Mini-Meteor" - desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor™" + desc = "Relive the excitement of a meteor shower! SweetMeat-eor. Co is not responsible for any injuries, headaches or hearing loss caused by Mini-Meteor?" icon = 'icons/obj/toy.dmi' icon_state = "minimeteor" w_class = 2.0 @@ -1038,13 +1110,25 @@ obj/item/toy/cards/deck/syndicate icon = 'icons/obj/toy.dmi' icon_state = "carpplushie" w_class = 2.0 + attack_verb = list("bitten", "eaten", "fin slapped") + var/bitesound = 'sound/weapons/bite.ogg' + +// Attack mob +/obj/item/toy/carpplushie/attack(mob/M as mob, mob/user as mob) + playsound(loc, bitesound, 20, 1) // Play bite sound in local area + return ..() + +// Attack self +/obj/item/toy/carpplushie/attack_self(mob/user as mob) + playsound(src.loc, bitesound, 20, 1) + return ..() /* * Toy big red button */ /obj/item/toy/redbutton name = "big red button" - desc = "A big, plastic red button. Reads 'From HonkCo Pranks©' on the back." + desc = "A big, plastic red button. Reads 'From HonkCo Pranks?' on the back." icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" w_class = 2.0 @@ -1053,7 +1137,7 @@ obj/item/toy/cards/deck/syndicate /obj/item/toy/redbutton/attack_self(mob/user) if (cooldown < world.time) cooldown = (world.time + 300) // Sets cooldown at 30 seconds - user.visible_message("[user] presses the big red button.", "You press the button, it plays a loud noise!", "The button clicks loudly.") + user.visible_message("[user] presses the big red button.", "You press the button, it plays a loud noise!", "The button clicks loudly.") playsound(src, 'sound/effects/explosionfar.ogg', 50, 0, surround = 0) for(var/mob/M in range(10, src)) // Checks range if(!M.stat && !istype(M, /mob/living/silicon/ai)) // Checks to make sure whoever's getting shaken is alive/not the AI @@ -1061,4 +1145,4 @@ obj/item/toy/cards/deck/syndicate shake_camera(M, 2, 1) // Shakes player camera 2 squares for 1 second. else - user << "Nothing happens." \ No newline at end of file + user << "Nothing happens." diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 57f667ac382..deef2e3e927 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -59,7 +59,7 @@ AI MODULES //The proc that actually changes the silicon's laws. /obj/item/weapon/aiModule/proc/transmitInstructions(var/mob/living/silicon/target, var/mob/sender) - target << "[sender] has uploaded a change to the laws you must follow using a [name]. From now on, these are your laws: " + target << "[sender] has uploaded a change to the laws you must follow using a [name]. From now on, these are your laws: " /******************** Modules ********************/ diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index e76181e672a..b04cbfa5467 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -110,7 +110,7 @@ RCD if(istype(W, /obj/item/weapon/rcd_ammo)) var/obj/item/weapon/rcd_ammo/R = W if((matter + R.ammoamt) > max_matter) - user << "The RCD cant hold any more matter-units." + user << "The RCD can't hold any more matter-units!" return user.drop_item() qdel(W) @@ -127,19 +127,19 @@ RCD switch(mode) if(1) mode = 2 - user << "Changed mode to 'Airlock'" + user << "You change RCD's mode to 'Airlock'." if(prob(20)) src.spark_system.start() return if(2) mode = 3 - user << "Changed mode to 'Deconstruct'" + user << "You change RCD's mode to 'Deconstruct'." if(prob(20)) src.spark_system.start() return if(3) mode = 1 - user << "Changed mode to 'Floor & Walls'" + user << "You change RCD's mode to 'Floor & Walls'." if(prob(20)) src.spark_system.start() return @@ -161,7 +161,7 @@ RCD if(1) if(istype(A, /turf/space)) if(useResource(1, user)) - user << "Building Floor..." + user << "You start building floor..." activate() A:ChangeTurf(/turf/simulated/floor/plating) return 1 @@ -169,7 +169,7 @@ RCD if(istype(A, /turf/simulated/floor)) if(checkResource(3, user)) - user << "Building Wall ..." + user << "You start building wall..." playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20)) if(!useResource(3, user)) return 0 @@ -188,7 +188,7 @@ RCD break if(door_check) - user << "Building Airlock..." + user << "You start building airlock..." playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50)) if(!useResource(10, user)) return 0 @@ -202,7 +202,7 @@ RCD return 1 return 0 else - user << "There is another door here!" + user << "There is another door here!" return 0 return 0 @@ -211,7 +211,7 @@ RCD if(istype(A, /turf/simulated/wall/r_wall) && !canRwall) return 0 if(checkResource(5, user)) - user << "Deconstructing Wall..." + user << "You start deconstructing wall..." playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 40)) if(!useResource(5, user)) return 0 @@ -222,7 +222,7 @@ RCD if(istype(A, /turf/simulated/floor)) if(checkResource(5, user)) - user << "Deconstructing Floor..." + user << "You start deconstructing floor..." playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50)) if(!useResource(5, user)) return 0 @@ -233,7 +233,7 @@ RCD if(istype(A, /obj/machinery/door/airlock)) if(checkResource(20, user)) - user << "Deconstructing Airlock..." + user << "You start deconstructing airlock..." playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50)) if(!useResource(20, user)) return 0 diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index 64185d5d5a0..360e473ab26 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -17,8 +17,12 @@ RPD #define METER_MODE 1 #define DISPOSALS_MODE 2 +#define CATEGORY_ATMOS 0 +#define CATEGORY_DISPOSALS 1 + /datum/pipe_info var/id=-1 + var/categoryId = CATEGORY_ATMOS var/dir=SOUTH var/dirtype=PIPE_BINARY var/icon = 'icons/obj/pipe-item.dmi' @@ -59,6 +63,7 @@ var/global/list/disposalpipeID2State=list( ) /datum/pipe_info/disposal + categoryId = CATEGORY_DISPOSALS icon = 'icons/obj/pipes/disposal.dmi' icon_state = "meterX" @@ -152,6 +157,7 @@ var/global/list/RPD_recipes=list( "purple" = rgb(130,43,255) ) var/paint_color="grey" + var/screen = CATEGORY_ATMOS //Starts on the atmos tab. /obj/item/weapon/pipe_dispenser/New() . = ..() @@ -163,34 +169,57 @@ var/global/list/RPD_recipes=list( show_menu(user) /obj/item/weapon/pipe_dispenser/proc/render_dir_img(var/_dir,var/pic,var/title,var/flipped=0) - var/selected="" + var/selected=" class=\"imglink\"" if(_dir == p_dir) - selected=" class=\"selected\"" - return "" + selected=" class=\"imglink selected\"" + return "" /obj/item/weapon/pipe_dispenser/proc/show_menu(mob/user as mob) if(!user || !src) return 0 var/dat = {"

    Type

    Utilities: -"} +
      "} + if(p_class != EATING_MODE) + dat += "
    • Eat Pipes
    • " + else + dat += "
    • Eat Pipes
    • " + if(p_class != PAINT_MODE) + dat += "
    • Paint Pipes
    • " + else + dat += "
    • Paint Pipes
    • " + dat += "
    " + + dat += "Category:
      " + if(screen == CATEGORY_ATMOS) + dat += "Atmospherics Disposals
      " + else if(screen == CATEGORY_DISPOSALS) + dat += "Atmospherics Disposals
      " + dat += "
    " + var/icon/preview=null + var/datbuild = "" for(var/category in RPD_recipes) - dat += "[category]:
      " var/list/cat=RPD_recipes[category] for(var/label in cat) var/datum/pipe_info/I = cat[label] var/found=0 if(I.id == p_type) - if(p_class==ATMOS_MODE && I.type==/datum/pipe_info) + if((p_class == ATMOS_MODE || p_class == METER_MODE) && (I.type == /datum/pipe_info || I.type == /datum/pipe_info/meter)) found=1 - else if(p_class==DISPOSALS_MODE && I.type==/datum/pipe_info/disposal) + else if(p_class == DISPOSALS_MODE && I.type==/datum/pipe_info/disposal) found=1 if(found) preview=new /icon(I.icon,I.icon_state) - dat += I.Render(src,label) + if(screen == I.categoryId) + if(I.id == p_type) + datbuild += "[label]" + else + datbuild += I.Render(src,label) + + if(length(datbuild) > 0) + dat += "[category]:
        " + dat += datbuild + datbuild = "" dat += "
      " var/color_css="" @@ -217,7 +246,9 @@ var/global/list/RPD_recipes=list( switch(p_conntype) if(-1) if(p_class==PAINT_MODE) - dirsel = "

      Direction

      [color_picker]" + dirsel = "

      Color

      [color_picker]" + else + dirsel = "" if(PIPE_BINARY) // Straight, N-S, W-E if(preview) @@ -359,47 +390,52 @@ var/global/list/RPD_recipes=list(

      "} - dat = {" - - - [name] - - - -[dirsel][dat] - - -"} - user << browse(dat, "window=pipedispenser") - onclose(user, "pipedispenser") + a.selected img, + a:hover { + background: #0066cc; + color: #ffffff; + } + [color_css] +"} + + dat = datsytle + dirsel + dat + + var/datum/browser/popup = new(user, "pipedispenser", name, 300, 550) + popup.set_content(dat) + popup.open() return /obj/item/weapon/pipe_dispenser/Topic(href, href_list) @@ -408,6 +444,10 @@ var/global/list/RPD_recipes=list( return usr.set_machine(src) src.add_fingerprint(usr) + if(href_list["screen"]) + screen = text2num(href_list["screen"]) + show_menu(usr) + if(href_list["setdir"]) p_dir= text2num(href_list["setdir"]) p_flipped = text2num(href_list["flipped"]) @@ -423,14 +463,14 @@ var/global/list/RPD_recipes=list( if(href_list["paintpipes"]) p_class = PAINT_MODE - p_conntype=-1 - p_dir=1 + p_conntype = -1 + p_dir = 1 src.spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) if(href_list["set_color"]) - paint_color=href_list["set_color"] + paint_color = href_list["set_color"] src.spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -446,8 +486,8 @@ var/global/list/RPD_recipes=list( if(href_list["makemeter"]) p_class = METER_MODE - p_conntype=-1 - p_dir=1 + p_conntype = -1 + p_dir = 1 src.spark_system.start() playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) show_menu(usr) @@ -467,17 +507,22 @@ var/global/list/RPD_recipes=list( return 0 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 0 if(istype(A,/area/shuttle)||istype(A,/turf/space/transit)) return 0 - + + //So that changing the menu settings doesn't affect the pipes already being built. + var/queued_p_type = p_type + var/queued_p_dir = p_dir + var/queued_p_flipped = p_flipped + switch(p_class) if(PAINT_MODE) // Paint pipes if(!istype(A,/obj/machinery/atmospherics/pipe)) // Avoid spewing errors about invalid mode -2 when clicking on stuff that aren't pipes. - user << "\The [src]'s error light flickers. Perhaps you need to only use it on pipes and pipe meters?" + user << "\The [src]'s error light flickers! Perhaps you need to only use it on pipes and pipe meters?" return 0 var/obj/machinery/atmospherics/pipe/P = A playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) @@ -491,7 +536,7 @@ var/global/list/RPD_recipes=list( if(EATING_MODE) // Eating pipes // Must click on an actual pipe or meter. if(istype(A,/obj/item/pipe) || istype(A,/obj/item/pipe_meter) || istype(A,/obj/structure/disposalconstruct)) - user << "Destroying Pipe..." + user << "You start destroying pipe..." playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 5)) activate() @@ -500,18 +545,18 @@ var/global/list/RPD_recipes=list( return 0 // Avoid spewing errors about invalid mode -1 when clicking on stuff that aren't pipes. - user << "The [src]'s error light flickers. Perhaps you need to only use it on pipes and pipe meters?" + user << "The [src]'s error light flickers! Perhaps you need to only use it on pipes and pipe meters?" return 0 if(ATMOS_MODE) if(!(istype(A, /turf))) - user << "The [src]'s error light flickers." + user << "The [src]'s error light flickers!" return 0 - user << "Building Pipes ..." + user << "You start building pipes..." playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20)) activate() - var/obj/item/pipe/P = new (A, pipe_type=p_type, dir=p_dir) - P.flipped = p_flipped + var/obj/item/pipe/P = new (A, pipe_type=queued_p_type, dir=queued_p_dir) + P.flipped = queued_p_flipped P.update() P.add_fingerprint(usr) return 1 @@ -519,9 +564,9 @@ var/global/list/RPD_recipes=list( if(METER_MODE) if(!(istype(A, /turf))) - user << "The [src]'s error light flickers." + user << "The [src]'s error light flickers!" return 0 - user << "Building Meter..." + user << "You start building meter..." playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20)) activate() @@ -531,12 +576,12 @@ var/global/list/RPD_recipes=list( if(DISPOSALS_MODE) if(!(istype(A, /turf))) - user << "The [src]'s error light flickers." + user << "The [src]'s error light flickers!" return 0 - user << "Building Pipes..." + user << "You start building pipes..." playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20)) - var/obj/structure/disposalconstruct/C = new (A,p_type,p_dir) + var/obj/structure/disposalconstruct/C = new (A, queued_p_type ,queued_p_dir) if(!C.can_place()) user << "There's not enough room to build that here!" @@ -557,3 +602,16 @@ var/global/list/RPD_recipes=list( /obj/item/weapon/pipe_dispenser/proc/activate() playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) +#undef PIPE_BINARY +#undef PIPE_BENT +#undef PIPE_TRINARY +#undef PIPE_TRIN_M +#undef PIPE_UNARY +#undef PIPE_QUAD +#undef PAINT_MODE +#undef EATING_MODE +#undef ATMOS_MODE +#undef METER_MODE +#undef DISPOSALS_MODE +#undef CATEGORY_ATMOS +#undef CATEGORY_DISPOSALS diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 15f3079898e..8dcdac57823 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -23,7 +23,7 @@ RSF ..() if (istype(W, /obj/item/weapon/rcd_ammo)) if ((matter + 10) > 30) - user << "The RSF cant hold any more matter." + user << "The RSF can't hold any more matter." return qdel(W) matter += 10 diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 60fc902e23e..00f3fbfd3b2 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -224,7 +224,7 @@ update_label("John Doe", "Clowny") var/points = 0 /obj/item/weapon/card/id/prisoner/attack_self(mob/user as mob) - usr << "You have accumulated [points] out of the [goal] points you need for freedom." + usr << "You have accumulated [points] out of the [goal] points you need for freedom." /obj/item/weapon/card/id/prisoner/one name = "Prisoner #13-001" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 075bab36a2a..230226e315b 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -373,7 +373,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O if(!packeditem) if(G.dry == 1) - user << "You stuff [O] into [src]." + user << "You stuff [O] into [src]." smoketime = 400 packeditem = 1 name = "[O.name]-packed [initial(name)]" @@ -381,18 +381,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM O.reagents.trans_to(src, O.reagents.total_volume) qdel(O) else - user << "It has to be dried first." + user << "It has to be dried first!" else - user << "It is already packed." + user << "It is already packed!" else - user << "You can't put that in the pipe." + user << "You can't put that in the pipe!" ..() /obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user as mob) var/turf/location = get_turf(user) if(lit) - user.visible_message("[user] puts out [src].") + user.visible_message("[user] puts out [src].", "You put out [src].") lit = 0 icon_state = icon_off item_state = icon_off @@ -479,16 +479,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM force = 5 damtype = "fire" hitsound = 'sound/items/welder.ogg' - attack_verb = list("burnt", "singed") + attack_verb = list("burnt", "signed") if(istype(src, /obj/item/weapon/lighter/zippo) ) - user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.") + user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "Without even breaking stride, you flip open and lights [src] in one smooth movement.") else if(prob(75)) - user.visible_message("After a few attempts, [user] manages to light [src].") + user.visible_message("After a few attempts, [user] manages to light [src].", "After a few attempts, you manage to light [src].") else - user << "You burn yourself while lighting the lighter." user.adjustFireLoss(5) - user.visible_message("After a few attempts, [user] manages to light [src], they however burn their finger in the process.") + user.visible_message("After a few attempts, [user] manages to light [src] - they however burn their finger in the process.", "You burn yourself while lighting the lighter!") user.AddLuminosity(1) SSobj.processing |= src @@ -499,9 +498,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM force = 0 attack_verb = null //human_defense.dm takes care of it if(istype(src, /obj/item/weapon/lighter/zippo) ) - user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing. Wow.") + user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing. Wow.", "You quietly shut off [src] without even looking at what you're doing. Wow.") else - user.visible_message("[user] quietly shuts off [src].") + user.visible_message("[user] quietly shuts off [src].", "You quietly shut off [src].") user.AddLuminosity(-1) SSobj.processing.Remove(src) @@ -572,6 +571,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM qdel(target) qdel(src) else - user << "You need to dry this first." + user << "You need to dry this first!" else ..() diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 1f0a51cc022..f67f6013119 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -46,17 +46,17 @@ //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn if(user.client && (target in user.client.screen)) - user << "You need to take that [target.name] off before cleaning it." + user << "You need to take that [target.name] off before cleaning it!" else if(istype(target,/obj/effect/decal/cleanable)) - user.visible_message("[user] begins to scrub \the [target.name] out with [src].") + user.visible_message("[user] begins to scrub \the [target.name] out with [src].", "You begin to scrub \the [target.name] out with [src]...") if(do_after(user, src.cleanspeed)) user << "You scrub \the [target.name] out." qdel(target) else if(ishuman(target) && user.zone_sel && user.zone_sel.selecting == "mouth") - user.visible_message("\the [user] washes \the [target]'s mouth out with [src.name]!") //washes mouth out with soap sounds better than 'the soap' here + user.visible_message("\the [user] washes \the [target]'s mouth out with [src.name]!", "You wash \the [target]'s mouth out with [src.name]!") //washes mouth out with soap sounds better than 'the soap' here return else - user.visible_message("[user] begins to clean \the [target.name] with [src].") + user.visible_message("[user] begins to clean \the [target.name] with [src]...", "You begin to clean \the [target.name] with [src]...") if(do_after(user, src.cleanspeed)) user << "You clean \the [target.name]." var/obj/effect/decal/cleanable/C = locate() in target diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index c40f89ddc7b..bd7c7c6f8bc 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -14,8 +14,9 @@ colour = "purple" /obj/item/weapon/lipstick/jade + //It's still called Jade, but theres no HTML color for jade, so we use lime. name = "jade lipstick" - colour = "jade" + colour = "lime" /obj/item/weapon/lipstick/black name = "black lipstick" @@ -26,17 +27,21 @@ name = "lipstick" /obj/item/weapon/lipstick/random/New() - colour = pick("red","purple","jade","black") + colour = pick("red","purple","lime","black","green","blue","white") name = "[colour] lipstick" /obj/item/weapon/lipstick/attack_self(mob/user) + overlays.Cut() user << "You twist \the [src] [open ? "closed" : "open"]." open = !open if(open) - icon_state = "[initial(icon_state)]_[colour]" + var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color") + colored.color = colour + icon_state = "lipstick_uncap" + overlays += colored else - icon_state = initial(icon_state) + icon_state = "lipstick" /obj/item/weapon/lipstick/attack(mob/M, mob/user) if(!open) return @@ -45,24 +50,29 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M + if(H.is_mouth_covered()) + user << "Remove [ H == user ? "your" : "their" ] mask!" + return if(H.lip_style) //if they already have lipstick on - user << "You need to wipe off the old lipstick first!" + user << "You need to wipe off the old lipstick first!" return if(H == user) user.visible_message("[user] does their lips with \the [src].", \ "You take a moment to apply \the [src]. Perfect!") - H.lip_style = colour + H.lip_style = "lipstick" + H.lip_color = colour H.update_body() else user.visible_message("[user] begins to do [H]'s lips with \the [src].", \ - "You begin to apply \the [src].") + "You begin to apply \the [src] on [H]'s lips...") if(do_after(user, 20) && do_after(H, 20, 5, 0)) //user needs to keep their active hand, H does not. - user.visible_message("[user] does [H]'s lips with \the [src].", \ - "You apply \the [src].") - H.lip_style = colour + user.visible_message("[user] does [H]'s lips with \the [src].", \ + "You apply \the [src] on [H]'s lips.") + H.lip_style = "lipstick" + H.lip_color = colour H.update_body() else - user << "Where are the lips on that?" + user << "Where are the lips on that?" //you can wipe off lipstick with paper! /obj/item/weapon/paper/attack(mob/M, mob/user) @@ -78,9 +88,9 @@ H.update_body() else user.visible_message("[user] begins to wipe [H]'s lipstick off with \the [src].", \ - "You begin to wipe off [H]'s lipstick.") + "You begin to wipe off [H]'s lipstick...") if(do_after(user, 10) && do_after(H, 10, 5, 0)) //user needs to keep their active hand, H does not. - user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ + user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ "You wipe off [H]'s lipstick.") H.lip_style = null H.update_body() @@ -114,23 +124,23 @@ var/location = user.zone_sel.selecting if(location == "mouth") if(!get_location_accessible(H, location)) - user << "The mask is in the way." + user << "The mask is in the way!" return if(H.facial_hair_style == "Shaved") - user << "Already clean-shaven." + user << "Already clean-shaven!" return if(H == user) //shaving yourself - user.visible_message("[user] starts to shave their facial hair with [src].", \ - "You take a moment to shave your facial hair with [src].") + user.visible_message("[user] starts to shave their facial hair with [src].", \ + "You take a moment to shave your facial hair with [src]...") if(do_after(user, 50)) - user.visible_message("[user] shaves his facial hair clean with [src].", \ + user.visible_message("[user] shaves his facial hair clean with [src].", \ "You finish shaving with [src]. Fast and clean!") shave(H, location) else var/turf/H_loc = H.loc user.visible_message("[user] tries to shave [H]'s facial hair with [src].", \ - "You start shaving [H]'s facial hair.") + "You start shaving [H]'s facial hair...") if(do_after(user, 50)) if(H_loc == H.loc) user.visible_message("[user] shaves off [H]'s facial hair with [src].", \ @@ -139,23 +149,23 @@ else if(location == "head") if(!get_location_accessible(H, location)) - user << "The headgear is in the way." + user << "The headgear is in the way!" return if(H.hair_style == "Bald" || H.hair_style == "Balding Hair" || H.hair_style == "Skinhead") - user << "There is not enough hair left to shave!" + user << "There is not enough hair left to shave!" return if(H == user) //shaving yourself - user.visible_message("[user] starts to shave their head with [src].", \ - "You start to shave your head with [src].") + user.visible_message("[user] starts to shave their head with [src].", \ + "You start to shave your head with [src]...") if(do_after(user, 50)) - user.visible_message("[user] shaves his head with [src].", \ + user.visible_message("[user] shaves his head with [src].", \ "You finish shaving with [src].") shave(H, location) else var/turf/H_loc = H.loc user.visible_message("[user] tries to shave [H]'s head with [src]!", \ - "You start shaving [H]'s head.") + "You start shaving [H]'s head...") if(do_after(user, 50)) if(H_loc == H.loc) user.visible_message("[user] shaves [H]'s head bald with [src]!", \ diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index fae1e6b4063..a44dc2c14e0 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -257,7 +257,7 @@ update_icon() return -/obj/item/weapon/defibrillator/compact/combat/attackby(obj/item/weapon/W, mob/user, params) +/obj/item/weapon/defibrillator/compact/combat/loaded/attackby(obj/item/weapon/W, mob/user, params) if(W == paddles) paddles.unwield() toggle_paddles() @@ -323,8 +323,7 @@ return 1 /obj/item/weapon/twohanded/shockpaddles/attack(mob/M, mob/user) - var/tobehealed - var/threshold = -config.health_threshold_dead + var/halfwaycritdeath = (config.health_threshold_crit + config.health_threshold_dead) / 2 var/mob/living/carbon/human/H = M if(busy) @@ -334,13 +333,13 @@ playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) return if(!wielded) - user << "You need to wield the paddles in both hands before you can use them on someone!" + user << "You need to wield the paddles in both hands before you can use them on someone!" return if(cooldown) - user << "[defib] is recharging." + user << "[defib] is recharging!" return if(!ishuman(M)) - user << "The instructions on [defib] don't mention how to revive that..." + user << "The instructions on [defib] don't mention how to revive that..." return else if(user.a_intent == "harm" && !defib.safety) @@ -360,7 +359,7 @@ defib.cooldowncheck(user) return if(user.zone_sel && user.zone_sel.selecting == "chest") - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...") busy = 1 update_icon() if(do_after(user, 30)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process @@ -376,7 +375,7 @@ for(var/obj/item/carried_item in H.contents) if(istype(carried_item, /obj/item/clothing/suit/space)) if(!defib.combat) - user.visible_message("[defib] buzzes: Patient's chest is obscured. Operation aborted.") + user.visible_message("[defib] buzzes: Patient's chest is obscured. Operation aborted.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) busy = 0 update_icon() @@ -385,20 +384,23 @@ 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.") playsound(get_turf(src), "bodyfall", 50, 1) playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) for(var/obj/item/organ/limb/O in H.organs) total_brute += O.brute_dam total_burn += O.burn_dam - if(H.health <= config.health_threshold_dead && total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) - tobehealed = health + threshold - tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived - H.adjustOxyLoss(tobehealed) - H.adjustToxLoss(tobehealed) - H.adjustFireLoss(tobehealed) - H.adjustBruteLoss(tobehealed) + if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) + //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit + if (H.health > halfwaycritdeath) + H.adjustOxyLoss(H.health - halfwaycritdeath) + else + var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() + var/mobhealth = H.health + H.adjustOxyLoss((mobhealth - halfwaycritdeath) * (H.getOxyLoss() / overall_damage)) + H.adjustToxLoss((mobhealth - halfwaycritdeath) * (H.getToxLoss() / overall_damage)) + H.adjustFireLoss((mobhealth - halfwaycritdeath) * (total_burn / overall_damage)) + H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage)) user.visible_message("[defib] pings: Resuscitation successful.") playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) H.stat = 1 @@ -410,12 +412,14 @@ defib.deductcharge(revivecost) add_logs(user, M, "revived", object="defibrillator") else - if(tplus > tlimit) - user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") + if (H.suiciding || (NOCLONE in H.mutations)) + user.visible_message("[defib] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile.") + else if (tplus > tlimit) + user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation. Further attempts futile.") else if(total_burn >= 180 || total_brute >= 180) user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") else - user.visible_message("[defib] buzzes: Resuscitation failed.") + user.visible_message("[defib] buzzes: Resuscitation failed - No soul in patient body. Further attempts may be successful.") if(ghost) ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" ghost << sound('sound/effects/genetics.ogg') @@ -425,10 +429,10 @@ cooldown = 1 defib.cooldowncheck(user) else - user.visible_message("[defib] buzzes: Patient is not in a valid state. Operation aborted.") + user.visible_message("[defib] buzzes: Patient is not in a valid state. Operation aborted.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) busy = 0 update_icon() else - user << "You need to target your patient's chest with [src]." + user << "You need to target your patient's chest with [src]!" return \ No newline at end of file diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 81c98702773..0f6da959109 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -72,9 +72,9 @@ if(initial(icon_state) == "d00") result = (result - 1)*10 if(user != null) //Dice was rolled in someone's hand - user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ + user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ "You throw [src]. It lands on [result]. [comment]", \ - "You hear [src] landing on [result]. [comment]") + "You hear [src] rolling.") else if(src.throwing == 0) //Dice was thrown and is coming to rest visible_message("[src] rolls to a stop, landing on [result]. [comment]") diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 0d5d6fb2695..49df5b897c7 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -46,7 +46,7 @@ /obj/item/weapon/dnainjector/attack(mob/target, mob/user) if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return if(ishuman(target)) var/mob/living/carbon/human/humantarget = target diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index d1ad1fb981d..8f992ab49d1 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -66,7 +66,7 @@ if(loc == target) return - user << "Planting explosives..." + user << "You start planting the bomb..." if(do_after(user, 50) && in_range(user, target)) user.drop_item() @@ -75,7 +75,7 @@ if (ismob(target)) add_logs(user, target, "planted [name] on") - user.visible_message("[user.name] finished planting an explosive on [target.name]!") + user.visible_message("[user.name] finished planting an explosive on [target.name].", "You finish planting an explosive on [target.name].") message_admins("[key_name(user, user.client)](?) planted [src.name] on [key_name(target)](?) with [timer] second fuse",0,1) log_game("[key_name(user)] planted [src.name] on [key_name(target)] with [timer] second fuse") @@ -84,7 +84,7 @@ log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") target.overlays += image_overlay - user << "Bomb has been planted. Timer counting down from [timer]." + user << "You plant the bomb. Timer counting down from [timer]." spawn(timer*10) if(target && !target.gc_destroyed) explode(get_turf(target)) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index f4dd08ea68f..607bdf5f378 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -51,18 +51,18 @@ var/safety_save = safety safety = 1 if(reagents.total_volume == reagents.maximum_volume) - user << "\The [src] is already full!" + user << "\The [src] is already full!" safety = safety_save return 1 var/obj/structure/reagent_dispensers/watertank/W = target var/transferred = W.reagents.trans_to(src, max_water) if(transferred > 0) - user << "\The [src] has been refilled by [transferred] units" + user << "\The [src] has been refilled by [transferred] units." playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) for(var/datum/reagent/water/R in reagents.reagent_list) R.cooling_temperature = cooling_power else - user << "\The [W] is empty!" + user << "\The [W] is empty!" safety = safety_save return 1 else @@ -77,7 +77,7 @@ return if (!safety) if (src.reagents.total_volume < 1) - usr << "\The [src] is empty." + usr << "\The [src] is empty!" return if (world.time < src.last_use + 20) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 5c0f7722a70..b36865df202 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -50,7 +50,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris, /obj/item/device/paicard, - /obj/item/device/violin, + /obj/item/device/instrument/violin, + /obj/item/device/instrument/guitar, /obj/item/weapon/storage/belt/utility/full, /obj/item/clothing/tie/horrible, /obj/item/clothing/suit/jacket/leather, @@ -86,4 +87,4 @@ max_amount = 25 /obj/item/stack/wrapping_paper/attack_self(mob/user) - user << "You need to use it on a package that has already been wrapped!" + user << "You need to use it on a package that has already been wrapped!" diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 5826fe552f9..84a7e5c8c6a 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -55,16 +55,16 @@ user << "You lock the [initial(name)] assembly." playsound(loc, 'sound/items/Screwdriver.ogg', 25, -3) else - user << "You need to add at least one beaker before locking the [initial(name)] assembly." + user << "You need to add at least one beaker before locking the [initial(name)] assembly!" else if(stage == READY && !nadeassembly) det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 user << "You modify the time delay. It's set for [det_time / 10] second\s." else if(stage == EMPTY) - user << "You need to add an activation mechanism." + user << "You need to add an activation mechanism!" else if(stage == WIRED && is_type_in_list(I, allowed_containers)) if(beakers.len == 2) - user << "[src] can not hold more containers." + user << "[src] can not hold more containers!" return else if(I.reagents.total_volume) @@ -73,7 +73,7 @@ I.loc = src beakers += I else - user << "[I] is empty." + user << "[I] is empty!" else if(stage == EMPTY && istype(I, /obj/item/device/assembly_holder)) var/obj/item/device/assembly_holder/A = I @@ -87,7 +87,7 @@ assemblyattacher = user.ckey stage_change(WIRED) - user << "You add [A] to the [initial(name)] assembly!" + user << "You add [A] to the [initial(name)] assembly./span>" else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = I @@ -96,7 +96,7 @@ stage_change(WIRED) user << "You rig the [initial(name)] assembly." else - user << "You need one length of coil to wire the assembly." + user << "You need one length of coil to wire the assembly!" return else if(stage == READY && istype(I, /obj/item/weapon/wirecutters)) @@ -211,9 +211,17 @@ reagents.chem_temp = total_temp /obj/item/weapon/grenade/chem_grenade/proc/can_flood_from(myloc, maxrange) + var/turf/myturf = get_turf(myloc) var/list/reachable = list(myloc) for(var/i=1; i<=maxrange; i++) + var/list/turflist = list() for(var/turf/T in (orange(i, myloc) - orange(i-1, myloc))) + turflist |= T + for(var/turf/T in turflist) + if( !(get_dir(T,myloc) in cardinal) && (abs(T.x - myturf.x) == abs(T.y - myturf.y) )) + turflist.Remove(T) + turflist.Add(T) // we move the purely diagonal turfs to the end of the list. + for(var/turf/T in turflist) if(T in reachable) continue for(var/turf/NT in orange(1, T)) if(!(NT in reachable)) continue @@ -288,8 +296,8 @@ var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("aluminium", 25) - B2.reagents.add_reagent("plasma", 25) + B1.reagents.add_reagent("phosphorus", 25) + B2.reagents.add_reagent("stable_plasma", 25) B2.reagents.add_reagent("sacid", 25) beakers += B1 diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index cc35b4024a9..37459241a78 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -32,7 +32,10 @@ /obj/item/weapon/grenade/iedcasing/CheckParts() var/obj/item/weapon/reagent_containers/food/drinks/soda_cans/can = locate() in contents if(can) + var/muh_layer = can.layer + can.layer = FLOAT_LAYER underlays += can + can.layer = muh_layer /obj/item/weapon/grenade/iedcasing/attack_self(mob/user as mob) // diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index e12f568c694..980a749b90d 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -43,7 +43,7 @@ add_logs(user, C, "handcuffed") else - user << "You fail to handcuff [C]." + user << "You fail to handcuff [C]!" /obj/item/weapon/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user) if(!target.handcuffed) @@ -102,7 +102,7 @@ user << "You wrap the cable restraint around the top of the rod." qdel(src) else - user << "You need one rod to make a wired rod." + user << "You need one rod to make a wired rod!" return /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user) @@ -118,7 +118,7 @@ user << "You handcuff [C]." add_logs(user, C, "handcuffed") else - user << "You fail to handcuff [C]." + user << "You fail to handcuff [C]!" /obj/item/weapon/restraints/handcuffs/cable/zipties name = "zipties" diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index a8b7ae88590..ede7ae576c6 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -147,9 +147,9 @@ else injectamount = cause reagents.trans_to(R, injectamount) - R << "You hear a faint *beep*." + R << "You hear a faint beep." if(!reagents.total_volume) - R << "You hear a faint click from your chest." + R << "You hear a faint click from your chest." qdel(src) @@ -173,10 +173,10 @@ /obj/item/weapon/implant/loyalty/implanted(mob/target) ..() - if((target.mind in ticker.mode.head_revolutionaries) || (target.mind in ticker.mode.A_bosses) || (target.mind in ticker.mode.B_bosses)) + if((target.mind in (ticker.mode.head_revolutionaries | ticker.mode.A_bosses | ticker.mode.B_bosses)) || is_shadow_or_thrall(target)) target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") return 0 - if((target.mind in ticker.mode.revolutionaries) || (target.mind in ticker.mode.A_gangsters) || (target.mind in ticker.mode.B_gangsters)) + if(target.mind in (ticker.mode.revolutionaries | ticker.mode.A_gang | ticker.mode.B_gang)) ticker.mode.remove_revolutionary(target.mind) ticker.mode.remove_gangster(target.mind, exclude_bosses=0) target << "You feel a surge of loyalty towards Nanotrasen." @@ -213,7 +213,7 @@ imp_in.reagents.add_reagent("synaptizine", 10) imp_in.reagents.add_reagent("omnizine", 10) - imp_in.reagents.add_reagent("morphine", 10) + imp_in.reagents.add_reagent("stimulants", 10) /obj/item/weapon/implant/emp diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index e8ebdd6d7dc..b3023ea69ef 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -25,9 +25,9 @@ var/turf/T = get_turf(M) if(T && (M == user || do_after(user, 50))) if(user && M && (get_turf(M) == T) && src && imp) - M.visible_message("[user] has implanted [M].") + M.visible_message("[user] has implanted [M].", "[user] implants you with the implant.") add_logs(user, M, "implanted", object="[name]") - user << "You implanted the implant into [M]." + user << "You implant the implant into [M]." if(imp.implanted(M)) imp.loc = M imp.imp_in = M diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 94a1afa043c..5136e6073d2 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -686,7 +686,8 @@ All doughs can be microwaved.
      Bowl: Add water to it for soup preparation.
      Meat: Microwave it, process it, slice it into microwavable cutlets with your knife, or use it raw.
      - Cheese: Add 5u universal enzyme (catalyst) to milk and soy milk to prepare cheese (sliceable) and tofu. + Cheese: Add 5u universal enzyme (catalyst) to milk and soy milk to prepare cheese (sliceable) and tofu.
      + Rice: Mix 10u rice with 10u water in a bowl then microwave it.

      Custom food:

      Add ingredients to a base item to prepare a custom meal.
      diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index d1e142cd09f..886ce709f86 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -3,7 +3,7 @@ var/force_on = 30 //force when active var/throwforce_on = 20 var/icon_state_on = "axe1" - var/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") w_class = 2 var/w_class_on = 4 @@ -31,7 +31,7 @@ flags = CONDUCT | NOSHIELD origin_tech = "combat=3" attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") - attack_verb_on = null + attack_verb_on = list() /obj/item/weapon/melee/energy/axe/suicide_act(mob/user) user.visible_message("[user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide.") @@ -47,7 +47,6 @@ throw_speed = 3 throw_range = 5 flags = NOSHIELD - attack_verb = null origin_tech = "magnets=3;syndicate=4" var/hacked = 0 @@ -69,7 +68,7 @@ force = force_on throwforce = throwforce_on hitsound = 'sound/weapons/blade1.ogg' - if(attack_verb_on) + if(attack_verb_on.len) attack_verb = attack_verb_on if(!item_color) icon_state = icon_state_on @@ -82,7 +81,8 @@ force = initial(force) throwforce = initial(throwforce) hitsound = initial(hitsound) - attack_verb = initial(attack_verb) + if(attack_verb_on.len) + attack_verb = list() icon_state = initial(icon_state) w_class = initial(w_class) playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index f08ddf39317..5b719a3f190 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -21,8 +21,10 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1)) A.clean_blood() + A.thermite = 0 var/turf/simulated/floor/F = A - F.dirt = 0 + if(istype(F)) + F.dirt = 0 for(var/obj/effect/O in A) if(istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) qdel(O) @@ -34,7 +36,7 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) if(!proximity) return if(reagents.total_volume < 1) - user << "Your mop is dry!" + user << "Your mop is dry!" return var/turf/simulated/turf = A @@ -43,11 +45,11 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) A = null if(istype(turf)) - user.visible_message("[user] begins to clean \the [turf] with [src].") + user.visible_message("[user] begins to clean \the [turf] with [src].", "You begin to clean \the [turf] with [src]...") if(do_after(user, mopspeed)) clean(turf) - user << "You have finished mopping!" + user << "You finish mopping./span>" /obj/effect/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/items/weapons/paiwire.dm b/code/game/objects/items/weapons/paiwire.dm index 83bc76517a6..b7f90a9ee0e 100644 --- a/code/game/objects/items/weapons/paiwire.dm +++ b/code/game/objects/items/weapons/paiwire.dm @@ -1,11 +1,11 @@ /obj/item/weapon/pai_cable/proc/plugin(obj/machinery/M as obj, mob/user as mob) if(istype(M, /obj/machinery/door) || istype(M, /obj/machinery/camera)) - user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.") + user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.") user.drop_item() src.loc = M src.machine = M else - user.visible_message("[user] dumbly fumbles to find a place on [M] to plug in [src].", "There aren't any ports on [M] that match the jack belonging to [src].") + user.visible_message("[user] dumbly fumbles to find a place on [M] to plug in [src].", "There aren't any ports on [M] that match the jack belonging to [src]!") /obj/item/weapon/pai_cable/attack(obj/machinery/M as obj, mob/user as mob) src.plugin(M, user) \ No newline at end of file diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm index 21c85b31297..15451d602a8 100644 --- a/code/game/objects/items/weapons/signs.dm +++ b/code/game/objects/items/weapons/signs.dm @@ -7,6 +7,7 @@ attack_verb = list("bashed","smacked") var/label = "" + var/last_wave = 0 /obj/item/weapon/picket_sign/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/toy/crayon)) @@ -18,11 +19,13 @@ ..() /obj/item/weapon/picket_sign/attack_self(mob/living/carbon/human/user) - if(label) - user.visible_message("[user] waves around \the \"[label]\" sign.") - else - user.visible_message("[user] waves around blank sign.") - user.changeNext_move(CLICK_CD_MELEE) + if( last_wave + 20 < world.time ) + last_wave = world.time + if(label) + user.visible_message("[user] waves around \the \"[label]\" sign.") + else + user.visible_message("[user] waves around blank sign.") + user.changeNext_move(CLICK_CD_MELEE) /datum/table_recipe/picket_sign name = "Picket Sign" diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm index 0df64ef2e05..e2af15774b5 100644 --- a/code/game/objects/items/weapons/singularityhammer.dm +++ b/code/game/objects/items/weapons/singularityhammer.dm @@ -92,7 +92,7 @@ target.take_organ_damage(0,30) target.visible_message("[target.name] was shocked by the [src.name]!", \ "You feel a powerful shock course through your body sending you flying!", \ - "You hear a heavy electrical crack.") + "You hear a heavy electrical crack!") var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) target.throw_at(throw_target, 200, 4) return diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index b5b0d9f60b3..92ebff9c716 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -286,7 +286,7 @@ */ /obj/item/weapon/storage/bag/tray name = "tray" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/containers.dmi' icon_state = "tray" desc = "A metal tray to lay food on." force = 5 diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 4e487b41ad7..9a71db5ab8d 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -134,7 +134,7 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", " add_logs(user, M, "attacked", object="[src.name]") if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return if(!chaplain) user << "The book sizzles in your hands." @@ -152,7 +152,7 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", " if (M.stat !=2) if(M.mind && (M.mind.assigned_role == "Chaplain")) - user << "You can't heal yourself!" + user << "You can't heal yourself!" return /*if((M.mind in ticker.mode.cult) && (prob(20))) M << "\red The power of [src.deity_name] clears your mind of heresy!" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 08bba19ba87..936f6e72425 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -33,18 +33,17 @@ if(!foldable) return if(contents.len) - user << "You can't fold this box with items still inside." + user << "You can't fold this box with items still inside!" return if(!ispath(foldable)) return //Close any open UI windows first - var/found = close_all() - if(!found) //No user had any windows closed - return + close_all() user << "You fold [src] flat." var/obj/item/I = new foldable(get_turf(src)) + user.drop_item() user.put_in_hands(I) user.update_inv_l_hand() user.update_inv_r_hand() @@ -350,7 +349,7 @@ /obj/item/weapon/storage/box/monkeycubes name = "monkey cube box" desc = "Drymate brand monkey cubes. Just add water!" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "monkeycubebox" storage_slots = 7 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 1f3675fc8a1..121a7b505ca 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -15,7 +15,7 @@ */ /obj/item/weapon/storage/fancy/ - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/containers.dmi' icon_state = "donutbox6" name = "donut box" var/icon_type = "donut" @@ -39,7 +39,7 @@ */ /obj/item/weapon/storage/fancy/donut_box - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/containers.dmi' icon_state = "donutbox6" icon_type = "donut" name = "donut box" @@ -58,7 +58,7 @@ */ /obj/item/weapon/storage/fancy/egg_box - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/containers.dmi' icon_state = "eggbox" icon_type = "egg" name = "egg box" @@ -246,7 +246,7 @@ /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims/New() ..() for(var/i = 1 to storage_slots) - reagents.add_reagent("lipozine",4) + reagents.add_reagent("lipolicide",4) reagents.add_reagent("ammonia",2) reagents.add_reagent("plantbgone",1) reagents.add_reagent("toxin",1.5) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 9b7d8f19952..35ec6dfbb1b 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -48,11 +48,11 @@ desc += "It appears to be broken." icon_state = src.icon_broken for(var/mob/O in viewers(user, 3)) - O.show_message(text("\The [src] has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2) + O.show_message(text("\The [src] has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2) return /obj/item/weapon/storage/lockbox/show_to(mob/user as mob) if(locked) - user << "It's locked!" + user << "It's locked!" else ..() return diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index f218df6b7f7..b8c214924f6 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -70,7 +70,7 @@ src.overlays = null overlays += image('icons/obj/storage.dmi', icon_locking) locked = 0 - user << "You short out the lock on [src]." + user << "You short out the lock on [src]." /obj/item/weapon/storage/secure/MouseDrop(over_object, src_location, over_location) if (locked) @@ -159,7 +159,7 @@ /obj/item/weapon/storage/secure/briefcase/attack_hand(mob/user as mob) if ((src.loc == user) && (src.locked == 1)) - usr << "[src] is locked and cannot be opened!" + usr << "[src] is locked and cannot be opened!" else if ((src.loc == user) && (!src.locked)) playsound(src.loc, "rustle", 50, 1, -5) if (user.s_active) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 7eaf4c6304a..ac11ad700f2 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -213,7 +213,7 @@ return 0 //Means the item is already in the storage item if(contents.len >= storage_slots) if(!stop_messages) - usr << "[src] is full, make some space." + usr << "[src] is full, make some space!" return 0 //Storage item is full if(can_hold.len) @@ -224,18 +224,18 @@ break if(!ok) if(!stop_messages) - usr << "[src] cannot hold [W]." + usr << "[src] cannot hold [W]!" return 0 for(var/A in cant_hold) //Check for specific items which this container can't hold. if(istype(W, A)) if(!stop_messages) - usr << "[src] cannot hold [W]." + usr << "[src] cannot hold [W]!" return 0 if(W.w_class > max_w_class) if(!stop_messages) - usr << "[W] is too big for [src]." + usr << "[W] is too big for [src]!" return 0 var/sum_w_class = W.w_class @@ -244,17 +244,17 @@ if(sum_w_class > max_combined_w_class) if(!stop_messages) - usr << "[src] is full, make some space." + usr << "[src] is full, make some space!" return 0 if(W.w_class >= w_class && (istype(W, /obj/item/weapon/storage))) if(!istype(src, /obj/item/weapon/storage/backpack/holding)) //bohs should be able to hold backpacks again. The override for putting a boh in a boh is in backpack.dm. if(!stop_messages) - usr << "[src] cannot hold [W] as it's a storage item of the same size." + usr << "[src] cannot hold [W] as it's a storage item of the same size!" return 0 //To prevent the stacking of same sized storage items. if(W.flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry. - usr << "\the [W] is stuck to your hand, you can't put it in \the [src]" + usr << "\the [W] is stuck to your hand, you can't put it in \the [src]!" return 0 return 1 @@ -325,7 +325,7 @@ ..() if(isrobot(user)) - user << "You're a robot. No." + user << "You're a robot. No." return 0 //Robots can't interact with storage items. if(!can_be_inserted(W, 0 , user)) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 878b80b8b05..7654a396f22 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -13,7 +13,6 @@ var/status = 0 var/obj/item/weapon/stock_parts/cell/high/bcell = null var/hitcost = 1000 - var/losspertick = 5 /obj/item/weapon/melee/baton/suicide_act(mob/user) user.visible_message("[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.") @@ -45,24 +44,8 @@ else return 0 -/obj/item/weapon/melee/baton/proc/update_process() - if(status) - SSobj.processing |= src - else - SSobj.processing.Remove(src) -/obj/item/weapon/melee/baton/process() - if(bcell) - if(bcell.charge < hitcost) - status = 0 - update_icon() - if(status) - if(isrobot(loc)) - var/mob/living/silicon/robot/R = loc - if(R && R.cell) - R.cell.use(losspertick) - else - bcell.use(losspertick) + /obj/item/weapon/melee/baton/update_icon() if(status) @@ -71,7 +54,6 @@ icon_state = "[initial(name)]_nocell" else icon_state = "[initial(name)]" - update_process() /obj/item/weapon/melee/baton/examine(mob/user) ..() diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 65a043fa5de..e83c50f5594 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -23,7 +23,7 @@ if(usr.stat || !usr.canmove || usr.restrained()) return src.stabilization_on = !( src.stabilization_on ) - usr << "You toggle the stabilization [stabilization_on? "on":"off"]." + usr << "You toggle the stabilization [stabilization_on? "on":"off"]." return @@ -41,7 +41,7 @@ icon_state = initial(icon_state) // item_state = initial(item_state) ion_trail.stop() - usr << "You toggle the jetpack [on? "on":"off"]." + usr << "You toggle the jetpack [on? "on":"off"]." return @@ -129,10 +129,10 @@ var/mob/living/carbon/human/H = loc.loc if(!H.wear_suit) - H << "You must be wearing the suit to use the inbuilt jetpack." + H << "You must be wearing the suit to use the inbuilt jetpack!" return if(!istype(H.s_store,/obj/item/weapon/tank/internals)) - H << "You must have a tank in your suit's storage to use the inbuilt jetpack." + H << "You must have a tank in your suit's storage to use the inbuilt jetpack!" return if(usr.stat || !usr.canmove || usr.restrained()) return @@ -146,7 +146,7 @@ icon_state = "[icon_state]-on" else turn_off() - H << "You toggle the inbuilt jetpack [on? "on":"off"]." + H << "You toggle the inbuilt jetpack [on? "on":"off"]." /obj/item/weapon/tank/jetpack/suit/proc/turn_off() on = 0 diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index ab28088dfe3..63d46028ba5 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -102,7 +102,7 @@ Tank
      Tank Pressure: [air_contents.return_pressure()]

      -Mask Release Pressure: - - [distribute_pressure] + +
      +Mask Release Pressure: - - [distribute_pressure] + +
      Mask Release Valve: [using_internal?("Open"):("Closed")] "} user << browse(message, "window=tank;size=600x300") @@ -135,7 +135,7 @@ if (location.internals) location.internals.icon_state = "internal1" else - usr << "You need something to connect to \the [src]." + usr << "You need something to connect to \the [src]!" src.add_fingerprint(usr) /* diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 72389fa1df1..d634d9a832c 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -26,9 +26,9 @@ set name = "Toggle Mister" set category = "Object" if (usr.get_item_by_slot(slot_back) != src) - usr << "The watertank needs to be on your back to use." + usr << "The watertank needs to be on your back to use!" return - if(usr.stat || !usr.canmove || usr.restrained()) + if(usr.incapacitated()) return on = !on @@ -40,7 +40,7 @@ //Detach the nozzle into the user's hands if(!user.put_in_hands(noz)) on = 0 - user << "You need a free hand to hold the mister." + user << "You need a free hand to hold the mister!" return noz.loc = user else @@ -268,10 +268,10 @@ return //Safety check so you don't blast yourself trying to refill your tank var/datum/reagents/R = reagents if(R.total_volume < 100) - user << "You need at least 100 units of water to use the nanofrost launcher!" + user << "You need at least 100 units of water to use the nanofrost launcher!" return if(nanofrost_cooldown) - user << "Nanofrost launcher is still recharging" + user << "Nanofrost launcher is still recharging..." return nanofrost_cooldown = 1 R.remove_any(100) @@ -297,7 +297,7 @@ if(src) metal_synthesis_cooldown-- else - user << "Metal foam mix is still being synthesized." + user << "Metal foam mix is still being synthesized..." return /obj/effect/nanofrost_container diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 86f9a77bd46..7603df34290 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -289,7 +289,7 @@ return 1 else if(M) - M << "You need more welding fuel to complete this task." + M << "You need more welding fuel to complete this task!" return 0 @@ -316,7 +316,7 @@ //Toggles the welder off and on /obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0) if(!status) - user << "[src] can't be turned on while unsecured." + user << "[src] can't be turned on while unsecured!" return welding = !welding if(welding) @@ -328,13 +328,13 @@ update_icon() SSobj.processing |= src else - user << "You need more fuel." + user << "You need more fuel!" welding = 0 else if(!message) user << "You switch [src] off." else - user << "[src] shuts off!" + user << "[src] shuts off!" force = 3 damtype = "brute" hitsound = "swing_hit" @@ -342,7 +342,7 @@ /obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) - user << "Turn it off first." + user << "Turn it off first!" return status = !status if(status) @@ -363,7 +363,7 @@ user << "You add a rod to a welder, starting to build a flamethrower." user.put_in_hands(F) else - user << "You need one rod to start building a flamethrower." + user << "You need one rod to start building a flamethrower!" return /obj/item/weapon/weldingtool/largetank diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 32349ddb581..2735a07f8b7 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -47,7 +47,7 @@ user << "It's too heavy for you to wield fully." return if(user.get_inactive_hand()) - user << "You need your other hand to be empty" + user << "You need your other hand to be empty!" return wielded = 1 force = force_wielded @@ -230,13 +230,13 @@ obj/item/weapon/twohanded/ /obj/item/weapon/twohanded/dualsaber/attack_hulk(mob/living/carbon/human/user) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up if(wielded) - user << "You cant pick up such dangerous item with your meaty hands without losing fingers, better not to." + user << "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!" return 1 /obj/item/weapon/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds. if(istype(M)) if(M.dna.check_mutation(HULK)) - M << "You lack the grace to wield this." + M << "You lack the grace to wield this!" return ..() hitsound = 'sound/weapons/blade1.ogg' diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 57d102eb03f..e7f13f3a881 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -158,4 +158,40 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) +/obj/item/weapon/switchblade + name = "switchblade" + icon_state = "switchblade" + desc = "A sharp, concealable, spring-loaded knife." + flags = CONDUCT + force = 20 + w_class = 2 + throwforce = 15 + throw_speed = 3 + throw_range = 6 + m_amt = 12000 + origin_tech = "materials=1" + hitsound = 'sound/weapons/Genhit.ogg' + attack_verb = list("stubbed", "poked") + var/extended +/obj/item/weapon/switchblade/attack_self(mob/user) + extended = !extended + playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1) + if(extended) + force = 20 + w_class = 3 + throwforce = 15 + icon_state = "switchblade_ext" + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + else + force = 1 + w_class = 2 + throwforce = 5 + icon_state = "switchblade" + attack_verb = list("stubbed", "poked") + hitsound = 'sound/weapons/Genhit.ogg' + +/obj/item/weapon/switchblade/suicide_act(mob/user) + user.visible_message("[user] is slitting \his own throat with the [src.name]! It looks like \he's trying to commit suicide.") + return (BRUTELOSS) \ No newline at end of file diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index e303f91ece2..09d1b6414e6 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -66,11 +66,11 @@ return if( istype(I, /obj/item/weapon/screwdriver)) if(!panel_open) - user << "You open the maintenance panel." + user << "You open the maintenance panel." set_sign(new /datum/barsign/hiddensigns/signoff) panel_open = 1 else - user << "You close the maintenance panel." + user << "You close the maintenance panel." if(!broken && !emagged) set_sign(pick(barsigns)) else if(emagged) @@ -82,17 +82,17 @@ if(istype(I, /obj/item/stack/cable_coil) && panel_open) var/obj/item/stack/cable_coil/C = I if(emagged) //Emagged, not broken by EMP - user << "Sign has been damaged beyond repair." + user << "Sign has been damaged beyond repair!" return else if(!broken) - user << "This sign is functioning properly." + user << "This sign is functioning properly!" return if(C.use(2)) user << "You replace the burnt wiring." broken = 0 else - user << "You need at least two lengths of cable." + user << "You need at least two lengths of cable!" @@ -105,7 +105,7 @@ /obj/structure/sign/barsign/emag_act(mob/user) if(broken || emagged) - user << "Nothing interesting happens." + user << "Nothing interesting happens!" return user << "You emag the barsign. Takeover in progress..." sleep(100) //10 seconds @@ -142,55 +142,55 @@ /datum/barsign/maltesefalcon name = "Maltese Falcon" icon = "maltesefalcon" - desc = "The Maltese Falcon, Space Bar and Grill" + desc = "The Maltese Falcon, Space Bar and Grill." /datum/barsign/thebark name = "The Bark" icon = "thebark" - desc = "Ian's bar of choice" + desc = "Ian's bar of choice." /datum/barsign/harmbaton name = "The Harmbaton" icon = "theharmbaton" - desc = "A great dining experience for both security members and assistants" + desc = "A great dining experience for both security members and assistants." /datum/barsign/thesingulo name = "The Singulo" icon = "thesingulo" - desc = "Where people go that'd rather not be called by their name" + desc = "Where people go that'd rather not be called by their name." /datum/barsign/thedrunkcarp name = "The Drunk Carp" icon = "thedrunkcarp" - desc = "Don't drink and Swim" + desc = "Don't drink and swim." /datum/barsign/scotchservinwill name = "Scotch Servin Willy's" icon = "scotchservinwill" - desc = "Willy sure moved up in the world from clown to bartender" + desc = "Willy sure moved up in the world from clown to bartender." /datum/barsign/officerbeersky name = "Officer Beersky's" icon = "officerbeersky" - desc = "Man eat a dong, these drinks are great" + desc = "Man eat a dong, these drinks are great." /datum/barsign/thecavern name = "The Cavern" icon = "thecavern" - desc = "Fine drinks while listening to some fine tunes" + desc = "Fine drinks while listening to some fine tunes." /datum/barsign/theouterspess name = "The Outer Spess" icon = "theouterspess" - desc = "This bar isn't actually located in outer space" + desc = "This bar isn't actually located in outer space." /datum/barsign/slipperyshots @@ -268,6 +268,10 @@ icon = "thealenath" desc = "All right, buddy. I think you've had EI NATH. Time to get a cab." +/datum/barsign/thealohasnackbar + name = "The Aloha Snackbar" + icon = "alohasnackbar" + desc = "A tasteful, inoffensive tiki bar sign." /datum/barsign/hiddensigns diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index a671823fdf2..8b11247a122 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -202,7 +202,7 @@ LINEN BINS update_icon() else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. if(!user.drop_item()) - user << "\The [I] is stuck to your hand, you cannot hide it among the sheets!" + user << "\The [I] is stuck to your hand, you cannot hide it among the sheets!" return I.loc = src hidden = I diff --git a/code/game/objects/structures/crates_lockers/bins.dm b/code/game/objects/structures/crates_lockers/bins.dm index 295d4a86c9d..edabca55fb7 100644 --- a/code/game/objects/structures/crates_lockers/bins.dm +++ b/code/game/objects/structures/crates_lockers/bins.dm @@ -2,6 +2,7 @@ desc = "A trash bin, place your trash here for the janitor to collect." name = "trash bin" icon_crate = "largebins" + icon_state = "largebins" anchored = 1 sound_effect_open = 'sound/effects/bin_open.ogg' sound_effect_close = 'sound/effects/bin_close.ogg' @@ -46,16 +47,16 @@ . = ..(O, user, 0, 0, 0) if(.) if(O != user) - user.visible_message("[user] tries to stuff [O] into [src].", \ + user.visible_message("[user] tries to stuff [O] into [src].", \ "You try to stuff [O] into [src].", \ - "You hear clanging.") + "You hear clanging.") if (!do_after(user, 40)) return if(!..(O, user, 0, 0)) return - user.visible_message("[user] stuffs [O] into[src].", \ + user.visible_message("[user] stuffs [O] into[src].", \ "You stuff [O] into [src].", \ - "You hear a loud metal bang.") + "You hear a loud metal bang.") insert(O, 1, !opened) if(opened) close() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 770783d972b..bf2f725f6c2 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -5,6 +5,8 @@ icon_state = "generic" density = 1 var/icon_door = null + var/icon_door_override = 0 //override to have open overlay use icon different to its base's + var/secure = 0 //secure locker or not, also used if overriding a non-secure locker with a secure door overlay to add fancy lights var/opened = 0 var/welded = 0 var/locked = 0 @@ -36,8 +38,27 @@ overlays += "[icon_state]_door" if(welded) overlays += "welded" + if(secure) + if(!broken) + if(locked) + overlays += "locked" + else + overlays += "unlocked" + else + overlays += "off" else - overlays += "[icon_state]_open" + if(icon_door_override) + overlays += "[icon_door]_open" + else + overlays += "[icon_state]_open" + +/obj/structure/closet/examine(mob/user) + ..() + if(secure) + if(broken || opened || !ishuman(user)) + return //Monkeys don't get a message, nor does anyone if it's open or emagged + else + user << "Alt-click the locker to [locked ? "unlock" : "lock"] it." /obj/structure/closet/alter_health() return get_turf(src) @@ -47,7 +68,7 @@ return (!density) /obj/structure/closet/proc/can_open() - if(src.welded) + if(src.welded || src.locked) return 0 return 1 @@ -77,10 +98,8 @@ /obj/structure/closet/proc/open() if(src.opened) return 0 - if(!src.can_open()) return 0 - src.dump_contents() src.opened = 1 @@ -124,7 +143,6 @@ return 0 if(!src.can_close()) return 0 - take_contents() src.opened = 0 @@ -170,6 +188,8 @@ /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(user.loc == src) + return if(opened) if(istype(W, /obj/item/weapon/grab)) if(src.large) @@ -181,7 +201,6 @@ return if(istype(W,/obj/item/tk_grab)) return 0 - if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) @@ -192,16 +211,13 @@ return playsound(loc, 'sound/items/Welder2.ogg', 50, 1) new /obj/item/stack/sheet/metal(src.loc) - visible_message("[user] has cut \the [src] apart with \the [WT].", "You hear welding.") + visible_message("[user] has cut \the [src] apart with \the [WT].", "You hear welding.") qdel(src) return - if(isrobot(user)) return - if(user.drop_item()) W.Move(loc) - else if(istype(W, /obj/item/stack/packageWrap)) return @@ -215,14 +231,20 @@ return playsound(loc, 'sound/items/welder.ogg', 50, 1) welded = !welded - user << "You [welded ? "welded [src] shut":"unwelded [src]"]." + user << "You [welded ? "weld [src] shut":"unweld [src]"]." update_icon() - user.visible_message("[user.name] has [welded ? "welded [src] shut":"unwelded [src]"].") + user.visible_message("[user.name] has [welded ? "welded [src] shut":"unwelded [src]"].", "You [welded ? "weld [src] shut":"unweld [src]"].") return + if(secure && broken) + user << "The locker appears to be broken." + return if(!place(user, W)) src.attack_hand(user) /obj/structure/closet/proc/place(var/mob/user, var/obj/item/I) + if(!src.opened) + togglelock(user) + return 1 return 0 /obj/structure/closet/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob, var/needs_opened = 1, var/show_message = 1, var/move_them = 1) @@ -250,15 +272,12 @@ /obj/structure/closet/relaymove(mob/user as mob) if(user.stat || !isturf(src.loc)) return - if(!src.open()) user << "It won't budge!" - if(!lastbang) - lastbang = 1 - for (var/mob/M in get_hearers_in_view(src, null)) + if(world.time > lastbang+5) + lastbang = world.time + for(var/mob/M in get_hearers_in_view(src, null)) M.show_message("BANG, bang!", 2) - spawn(30) - lastbang = 0 /obj/structure/closet/attack_paw(mob/user as mob) @@ -268,14 +287,11 @@ src.add_fingerprint(user) if(!src.toggle()) - usr << "It won't budge!" + return src.attackby(null, user) // tk grab then use on self /obj/structure/closet/attack_self_tk(mob/user as mob) - src.add_fingerprint(user) - - if(!src.toggle()) - user << "It won't budge!" + return src.attack_hand(user) /obj/structure/closet/verb/verb_toggleopen() set src in oview(1) @@ -321,8 +337,7 @@ welded = 0 //applies to all lockers lockers locked = 0 //applies to critter crates and secure lockers only broken = 1 //applies to secure lockers only - visible_message("[user] successfully broke out of [src]!") - user << "You successfully break out of [src]!" + user.visible_message("[user] successfully broke out of [src]!", "You successfully break out of [src]!") if(istype( src.loc, /obj/structure/bigDelivery)) var/obj/structure/bigDelivery/D = src.loc qdel(D) @@ -331,3 +346,54 @@ open() else user << "You fail to break out of [src]!" + +/obj/structure/closet/AltClick(var/mob/user) + ..() + if(user.stat || !user.canmove || user.restrained() || broken) + user << "You can't do that right now." + return + if(src.opened || !secure || !in_range(src, user)) + return + else + togglelock(user) + +/obj/structure/closet/emp_act(severity) + for(var/obj/O in src) + O.emp_act(severity) + if(secure && !broken) + if(prob(50/severity)) + src.locked = !src.locked + src.update_icon() + if(prob(20/severity) && !opened) + if(!locked) + open() + else + src.req_access = list() + src.req_access += pick(get_all_accesses()) + ..() + +/obj/structure/closet/proc/togglelock(mob/user as mob) + if(secure) + if(src.allowed(user)) + src.locked = !src.locked + add_fingerprint(user) + for(var/mob/O in viewers(user, 3)) + if((O.client && !( O.eye_blind ))) + O << "[user] has [locked ? null : "un"]locked the locker." + update_icon() + else + user << "Access Denied" + else + return + +/obj/structure/closet/emag_act(mob/user as mob) + if(secure && !broken) + broken = 1 + locked = 0 + desc += " It appears to be broken." + update_icon() + for(var/mob/O in viewers(user, 3)) + O.show_message("The locker has been broken by [user] with an electromagnetic card!", 1, "You hear a faint electrical spark.", 2) + overlays += "sparking" + spawn(4) //overlays don't support flick so we have to cheat + update_icon() diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index d68d9555c05..1cabfc03243 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -48,8 +48,8 @@ new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/clothing/shoes/combat/swat(src) new /obj/item/clothing/shoes/combat/swat(src) - new /obj/item/clothing/suit/space/deathsquad(src) - new /obj/item/clothing/suit/space/deathsquad(src) + new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) + new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) new /obj/item/clothing/under/syndicate/tacticool(src) new /obj/item/clothing/under/syndicate/tacticool(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index e5b8465d3bf..79a66cda856 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -9,6 +9,7 @@ ..() for(var/i = 0, i < 3, i++) new /obj/item/weapon/reagent_containers/food/condiment/flour(src) + new /obj/item/weapon/reagent_containers/food/condiment/rice(src) new /obj/item/weapon/reagent_containers/food/condiment/sugar(src) /obj/structure/closet/secure_closet/freezer/kitchen/mining @@ -20,7 +21,7 @@ /obj/structure/closet/secure_closet/freezer/meat/New() ..() for(var/i = 0, i < 4, i++) - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src) /obj/structure/closet/secure_closet/freezer/fridge name = "refrigerator" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm index 41242ba802f..fbfeb038a07 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm @@ -49,7 +49,7 @@ new /obj/item/weapon/storage/firstaid/brute(src) new /obj/item/weapon/storage/firstaid/regular(src) new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/defibrillator/compact/combat(src) + new /obj/item/weapon/defibrillator/compact/combat/loaded(src) new /obj/machinery/bot/medbot(src) /obj/structure/closet/secure_closet/ertEngi diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index f6f51b879ee..67292b52f2d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -1,122 +1,7 @@ /obj/structure/closet/secure_closet name = "secure locker" desc = "It's an immobile card-locked storage unit." - density = 1 - opened = 0 locked = 1 icon_state = "secure" - wall_mounted = 0 //never solid (You can always pass over it) health = 200 - -/obj/structure/closet/secure_closet/update_icon()//Putting the welded stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) - ..() - if(!broken) - if(locked) - overlays += "locked" - else - overlays += "unlocked" - else - overlays += "off" - -/obj/structure/closet/secure_closet/examine(mob/user) - ..() - if(broken || opened || !ishuman(user)) - return //Monkeys don't get a message, nor does anyone ief it's open or emagged - else - user << "Alt-click the locker to [locked ? "unlock" : "lock"] it." - -/obj/structure/closet/secure_closet/AltClick(var/mob/user) - ..() - if(!in_range(src, user)) - return - if(!ishuman(user)) - user << "You have no idea how this thing is supposed to work." - return - if(user.stat || !user.canmove || user.restrained() || broken) - user << "You can't do that right now." - return - if(src.opened) - return - else - togglelock(user) - -/obj/structure/closet/secure_closet/can_open() - if(src.locked || src.welded) - return 0 - return 1 - -/obj/structure/closet/secure_closet/emp_act(severity) - for(var/obj/O in src) - O.emp_act(severity) - if(!broken) - if(prob(50/severity)) - src.locked = !src.locked - src.update_icon() - if(prob(20/severity) && !opened) - if(!locked) - open() - else - src.req_access = list() - src.req_access += pick(get_all_accesses()) - ..() - -/obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob) - if(src.allowed(user)) - src.locked = !src.locked - add_fingerprint(user) - for(var/mob/O in viewers(user, 3)) - if((O.client && !( O.eye_blind ))) - O << "[user] has [locked ? null : "un"]locked the locker." - update_icon() - else - user << "Access Denied" - -/obj/structure/closet/secure_closet/place(var/mob/user, var/obj/item/I) - if(!src.opened) - togglelock(user) - return 1 - return 0 - -/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - - if(!src.opened && src.broken) - user << "The locker appears to be broken." - return - else - ..(W, user) - -/obj/structure/closet/secure_closet/emag_act(mob/user as mob) - if(!broken) - broken = 1 - locked = 0 - desc += "It appears to be broken." - update_icon() - - for(var/mob/O in viewers(user, 3)) - O.show_message("The locker has been broken by [user] with an electromagnetic card!", 1, "You hear a faint electrical spark.", 2) - overlays += "sparking" - spawn(4) //overlays don't support flick so we have to cheat - update_icon() - -/obj/structure/closet/secure_closet/relaymove(mob/user as mob) - if(user.stat || !isturf(src.loc)) - return - - if(!(src.locked)) - open() - else - user << "The locker is locked!" - if(world.time > lastbang+5) - lastbang = world.time - for(var/mob/M in get_hearers_in_view(src, null)) - M.show_message("BANG, bang!", 2) - return - -/obj/structure/closet/secure_closet/attack_hand(mob/user as mob) - src.add_fingerprint(user) - - if(!src.toggle()) - return src.attackby(null, user) - -/obj/structure/closet/secure_closet/attack_paw(mob/user as mob) - return src.attack_hand(user) \ No newline at end of file + secure = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 303e3160e37..13dbc939b43 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -22,6 +22,7 @@ /obj/structure/closet/syndicate/nuclear/New() ..() + contents = list() new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 9105fd08796..3290d6cc83c 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -159,6 +159,7 @@ /obj/structure/closet/bombclosetsecurity/New() ..() + contents = list() new /obj/item/clothing/suit/bomb_suit/security( src ) new /obj/item/clothing/under/rank/security( src ) new /obj/item/clothing/shoes/sneakers/brown( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 0b4950b45b5..9f140649769 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -20,6 +20,7 @@ /obj/structure/closet/wardrobe/red/New() ..() + contents = list() new /obj/item/weapon/storage/backpack/security(src) new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/weapon/storage/backpack/dufflebag/sec(src) @@ -46,6 +47,7 @@ /obj/structure/closet/wardrobe/pink/New() ..() + contents = list() new /obj/item/clothing/under/color/pink(src) new /obj/item/clothing/under/color/pink(src) new /obj/item/clothing/under/color/pink(src) @@ -60,6 +62,7 @@ /obj/structure/closet/wardrobe/black/New() ..() + contents = list() new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) @@ -88,6 +91,7 @@ /obj/structure/closet/wardrobe/chaplain_black/New() ..() + contents = list() new /obj/item/clothing/under/rank/chaplain(src) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/suit/nun(src) @@ -106,6 +110,7 @@ /obj/structure/closet/wardrobe/green/New() ..() + contents = list() new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/under/color/green(src) @@ -124,6 +129,7 @@ /obj/structure/closet/wardrobe/orange/New() ..() + contents = list() new /obj/item/clothing/under/rank/prisoner(src) new /obj/item/clothing/under/rank/prisoner(src) new /obj/item/clothing/under/rank/prisoner(src) @@ -139,6 +145,7 @@ /obj/structure/closet/wardrobe/yellow/New() ..() + contents = list() new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/under/color/yellow(src) @@ -156,6 +163,7 @@ /obj/structure/closet/wardrobe/atmospherics_yellow/New() ..() + contents = list() new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) @@ -175,6 +183,7 @@ /obj/structure/closet/wardrobe/engineering_yellow/New() ..() + contents = list() new /obj/item/clothing/under/rank/engineer(src) new /obj/item/clothing/under/rank/engineer(src) new /obj/item/clothing/under/rank/engineer(src) @@ -190,6 +199,7 @@ /obj/structure/closet/wardrobe/white/New() ..() + contents = list() new /obj/item/clothing/under/color/white(src) new /obj/item/clothing/under/color/white(src) new /obj/item/clothing/under/color/white(src) @@ -206,6 +216,7 @@ /obj/structure/closet/wardrobe/white/medical/New() ..() + contents = list() new /obj/item/clothing/under/rank/nursesuit (src) new /obj/item/clothing/head/nursehat (src) new /obj/item/clothing/under/rank/medical/blue(src) @@ -228,6 +239,7 @@ /obj/structure/closet/wardrobe/pjs/New() ..() + contents = list() new /obj/item/clothing/under/pj/red(src) new /obj/item/clothing/under/pj/red(src) new /obj/item/clothing/under/pj/blue(src) @@ -245,6 +257,7 @@ /obj/structure/closet/wardrobe/toxins_white/New() ..() + contents = list() new /obj/item/clothing/under/rank/scientist(src) new /obj/item/clothing/under/rank/scientist(src) new /obj/item/clothing/under/rank/scientist(src) @@ -263,6 +276,7 @@ /obj/structure/closet/wardrobe/robotics_black/New() ..() + contents = list() new /obj/item/clothing/under/rank/roboticist(src) new /obj/item/clothing/under/rank/roboticist(src) new /obj/item/clothing/suit/toggle/labcoat(src) @@ -286,6 +300,7 @@ /obj/structure/closet/wardrobe/chemistry_white/New() ..() + contents = list() new /obj/item/clothing/under/rank/chemist(src) new /obj/item/clothing/under/rank/chemist(src) new /obj/item/clothing/shoes/sneakers/white(src) @@ -305,6 +320,7 @@ /obj/structure/closet/wardrobe/genetics_white/New() ..() + contents = list() new /obj/item/clothing/under/rank/geneticist(src) new /obj/item/clothing/under/rank/geneticist(src) new /obj/item/clothing/shoes/sneakers/white(src) @@ -324,6 +340,7 @@ /obj/structure/closet/wardrobe/virology_white/New() ..() + contents = list() new /obj/item/clothing/under/rank/virologist(src) new /obj/item/clothing/under/rank/virologist(src) new /obj/item/clothing/shoes/sneakers/white(src) @@ -345,6 +362,7 @@ /obj/structure/closet/wardrobe/grey/New() ..() + contents = list() new /obj/item/clothing/under/color/grey(src) new /obj/item/clothing/under/color/grey(src) new /obj/item/clothing/under/color/grey(src) @@ -375,6 +393,7 @@ /obj/structure/closet/wardrobe/mixed/New() ..() + contents = list() if(prob(40)) new /obj/item/clothing/suit/jacket(src) if(prob(40)) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 6270de31537..f3b11af3cbf 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -5,12 +5,16 @@ desc = "A rectangular steel crate." icon = 'icons/obj/crates.dmi' var/icon_crate = "crate" + icon_state = "crate" req_access = null -// mouse_drag_pointer = MOUSE_ACTIVE_POINTER //??? var/rigged = 0 var/sound_effect_open = 'sound/machines/click.ogg' var/sound_effect_close = 'sound/machines/click.ogg' +/obj/structure/closet/crate/New() + ..() + update_icon() + /obj/structure/closet/crate/update_icon() if(opened) icon_state = "[icon_crate]open" @@ -21,26 +25,36 @@ desc = "A internals crate." name = "internals crate" icon_crate = "o2crate" + icon_state = "o2crate" /obj/structure/closet/crate/trashcart desc = "A heavy, metal trashcart with wheels." name = "trash cart" icon_crate = "trashcart" + icon_state = "trashcart" /obj/structure/closet/crate/medical desc = "A medical crate." name = "medical crate" icon_crate = "medicalcrate" + icon_state = "medicalcrate" /obj/structure/closet/crate/rcd desc = "A crate for the storage of the RCD." name = "\improper RCD crate" - icon_crate = "crate" + +/obj/structure/closet/crate/rcd/New() + ..() + new /obj/item/weapon/rcd_ammo(src) + new /obj/item/weapon/rcd_ammo(src) + new /obj/item/weapon/rcd_ammo(src) + new /obj/item/weapon/rcd(src) /obj/structure/closet/crate/freezer desc = "A freezer." name = "freezer" icon_crate = "freezer" + icon_state = "freezer" var/target_temp = T0C - 40 var/cooling_power = 40 @@ -67,6 +81,7 @@ desc = "A crate with a radiation sign on it." name = "radioactive gear crate" icon_crate = "radiation" + icon_state = "radiation" /obj/structure/closet/crate/radiation/New() ..() @@ -82,8 +97,8 @@ /obj/structure/closet/crate/hydroponics name = "hydroponics crate" desc = "All you need to destroy those pesky weeds and pests." - icon = 'icons/obj/storage.dmi' icon_crate = "hydrocrate" + icon_state = "hydrocrate" /obj/structure/closet/crate/hydroponics/prespawned @@ -97,6 +112,7 @@ desc = "A secure crate." name = "secure crate" icon_crate = "securecrate" + icon_state = "securecrate" var/redlight = "securecrater" var/greenlight = "securecrateg" var/sparks = "securecratesparks" @@ -107,26 +123,26 @@ /obj/structure/closet/crate/secure/weapon desc = "A secure weapons crate." name = "weapons crate" - icon = 'icons/obj/storage.dmi' icon_crate = "weaponcrate" + icon_state = "weaponcrate" /obj/structure/closet/crate/secure/plasma desc = "A secure plasma crate." name = "plasma crate" - icon = 'icons/obj/storage.dmi' icon_crate = "plasmacrate" + icon_state = "plasmacrate" /obj/structure/closet/crate/secure/gear desc = "A secure gear crate." name = "gear crate" - icon = 'icons/obj/storage.dmi' icon_crate = "secgearcrate" + icon_state = "secgearcrate" /obj/structure/closet/crate/secure/hydrosec desc = "A crate with a lock on it, painted in the scheme of the station's botanists." name = "secure hydroponics crate" - icon = 'icons/obj/storage.dmi' icon_crate = "hydrosecurecrate" + icon_state = "hydrosecurecrate" /obj/structure/closet/crate/secure/New() ..() @@ -136,29 +152,18 @@ else overlays += greenlight -/obj/structure/closet/crate/rcd/New() - ..() - new /obj/item/weapon/rcd_ammo(src) - new /obj/item/weapon/rcd_ammo(src) - new /obj/item/weapon/rcd_ammo(src) - new /obj/item/weapon/rcd(src) - /obj/structure/closet/crate/open() playsound(src.loc, sound_effect_open, 15, 1, -3) - dump_contents() - - update_icon() src.opened = 1 + update_icon() return 1 /obj/structure/closet/crate/close() playsound(src.loc, sound_effect_close, 15, 1, -3) - take_contents() - - update_icon() src.opened = 0 + update_icon() return 1 /obj/structure/closet/crate/insert(var/atom/movable/AM, var/include_mobs = 0) @@ -244,7 +249,7 @@ if(isrobot(user)) return if(!user.drop_item()) //couldn't drop the item - user << "\The [W] is stuck to your hand, you cannot put it in \the [src]!" + user << "\The [W] is stuck to your hand, you cannot put it in \the [src]!" return if(W) W.loc = src.loc @@ -252,14 +257,14 @@ return else if(istype(W, /obj/item/stack/cable_coil)) if(rigged) - user << "[src] is already rigged!" + user << "[src] is already rigged!" return var/obj/item/stack/cable_coil/C = W if (C.use(5)) user << "You rig [src]." rigged = 1 else - user << "You need 5 lengths of cable to rig [src]." + user << "You need 5 lengths of cable to rig [src]!" return else if(istype(W, /obj/item/device/electropack)) if(rigged) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 28b15223ebd..54a1fe847c3 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -6,7 +6,7 @@ density = 1 /obj/structure/largecrate/attack_hand(mob/user as mob) - user << "You need a crowbar to pry this open!" + user << "You need a crowbar to pry this open!" return /obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob, params) @@ -15,9 +15,9 @@ var/turf/T = get_turf(src) for(var/obj/O in contents) O.loc = T - user.visible_message("[user] pries \the [src] open.", \ + user.visible_message("[user] pries \the [src] open.", \ "You pry open \the [src].", \ - "You hear splitting wood.") + "You hear splitting wood.") qdel(src) else return attack_hand(user) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 71ad52a0388..d37ebc83076 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -440,14 +440,14 @@ obj/structure/door_assembly/New() else if(istype(W, /obj/item/weapon/weldingtool) && !anchored ) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) - user.visible_message("[user] dissassembles the airlock assembly.", \ - "You start to dissassemble the airlock assembly.") + user.visible_message("[user] disassembles the airlock assembly.", \ + "You start to disassemble the airlock assembly...") playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(do_after(user, 40)) if( !WT.isOn() ) return - user << " You've disassembled the airlock assembly." + user << " You disassemble the airlock assembly." new /obj/item/stack/sheet/metal(get_turf(src), 4) if (mineral) if (mineral == "glass") @@ -469,14 +469,14 @@ obj/structure/door_assembly/New() if(door_check) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user.visible_message("[user] secures the airlock assembly to the floor.", \ - "You start to secure the airlock assembly to the floor.", \ - "You hear wrenching") + user.visible_message("[user] secures the airlock assembly to the floor.", \ + "You start to secure the airlock assembly to the floor...", \ + "You hear wrenching.") if(do_after(user, 40)) if( src.anchored ) return - user << " You've secured the airlock assembly." + user << " You secure the airlock assembly." src.name = "secured airlock assembly" src.anchored = 1 else @@ -484,72 +484,70 @@ obj/structure/door_assembly/New() else if(istype(W, /obj/item/weapon/wrench) && anchored ) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user.visible_message("[user] unsecures the airlock assembly from the floor.", \ - "You start to unsecure the airlock assembly from the floor.", \ - "You hear wrenching") + user.visible_message("[user] unsecures the airlock assembly from the floor.", \ + "You start to unsecure the airlock assembly from the floor...", \ + "You hear wrenching.") if(do_after(user, 40)) if( !src.anchored ) return - user << " You've unsecured the airlock assembly." + user << " You unsecure the airlock assembly." src.name = "airlock assembly" src.anchored = 0 else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored ) var/obj/item/stack/cable_coil/C = W if (C.get_amount() < 1) - user << "You need one length of cable to wire the airlock assembly." + user << "You need one length of cable to wire the airlock assembly!" return - user.visible_message("[user] wires the airlock assembly.", \ - "You start to wire the airlock assembly.") + user.visible_message("[user] wires the airlock assembly.", \ + "You start to wire the airlock assembly...") if(do_after(user, 40)) if(C.get_amount() < 1 || state != 0) return C.use(1) src.state = 1 - user << "You've wired the airlock assembly." + user << "You wire the airlock assembly." src.name = "wired airlock assembly" else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 ) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user.visible_message("[user] cuts the wires from the airlock assembly.", \ - "You start to cut the wires from the airlock assembly.") + user.visible_message("[user] cuts the wires from the airlock assembly.", \ + "You start to cut the wires from the airlock assembly...") if(do_after(user, 40)) if( src.state != 1 ) return - user << " You've cut the wires from the airlock assembly." + user << " You cut the wires from the airlock assembly." new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = 0 src.name = "secured airlock assembly" else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 ) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user.visible_message("[user] installs the electronics into the airlock assembly.", \ - "You start to install electronics into the airlock assembly.") - user.drop_item() - W.loc = src + user.visible_message("[user] installs the electronics into the airlock assembly.", \ + "You start to install electronics into the airlock assembly...") + if(do_after(user, 40)) if( src.state != 1 ) - W.loc = src.loc return - user << " You've installed the airlock electronics." + + user.drop_item() + W.loc = src + user << " You install the airlock electronics." src.state = 2 src.name = "near finished airlock assembly" src.electronics = W - else - W.loc = src.loc - //qdel(W) else if(istype(W, /obj/item/weapon/crowbar) && state == 2 ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", \ - "You start to remove electronics from the airlock assembly.") + user.visible_message("[user] removes the electronics from the airlock assembly.", \ + "You start to remove electronics from the airlock assembly...") if(do_after(user, 40)) if( src.state != 2 ) return - user << " You've removed the airlock electronics." + user << " You remove the airlock electronics." src.state = 1 src.name = "wired airlock assembly" var/obj/item/weapon/airlock_electronics/ae @@ -565,11 +563,11 @@ obj/structure/door_assembly/New() if(G.get_amount() >= 1) if(G.type == /obj/item/stack/sheet/rglass) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user.visible_message("[user] adds [G.name] to the airlock assembly.", \ - "You start to install [G.name] into the airlock assembly.") + user.visible_message("[user] adds [G.name] to the airlock assembly.", \ + "You start to install [G.name] into the airlock assembly...") if(do_after(user, 40)) if(G.get_amount() < 1 || mineral) return - user << "You've installed reinforced glass windows into the airlock assembly." + user << "You install reinforced glass windows into the airlock assembly." G.use(1) mineral = "glass" name = "near finished window airlock assembly" @@ -589,11 +587,11 @@ obj/structure/door_assembly/New() var/M = G.sheettype if(G.get_amount() >= 2) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user.visible_message("[user] adds [G.name] to the airlock assembly.", \ - "You start to install [G.name] into the airlock assembly.") + user.visible_message("[user] adds [G.name] to the airlock assembly.", \ + "You start to install [G.name] into the airlock assembly...") if(do_after(user, 40)) if(G.get_amount() < 2 || mineral) return - user << "You've installed [M] plating into the airlock assembly." + user << "You install [M] plating into the airlock assembly." G.use(2) mineral = "[M]" name = "near finished [M] airlock assembly" @@ -604,12 +602,12 @@ obj/structure/door_assembly/New() else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 ) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user.visible_message("[user] finishes the airlock.", \ - "You start finishing the airlock.") + user.visible_message("[user] finishes the airlock.", \ + "You start finishing the airlock...") if(do_after(user, 40)) if(src.loc && state == 2) - user << " You've finished the airlock." + user << " You finish the airlock." var/obj/machinery/door/airlock/door if(mineral == "glass") door = new src.glass_type( src.loc ) diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 36b14829157..d3fc4a8b3da 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -49,10 +49,10 @@ s.start() if(buckled_mob) buckled_mob.burn_skin(85) - buckled_mob << "You feel a deep shock course through your body!" + buckled_mob << "You feel a deep shock course through your body!" sleep(1) buckled_mob.burn_skin(85) - visible_message("The electric chair went off!", "You hear a deep sharp shock!") + visible_message("The electric chair went off!", "You hear a deep sharp shock!") A.power_light = light A.updateicon() diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 7af569a1d13..091dc25d6d0 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -97,7 +97,7 @@ /obj/structure/falsewall/attackby(obj/item/weapon/W, mob/user, params) if(opening) - user << "You must wait until the door has stopped moving." + user << "You must wait until the door has stopped moving!" return if(density) @@ -109,7 +109,7 @@ if (!istype(T, /turf/simulated/floor)) user << "[src] bolts must be tightened on the floor!" return - user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.") + user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.") ChangeToWall() if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W @@ -131,7 +131,7 @@ dismantle(user) /obj/structure/falsewall/proc/dismantle(mob/user) - user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.") + user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.") new /obj/structure/girder/displaced(loc) if(mineral == "metal") if(istype(src, /obj/structure/falsewall/reinforced)) @@ -221,7 +221,7 @@ if(world.time > last_event+15) active = 1 for(var/mob/living/L in range(3,src)) - L.apply_effect(12,IRRADIATE,0) + L.irradiate(12) for(var/turf/simulated/wall/mineral/uranium/T in range(3,src)) T.radiate() last_event = world.time diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index e14abdc52d2..49aa0a97127 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -1,51 +1,57 @@ +#define GIRDER_NORMAL 0 +#define GIRDER_REINF_STRUTS 1 +#define GIRDER_REINF 2 +#define GIRDER_DISPLACED 3 + /obj/structure/girder name = "girder" icon_state = "girder" anchored = 1 density = 1 layer = 2 - var/state = 0 + var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. /obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob, params) add_fingerprint(user) - if(istype(W, /obj/item/weapon/wrench) && state == 0) - if(anchored && !istype(src,/obj/structure/girder/displaced)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "Now disassembling the girder..." - if(do_after(user,40)) - if(!src.loc) + if(istype(W, /obj/item/weapon/weldingtool) && state == GIRDER_DISPLACED) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + user.visible_message("[user] disassembles the girder.", \ + "You start to disassemble the girder...", "You hear welding and clanking.") + if(do_after(user, 40, target = src)) + if( !WT.isOn() ) return - user << "You dissasembled the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) - qdel(src) - else if(!anchored) - if (!istype(src.loc, /turf/simulated/floor)) - usr << "A floor must be present to secure the girder!" - return - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "Now securing the girder..." - if(do_after(user, 40)) - if(!src.loc) - return - user << "You secured the girder!" - var/obj/structure/girder/G = new (loc) - transfer_fingerprints_to(G) + user << "You disassemble the girder." + var/obj/item/stack/sheet/metal/M = new (loc, 2) + M.add_fingerprint(user) qdel(src) + else if(istype(W, /obj/item/weapon/wrench) && state == GIRDER_DISPLACED) + if (!istype(src.loc, /turf/simulated/floor)) + usr << "A floor must be present to secure the girder!" + return + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "You start securing the girder..." + if(do_after(user, 40, target = src)) + user << "You secure the girder." + var/obj/structure/girder/G = new (loc) + transfer_fingerprints_to(G) + qdel(src) + else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user << "Now slicing apart the girder..." - if(do_after(user,30)) - if(!src.loc) - return - user << "You slice apart the girder!" - new /obj/item/stack/sheet/metal(get_turf(src)) + user << "You start slicing apart the girder..." + if(do_after(user, 30, target = src)) + user << "You slice apart the girder." + var/obj/item/stack/sheet/metal/M = new (loc, 2) + M.add_fingerprint(user) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) var/obj/item/weapon/pickaxe/drill/jackhammer/D = W if(!D.bcell.use(D.drillcost)) - user << "Your [D.name] doesn't have enough power to break through the [name]." + user << "Your [D.name] doesn't have enough power to break through the [name]!" return D.update_icon() user << "You smash through the girder!" @@ -53,40 +59,35 @@ D.playDigSound() qdel(src) - else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) + else if(istype(W, /obj/item/weapon/screwdriver) && state == GIRDER_REINF) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "Now unsecuring support struts..." - if(do_after(user,40)) - if(!src.loc) - return - user << "You unsecured the support struts!" - state = 1 + user << "You start unsecuring support struts..." + if(do_after(user, 40, target = src)) + user << "You unsecure the support struts." + state = GIRDER_REINF_STRUTS - else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) + else if(istype(W, /obj/item/weapon/wirecutters) && state == GIRDER_REINF_STRUTS) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user << "Now removing support struts..." - if(do_after(user,40)) - if(!src.loc) - return - user << "You removed the support struts!" + user << "You start removing support struts..." + if(do_after(user, 40, target = src)) + user << "You remove the support struts." + new /obj/item/stack/sheet/plasteel(get_turf(src)) var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) qdel(src) - else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user << "Now dislodging the girder..." - if(do_after(user, 40)) - if(!src.loc) - return - user << "You dislodged the girder!" + else if(istype(W, /obj/item/weapon/wrench) && state == GIRDER_NORMAL && anchored ) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << "You start unsecuring the girder..." + if(do_after(user, 40, target = src)) + user << "You unsecure the girder." var/obj/structure/girder/displaced/D = new (loc) transfer_fingerprints_to(D) qdel(src) else if(istype(W, /obj/item/stack/sheet)) if (!istype(src.loc, /turf/simulated/floor)) - usr << "The girder is too unstable to build anything!" + usr << "A floor must be present to build a false wall!" return var/obj/item/stack/sheet/S = W @@ -94,24 +95,28 @@ if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg) if(!anchored) - if (S.use(2)) - user << "You create a false wall! Push on it to open or close the passage." + if(S.get_amount() < 2) + user << "You need two sheets of metal to create a false wall!" + return + user << "You start building a false wall..." + if(do_after(user, 20, target = src)) + if(!src.loc || !S || S.amount < 2) + return + S.use(2) + user << "You create a false wall. Push on it to open or close the passage." var/obj/structure/falsewall/F = new (loc) transfer_fingerprints_to(F) qdel(src) - else - user << "You need two sheets of metal to create a false wall." - return else if(S.get_amount() < 2) - user << "You need two sheets of metal to finish a wall." + user << "You need two sheets of metal to finish a wall!" return - user << "Now adding plating..." + user << "You start adding plating..." if (do_after(user, 40)) if(loc == null || S.get_amount() < 2) return S.use(2) - user << "You added the plating!" + user << "You add the plating." var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(/turf/simulated/wall) for(var/turf/simulated/wall/X in Tsrc.loc) @@ -123,22 +128,26 @@ if(/obj/item/stack/sheet/plasteel) if(!anchored) if(S.amount < 2) - user << "You need at least two sheets to create a false wall." + user << "You need at least two sheets to create a false wall!" return - S.use(2) - user << "You create a false wall! Push on it to open or close the passage." - var/obj/structure/falsewall/reinforced/FW = new (loc) - transfer_fingerprints_to(FW) - qdel(src) + user << "You start building a reinforced false wall..." + if(do_after(user, 20, target = src)) + if(!src.loc || !S || S.amount < 2) + return + S.use(2) + user << "You create a reinforced false wall. Push on it to open or close the passage." + var/obj/structure/falsewall/reinforced/FW = new (loc) + transfer_fingerprints_to(FW) + qdel(src) else if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... if(S.amount < 1) return ..() - user << "Now finalising reinforced wall..." + user << "You start finalizing the reinforced wall..." if(do_after(user, 50)) if(!src.loc || !S || S.amount < 1) return S.use(1) - user << "Wall fully reinforced!" + user << "You fully reinforce the wall." var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) @@ -147,12 +156,12 @@ return else if(S.amount < 1) return ..() - user << "Now reinforcing girders..." - if (do_after(user,60)) + user << "You start reinforcing the girder..." + if (do_after(user, 60)) if(!src.loc || !S || S.amount < 1) return S.use(1) - user << "Girders reinforced!" + user << "You reinforce the girder." var/obj/structure/girder/reinforced/R = new (loc) transfer_fingerprints_to(R) qdel(src) @@ -162,22 +171,22 @@ var/M = S.sheettype if(!anchored) if(S.amount < 2) - user << "You need at least two sheets to create a false wall." + user << "You need at least two sheets to create a false wall!" return S.use(2) - user << "You create a false wall! Push on it to open or close the passage." + user << "You create a false wall. Push on it to open or close the passage." var/F = text2path("/obj/structure/falsewall/[M]") var/obj/structure/FW = new F (loc) transfer_fingerprints_to(FW) qdel(src) else if(S.amount < 2) return ..() - user << "Now adding plating..." - if (do_after(user,40)) + user << "You start adding plating..." + if (do_after(user, 40)) if(!src.loc || !S || S.amount < 2) return S.use(2) - user << "You added the plating!" + user << "You add the plating." var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) for(var/turf/simulated/wall/mineral/X in Tsrc.loc) @@ -192,7 +201,7 @@ if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. user.drop_item() P.loc = src.loc - user << "You fit the pipe into \the [src]!" + user << "You fit the pipe into \the [src]." else ..() @@ -236,12 +245,14 @@ name = "displaced girder" icon_state = "displaced" anchored = 0 + state = GIRDER_DISPLACED girderpasschance = 25 + layer = 2.45 /obj/structure/girder/reinforced name = "reinforced girder" icon_state = "reinforced" - state = 2 + state = GIRDER_REINF girderpasschance = 0 /obj/structure/girder/reinforced/ex_act(severity, target) @@ -271,24 +282,29 @@ layer = 2 /obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "Now disassembling the girder..." - if(do_after(user,40)) - user << "You dissasembled the girder!" - var/obj/effect/decal/remains/human/R = new (get_turf(src)) - transfer_fingerprints_to(R) - qdel(src) + add_fingerprint(user) + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + user.visible_message("[user] disassembles the girder.", \ + "You start to disassemble the girder...", "You hear welding and clanking.") + if(do_after(user, 40)) + if( !WT.isOn() ) + return + user << "You disassemble the girder." + var/obj/effect/decal/remains/human/R = new (get_turf(src)) + transfer_fingerprints_to(R) + qdel(src) else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user << "Now slicing apart the girder..." - if(do_after(user,30)) - user << "You slice apart the girder!" + user << "You start slicing apart the girder..." + if(do_after(user, 30)) + user << "You slice apart the girder." var/obj/effect/decal/remains/human/R = new (get_turf(src)) transfer_fingerprints_to(R) qdel(src) - else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) var/obj/item/weapon/pickaxe/drill/jackhammer/D = W if(!D.bcell.use(D.drillcost)) @@ -321,4 +337,4 @@ qdel(src) return else - return \ No newline at end of file + return diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 03df21e80a9..79fda3eda5c 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -40,8 +40,8 @@ user.do_attack_animation(src) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) user.visible_message("[user] hits [src].", \ - "You hit [src].", \ - "You hear twisting metal.") + "You hit [src].", \ + "You hear twisting metal.") if(shock(user, 70)) return @@ -55,8 +55,8 @@ user.changeNext_move(CLICK_CD_MELEE) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) user.visible_message("[user] mangles [src].", \ - "You mangle [src].", \ - "You hear twisting metal.") + "You mangle [src].", \ + "You hear twisting metal.") if(!shock(user, 70)) health -= 5 @@ -70,8 +70,8 @@ playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) user.visible_message("[user] smashes against [src].", \ - "You smash against [src].", \ - "You hear twisting metal.") + "You smash against [src].", \ + "You hear twisting metal.") health -= rand(1,2) healthcheck() @@ -83,8 +83,8 @@ M.do_attack_animation(src) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) M.visible_message("[M] smashes against [src].", \ - "You smash against [src].", \ - "You hear twisting metal.") + "You smash against [src].", \ + "You hear twisting metal.") health -= M.melee_damage_upper healthcheck() @@ -118,6 +118,8 @@ return /obj/structure/grille/Deconstruct() + if(!loc) //if already qdel'd somehow, we do nothing + return transfer_fingerprints_to(stored) var/turf/T = loc stored.loc = T @@ -143,7 +145,7 @@ playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) anchored = !anchored user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \ - "You have [anchored ? "fastened [src] to" : "unfastened [src] from"] the floor.") + "You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.") return else if(istype(W, /obj/item/stack/rods) && destroyed) var/obj/item/stack/rods/R = W @@ -162,16 +164,16 @@ if (!destroyed) var/obj/item/stack/ST = W if (ST.get_amount() < 2) - user << "You need at least two sheets of glass for that." + user << "You need at least two sheets of glass for that!" return var/dir_to_set = SOUTHWEST if(!anchored) - user << "[src] needs to be fastened to the floor first." + user << "[src] needs to be fastened to the floor first!" return for(var/obj/structure/window/WINDOW in loc) - user << "There is already a window there." + user << "There is already a window there!" return - user << "You start placing the window." + user << "You start placing the window..." if(do_after(user,20)) if(!src.loc || !anchored) //Grille destroyed or unanchored while waiting return diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 3de876924ca..7a677e8fa42 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -37,7 +37,7 @@ /obj/structure/janitorialcart/attackby(obj/item/I, mob/user, params) - var/fail_msg = "There is already one of those in [src]." + var/fail_msg = "There is already one of those in [src]!" if(istype(I, /obj/item/weapon/mop)) var/obj/item/weapon/mop/m=I @@ -74,11 +74,11 @@ signs++ update_icon() else - user << "[src] can't hold any more signs." + user << "[src] can't hold any more signs!" else if(mybag) mybag.attackby(I, user) else if(istype(I, /obj/item/weapon/crowbar)) - user.visible_message("[user] begins to empty the contents of [src].") + user.visible_message("[user] begins to empty the contents of [src].", "You begin to empty the contents of [src]...") if(do_after(user, 30)) usr << "You empty the contents of [src]'s bucket onto the floor." reagents.reaction(src.loc) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 34251cd9c17..4cd8cae36e3 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -88,45 +88,45 @@ if(src.skin >= 1) src.skin-- new /obj/item/stack/sheet/animalhide/monkey(src.loc) - user << "You remove the hide from the monkey!" + user << "You remove the hide from the monkey." else if(src.meat > 1) src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src.loc ) - usr << "You remove some meat from the monkey." + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc ) + usr << "You remove some meat from the monkey." else if(src.meat == 1) src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src.loc) - usr << "You remove the last piece of meat from the monkey!" + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc) + usr << "You remove the last piece of meat from the monkey." src.icon_state = "spike" src.occupied = 0 else if(src.meattype == MEATTYPE_ALIEN && src.skintype == SKINTYPE_ALIEN) if(src.skin >= 1) src.skin-- new /obj/item/stack/sheet/animalhide/xeno(src.loc) - user << "You remove the hide from the alien!" + user << "You remove the hide from the alien." else if(src.meat > 1) src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/xeno(src.loc ) - usr << "You remove some meat from the alien." + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc ) + usr << "You remove some meat from the alien." else if(src.meat == 1) src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/xeno(src.loc) - usr << "You remove the last piece of meat from the alien!" + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc) + usr << "You remove the last piece of meat from the alien." src.icon_state = "spike" src.occupied = 0 else if(src.meattype == MEATTYPE_BEAR && src.skintype == SKINTYPE_BEAR) if(src.skin >= 1) src.skin-- new /obj/item/clothing/head/bearpelt(src.loc) - user << "You remove the hide from the bear!" + user << "You remove the hide from the bear." else if(src.meat > 1) src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/bear(src.loc ) - usr << "You remove some meat from the bear." + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc ) + usr << "You remove some meat from the bear." else if(src.meat == 1) src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/bear(src.loc) - usr << "You remove the last piece of meat from the bear!" + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc) + usr << "You remove the last piece of meat from the bear." src.icon_state = "spike" src.occupied = 0 diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index dfcb2f58270..98e64467ee0 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -40,27 +40,27 @@ if(up && down) switch( alert("Go up or down the ladder?", "Ladder", "Up", "Down", "Cancel") ) if("Up") - user.visible_message("[user] climbs up \the [src]!", \ - "You climb up \the [src]!") + user.visible_message("[user] climbs up \the [src].", \ + "You climb up \the [src].") user.loc = get_turf(up) up.add_fingerprint(user) if("Down") - user.visible_message("[user] climbs down \the [src]!", \ - "You climb down \the [src]!") + user.visible_message("[user] climbs down \the [src].", \ + "You climb down \the [src].") user.loc = get_turf(down) down.add_fingerprint(user) if("Cancel") return else if(up) - user.visible_message("[user] climbs up \the [src]!", \ - "You climb up \the [src]!") + user.visible_message("[user] climbs up \the [src].", \ + "You climb up \the [src].") user.loc = get_turf(up) up.add_fingerprint(user) else if(down) - user.visible_message("[user] climbs down \the [src]!", \ - "You climb down \the [src]!") + user.visible_message("[user] climbs down \the [src].", \ + "You climb down \the [src].") user.loc = get_turf(down) down.add_fingerprint(user) diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 3a191773127..7178f8c35ac 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -75,8 +75,8 @@ if (src.destroyed) return else - user.visible_message("[user] kicks the lab cage.", \ - "You kick the lab cage.") + user.visible_message("[user] kicks the lab cage.", \ + "You kick the lab cage.") src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 01dd4848f2b..49537016514 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -125,13 +125,13 @@ /obj/structure/mineral_door/attackby(obj/item/weapon/W, mob/user, params) if(istype(W,/obj/item/weapon/pickaxe)) var/obj/item/weapon/pickaxe/digTool = W - user << "You start digging the [name]." + user << "You start digging the [name]..." if(do_after(user,digTool.digspeed*hardness) && src) - user << "You finished digging." + user << "You finish digging." Dismantle() else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc? hardness -= W.force/100 - user << "You hit the [name] with your [W.name]!" + user << "You hit the [name] with your [W.name]!" CheckHardness() else attack_hand(user) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 050f225a6b4..3776b5306e2 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -65,7 +65,7 @@ return if(prob(I.force * 2)) - visible_message("[user] smashes [src] with [I]!") + visible_message("[user] smashes [src] with [I].") shatter() else visible_message("[user] hits [src] with [I]!") diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 623cb4c6c5b..526e9e3f028 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -164,11 +164,11 @@ var/global/list/crematoriums = new/list() return //don't let you cremate something twice or w/e if(contents.len <= 1) - audible_message("You hear a hollow crackle.") + audible_message("You hear a hollow crackle.") return else - audible_message("You hear a roar as the crematorium activates.") + audible_message("You hear a roar as the crematorium activates.") locked = 1 update_icon() @@ -243,7 +243,7 @@ Crematorium Switch connected.close() add_fingerprint(user) else - user << "That's not connected to anything." + user << "That's not connected to anything!" /obj/structure/tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) if(!istype(O, /atom/movable) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user) @@ -259,7 +259,7 @@ Crematorium Switch return O.loc = src.loc if (user != O) - visible_message("[user] stuffs [O] into [src]!") + visible_message("[user] stuffs [O] into [src].") return /* diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 2324c724ed4..9a2a5da2cee 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -330,7 +330,7 @@ /obj/structure/piano/attack_hand(mob/user as mob) if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 1 interact(user) @@ -352,8 +352,8 @@ if (do_after(user, 20)) user.visible_message( \ "[user] tightens \the [src]'s casters.", \ - " You have tightened \the [src]'s casters. Now it can be played again.", \ - "You hear ratchet.") + " You tighten \the [src]'s casters. Now it can be played again.", \ + "You hear ratchet.") anchored = 1 else if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -361,8 +361,8 @@ if (do_after(user, 40)) user.visible_message( \ "[user] loosens \the [src]'s casters.", \ - " You have loosened \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") + " You loosen \the [src]. Now it can be pulled somewhere else.", \ + "You hear ratchet.") anchored = 0 else ..() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 392dc05693f..1676e9ae16c 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -42,11 +42,11 @@ FLOOR SAFES /obj/structure/safe/proc/check_unlocked(mob/user as mob, canhear) if(user && canhear) if(tumbler_1_pos == tumbler_1_open) - user << "You hear a [pick("tonk", "krunk", "plunk")] from [src]." + user << "You hear a [pick("tonk", "krunk", "plunk")] from [src]." if(tumbler_2_pos == tumbler_2_open) - user << "You hear a [pick("tink", "krink", "plink")] from [src]." + user << "You hear a [pick("tink", "krink", "plink")] from [src]." if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open) - if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") + if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") return 1 return 0 @@ -101,7 +101,7 @@ FLOOR SAFES updateUsrDialog() return else - user << "You can't [open ? "close" : "open"] [src], the lock is engaged!" + user << "You can't [open ? "close" : "open"] [src], the lock is engaged!" return if(href_list["decrement"]) @@ -109,11 +109,11 @@ FLOOR SAFES if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71) tumbler_1_pos = decrement(tumbler_1_pos) if(canhear) - user << "You hear a [pick("clack", "scrape", "clank")] from [src]." + user << "You hear a [pick("clack", "scrape", "clank")] from [src]." if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35) tumbler_2_pos = decrement(tumbler_2_pos) if(canhear) - user << "You hear a [pick("click", "chink", "clink")] from [src]." + user << "You hear a [pick("click", "chink", "clink")] from [src]." check_unlocked(user, canhear) updateUsrDialog() return @@ -123,11 +123,11 @@ FLOOR SAFES if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71) tumbler_1_pos = increment(tumbler_1_pos) if(canhear) - user << "You hear a [pick("clack", "scrape", "clank")] from [src]." + user << "You hear a [pick("clack", "scrape", "clank")] from [src]." if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35) tumbler_2_pos = increment(tumbler_2_pos) if(canhear) - user << "You hear a [pick("click", "chink", "clink")] from [src]." + user << "You hear a [pick("click", "chink", "clink")] from [src]." check_unlocked(user, canhear) updateUsrDialog() return @@ -147,7 +147,7 @@ FLOOR SAFES if(I.w_class + space <= maxspace) space += I.w_class if(!user.drop_item()) - user << "\The [I] is stuck to your hand, you cannot put it in the safe!" + user << "\The [I] is stuck to your hand, you cannot put it in the safe!" return I.loc = src user << "You put [I] in [src]." @@ -158,7 +158,7 @@ FLOOR SAFES return else if(istype(I, /obj/item/clothing/tie/stethoscope)) - user << "Hold [I] in one of your hands while you manipulate the dial." + user << "Hold [I] in one of your hands while you manipulate the dial!" return diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 198ecc64993..86ec583212d 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -22,60 +22,60 @@ if(istype(W, /obj/item/weapon/wrench)) if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user.visible_message("[user] is loosening the [name]'s bolts...", \ + user.visible_message("[user] is loosening the [name]'s bolts.", \ "You are loosening the [name]'s bolts...") if(do_after(user,40)) if(!src.loc || !anchored) return - user.visible_message("[user] loosened the [name]'s bolts!", \ - "You loosened the [name]'s bolts!") + user.visible_message("[user] loosened the [name]'s bolts!", \ + "You loosen the [name]'s bolts!") anchored = 0 else if (!istype(src.loc, /turf/simulated/floor)) - user.visible_message("A floor must be present to secure the [name]!") + user.visible_message("A floor must be present to secure the [name]!") return playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user.visible_message("[user] is securing the [name]'s bolts...", \ + user.visible_message("[user] is securing the [name]'s bolts...", \ "You are securing the [name]'s bolts...") if(do_after(user, 40)) if(!src.loc || anchored) return - user.visible_message("[user] has secured the [name]'s bolts!", \ - "You have secured the [name]'s bolts!") + user.visible_message("[user] has secured the [name]'s bolts.", \ + "You have secured the [name]'s bolts.") anchored = 1 else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user.visible_message("[user] is slicing apart the [name]...", \ + user.visible_message("[user] is slicing apart the [name]...", \ "You are slicing apart the [name]...") if(do_after(user,30)) if(!src.loc) return - user.visible_message("[user] slices apart the [name]!", \ - "You slice apart the [name]!") + user.visible_message("[user] slices apart the [name].", \ + "You slice apart the [name].") Dismantle(1) else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) var/obj/item/weapon/pickaxe/drill/jackhammer/D = W if(!D.bcell.use(D.drillcost)) - user << "Your [D.name] doesn't have enough power to break through the [name]." + user << "Your [D.name] doesn't have enough power to break through the [name]!" return D.update_icon() if(!src.loc) return - user.visible_message("[user] destroys the [name]!", \ - "You destroy the [name]!") + user.visible_message("[user] destroys the [name]!", \ + "You destroy the [name].") D.playDigSound() qdel(src) else if(istype(W, /obj/item/weapon/weldingtool) && !anchored) playsound(loc, 'sound/items/Welder.ogg', 40, 1) - user.visible_message("[user] is slicing apart the [name]...", \ + user.visible_message("[user] is slicing apart the [name].", \ "You are slicing apart the [name]...") if(do_after(user, 40)) if(!src.loc) return playsound(loc, 'sound/items/Welder2.ogg', 50, 1) - user.visible_message("[user] slices apart the [name]!", \ + user.visible_message("[user] slices apart the [name].", \ "You slice apart the [name]!") Dismantle(1) @@ -87,7 +87,7 @@ /obj/structure/statue/attack_hand(mob/living/user as mob) user.changeNext_move(CLICK_CD_MELEE) add_fingerprint(user) - user.visible_message("[user] rubs some dust off from the [name]'s surface.", \ + user.visible_message("[user] rubs some dust off from the [name]'s surface.", \ "You rub some dust off from the [name]'s surface.") /obj/structure/statue/CanAtmosPass() @@ -180,7 +180,7 @@ if(world.time > last_event+15) active = 1 for(var/mob/living/L in range(3,src)) - L.apply_effect(12,IRRADIATE,0) + L.irradiate(12) last_event = world.time active = null return diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 15c26a7a058..4673fcfeb40 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -12,14 +12,14 @@ var/mob/living/M = buckled_mob if(M != user) M.visible_message(\ - "[user.name] pulls [M.name] free from the sticky nest!",\ + "[user.name] pulls [M.name] free from the sticky nest!",\ "[user.name] pulls you free from the gelatinous resin.",\ - "You hear squelching...") + "You hear squelching...") else M.visible_message(\ "[M.name] struggles to break free from the gelatinous resin!",\ - "You struggle to break free from the gelatinous resin. (Stay still for two minutes.)",\ - "You hear squelching...") + "You struggle to break free from the gelatinous resin... (Stay still for two minutes.)",\ + "You hear squelching...") if(!do_after(M, 1200)) if(M && M.buckled) M << "You fail to unbuckle yourself!" @@ -28,8 +28,8 @@ return M.visible_message(\ "[M.name] breaks free from the gelatinous resin!",\ - "You break free from the gelatinous resin!",\ - "You hear squelching...") + "You break free from the gelatinous resin!",\ + "You hear squelching...") unbuckle_mob() add_fingerprint(user) @@ -47,20 +47,20 @@ if(buckle_mob(M)) M.visible_message(\ - "[user.name] secretes a thick vile goo, securing [M.name] into [src]!",\ - "[user.name] drenches you in a foul-smelling resin, trapping you in [src]!",\ - "You hear squelching...") + "[user.name] secretes a thick vile goo, securing [M.name] into [src]!",\ + "[user.name] drenches you in a foul-smelling resin, trapping you in [src]!",\ + "You hear squelching...") /obj/structure/stool/bed/nest/post_buckle_mob(mob/living/M) if(M == buckled_mob) M.pixel_y = 0 M.pixel_x = initial(M.pixel_x) + 2 - overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6) + M.layer = MOB_LAYER - 0.3 + overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=MOB_LAYER - 0.2) else - M.pixel_x = initial(M.pixel_x) - M.pixel_y = initial(M.pixel_y) - if(M.lying) - M.pixel_y = M.lying_pixel_offset + M.pixel_x = M.get_standard_pixel_x_offset(M.lying) + M.pixel_y = M.get_standard_pixel_y_offset(M.lying) + M.layer = initial(M.layer) overlays.Cut() /obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob, params) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 3a4588dcb3b..af9c059a8f7 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -68,9 +68,8 @@ else density = 0 icon_state = "down" - M.pixel_y = initial(M.pixel_y) - if(M.lying) - M.pixel_y = M.lying_pixel_offset + M.pixel_x = M.get_standard_pixel_x_offset(M.lying) + M.pixel_y = M.get_standard_pixel_y_offset(M.lying) /obj/item/roller @@ -93,7 +92,7 @@ return if(buckled_mob) return 0 - visible_message("[usr] collapses \the [src.name].") + usr.visible_message("[usr] collapses \the [src.name].", "You collapse \the [src.name].") new/obj/item/roller(get_turf(src)) qdel(src) return @@ -115,7 +114,7 @@ if(loaded) var/obj/structure/stool/bed/roller/R = loaded R.loc = user.loc - user.visible_message("[user] deploys [loaded].") + user.visible_message("[user] deploys [loaded].", "You deploy [loaded].") loaded = null else user << "The dock is empty!" @@ -125,7 +124,7 @@ if(!proximity) return if(loaded) - user << "You already have a roller bed docked!" + user << "You already have a roller bed docked!" return var/obj/structure/stool/bed/roller/R = target @@ -134,6 +133,6 @@ loaded = target target.loc = src - user.visible_message("[user] collects [loaded].") + user.visible_message("[user] collects [loaded].", "You collect [loaded].") ..() diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index ed6433552c7..4e44968971b 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -22,7 +22,7 @@ /obj/structure/table_frame/attackby(var/obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/wrench)) - user << "Now disassembling [src]." + user << "You start disassembling [src]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 30)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -32,7 +32,7 @@ return if(istype(I, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/P = I - user << "Now adding [P] to [src]." + user << "You start adding [P] to [src]..." if(do_after(user, 50)) new /obj/structure/table/reinforced(src.loc) qdel(src) @@ -40,7 +40,7 @@ return if(istype(I, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = I - user << "Now adding [M] to [src]." + user << "You start adding [M] to [src]..." if(do_after(user, 20)) new /obj/structure/table(src.loc) qdel(src) @@ -48,7 +48,7 @@ return if(istype(I, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = I - user << "Now adding [G] to [src]." + user << "You start adding [G] to [src]..." if(do_after(user, 20)) new /obj/structure/table/glass(src.loc) qdel(src) @@ -71,7 +71,7 @@ ..() if(istype(I, /obj/item/stack/sheet/mineral/wood)) var/obj/item/stack/sheet/mineral/wood/W = I - user << "Now adding [W] to [src]." + user << "You start adding [W] to [src]..." if(do_after(user, 20)) new /obj/structure/table/wood(src.loc) qdel(src) @@ -79,7 +79,7 @@ return if(istype(I, /obj/item/stack/tile/carpet)) var/obj/item/stack/tile/carpet/C = I - user << "Now adding [C] to [src]." + user << "You start adding [C] to [src]..." if(do_after(user, 20)) new /obj/structure/table/wood/poker(src.loc) qdel(src) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 9b751df0eb3..d7d6b0ddc24 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -222,7 +222,7 @@ user.changeNext_move(CLICK_CD_MELEE) if(tableclimber && tableclimber != user) tableclimber.Weaken(2) - tableclimber.visible_message("[tableclimber.name] has been knocked off the table", "You've been knocked off the table", "You see [tableclimber.name] get knocked off the table") + tableclimber.visible_message("[tableclimber.name] has been knocked off the table", "You're knocked off the table!", "You see [tableclimber.name] get knocked off the table") /obj/structure/table/attack_tk() // no telehulk sorry @@ -307,7 +307,7 @@ for(var/obj/item/C in oldContents) C.loc = src.loc - user.visible_message("[user] empties [I] on [src].") + user.visible_message("[user] empties [I] on [src].") return // If the tray IS empty, continue on (tray will be placed on the table like other items) @@ -345,7 +345,7 @@ return if(destroy_type == TBL_DISASSEMBLE) - user << "Now disassembling [src]." + user << "You start disassembling [src]..." playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20)) new frame(src.loc) @@ -355,7 +355,7 @@ return if(destroy_type == TBL_DECONSTRUCT) - user << "Now deconstructing [src]." + user << "You start deconstructing [src]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 40)) for(var/i = 1, i <= framestackamount, i++) @@ -374,7 +374,7 @@ /obj/structure/table/proc/climb_table(mob/user) src.add_fingerprint(user) user.visible_message("[user] starts climbing onto [src].", \ - "You start climbing onto [src].") + "You start climbing onto [src]...") var/climb_time = 20 if(user.restrained()) //Table climbing takes twice as long when restrained. climb_time *= 2 @@ -454,18 +454,18 @@ var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) if(src.status == 2) - user << "Now weakening the reinforced table" + user << "You start weakening the reinforced table..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50)) if(!src || !WT.isOn()) return - user << "Table weakened" + user << "You weaken the table." src.status = 1 else - user << "Now strengthening the reinforced table" + user << "You start strengthening the reinforced table..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50)) if(!src || !WT.isOn()) return - user << "Table strengthened" + user << "You strengthen the table." src.status = 2 return ..() @@ -534,7 +534,7 @@ if(isrobot(user)) return if(!user.drop_item()) - user << "\The [O] is stuck to your hand, you cannot put it in the rack!" + user << "\The [O] is stuck to your hand, you cannot put it in the rack!" return if (O.loc != src.loc) step(O, get_dir(O, src)) @@ -549,7 +549,7 @@ if(isrobot(user)) return if(!user.drop_item()) - user << "\The [W] is stuck to your hand, you cannot put it in the rack!" + user << "\The [W] is stuck to your hand, you cannot put it in the rack!" return W.Move(loc) return 1 @@ -568,20 +568,20 @@ user.do_attack_animation(src) playsound(loc, 'sound/items/dodgeball.ogg', 80, 1) user.visible_message("[user] kicks [src].", \ - "You kick [src].") + "You kick [src].") health -= rand(1,2) healthcheck() /obj/structure/rack/attack_alien(mob/living/user) user.do_attack_animation(src) - visible_message("[user] slices [src] apart!") + visible_message("[user] slices [src] apart.") rack_destroy() /obj/structure/rack/attack_animal(mob/living/simple_animal/user) if(user.environment_smash) user.do_attack_animation(src) - visible_message("[user] smashes [src] apart!") + visible_message("[user] smashes [src] apart.") rack_destroy() /obj/structure/rack/attack_tk() // no telehulk sorry return @@ -615,7 +615,7 @@ return /obj/item/weapon/rack_parts/attack_self(mob/user as mob) - user << "Constructing rack..." + user << "You start constructing rack..." if (do_after(user, 50)) var/obj/structure/rack/R = new /obj/structure/rack( user.loc ) R.add_fingerprint(user) diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index b14dbcdb764..da9c57601e3 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -36,7 +36,7 @@ /obj/structure/dispenser/attack_hand(mob/user as mob) if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 1 user.set_machine(src) var/dat = "[src]

      " diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 15405604004..e1d8952d518 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -30,7 +30,7 @@ W.loc = loc W.layer = 3.1 pinned_target = W - user << "You slide the target into the stake." + user << "You slide the target into the stake." return /obj/structure/target_stake/attack_hand(mob/user as mob) @@ -44,9 +44,9 @@ if(ishuman(user)) if(!user.get_active_hand()) user.put_in_hands(pinned_target) - user << "You take the target out of the stake." + user << "You take the target out of the stake." else pinned_target.loc = get_turf(user) - user << "You take the target out of the stake." + user << "You take the target out of the stake." pinned_target = null diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 949f192ecc7..cbc1fbb529a 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -54,7 +54,7 @@ T.add_fingerprint(user) T.loc = src.loc T.dir = turn(src.dir, -90) - user.visible_message("[user] inserts the [R].", "You insert the [R].") + user.visible_message("[user] inserts the [R].", "You insert the [R].") qdel(R) @@ -67,7 +67,7 @@ else if(icon_state == "open") if(pod.contents.len && user.loc != pod) - user.visible_message("[user] starts emptying [pod]'s contents onto the floor!") + user.visible_message("[user] starts emptying [pod]'s contents onto the floor.", "You start emptying [pod]'s contents onto the floor...") if(do_after(user, 10)) //So it doesn't default to close_animation() on fail if(pod.loc == loc) for(var/atom/movable/AM in pod) @@ -96,9 +96,9 @@ if(istype(W, /obj/item/weapon/crowbar)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents) - user << "Empty the pod first." + user << "Empty the pod first!" return - user.visible_message("[user] removes the [pod].", "You remove the [pod].") + user.visible_message("[user] removes the [pod].", "You remove the [pod].") var/obj/structure/c_transit_tube_pod/R = new/obj/structure/c_transit_tube_pod(src.loc) pod.transfer_fingerprints_to(R) R.add_fingerprint(user) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index bdee679770d..3db04c5088a 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -42,12 +42,12 @@ obj/structure/transit_tube/ex_act(severity, target) if(istype(W, /obj/item/weapon/wrench)) if(copytext(icon_state, 1, 3) != "D-") //decorative diagonals cannot be unwrenched directly for(var/obj/structure/transit_tube_pod/pod in src.loc) - user << "Remove the pod first." + user << "Remove the pod first!" return - user.visible_message("[user] starts to deattach \the [src]!", "You start deattaching the [name]...") + user.visible_message("[user] starts to deattach \the [src].", "You start to deattach the [name]...") playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 35)) - user << "You deattach the [name]!" + user << "You deattach the [name]." var/obj/structure/R = new tube_construction(src.loc) R.icon_state = src.icon_state src.transfer_fingerprints_to(R) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index aa13ac145fc..cb47c7c4e15 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -83,7 +83,7 @@ src.add_fingerprint(user) if(do_after(user, 40)) if(!src) return - user << "You attach the [name]!" + user << "You attach the [name]." var/obj/structure/transit_tube/R = src.buildtube() src.transfer_fingerprints_to(R) qdel(src) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 645a121e168..b686464321e 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -31,7 +31,7 @@ for(var/obj/structure/transit_tube/station/T in loc) return if(src.contents.len) - user.visible_message("[user] empties \the [src].", "You empty \the [src].") + user.visible_message("[user] empties \the [src].", "You empty \the [src].") src.empty() return else @@ -46,7 +46,7 @@ if(!moving) user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - user << "You start trying to escape from the pod." + user << "You start trying to escape from the pod..." if(do_after(user, 600)) user << "You manage to open the pod." src.empty() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 2971a867071..69e34eab25a 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -20,7 +20,7 @@ if(swirlie) user.changeNext_move(CLICK_CD_MELEE) playsound(src.loc, "swing_hit", 25, 1) - swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto [swirlie]'s head!", "You hear reverberating porcelain.") + swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto [swirlie]'s head!", "You hear reverberating porcelain.") swirlie.adjustBruteLoss(5) return @@ -48,10 +48,10 @@ /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/crowbar)) - user << "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]." + user << "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]..." playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(do_after(user, 30)) - user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") + user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() return @@ -65,14 +65,14 @@ var/mob/living/GM = G.affecting if(G.state >= GRAB_AGGRESSIVE) if(GM.loc != get_turf(src)) - user << "[GM] needs to be on [src]." + user << "[GM] needs to be on [src]!" return if(!swirlie) if(open) - GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give [GM] a swirlie!") + GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give [GM] a swirlie...") swirlie = GM if(do_after(user, 30, 5, 0)) - GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives [GM] a swirlie!", "You hear a toilet flushing.") + GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives [GM] a swirlie!", "You hear a toilet flushing.") if(iscarbon(GM)) var/mob/living/carbon/C = GM if(!C.internal) @@ -85,17 +85,17 @@ GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams [GM.name] into [src]!") GM.adjustBruteLoss(5) else - user << "You need a tighter grip." + user << "You need a tighter grip!" if(cistern) if(I.w_class > 3) - user << "[I] does not fit." + user << "[I] does not fit!" return if(w_items + I.w_class > 5) - user << "The cistern is full." + user << "The cistern is full!" return if(!user.drop_item()) - user << "\The [I] is stuck to your hand, you cannot put it in the cistern!" + user << "\The [I] is stuck to your hand, you cannot put it in the cistern!" return I.loc = src w_items += I.w_class @@ -127,7 +127,7 @@ user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") GM.adjustBruteLoss(8) else - user << "You need a tighter grip." + user << "You need a tighter grip!" /obj/machinery/shower @@ -171,7 +171,7 @@ if(I.type == /obj/item/device/analyzer) user << "The water temperature seems to be [watertemp]." if(istype(I, /obj/item/weapon/wrench)) - user << "You begin to adjust the temperature valve with \the [I]." + user << "You begin to adjust the temperature valve with \the [I]..." if(do_after(user, 50)) switch(watertemp) if("normal") @@ -236,7 +236,7 @@ var/mob/living/L = O L.ExtinguishMob() L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily - L << "You've been drenched in water!" + L << "You're drenched in water!" if(iscarbon(O)) var/mob/living/carbon/M = O if(M.r_hand) @@ -363,7 +363,7 @@ user << "Someone's already washing here." return - user << "You start washing your hands." + user << "You start washing your hands..." busy = 1 sleep(40) @@ -372,12 +372,12 @@ if(!Adjacent(user)) return //Person has moved away from the sink user.clean_blood() - user.visible_message("[user] washes their hands in [src].") + user.visible_message("[user] washes their hands in [src].", "You wash your hands in [src].") /obj/structure/sink/attackby(obj/item/O, mob/user, params) if(busy) - user << "Someone's already washing here." + user << "Someone's already washing here!" return if(istype(O, /obj/item/weapon/reagent_containers)) @@ -410,7 +410,7 @@ var/obj/item/I = O if(!I || !istype(I,/obj/item)) return - usr << "You start washing [I]." + usr << "You start washing [I]..." busy = 1 sleep(40) @@ -422,7 +422,7 @@ O.clean_blood() user.visible_message( \ - "[user] washes [I] using [src].", \ + "[user] washes [I] using [src].", \ "You wash [I] using [src].") diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 9ba3ec15458..1c173316ec3 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -76,12 +76,12 @@ obj/structure/windoor_assembly/Destroy() if(istype(W, /obj/item/weapon/weldingtool) && !anchored ) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) - user.visible_message("[user] dissassembles the windoor assembly.", "You start to dissassemble the windoor assembly.") + user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...") playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(do_after(user, 40)) if(!src || !WT.isOn()) return - user << "You dissasembled the windoor assembly!" + user << "You disassemble the windoor assembly." var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) RG.add_fingerprint(user) if(secure) @@ -95,19 +95,19 @@ obj/structure/windoor_assembly/Destroy() if(istype(W, /obj/item/weapon/wrench) && !anchored) for(var/obj/machinery/door/window/WD in src.loc) if(WD.dir == src.dir) - user << "There is already a windoor in that location." + user << "There is already a windoor in that location!" return playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor.") + user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...") if(do_after(user, 40)) if(!src || src.anchored) return for(var/obj/machinery/door/window/WD in src.loc) if(WD.dir == src.dir) - user << "There is already a windoor in that location." + user << "There is already a windoor in that location!" return - user << "You've secured the windoor assembly!" + user << "You secure the windoor assembly." src.anchored = 1 if(src.secure) src.name = "secure anchored windoor assembly" @@ -117,12 +117,12 @@ obj/structure/windoor_assembly/Destroy() //Unwrenching an unsecure assembly un-anchors it. Step 4 undone else if(istype(W, /obj/item/weapon/wrench) && anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor.") + user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") if(do_after(user, 40)) if(!src || !src.anchored) return - user << "You've unsecured the windoor assembly!" + user << "You unsecure the windoor assembly." src.anchored = 0 if(src.secure) src.name = "secure windoor assembly" @@ -133,9 +133,9 @@ obj/structure/windoor_assembly/Destroy() else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) var/obj/item/stack/sheet/plasteel/P = W if(P.amount < 2) - user << "You need more plasteel to do this." + user << "You need more plasteel to do this!" return - user << "You start to reinforce the windoor with plasteel." + user << "You start to reinforce the windoor with plasteel..." if(do_after(user,40)) if(!src || secure) @@ -151,14 +151,14 @@ obj/structure/windoor_assembly/Destroy() //Adding cable to the assembly. Step 5 complete. else if(istype(W, /obj/item/stack/cable_coil) && anchored) - user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly.") + user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly...") if(do_after(user, 40)) if(!src || !src.anchored || src.state != "01") return var/obj/item/stack/cable_coil/CC = W CC.use(1) - user << "You wire the windoor!" + user << "You wire the windoor." src.state = "02" if(src.secure) src.name = "secure wired windoor assembly" @@ -172,13 +172,13 @@ obj/structure/windoor_assembly/Destroy() //Removing wire from the assembly. Step 5 undone. if(istype(W, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.") + user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...") if(do_after(user, 40)) if(!src || src.state != "02") return - user << "You cut the windoor wires!" + user << "You cut the windoor wires." new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = "01" if(src.secure) @@ -189,7 +189,7 @@ obj/structure/windoor_assembly/Destroy() //Adding airlock electronics for access. Step 6 complete. else if(istype(W, /obj/item/weapon/airlock_electronics)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.") + user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...") user.drop_item() W.loc = src @@ -197,7 +197,7 @@ obj/structure/windoor_assembly/Destroy() if(!src || src.electronics) W.loc = src.loc return - user << "You've installed the airlock electronics!" + user << "You install the airlock electronics." src.name = "near finished windoor assembly" src.electronics = W else @@ -209,12 +209,12 @@ obj/structure/windoor_assembly/Destroy() return playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.") + user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...") if(do_after(user, 40)) if(!src || !electronics) return - user << "You've removed the airlock electronics!" + user << "You remove the airlock electronics." src.name = "wired windoor assembly" var/obj/item/weapon/airlock_electronics/ae ae = electronics @@ -235,18 +235,18 @@ obj/structure/windoor_assembly/Destroy() //Crowbar to complete the assembly, Step 7 complete. else if(istype(W, /obj/item/weapon/crowbar)) if(!src.electronics) - usr << "The assembly is missing electronics." + usr << "The assembly is missing electronics!" return usr << browse(null, "window=windoor_access") playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame.") + user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...") if(do_after(user, 40)) if(src.loc && src.electronics) density = 1 //Shouldn't matter but just incase - user << "You finish the windoor!" + user << "You finish the windoor." if(secure) var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(src.loc) @@ -306,7 +306,7 @@ obj/structure/windoor_assembly/Destroy() if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "It is fastened to the floor; therefore, you can't rotate it!" + usr << "It is fastened to the floor; therefore, you can't rotate it!" return 0 //if(src.state != "01") //update_nearby_tiles(need_rebuild=1) //Compel updates before @@ -329,11 +329,11 @@ obj/structure/windoor_assembly/Destroy() return if(src.facing == "l") - usr << "The windoor will now slide to the right." + usr << "The windoor will now slide to the right." src.facing = "r" else src.facing = "l" - usr << "The windoor will now slide to the left." + usr << "The windoor will now slide to the left." update_icon() return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 42be0f87cec..f773adc6714 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -16,20 +16,25 @@ var/disassembled = 0 var/wtype = "glass" var/fulltile = 0 - var/obj/item/stack/rods/storedrods - var/obj/item/weapon/shard/storedshard + var/list/storeditems = list() // var/silicate = 0 // number of units of silicate // var/icon/silicateIcon = null // the silicated icon /obj/structure/window/New(Loc,re=0) ..() health = maxhealth - if(re) reinf = re - storedshard = new/obj/item/weapon/shard(src) + if(re) + reinf = re + storeditems.Add(new/obj/item/weapon/shard(src)) + if(fulltile) + storeditems.Add(new/obj/item/weapon/shard(src)) ini_dir = dir if(reinf) state = 2*anchored - storedrods = new/obj/item/stack/rods(src) + var/obj/item/stack/rods/R = new/obj/item/stack/rods(src) + storeditems.Add(R) + if(fulltile) + R.add(1) air_update_turf(1) update_nearby_icons() @@ -123,9 +128,7 @@ ..(user, 1) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) user.visible_message("[user] smashes through [src]!") - storedshard.add_fingerprint(user) - if(storedrods) - storedrods.add_fingerprint(user) + add_fingerprint(user) hit(50) return 1 @@ -133,7 +136,7 @@ if(!can_be_reached(user)) return user.changeNext_move(CLICK_CD_MELEE) - user.visible_message("[user] knocks on [src].") + user.visible_message("[user] knocks on [src].") add_fingerprint(user) playsound(loc, 'sound/effects/Glassknock.ogg', 50, 1) @@ -188,51 +191,51 @@ if(istype(I, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) if(reinf && (state == 2 || state == 1)) - user << (state == 2 ? "You begin to unscrew the window from the frame." : "You begin to screw the window to the frame.") + user << (state == 2 ? "You begin to unscrew the window from the frame..." : "You begin to screw the window to the frame...") else if(reinf && state == 0) - user << (anchored ? "You begin to unscrew the frame from the floor." : "You begin to screw the frame to the floor.") + user << (anchored ? "You begin to unscrew the frame from the floor..." : "You begin to screw the frame to the floor...") else if(!reinf) - user << (anchored ? "You begin to unscrew the window from the floor." : "You begin to screw the window to the floor.") + user << (anchored ? "You begin to unscrew the window from the floor..." : "You begin to screw the window to the floor...") if(do_after(user, 40)) if(reinf && (state == 1 || state == 2)) //If state was unfastened, fasten it, else do the reverse state = (state == 1 ? 2 : 1) - user << (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame.") + user << (state == 1 ? "You unfasten the window from the frame." : "You fasten the window to the frame.") else if(reinf && state == 0) anchored = !anchored update_nearby_icons() - user << (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.") + user << (anchored ? "You fasten the frame to the floor." : "You unfasten the frame from the floor.") else if(!reinf) anchored = !anchored update_nearby_icons() - user << (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.") + user << (anchored ? "You fasten the window to the floor." : "You unfasten the window.") else if (istype(I, /obj/item/weapon/crowbar) && reinf && (state == 0 || state == 1)) - user << (state == 0 ? "You begin to lever the window into the frame." : "You begin to lever the window out of the frame.") + user << (state == 0 ? "You begin to lever the window into the frame..." : "You begin to lever the window out of the frame...") playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) if(do_after(user, 40)) //If state was out of frame, put into frame, else do the reverse state = (state == 0 ? 1 : 0) - user << (state == 1 ? "You have pried the window into the frame." : "You have pried the window out of the frame.") + user << (state == 1 ? "You pry the window into the frame." : "You pry the window out of the frame.") else if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = I if(user.a_intent == "help") //so you can still break windows with welding tools if(health < maxhealth) if(WT.remove_fuel(0,user)) - user << "You begin repairing [src]." + user << "You begin repairing [src]..." playsound(loc, 'sound/items/Welder.ogg', 40, 1) if(do_after(user, 40)) health = maxhealth playsound(loc, 'sound/items/Welder2.ogg', 50, 1) else - user << "[src] is already in good condition." + user << "[src] is already in good condition!" update_nearby_icons() else if(istype(I, /obj/item/weapon/wrench) && !anchored) playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) - user << " You begin to disassemble [src]." + user << " You begin to disassemble [src]..." if(do_after(user, 40)) if(disassembled) return //Prevents multiple deconstruction attempts @@ -279,29 +282,23 @@ return 1 /obj/structure/window/proc/hit(var/damage, var/sound_effect = 1) - if(reinf) damage *= 0.5 + if(reinf) + damage *= 0.5 health = max(0, health - damage) update_nearby_icons() if(sound_effect) playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) if(health <= 0) - if(dir == SOUTHWEST) - var/index = null - index = 0 - while(index < 2) - spawnfragments() - index++ - else - spawnfragments() + spawnfragments() return /obj/structure/window/proc/spawnfragments() + if(!loc) //if already qdel'd somehow, we do nothing + return var/turf/T = loc - storedshard.loc = T - transfer_fingerprints_to(storedshard) - if(storedrods) - storedrods.loc = T - transfer_fingerprints_to(storedrods) + for(var/obj/item/I in storeditems) + I.loc = T + transfer_fingerprints_to(I) qdel(src) update_nearby_icons() @@ -314,7 +311,7 @@ return if(anchored) - usr << "It is fastened to the floor therefore you can't rotate it!" + usr << "It is fastened to the floor therefore you can't rotate it!" return 0 dir = turn(dir, 90) @@ -334,7 +331,7 @@ return if(anchored) - usr << "It is fastened to the floor therefore you can't rotate it!" + usr << "It is fastened to the floor therefore you can't rotate it!" return 0 dir = turn(dir, 270) diff --git a/code/game/say.dm b/code/game/say.dm index 040f26c8d84..5d6d0eb6d65 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -13,7 +13,7 @@ var/list/freqtospan = list( "1353" = "comradio", "1447" = "aiprivradio", "1213" = "syndradio", - "1441" = "centcomradio" + "1337" = "centcomradio" ) /atom/movable/proc/say(message) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index fef4bbef000..c0ebdc6ed13 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -23,7 +23,11 @@ if(wet_overlay) overlays -= wet_overlay wet_overlay = null - wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + var/turf/simulated/floor/F = src + if(istype(F)) + wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + else + wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay spawn(rand(790, 820)) // Purely so for visual effect diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index f550095c738..be064079ef9 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -164,7 +164,7 @@ if(world.time > last_event+15) active = 1 for(var/mob/living/L in range(3,src)) - L.apply_effect(1,IRRADIATE,0) + L.irradiate(1) for(var/turf/simulated/floor/mineral/uranium/T in range(3,src)) T.radiate() last_event = world.time diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index b41e048e30c..d09fd62b222 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -30,20 +30,20 @@ return if(istype(C, /obj/item/stack/rods)) if(broken || burnt) - user << "Repair the plating first." + user << "Repair the plating first!" return var/obj/item/stack/rods/R = C if (R.get_amount() < 2) - user << "You need two rods to make a reinforced floor." + user << "You need two rods to make a reinforced floor!" return else - user << "Reinforcing the floor..." + user << "You begin reinforcing the floor..." if(do_after(user, 30)) if (R.get_amount() >= 2) ChangeTurf(/turf/simulated/floor/engine) playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) R.use(2) - user << "You have reinforced the floor." + user << "You reinforce the floor." return else if(istype(C, /obj/item/stack/tile)) if(!broken && !burnt) @@ -56,7 +56,7 @@ W.use(1) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) else - user << "This section is too damaged to support a tile. Use a welder to fix the damage." + user << "This section is too damaged to support a tile! Use a welder to fix the damage." else if(istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/welder = C if( welder.isOn() && (broken || burnt) ) @@ -95,7 +95,7 @@ if(!C || !user) return if(istype(C, /obj/item/weapon/wrench)) - user << "Removing rods..." + user << "You begin removing rods..." playsound(src, 'sound/items/Ratchet.ogg', 80, 1) if(do_after(user, 30)) new /obj/item/stack/rods(src, 2) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 76206f08ab6..62f5324dc59 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -144,7 +144,7 @@ if(try_wallmount(W,user,T) || try_decon(W,user,T) || try_destroy(W,user,T)) return - return attack_hand(user) + return /turf/simulated/wall/proc/try_wallmount(obj/item/weapon/W as obj, mob/user as mob, turf/T as turf) @@ -181,7 +181,7 @@ if( istype(W, /obj/item/weapon/weldingtool) ) var/obj/item/weapon/weldingtool/WT = W if( WT.remove_fuel(0,user) ) - user << "You begin slicing through the outer plating." + user << "You begin slicing through the outer plating..." playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, slicing_duration)) if( !istype(src, /turf/simulated/wall) || !user || !WT || !WT.isOn() || !T ) @@ -191,7 +191,7 @@ dismantle_wall() return 1 else if( istype(W, /obj/item/weapon/gun/energy/plasmacutter) ) - user << "You begin slicing through the outer plating." + user << "You begin slicing through the outer plating..." playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, slicing_duration*0.6)) // plasma cutter is faster than welding tool if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) @@ -199,7 +199,7 @@ if( user.loc == T && user.get_active_hand() == W ) user << "You remove the outer plating." dismantle_wall() - visible_message("The wall was sliced apart by [user]!", "You hear metal being sliced apart.") + visible_message("The wall was sliced apart by [user]!", "You hear metal being sliced apart.") return 1 return 0 @@ -208,7 +208,7 @@ if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) var/obj/item/weapon/pickaxe/drill/jackhammer/D = W if(!D.bcell.use(400)) - user << "Your [D.name] doesn't have enough power to break through the [name]." + user << "Your [D.name] doesn't have enough power to break through the [name]!" return D.update_icon() if( !istype(src, /turf/simulated/wall) || !user || !W || !T ) @@ -216,7 +216,7 @@ if( user.loc == T && user.get_active_hand() == W ) D.playDigSound() dismantle_wall() - visible_message("[user] smashes through the [name] with the [W.name]!", "You hear the grinding of metal.") + visible_message("[user] smashes through the [name] with the [W.name]!", "You hear the grinding of metal.") return 1 return 0 diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index 817fd5be882..ffa184a2a66 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -64,7 +64,7 @@ if(world.time > last_event+15) active = 1 for(var/mob/living/L in range(3,src)) - L.apply_effect(12,IRRADIATE,0) + L.irradiate(12) for(var/turf/simulated/wall/mineral/uranium/T in range(3,src)) T.radiate() last_event = world.time diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index cf7b6ffd6ec..be6281e25fe 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -34,22 +34,22 @@ if(!D.bcell.use(800)) user << "Your [D.name] doesn't have enough power to break through the [name]." return 1 - user << "You begin to smash though the [name]." + user << "You begin to smash though the [name]..." if(do_after(user, 50)) if( !istype(src, /turf/simulated/wall/r_wall) || !user || !W || !T ) return 1 if( user.loc == T && user.get_active_hand() == W ) D.update_icon() D.playDigSound() - visible_message("[user] smashes through the [name] with the [D.name]!", "You hear the grinding of metal.") + visible_message("[user] smashes through the [name] with the [D.name]!", "You hear the grinding of metal.") dismantle_wall() return 1 else if(istype(W, /obj/item/stack/sheet/metal) && d_state) var/obj/item/stack/sheet/metal/MS = W if (MS.get_amount() < 1) - user << "You need one sheet of metal to repair the wall." + user << "You need one sheet of metal to repair the wall!" return 1 - user << "You begin patching-up the wall with \a [MS]." + user << "You begin patching-up the wall with \a [MS]..." if (do_after(user, max(20*d_state,100)))//time taken to repair is proportional to the damage! (max 10 seconds) if(loc == null || MS.get_amount() < 1) return 1 @@ -75,7 +75,7 @@ if(1) if (istype(W, /obj/item/weapon/screwdriver)) - user << "You begin removing the support lines." + user << "You begin removing the support lines..." playsound(src, 'sound/items/Screwdriver.ogg', 100, 1) if(do_after(user, 40)) @@ -97,7 +97,7 @@ relativewall_neighbours() //call smoothwall stuff user << "You replace the outer grille." else - user << "You need one rod to repair the wall." + user << "You need one rod to repair the wall!" return 1 return 1 @@ -106,7 +106,7 @@ var/obj/item/weapon/weldingtool/WT = W if( WT.remove_fuel(0,user) ) - user << "You begin slicing through the metal cover." + user << "You begin slicing through the metal cover..." playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 60)) @@ -121,7 +121,7 @@ if( istype(W, /obj/item/weapon/gun/energy/plasmacutter) ) - user << "You begin slicing through the metal cover." + user << "You begin slicing through the metal cover..." playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 60)) @@ -137,7 +137,7 @@ if(3) if (istype(W, /obj/item/weapon/crowbar)) - user << "You struggle to pry off the cover." + user << "You struggle to pry off the cover..." playsound(src, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 100)) @@ -153,7 +153,7 @@ if(4) if (istype(W, /obj/item/weapon/wrench)) - user << "You start loosening the anchoring bolts which secure the support rods to their frame." + user << "You start loosening the anchoring bolts which secure the support rods to their frame..." playsound(src, 'sound/items/Ratchet.ogg', 100, 1) if(do_after(user, 40)) @@ -171,7 +171,7 @@ var/obj/item/weapon/weldingtool/WT = W if( WT.remove_fuel(0,user) ) - user << "You begin slicing through the support rods." + user << "You begin slicing through the support rods..." playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 100)) @@ -187,7 +187,7 @@ if( istype(W, /obj/item/weapon/gun/energy/plasmacutter) ) - user << "You begin slicing through the support rods." + user << "You begin slicing through the support rods..." playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 70)) @@ -204,7 +204,7 @@ if(6) if( istype(W, /obj/item/weapon/crowbar) ) - user << "You struggle to pry off the outer sheath." + user << "You struggle to pry off the outer sheath..." playsound(src, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 100)) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 38dcbe609c6..7b5c0627eac 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -38,16 +38,16 @@ var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src) if(W) - user << "There is already a catwalk here." + user << "There is already a catwalk here!" return if(L) if(R.use(1)) - user << "Constructing catwalk..." + user << "You begin constructing catwalk..." playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) qdel(L) ReplaceWithCatwalk() else - user << "You need two rods to build a catwalk." + user << "You need two rods to build a catwalk!" return if(R.use(1)) user << "Constructing support lattice..." @@ -66,9 +66,9 @@ user << "You build a floor." ChangeTurf(/turf/simulated/floor/plating) else - user << "You need one floor tile to build a floor." + user << "You need one floor tile to build a floor!" else - user << "The plating is going to need some support. Place metal rods first." + user << "The plating is going to need some support! Place metal rods first." /turf/space/Entered(atom/movable/A) ..() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 74be224cc36..061a8db5665 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -126,8 +126,7 @@ /turf/proc/ChangeTurf(var/path) if(!path) return if(path == type) return src - var/old_lumcount = lighting_lumcount - initial(lighting_lumcount) - var/old_opacity = opacity + SSair.remove_from_active(src) var/turf/W = new path(src) @@ -136,18 +135,6 @@ W:Assimilate_Air() W.RemoveLattice() - W.lighting_lumcount += old_lumcount - if(old_lumcount != W.lighting_lumcount) //light levels of the turf have changed. We need to shift it to another lighting-subarea - W.lighting_changed = 1 - SSlighting.changed_turfs += W - - if(old_opacity != W.opacity) //opacity has changed. Need to update surrounding lights - if(W.lighting_lumcount) //unless we're being illuminated, don't bother (may be buggy, hard to test) - W.UpdateAffectingLights() - - for(var/turf/space/S in range(W,1)) - S.update_starlight() - W.levelupdate() W.CalculateAdjacentTurfs() return W @@ -349,4 +336,4 @@ return !density /turf/proc/can_lay_cable() - return can_have_cabling() & !intact + return can_have_cabling() & !intact diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index a3ba0d120b0..ca6b69118a5 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -24,4 +24,8 @@ /turf/unsimulated/floor/grass/New() ..() - icon_state = "grass[rand(1,4)]" + icon_state = "grass[rand(1,4)]" + +/turf/unsimulated/floor/abductor + name = "alien floor" + icon_state = "alienpod1" diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 7244345c7d1..27392e1e9d6 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -29,6 +29,9 @@ turf/unsimulated/wall/splashscreen icon_state = "r_wall" name = "reinforced wall" +/turf/unsimulated/wall/vault + icon_state = "rockvault" + /turf/unsimulated/shuttle name = "shuttle" icon = 'icons/turf/shuttle.dmi' @@ -62,4 +65,7 @@ turf/unsimulated/wall/splashscreen /turf/unsimulated/shuttle/floor name = "floor" - icon_state = "floor" \ No newline at end of file + icon_state = "floor" + +/turf/unsimulated/wall/abductor + icon_state = "alien1" \ No newline at end of file diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 7fc2486a184..c89f8d740f4 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -33,22 +33,23 @@ //Do 175 damage divided by the number of damage types applied. if(damagetype & BRUTELOSS) - adjustBruteLoss(175/damage_mod) + adjustBruteLoss(200/damage_mod) if(damagetype & FIRELOSS) - adjustFireLoss(175/damage_mod) + adjustFireLoss(200/damage_mod) if(damagetype & TOXLOSS) - adjustToxLoss(175/damage_mod) + adjustToxLoss(200/damage_mod) if(damagetype & OXYLOSS) - adjustOxyLoss(175/damage_mod) + adjustOxyLoss(200/damage_mod) //If something went wrong, just do normal oxyloss if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() + death(0) return var/suicide_message = pick("[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ @@ -58,8 +59,9 @@ visible_message("[suicide_message]", "[suicide_message]") - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() + death(0) /mob/living/carbon/brain/verb/suicide() set hidden = 1 @@ -88,8 +90,9 @@ //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while visible_message("[src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide.", \ "[src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide.") - adjustOxyLoss(max(175- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjustOxyLoss(max(200- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() + death(0) /mob/living/silicon/ai/verb/suicide() set hidden = 1 @@ -105,6 +108,7 @@ //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() + death(0) /mob/living/silicon/robot/verb/suicide() set hidden = 1 @@ -120,6 +124,7 @@ //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() + death(0) /mob/living/silicon/pai/verb/suicide() set category = "pAI Commands" @@ -145,10 +150,11 @@ suiciding = 1 visible_message("[src] is thrashing wildly! It looks like \he's trying to commit suicide.", \ "[src] is thrashing wildly! It looks like \he's trying to commit suicide.", \ - "You hear thrashing") + "You hear thrashing.") //put em at -175 - adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjustOxyLoss(max(200 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() + death(0) /mob/living/simple_animal/verb/suicide() set hidden = 1 @@ -170,7 +176,7 @@ else if(stat == DEAD) src << "You're already dead!" else if(stat == UNCONSCIOUS) - src << "You need to be conscious to suicide" + src << "You need to be conscious to suicide!" return /mob/living/carbon/canSuicide() diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index a89aea9f725..b3aa7455c17 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -48,11 +48,9 @@ world/IsBanned(key,address,computer_id) if(IsGuestKey(key)) if (!guests_allowed) log_access("Failed Login: [key] - Guests not allowed") - message_admins("Failed Login: [key] - Guests not allowed") return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.") if (config.panic_bunker && dbcon && dbcon.IsConnected()) log_access("Failed Login: [key] - Guests not allowed during panic bunker") - message_admins("Failed Login: [key] - Guests not allowed during panic bunker") return list("reason"="guest", "desc"="\nReason: Sorry but the server is currently not accepting connections from never before seen players or guests. If you have played on this server with a byond account before, please log in to the byond account you have played from.") //Population Cap Checking @@ -66,7 +64,6 @@ world/IsBanned(key,address,computer_id) . = CheckBan( ckey(key), computer_id, address ) if(.) log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") - message_admins("Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]") return . return ..() //default pager ban stuff diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 6c0a2019fe7..d9a4d08f85b 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -27,7 +27,7 @@ var/global/floorIsLava = 0 body += "Options panel for [M]" if(M.client) body += " played by [M.client] " - body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" + body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" if(istype(M, /mob/new_player)) body += " Hasn't Entered Game " @@ -862,4 +862,38 @@ proc/kick_clients_in_lobby(var/message, var/kick_only_afk = 0) C << message kicked_client_names.Add("[C.ckey]") del(C) - return kicked_client_names \ No newline at end of file + return kicked_client_names + +//returns 1 to let the dragdrop code know we are trapping this event +//returns 0 if we don't plan to trap the event +/datum/admins/proc/cmd_ghost_drag(var/mob/dead/observer/frommob, var/mob/living/tomob) + + //this is the exact two check rights checks required to edit a ckey with vv. + if (!check_rights(R_VAREDIT,0) || !check_rights(R_SPAWN|R_DEBUG,0)) + return 0 + + if (!frommob.ckey) + return 0 + + var/question = "" + if (tomob.ckey) + question = "This mob already has a user ([tomob.key]) in control of it! " + question += "Are you sure you want to place [frommob.name]([frommob.key]) in control of [tomob.name]?" + + var/ask = alert(question, "Place ghost in control of mob?", "Yes", "No") + if (ask != "Yes") + return 1 + + if (!frommob || !tomob) //make sure the mobs don't go away while we waited for a response + return 1 + + tomob.ghostize(0) + + message_admins("[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].") + log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].") + feedback_add_details("admin_verb","CGD") + + tomob.ckey = frommob.ckey + qdel(frommob) + + return 1 \ No newline at end of file diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 711907c6025..0fa01cb6319 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -248,6 +248,7 @@ var/list/admin_ranks = list() //list of all admin_rank datums admin_datums -= adm_ckey D.disassociate() + updateranktodb(adm_ckey, "player") message_admins("[key_name_admin(usr)] removed [adm_ckey] from the admins list") log_admin("[key_name(usr)] removed [adm_ckey] from the admins list") log_admin_rank_modification(adm_ckey, "Removed") @@ -288,6 +289,7 @@ var/list/admin_ranks = list() //list of all admin_rank datums var/client/C = directory[adm_ckey] //find the client with the specified ckey (if they are logged in) D.associate(C) //link up with the client and add verbs + updateranktodb(adm_ckey, new_rank) message_admins("[key_name_admin(usr)] edited the admin rank of [adm_ckey] to [new_rank]") log_admin("[key_name(usr)] edited the admin rank of [adm_ckey] to [new_rank]") log_admin_rank_modification(adm_ckey, new_rank) @@ -319,3 +321,13 @@ var/list/admin_ranks = list() //list of all admin_rank datums log_admin_permission_modification(adm_ckey, D.rank.rights) edit_admin_permissions() + +/datum/admins/proc/updateranktodb(ckey,newrank) + establish_db_connection() + if (!dbcon.IsConnected()) + return + var/sql_ckey = sanitizeSQL(ckey) + var/sql_admin_rank = sanitizeSQL(newrank) + + var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastadminrank = '[sql_admin_rank]' WHERE ckey = '[sql_ckey]'") + query_update.Execute() \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 956e2d99bc7..ce9bc361b99 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -69,6 +69,7 @@ var/list/admin_verbs_ban = list( var/list/admin_verbs_sounds = list( /client/proc/play_local_sound, /client/proc/play_sound, + /client/proc/set_round_end_sound, ) var/list/admin_verbs_fun = list( /client/proc/cmd_admin_dress, @@ -158,6 +159,7 @@ var/list/admin_verbs_hideable = list( /client/proc/check_words, /client/proc/play_local_sound, /client/proc/play_sound, + /client/proc/set_round_end_sound, /client/proc/cmd_admin_dress, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, @@ -441,9 +443,9 @@ var/list/admin_verbs_hideable = list( message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].") if(T.mind) - T.mind.spell_list += new S + T.mind.AddSpell(new S) else - T.mob_spell_list += new S + T.AddSpell(new S) message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!") diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index 7306af6e4ff..eae80abf304 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -15,7 +15,7 @@ var/quick_create_object_html = null var/pathtext = null - pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/item","/obj/item/clothing","/obj/item/weapon/reagent_containers/food","/obj/item/weapon","/obj/machinery") + pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/effect","/obj/item","/obj/item/clothing","/obj/item/weapon/reagent_containers/food","/obj/item/weapon","/obj/item/weapon/gun","/obj/machinery","/obj/item/stack") var path = text2path(pathtext) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 4b50cfa3af0..dc82a42143a 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -305,6 +305,8 @@ usr << browse(dat, "window=players;size=600x480") /datum/admins/proc/check_antagonists() + var/list/supported_continuous_modes = list("revolution", "gang", "wizard", "malfunction", "blob") + var/list/supported_midround_antag_modes = list("wizard", "malfunction", "blob") if (ticker && ticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

      Round Status

      " dat += "Current Game Mode: [ticker.mode.name]
      " @@ -321,6 +323,16 @@ dat += "Send Back
      " else dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
      " + dat += "Continuous Round Status
      " + if(!ticker.mode.config_tag in supported_continuous_modes) + dat += "Continue if antagonists die" + else + dat += "[config.continuous[ticker.mode.config_tag] ? "Continue if antagonists die" : "End on antagonist death"]" + if(config.continuous[ticker.mode.config_tag] && ticker.mode.config_tag in supported_midround_antag_modes) + dat += ", [config.midround_antag[ticker.mode.config_tag] ? "creating replacement antagonists" : "not creating new antagonists"]
      " + else + dat += "
      " + dat += "
      " dat += "End Round Now
      " dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
      " if(ticker.mode.syndicates.len) @@ -373,8 +385,8 @@ dat += "Head not found!" dat += "" - if(ticker.mode.A_bosses.len || ticker.mode.A_gangsters.len) - dat += "
      " + if(ticker.mode.A_bosses.len || ticker.mode.A_gang.len) + dat += "
      [gang_name("A")] Gang Members
      " for(var/datum/mind/N in ticker.mode.A_bosses) var/mob/M = N.current if(!M) @@ -382,15 +394,15 @@ else dat += "" dat += "" - for(var/datum/mind/N in ticker.mode.A_gangsters) + for(var/datum/mind/N in ticker.mode.A_gang) var/mob/M = N.current if(M) dat += "" dat += "" dat += "
      [gang_name("A")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.A] Influence, " : "")][round((ticker.mode.A_territory.len/start_state.num_territories)*100, 0.1)]% Control
      [M.real_name] (Boss)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PM
      [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PM
      " - if(ticker.mode.B_bosses.len || ticker.mode.B_gangsters.len) - dat += "
      " + if(ticker.mode.B_bosses.len || ticker.mode.B_gang.len) + dat += "
      [gang_name("B")] Gang Members
      " for(var/datum/mind/N in ticker.mode.B_bosses) var/mob/M = N.current if(!M) @@ -398,7 +410,7 @@ else dat += "" dat += "" - for(var/datum/mind/N in ticker.mode.B_gangsters) + for(var/datum/mind/N in ticker.mode.B_gang) var/mob/M = N.current if(M) dat += "" @@ -450,6 +462,36 @@ dat += "" dat += "
      [gang_name("B")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.B] Influence, " : "")][round((ticker.mode.B_territory.len/start_state.num_territories)*100, 0.1)]% Control
      [M.real_name] (Boss)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PM
      [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]
      Traitor not found!
      " + if(ticker.mode.shadows.len) + dat += "
      " + for(var/datum/mind/N in ticker.mode.shadows) + var/mob/M = N.current + if(M) + dat += "" + dat += "" + dat += "
      Shadowlings
      [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PM
      " + + if(ticker.mode.thralls.len) + dat += "
      " + for(var/datum/mind/N in ticker.mode.thralls) + var/mob/M = N.current + if(M) + dat += "" + dat += "" + dat += "
      Shadowling Thralls
      [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PM
      " + + if(ticker.mode.abductors.len) + dat += "
      " + for(var/datum/mind/abductor in ticker.mode.abductors) + var/mob/M = abductor.current + if(M) + dat += "" + dat += "" + dat += "" + else + dat += "" + dat += "
      Abductors
      [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PMShow Objective
      Abductor not found!
      " + if(istype(ticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/mode = ticker.mode dat += "
      " diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1821f3d7f71..7dbb6838046 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -12,40 +12,56 @@ return switch(href_list["makeAntag"]) if("1") - message_admins("[key_name_admin(usr)] created traitors.") - log_admin("[key_name(usr)] created traitors.") - if(!src.makeTraitors()) - usr << "Unfortunatly there were no candidates available." + if(src.makeTraitors()) + message_admins("[key_name_admin(usr)] created traitors.") + log_admin("[key_name(usr)] created traitors.") + else + message_admins("[key_name_admin(usr)] tried to create traitors. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to create traitors.") if("2") - message_admins("[key_name(usr)] created changelings.") - log_admin("[key_name(usr)] created changelings.") - if(!src.makeChanglings()) - usr << "Unfortunatly there were no candidates available." + if(src.makeChanglings()) + message_admins("[key_name(usr)] created changelings.") + log_admin("[key_name(usr)] created changelings.") + else + message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to create changelings.") if("3") - message_admins("[key_name(usr)] started a revolution.") - log_admin("[key_name(usr)] started a revolution.") if(!src.makeRevs()) - usr << "Unfortunatly there were no candidates available." + message_admins("[key_name(usr)] started a revolution.") + log_admin("[key_name(usr)] started a revolution.") + else + message_admins("[key_name_admin(usr)] tried to start a revolution. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to start a revolution.") if("4") - message_admins("[key_name(usr)] created cultists.") - log_admin("[key_name(usr)] created cultists.") - if(!src.makeCult()) - usr << "Unfortunatly there were no candidates available." + if(src.makeCult()) + message_admins("[key_name(usr)] started a cult.") + log_admin("[key_name(usr)] started a cult.") + else + message_admins("[key_name_admin(usr)] tried to start a cult. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to start a cult.") if("5") - message_admins("[key_name(usr)] caused an AI to malfunction.") - log_admin("[key_name(usr)] caused an AI to malfunction.") - if(!src.makeMalfAImode()) - usr << "Unfortunatly there were no candidates available." + if(src.makeMalfAImode()) + message_admins("[key_name(usr)] caused an AI to malfunction.") + log_admin("[key_name(usr)] caused an AI to malfunction.") + else + message_admins("[key_name_admin(usr)] tried to cause an AI to malfunction. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to cause an AI to malfunction.") if("6") - message_admins("[key_name(usr)] created a wizard.") - log_admin("[key_name(usr)] created a wizard.") - if(!src.makeWizard()) - usr << "Unfortunatly there were no candidates available." + message_admins("[key_name(usr)] is creating a wizard...") + if(src.makeWizard()) + message_admins("[key_name(usr)] created a wizard.") + log_admin("[key_name(usr)] created a wizard.") + else + message_admins("[key_name_admin(usr)] tried to create a wizard. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to create a wizard.") if("7") - message_admins("[key_name(usr)] created a nuke team.") - log_admin("[key_name(usr)] created a nuke team.") - if(!src.makeNukeTeam()) - usr << "Unfortunatly there were not enough candidates available." + message_admins("[key_name(usr)] is creating a nuke team...") + if(src.makeNukeTeam()) + message_admins("[key_name(usr)] created a nuke team.") + log_admin("[key_name(usr)] created a nuke team.") + else + message_admins("[key_name_admin(usr)] tried to create a nuke team. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create a nuke team.") if("8") message_admins("[key_name(usr)] spawned a ninja.") log_admin("[key_name(usr)] spawned a ninja.") @@ -55,27 +71,52 @@ log_admin("[key_name(usr)] started an alien infestation.") src.makeAliens() if("10") - message_admins("[key_name(usr)] created a death squad.") - log_admin("[key_name(usr)] created a death squad.") - if(!src.makeDeathsquad()) - usr << "Unfortunatly there were not enough candidates available." + message_admins("[key_name(usr)] is creating a death squad...") + if(src.makeDeathsquad()) + message_admins("[key_name(usr)] created a death squad.") + log_admin("[key_name(usr)] created a death squad.") + else + message_admins("[key_name_admin(usr)] tried to create a death squad. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create a death squad.") if("11") var/strength = input("Set Blob Strength (1=Weak, 2=Strong, 3=Full)","Set Strength",1) as num message_admins("[key_name(usr)] spawned a blob with strength [strength].") log_admin("[key_name(usr)] spawned a blob with strength [strength].") new/datum/round_event/blob(strength) if("12") - message_admins("[key_name(usr)] started a gang war.") - log_admin("[key_name(usr)] started a gang war.") - if(!src.makeGangsters()) - usr << "Unfortunatly there were not enough candidates available." + if(src.makeGangsters()) + message_admins("[key_name(usr)] started a gang war.") + log_admin("[key_name(usr)] started a gang war.") + else + message_admins("[key_name(usr)] tried to start a gang war. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to start a gang war.") if("13") - message_admins("[key_name(usr)] created a emergency response team.") - log_admin("[key_name(usr)] created a emergency response team.") - if(!src.makeEmergencyresponseteam()) - usr << "Unfortunatly there were not enough candidates available." + message_admins("[key_name(usr)] is creating an emergency response team...") + if(src.makeEmergencyresponseteam()) + message_admins("[key_name(usr)] created an emergency response team.") + log_admin("[key_name(usr)] created an emergency response team.") + else + message_admins("[key_name_admin(usr)] tried to create an emergency response team. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create an emergency response team.") + if("14") + message_admins("[key_name(usr)] is creating an abductor team...") + if(src.makeAbductorTeam()) + message_admins("[key_name(usr)] created an abductor team.") + log_admin("[key_name(usr)] created an abductor team.") + else + message_admins("[key_name_admin(usr)] tried to create an abductor team. Unfortunatly there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create an abductor team.") + if("15") + message_admins("[key_name(usr)] is creating a revenant...") + if(src.makeRevenant()) + message_admins("[key_name(usr)] created a revenant.") + log_admin("[key_name(usr)] created a revenant.") + else + message_admins("[key_name_admin(usr)] tried to create a revenant. Unfortunately, there were no candidates available.") + log_admin("[key_name(usr)] failed to create a revenant.") else if(href_list["forceevent"]) + if(!check_rights(R_FUN)) return var/datum/round_event_control/E = locate(href_list["forceevent"]) in SSevent.control if(E) var/datum/round_event/event = E.runEvent() @@ -221,6 +262,28 @@ message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds") href_list["secretsadmin"] = "check_antagonist" + else if(href_list["toggle_continuous"]) + if(!check_rights(R_ADMIN)) return + + if(!config.continuous[ticker.mode.config_tag]) + config.continuous[ticker.mode.config_tag] = 1 + else + config.continuous[ticker.mode.config_tag] = 0 + + message_admins("[key_name_admin(usr)] toggled the round to [config.continuous[ticker.mode.config_tag] ? "continue if all antagonists die" : "end with the antagonists"].") + check_antagonists() + + else if(href_list["toggle_midround_antag"]) + if(!check_rights(R_ADMIN)) return + + if(!config.midround_antag[ticker.mode.config_tag]) + config.midround_antag[ticker.mode.config_tag] = 1 + else + config.midround_antag[ticker.mode.config_tag] = 0 + + message_admins("[key_name_admin(usr)] toggled the round to [config.midround_antag[ticker.mode.config_tag] ? "use" : "skip"] the midround antag system.") + check_antagonists() + else if(href_list["delay_round_end"]) if(!check_rights(R_SERVER)) return @@ -644,6 +707,18 @@ else jobs += "" + //Abductor + if(jobban_isbanned(M, "abductor") || isbanned_dept) + jobs += "" + else + jobs += "" + + //Deathsquad + if(jobban_isbanned(M, "deathsquad") || isbanned_dept) + jobs += "" + else + jobs += "" + /* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment if(jobban_isbanned(M, "malf AI") || isbanned_dept) jobs += "" diff --git a/code/modules/admin/verbs/bluespacearty.dm b/code/modules/admin/verbs/bluespacearty.dm index c3c0c0d90b7..486c0003129 100644 --- a/code/modules/admin/verbs/bluespacearty.dm +++ b/code/modules/admin/verbs/bluespacearty.dm @@ -29,6 +29,6 @@ target.Weaken(20) target.stuttering = 20 - target << "You've been hit by bluespace artillery!" + target << "You're hit by bluespace artillery!" log_admin("[target.name] has been hit by Bluespace Artillery fired by [usr]") message_admins("[target.name] has been hit by Bluespace Artillery fired by [usr]") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 22f84bea4d8..af5e35c3ff7 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -856,14 +856,14 @@ var/global/list/g_fancy_list_of_types = null equip_deathsquad(M) if("emergency response officer") - switch(input("Which class?") in list("Commander","Security","Engineer","Medical")) + switch(input("Which class?") in list("Commander","Security","Engineer","Medic")) if("Commander") equip_emergencyresponsesquad(M, "commander") if("Security") equip_emergencyresponsesquad(M, "sec") if("Engineer") equip_emergencyresponsesquad(M, "eng") - if("Medical") + if("Medic") equip_emergencyresponsesquad(M, "med") if("centcom official") @@ -919,16 +919,17 @@ var/global/list/g_fancy_list_of_types = null if("special ops officer") var/obj/item/device/radio/headset/R = new /obj/item/device/radio/headset/headset_cent/commander(M) - R.set_frequency(1441) + R.set_frequency(CENTCOM_FREQ) + R.freqlock = 1 M.equip_to_slot_or_del(R, slot_ears) M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/officer(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/beret(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) @@ -1106,26 +1107,27 @@ var/global/list/g_fancy_list_of_types = null //Deathsquad /proc/equip_deathsquad(var/mob/living/carbon/human/M, var/officer) var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M) - R.set_frequency(1441) + R.set_frequency(CENTCOM_FREQ) + R.freqlock = 1 M.equip_to_slot_or_del(R, slot_ears) if(officer) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) - else - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/beret(M), slot_head) + //else + // M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/deathsquad(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/toggle/thermal(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) @@ -1157,7 +1159,8 @@ var/global/list/g_fancy_list_of_types = null /proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/ertrole) var/obj/item/weapon/card/id/W = null var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M) - R.set_frequency(1441) + R.set_frequency(CENTCOM_FREQ) + R.freqlock = 1 M.equip_to_slot_or_del(R, slot_ears) switch(ertrole) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index b8041bc269e..d4cd11aad0d 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -22,6 +22,8 @@ client/proc/one_click_antag() Make Nuke Team (Requires Ghosts)
      Make Deathsquad (Requires Ghosts)
      Make Emergency Response Team (Requires Ghosts)
      + Make Abductor Team (Requires Ghosts)
      + Make Revenant (Requires Ghost)
      "} /* These dont work just yet Ninja, aliens and deathsquad I have not looked into yet @@ -238,26 +240,9 @@ client/proc/one_click_antag() /datum/admins/proc/makeNukeTeam() var/datum/game_mode/nuclear/temp = new - var/list/mob/dead/observer/candidates = list() + var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp) var/list/mob/dead/observer/chosen = list() var/mob/dead/observer/theghost = null - var/time_passed = world.time - - for(var/mob/dead/observer/G in player_list) - if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate")) - if(temp.age_check(G.client)) - spawn(0) - switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - else - return - - sleep(300) if(candidates.len) var/numagents = 5 @@ -310,8 +295,9 @@ client/proc/one_click_antag() else new_character.mind.make_Nuke(synd_spawn[spawnpos],nuke_code) spawnpos++ - - return 1 + return 1 + else + return 0 @@ -327,34 +313,17 @@ client/proc/one_click_antag() // DEATH SQUADS /datum/admins/proc/makeDeathsquad() - var/list/mob/dead/observer/candidates = list() - var/time_passed = world.time var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.") + var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null) + var/squadSpawned = 0 - //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. - for(var/mob/dead/observer/G in player_list) - spawn(0) - switch(alert(G,"Do you wish to be considered for an elite Nanotrasen strike team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - else - return - sleep(300) - - for(var/mob/dead/observer/G in candidates) - if(!G.key) - candidates.Remove(G) - - if(candidates.len >= 3) //Minimum 3 to be considered a squad + if(candidates.len >= 2) //Minimum 2 to be considered a squad //Pick the lucky players var/numagents = min(5,candidates.len) //How many commandos to spawn var/list/spawnpoints = deathsquadspawn while(numagents && candidates.len) if (numagents > spawnpoints.len) + numagents-- continue // This guy's unlucky, not enough spawn points, we skip him. var/spawnloc = spawnpoints[numagents] var/mob/dead/observer/chosen_candidate = pick(candidates) @@ -399,11 +368,12 @@ client/proc/one_click_antag() message_admins("The deathsquad has spawned with the mission: [mission].") log_game("[key_name(Commando)] has been selected as a Death Commando") numagents-- + squadSpawned++ - if (numagents == candidates.len) - return 0 // No one got spawned! - else + if (squadSpawned) return 1 + else + return 0 return @@ -442,34 +412,17 @@ client/proc/one_click_antag() // EMERGENCY RESPONSE TEAM /datum/admins/proc/makeEmergencyresponseteam() - var/list/mob/dead/observer/candidates = list() - var/time_passed = world.time var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.") - - //Generates a list of officers from active ghosts. Then the user picks which characters to respawn as the officers. - for(var/mob/dead/observer/G in player_list) - spawn(0) - switch(alert(G,"Do you wish to be considered for an elite Nanotrasen Emergency Response Team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - return - candidates += G - if("No") - return - else - return - sleep(300) - - for(var/mob/dead/observer/G in candidates) - if(!G.key) - candidates.Remove(G) + var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Emergency Response Team?", "deathsquad", null) + var/teamSpawned = 0 if(candidates.len >= 4) //Minimum 4 to be considered a squad //Pick the (un)lucky players var/numagents = min(7,candidates.len) //How many officers to spawn var/list/spawnpoints = emergencyresponseteamspawn while(numagents && candidates.len) - if (candidates.len > spawnpoints.len) + if (numagents > spawnpoints.len) + numagents-- continue // This guy's unlucky, not enough spawn points, we skip him. var/spawnloc = spawnpoints[numagents] var/mob/dead/observer/chosen_candidate = pick(candidates) @@ -531,14 +484,120 @@ client/proc/one_click_antag() message_admins("The emergency response team has spawned with the mission: [mission].") log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer") numagents-- + teamSpawned++ - if (numagents == candidates.len) - return 0 // No one got spawned! - else + if (teamSpawned) return 1 + else + return 0 return +//Abductors +/datum/admins/proc/makeAbductorTeam() + var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null) + + if(candidates.len >= 2) + //Oh god why we can't have static functions + var/teams_finished = 0 + if(ticker.mode.config_tag == "abductor") + var/datum/game_mode/abduction/A = ticker.mode + teams_finished = A.teams + else + teams_finished = round(ticker.mode.abductors.len / 2) + var/number = teams_finished + 1 + + var/datum/game_mode/abduction/temp + if(ticker.mode.config_tag == "abductor") + temp = ticker.mode + else + temp = new + + var/agent_mind = pick(candidates) + candidates -= agent_mind + var/scientist_mind = pick(candidates) + + var/mob/living/carbon/human/agent=makeBody(agent_mind) + var/mob/living/carbon/human/scientist=makeBody(scientist_mind) + + agent_mind = agent.mind + scientist_mind = scientist.mind + + temp.scientists.len = number + temp.agents.len = number + temp.abductors.len = 2*number + temp.team_objectives.len = number + temp.team_names.len = number + temp.scientists[number] = scientist_mind + temp.agents[number] = agent_mind + temp.abductors |= list(agent_mind,scientist_mind) + temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) + temp.post_setup_team(number) + if(ticker.mode.config_tag == "abductor") + var/datum/game_mode/abduction/A = ticker.mode + A.teams += 1 + else + ticker.mode.abductors |= temp.abductors + + return 1 + else + return + +/datum/admins/proc/makeRevenant() + var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null) + if(candidates.len >= 1) + var/spook_op = pick(candidates) + var/mob/dead/observer/O = spook_op + candidates -= spook_op + var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant(get_turf(O)) + revvie.key = O.key + revvie.mind.assigned_role = "revenant" + revvie.mind.special_role = "Revenant" + return 1 + else + return + +/datum/admins/proc/getCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck) + var/list/mob/dead/observer/candidates = list() + var/time_passed = world.time + if (!Question) + Question = "Would you like to be a special role?" + + for(var/mob/dead/observer/G in player_list) + if(!G.key || !G.client) + continue + if (gametypeCheck) + if(!gametypeCheck.age_check(G.client)) + continue + if (jobbanType) + if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate")) + continue + spawn(0) + G << 'sound/misc/notice2.ogg' //Alerting them to their consideration + switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No")) + if("Yes") + G << 'sound/machines/ping.ogg' + G << "Choice registered: Yes." + if((world.time-time_passed)>300)//If more than 30 game seconds passed. + G << "Sorry, you were too late for the consideration!" + G << 'sound/machines/buzz-sigh.ogg' + return + candidates += G + if("No") + G << "Choice registered: No." + G << 'sound/machines/buzz-sigh.ogg' + return + else + return + sleep(300) + + //Check all our candidates, to make sure they didn't log off during the 30 second wait period. + for(var/mob/dead/observer/G in candidates) + if(!G.key || !G.client) + candidates.Remove(G) + + return candidates + /datum/admins/proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character if(!G_found || !G_found.key) return diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 22f77f0e643..82e183bf91f 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -36,6 +36,20 @@ var/sound/admin_sound playsound(get_turf(src.mob), S, 50, 0, 0) feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/set_round_end_sound(S as sound) + set category = "Fun" + set name = "Set Round End Sound" + if(!check_rights(R_SOUNDS)) return + + if(ticker) + ticker.round_end_sound = S + else + return + + log_admin("[key_name(src)] set the round end sound to [S]") + message_admins("[key_name_admin(src)] set the round end sound to [S]") + feedback_add_details("admin_verb","SRES") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/stop_sounds() set category = "Debug" set name = "Stop Sounds" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 7755e882965..b738becff50 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -33,7 +33,7 @@ if(usr) if (usr.client) if(usr.client.holder) - M << "You hear [ticker.Bible_deity_name ? "the voice of " + ticker.Bible_deity_name : "a voice"] in your head... [msg]" + M << "You hear [ticker.Bible_deity_name ? "the voice of " + ticker.Bible_deity_name : "a voice"] in your head... [msg]" log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") message_admins(" SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]") diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 38bdb41d43b..94b5790af58 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -19,7 +19,7 @@ if(ishuman(usr)) var/mob/living/carbon/human/user = usr if((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY && prob(50)) - user << "Your hand slips, setting off the trigger." + user << "Your hand slips, setting off the trigger!" pulse(0) update_icon() if(usr) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 62aaa5e8b7b..201dde00b62 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -16,7 +16,9 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "blob" = /datum/game_mode/blob, //9 "ninja", //10 "monkey" = /datum/game_mode/monkey, //11 - "gangster" = /datum/game_mode/gang //12 + "gangster" = /datum/game_mode/gang, //12 + "shadowling" = /datum/game_mode/shadowling, //13 + "abductor" = /datum/game_mode/abduction //14 ) @@ -735,13 +737,10 @@ datum/preferences if(result) var/newtype = roundstart_species[result] pref_species = new newtype() - if(!config.mutant_colors || mutant_color == "#000") + if(mutant_color == "#000") mutant_color = pref_species.default_color if("mutant_color") - if(!config.mutant_colors) - user << "Alien colors are disabled." - return var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null if(new_mutantcolor) var/temp_hsv = RGBtoHSV(new_mutantcolor) @@ -947,4 +946,4 @@ datum/preferences character.backbag = backbag character.update_body() - character.update_hair() \ No newline at end of file + character.update_hair() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 65205405358..c64c25d5302 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -92,7 +92,6 @@ BLIND // can't see anything icon = 'icons/obj/clothing/masks.dmi' body_parts_covered = HEAD slot_flags = SLOT_MASK - var/alloweat = 0 strip_delay = 40 put_on_delay = 40 var/mask_adjusted = 0 @@ -106,7 +105,7 @@ BLIND // can't see anything //Proc that moves gas/breath masks out of the way, disabling them and allowing pill/food consumption /obj/item/clothing/mask/proc/adjustmask(var/mob/user) if(!ignore_maskadjust) - if(!user.canmove || user.stat || user.restrained()) + if(user.incapacitated()) return if(src.mask_adjusted == 1) src.icon_state = initial(icon_state) @@ -114,12 +113,12 @@ BLIND // can't see anything permeability_coefficient = initial(permeability_coefficient) flags |= visor_flags flags_inv |= visor_flags_inv - user << "You push \the [src] back into place." + user << "You push \the [src] back into place." src.mask_adjusted = 0 slot_flags = initial(slot_flags) else src.icon_state += "_up" - user << "You push \the [src] out of the way." + user << "You push \the [src] out of the way." gas_transfer_coefficient = null permeability_coefficient = null flags &= ~visor_flags @@ -131,6 +130,7 @@ BLIND // can't see anything + //Shoes /obj/item/clothing/shoes name = "shoes" @@ -293,20 +293,20 @@ atom/proc/generate_female_clothing(index,t_color,icon,type) var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes if(get_dist(usr, src) > 1) - usr << "You have moved too far away." + usr << "You have moved too far away!" return sensor_mode = modes.Find(switchMode) - 1 if (src.loc == usr) switch(sensor_mode) if(0) - usr << "You disable your suit's remote sensing equipment." + usr << "You disable your suit's remote sensing equipment." if(1) - usr << "Your suit will now only report whether you are alive or dead." + usr << "Your suit will now only report whether you are alive or dead." if(2) - usr << "Your suit will now only report your exact vital lifesigns." + usr << "Your suit will now only report your exact vital lifesigns." if(3) - usr << "Your suit will now report your exact vital lifesigns as well as your coordinate position." + usr << "Your suit will now report your exact vital lifesigns as well as your coordinate position." if(istype(loc,/mob/living/carbon/human)) var/mob/living/carbon/human/H = loc @@ -329,19 +329,19 @@ atom/proc/generate_female_clothing(index,t_color,icon,type) if(!can_use(usr)) return if(!can_adjust) - usr << "You cannot wear this suit any differently." + usr << "You cannot wear this suit any differently!" return if(src.adjusted == 1) src.fitted = initial(fitted) src.item_color = initial(item_color) src.item_color = src.suit_color //colored jumpsuits are shit and break without this - usr << "You adjust the suit back to normal." + usr << "You adjust the suit back to normal." src.adjusted = 0 else if(src.fitted != FEMALE_UNIFORM_TOP) src.fitted = NO_FEMALE_UNIFORM src.item_color += "_d" - usr << "You adjust the suit to wear it more casually." + usr << "You adjust the suit to wear it more casually." src.adjusted = 1 usr.update_inv_w_uniform() ..() @@ -388,7 +388,7 @@ atom/proc/generate_female_clothing(index,t_color,icon,type) flags |= (visor_flags) flags_inv |= (visor_flags_inv) icon_state = initial(icon_state) - usr << "You pull \the [src] down." + usr << "You pull \the [src] down." flash_protect = initial(flash_protect) tint = initial(tint) else @@ -396,7 +396,7 @@ atom/proc/generate_female_clothing(index,t_color,icon,type) flags &= ~(visor_flags) flags_inv &= ~(visor_flags_inv) icon_state = "[initial(icon_state)]up" - usr << "You push \the [src] up." + usr << "You push \the [src] up." flash_protect = 0 tint = 0 @@ -409,7 +409,7 @@ atom/proc/generate_female_clothing(index,t_color,icon,type) /obj/item/clothing/proc/can_use(mob/user) if(user && ismob(user)) - if(!user.stat && user.canmove && !user.restrained()) + if(!user.incapacitated()) return 1 return 0 diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 3367901fc15..51f560c29f9 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -178,8 +178,8 @@ emp_act(severity) if(istype(src.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/M = src.loc - M << "The Optical Thermal Scanner overloads and blinds you!" if(M.glasses == src) + M << "The Optical Thermal Scanner overloads and blinds you!" M.eye_blind = 3 M.eye_blurry = 5 M.disabilities |= NEARSIGHT diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 709f923534c..6cbd4620382 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -6,12 +6,12 @@ var/hud_type = null /obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot) - if(slot == slot_glasses) + if(hud_type && slot == slot_glasses) var/datum/atom_hud/H = huds[hud_type] H.add_hud_to(user) /obj/item/clothing/glasses/hud/dropped(mob/living/carbon/human/user) - if(istype(user) && user.glasses == src) + if(hud_type && istype(user) && user.glasses == src) var/datum/atom_hud/H = huds[hud_type] H.remove_hud_from(user) @@ -82,4 +82,62 @@ icon_state = "supergars" item_state = "garb" force = 12 - throwforce = 12 \ No newline at end of file + throwforce = 12 + +/obj/item/clothing/glasses/hud/toggle + name = "Toggle Hud" + desc = "A hud with multiple functions." + action_button_name = "Switch HUD" + +/obj/item/clothing/glasses/hud/toggle/attack_self(mob/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/wearer = user + if (wearer.glasses != src) + return + + if (hud_type) + var/datum/atom_hud/H = huds[hud_type] + H.remove_hud_from(user) + + if (hud_type == DATA_HUD_MEDICAL_ADVANCED) + hud_type = null + else if (hud_type == DATA_HUD_SECURITY_ADVANCED) + hud_type = DATA_HUD_MEDICAL_ADVANCED + else + hud_type = DATA_HUD_SECURITY_ADVANCED + + if (hud_type) + var/datum/atom_hud/H = huds[hud_type] + H.add_hud_to(user) + +/obj/item/clothing/glasses/hud/toggle/thermal + name = "Thermal HUD Scanner" + desc = "Thermal imaging HUD in the shape of glasses." + icon_state = "thermal" + hud_type = DATA_HUD_SECURITY_ADVANCED + vision_flags = SEE_MOBS + invis_view = 2 + +/obj/item/clothing/glasses/hud/toggle/thermal/attack_self(mob/user) + ..() + switch (hud_type) + if (DATA_HUD_MEDICAL_ADVANCED) + icon_state = "meson" + if (DATA_HUD_SECURITY_ADVANCED) + icon_state = "thermal" + else + icon_state = "purple" + user.update_inv_glasses() + +/obj/item/clothing/glasses/hud/toggle/thermal/emp_act(severity) + if(istype(src.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = src.loc + if(M.glasses == src) + M << "The [src] overloads and blinds you!" + M.eye_blind = 3 + M.eye_blurry = 5 + M.disabilities |= NEARSIGHT + spawn(100) + M.disabilities &= ~NEARSIGHT + ..() \ No newline at end of file diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index e712565dc77..e1d1e53e8b8 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -12,7 +12,7 @@ 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. + user << "You cannot turn the light on while in this [user.loc]!" //To prevent some lighting anomalities. return on = !on icon_state = "hardhat[on]_[item_color]" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 4fbd2b6b832..cc4c13cfa43 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -235,14 +235,14 @@ obj/item/clothing/head/helmet/bluetaghelm 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]") + 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]") + user.visible_message("[user] removes [helmetCam] from [src].","You remove [helmetCam] from [src].") helmetCam.assembly.loc = get_turf(src) helmetCam.assembly = null qdel(helmetCam) @@ -263,7 +263,7 @@ obj/item/clothing/head/helmet/bluetaghelm var/mob/living/carbon/human/user = usr if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [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"]." diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index f5a8ac28885..6eee2eaf8a0 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -100,12 +100,12 @@ src.icon_state = "ushankaup" src.item_state = "ushankaup" earflaps = 0 - user << "You raise the ear flaps on the ushanka." + user << "You raise the ear flaps on the ushanka." else src.icon_state = "ushankadown" src.item_state = "ushankadown" earflaps = 1 - user << "You lower the ear flaps on the ushanka." + user << "You lower the ear flaps on the ushanka." /* * Pumpkin head diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 02fc5c460f7..96c5f55cedd 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -27,10 +27,10 @@ src.flipped = !src.flipped if(src.flipped) icon_state = "[item_color]soft_flipped" - user << "You flip the hat backwards." + user << "You flip the hat backwards." else icon_state = "[item_color]soft" - user << "You flip the hat back in normal position." + user << "You flip the hat back in normal position." usr.update_inv_head(0) //so our mob-overlays update /obj/item/clothing/head/soft/examine(mob/user) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 6828d17dad4..f70bffdf3d7 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -222,7 +222,7 @@ /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - alloweat = 1 + flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "clown" item_state = "clown_hat" @@ -245,28 +245,28 @@ obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user) /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" desc = "A feminine clown mask for the dabbling crossdressers or female entertainers." - alloweat = 1 + flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "sexyclown" item_state = "sexyclown" /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." - alloweat = 1 + flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "mime" item_state = "mime" /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" desc = "A mask used when acting as a monkey." - alloweat = 1 + flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "monkeymask" item_state = "monkeymask" /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" desc = "A traditional female mime's mask." - alloweat = 1 + flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "sexymime" item_state = "sexymime" @@ -283,5 +283,5 @@ obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user) /obj/item/clothing/mask/gas/owl_mask name = "owl mask" desc = "Twoooo!" - alloweat = 1 + flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "owl" \ No newline at end of file diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 4ce903e2bf8..dc9c31861c7 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -12,7 +12,7 @@ if(iscarbon(user)) var/mob/living/carbon/C = user if(src == C.wear_mask) - user << "You need help taking this off!" + user << "You need help taking this off!" return ..() diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index ee256e42595..f1da928afff 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -21,7 +21,7 @@ if(bananium < 100) on = !on update_icon() - usr << "You ran out of bananium!" + usr << "You ran out of bananium!" else ..() @@ -49,9 +49,9 @@ if(bananium > 0) on = !on update_icon() - usr << "You [on ? "activate" : "deactivate"] the prototype shoes." + usr << "You [on ? "activate" : "deactivate"] the prototype shoes." else - usr << "You need bananium to turn the prototype shoes on." + usr << "You need bananium to turn the prototype shoes on!" /obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon() if(on) diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index e463f77fb68..1074159da7f 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -106,6 +106,6 @@ if(ishuman(user)) var/mob/living/carbon/human/C = user if(C.shoes == src && src.chained == 1) - user << "You need help taking these off!" + user << "You need help taking these off!" return ..() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index d7d2414ff68..8d742f983db 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -28,7 +28,7 @@ src.slowdown = slowdown_active magpulse = !magpulse icon_state = "[magboot_state][magpulse]" - user << "You [magpulse ? "enable" : "disable"] the mag-pulse traction system." + user << "You [magpulse ? "enable" : "disable"] the mag-pulse traction system." user.update_inv_shoes(0) //so our mob-overlays update user.update_gravity(user.mob_has_gravity()) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 5e019d89409..f178515a89b 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -14,7 +14,7 @@ /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. + user << "You cannot turn the light on while in this [user.loc]!" //To prevent some lighting anomalities. return on = !on icon_state = "hardsuit[on]-[item_color]" @@ -171,7 +171,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user) //Toggle Helmet if(!isturf(user.loc)) - user << "You cannot toggle your helmet while in this [user.loc]" //To prevent some lighting anomalities. + user << "You cannot toggle your helmet while in this [user.loc]!" //To prevent some lighting anomalities. return on = !on if(on || force) diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 09f52337f14..cf8a9d9e5a6 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -20,7 +20,7 @@ //Death squad armored space suits, not hardsuits! -/obj/item/clothing/head/helmet/space/deathsquad +/obj/item/clothing/head/helmet/space/hardsuit/deathsquad name = "deathsquad helmet" desc = "That's not red paint. That's real blood." icon_state = "deathsquad" @@ -29,8 +29,12 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 + action_button_name = null -/obj/item/clothing/suit/space/deathsquad +/obj/item/clothing/head/helmet/space/hardsuit/deathsquad/attack_self(mob/user) + return + +/obj/item/clothing/suit/space/hardsuit/deathsquad name = "deathsquad suit" desc = "A heavily armored, advanced space suit that protects against most forms of damage." icon_state = "deathsquad" @@ -41,15 +45,20 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad -/obj/item/clothing/head/helmet/space/deathsquad/beret +/obj/item/clothing/head/helmet/space/beret name = "officer's beret" desc = "An armored beret commonly used by special operations officers. Uses advanced force field technology to protect the head from space." icon_state = "beret_badge" flags = STOPSPRESSUREDMAGE flags_inv = 0 + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) + strip_delay = 130 + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + unacidable = 1 -/obj/item/clothing/suit/space/deathsquad/officer +/obj/item/clothing/suit/space/officer name = "officer's jacket" desc = "An armored, space-proof jacket used in special operations." icon_state = "detective" @@ -58,6 +67,12 @@ slowdown = 0 flags_inv = 0 w_class = 3 + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals) + armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100) + slowdown = 1 + strip_delay = 130 + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + unacidable = 1 //NASA Voidsuit @@ -110,6 +125,7 @@ icon_state = "pirate" item_state = "pirate" w_class = 3 + flags_inv = 0 allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals) slowdown = 0 armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index b8683c10cc7..b9ecf892582 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -61,7 +61,6 @@ permeability_coefficient = 0.50 body_parts_covered = CHEST|GROIN|ARMS allowed = list(/obj/item/weapon/kitchenknife) - action_button_name = "Toggle Jacket Sleeves" togglename = "sleeves" //Cook diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 380e0262597..470b6f6ebd4 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -38,10 +38,10 @@ if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc if(H.wear_suit != src) - H << "You must be wearing [src] to put up the hood." + H << "You must be wearing [src] to put up the hood!" return if(H.head) - H << "You're already wearing something on your head." + H << "You're already wearing something on your head!" return else H.equip_to_slot_if_possible(hood,slot_head,0,0,1) @@ -57,13 +57,16 @@ ..() suit_toggle() +/obj/item/clothing/suit/toggle/ui_action_click() + suit_toggle() + /obj/item/clothing/suit/toggle/proc/suit_toggle() set src in usr if(!can_use(usr)) return 0 - usr << "You toggle [src]'s [togglename]." + usr << "You toggle [src]'s [togglename]." if(src.suittoggled) src.icon_state = "[initial(icon_state)]" src.suittoggled = 0 @@ -125,18 +128,18 @@ if(!suittoggled) if(ishuman(src.loc)) if(H.wear_suit != src) - H << "You must be wearing [src] to engage the helmet." + H << "You must be wearing [src] to engage the helmet!" return if(H.head) - H << "You're already wearing something on your head." + H << "You're already wearing something on your head!" return else - H << "You engage the helmet on the hardsuit." + H << "You engage the helmet on the hardsuit." H.equip_to_slot_if_possible(helmet,slot_head,0,0,1) suittoggled = 1 H.update_inv_wear_suit() playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) else - H << "You disengage the helmet on the hardsuit." + H << "You disengage the helmet on the hardsuit." playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) RemoveHelmet() diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index a92c45a0ab6..20acefb09d6 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -80,6 +80,7 @@ icon_state = A.icon_state item_state = A.item_state item_color = A.item_color + suit_color = A.suit_color usr.update_inv_w_uniform() //so our overlays update. diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 92fe8b9272c..1dda5f2ebd2 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -100,10 +100,10 @@ if(user == M) user << "You attach [src] to [U]." else - user.visible_message("[user] pins \the [src] on [M]'s chest.", \ + user.visible_message("[user] pins \the [src] on [M]'s chest.", \ "You pin \the [src] on [M]'s chest.") - else user << "Medals can only be pinned on jumpsuits." + else user << "Medals can only be pinned on jumpsuits!" else ..() /obj/item/clothing/tie/medal/conduct @@ -280,6 +280,7 @@ /obj/item/clothing/tie/petcollar //don't really wear this though please c'mon seriously guys name = "pet collar" + desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule." icon_state = "petcollar" item_color = "petcollar" var/tagname = null diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm index 45d4d340ecd..ae95ef86a03 100644 --- a/code/modules/crafting/guncrafting.dm +++ b/code/modules/crafting/guncrafting.dm @@ -20,7 +20,7 @@ /obj/item/weaponcrafting/reciever/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/pipe)) - user << "You attach the shotgun barrel to the receiver. The pins seem loose." + user << "You attach the shotgun barrel to the receiver. The pins seem loose." var/obj/item/weaponcrafting/ishotgunconstruction/I = new /obj/item/weaponcrafting/ishotgunconstruction user.unEquip(src) user.put_in_hands(I) @@ -53,7 +53,7 @@ /obj/item/weaponcrafting/ishotgunconstruction2/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weaponcrafting/stock)) - user << "You attach the stock to the receiver-barrel assembly." + user << "You attach the stock to the receiver-barrel assembly." var/obj/item/weaponcrafting/ishotgunconstruction3/I = new /obj/item/weaponcrafting/ishotgunconstruction3 user.unEquip(src) user.put_in_hands(I) @@ -78,6 +78,6 @@ user << "You tie the wrapping paper around the stock and the barrel to secure it." qdel(src) else - user << "You need at least five feet of wrapping paper to secure the stock." + user << "You need at least five feet of wrapping paper to secure the stock!" return diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm index 684f3ec5eb2..75847c323f4 100644 --- a/code/modules/crafting/table.dm +++ b/code/modules/crafting/table.dm @@ -91,6 +91,8 @@ if(istype(A, /obj/item)) var/atom/movable/B = A B.loc = I + B.pixel_x = initial(B.pixel_x) + B.pixel_y = initial(B.pixel_y) else if(!I.reagents) I.reagents = new /datum/reagents() @@ -176,7 +178,7 @@ return Deletion /obj/structure/table/interact(mob/user) - if(user.stat || user.lying || !Adjacent(user)) + if(user.incapacitated() || user.lying || !Adjacent(user)) return check_table() if(!table_contents.len) diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index d8f8b6aad65..b43f7077d9f 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -45,8 +45,8 @@ else return - user.visible_message("[user] puts [I] into [src].", "You put [I] inside [src].",\ - "You hear a rustle as someone puts something into a plastic bag.") + user.visible_message("[user] puts [I] into [src].", "You put [I] inside [src].",\ + "You hear a rustle as someone puts something into a plastic bag.") icon_state = "evidence" @@ -68,8 +68,8 @@ /obj/item/weapon/evidencebag/attack_self(mob/user as mob) if(contents.len) var/obj/item/I = contents[1] - user.visible_message("[user] takes [I] out of [src].", "You take [I] out of [src].",\ - "You hear someone rustle around in a plastic bag, and remove something.") + user.visible_message("[user] takes [I] out of [src].", "You take [I] out of [src].",\ + "You hear someone rustle around in a plastic bag, and remove something.") overlays.Cut() //remove the overlays user.put_in_hands(I) w_class = 1 diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index a2d323e81d8..2e09166ae6e 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -21,7 +21,7 @@ /obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) if(ismob(target) && target.reagents && reagents.total_volume) - user.visible_message("[user] has smothered \the [target] with \the [src]!", "You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise") + user.visible_message("[user] has smothered \the [target] with \the [src]!", "You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise.") src.reagents.reaction(target, TOUCH) src.reagents.clear_reagents() return @@ -31,8 +31,8 @@ /obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob,proximity) if(!proximity) return if(istype(A) && src in user) - user.visible_message("[user] starts to wipe down [A] with [src]!") + user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...You finish wiping off the [A].") A.clean_blood() return diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index affb72d1381..5fbe0263949 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -151,7 +151,7 @@ if(!found_something) add_log("# No forensic traces found #", 0) // Don't display this to the holder user if(holder) - holder << "Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!" + holder << "Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!" else if(holder) holder << "You finish scanning \the [target_name]." diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index eacc8eacaba..03f8ea5051a 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -47,7 +47,7 @@ /obj/item/weapon/toy/xmas_cracker/attack(mob/target, mob/user) if( !cracked && istype(target,/mob/living/carbon/human) && (target.stat == CONSCIOUS) && !target.get_active_hand() ) - target.visible_message("[user] and [target] pop \an [src]! *pop*", "You pull \an [src] with [target]! *pop*", "You hear a *pop*.") + target.visible_message("[user] and [target] pop \an [src]! *pop*", "You pull \an [src] with [target]! *pop*", "You hear a pop.") var/obj/item/weapon/paper/Joke = new /obj/item/weapon/paper(user.loc) Joke.name = "[pick("awful","terrible","unfunny")] joke" Joke.info = pick("What did one snowman say to the other?\n\n'Is it me or can you smell carrots?'", @@ -143,9 +143,9 @@ santa_objective.completed = 1 //lets cut our santas some slack. santa_objective.owner = santa.mind santa.mind.objectives += santa_objective - santa.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/presents + santa.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/presents) var/obj/effect/proc_holder/spell/targeted/area_teleport/teleport/telespell = new(santa) telespell.clothes_req = 0 //santa robes aren't actually magical. - santa.mind.spell_list += telespell //does the station have chimneys? WHO KNOWS! + santa.mind.AddSpell(telespell) //does the station have chimneys? WHO KNOWS! santa << "You are Santa! Your objective is to bring joy to the people on this station. You can conjure more presents using a spell, and there are several presents in your bag." diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 55b30f45011..f86ecdb5c42 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -36,9 +36,10 @@ if(istype(C, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C - H.apply_effect((rand(15, 75)), IRRADIATE, 0) if(prob(5)) - H.apply_effect((rand(90, 150)), IRRADIATE, 0) + H.irradiate(rand(100, 160)) + else + H.irradiate(rand(15, 75)) if(prob(25)) if(prob(75)) randmutb(H) @@ -49,7 +50,7 @@ else if(istype(C, /mob/living/carbon/monkey)) var/mob/living/carbon/monkey/M = C - M.apply_effect((rand(15, 75)), IRRADIATE, 0) + M.irradiate(rand(15, 75)) /datum/round_event/radiation_storm/end() diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 75f860eb5f0..e4ec5e8fd5a 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -137,7 +137,7 @@ /datum/spacevine_mutation/light/on_grow(obj/effect/spacevine/holder) if(prob(10*severity)) - holder.luminosity = 4 + holder.SetLuminosity(4) /datum/spacevine_mutation/toxicity name = "toxic" diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index e3b4c5d1fb6..5d3567a9d47 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -33,9 +33,9 @@ I.key = C.key //Operation: Fuck off and scare people - I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null) - I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null) - I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null) + I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) + I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)) + I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)) ticker.mode.traitors += I.mind I.mind.special_role = "imposter" diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm index 6888a4a9a04..6986e52d26a 100644 --- a/code/modules/food&drinks/drinks/drinks.dm +++ b/code/modules/food&drinks/drinks/drinks.dm @@ -224,7 +224,7 @@ /obj/item/weapon/reagent_containers/food/drinks/soda_cans/attack(mob/M, mob/user) if(M == user && !src.reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head") - user.visible_message("[user] crushes the can of [src] on \his forehead!", "You crush the can of [src] on your forehead!") + user.visible_message("[user] crushes the can of [src] on \his forehead!", "You crush the can of [src] on your forehead.") playsound(user.loc,'sound/weapons/pierce.ogg', rand(10,50), 1) var/obj/item/trash/can/crushed_can = new /obj/item/trash/can(user.loc) crushed_can.icon_state = icon_state diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm index 816c4d7f651..116f3b42480 100644 --- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm @@ -8,6 +8,7 @@ volume = 50 /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() + overlays.Cut() if (reagents.reagent_list.len > 0) switch(reagents.get_master_reagent_id()) if("beer") @@ -442,8 +443,39 @@ icon_state = "toxinsspecialglass" name = "Toxins Special" desc = "Whoah, this thing is on FIRE" + if("chocolatepudding") + icon_state = "chocolatepudding" + name = "Chocolate Pudding" + desc = "" + if("vanillapudding") + icon_state = "vanillapudding" + name = "Vanilla Pudding" + desc = "Whoah, this thing is on FIRE" + if("cherryshake") + icon_state = "cherryshake" + name = "Cherry Shake" + desc = "A cherry flavored milkshake." + if("bluecherryshake") + icon_state = "bluecherryshake" + name = "Blue Cherry Shake" + desc = "An exotic blue milkshake." + if("drunkenblumpkin") + icon_state = "drunkenblumpkin" + name = "Drunken Blumpkin" + desc = "A drink for the drunks." + if("pumpkin_latte") + icon_state = "pumpkin_latte" + name = "Pumpkin Latte" + desc = "A mix of coffee and pumpkin juice." + if("gibbfloats") + icon_state = "gibbfloats" + name = "Gibbfloat" + desc = "Dr. Gibb with ice cream on top." else icon_state ="glass_brown" + var/image/I = image(icon, "glassoverlay") + I.color = mix_color_from_reagents(reagents.reagent_list) + overlays += I name = "Glass of ..what?" desc = "You can't really tell what this is." else @@ -546,3 +578,16 @@ /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/cola list_reagents = list("cola" = 50) +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attackby(var/obj/item/I, mob/user as mob, params) + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs + var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I + if(reagents) + if(reagents.total_volume >= reagents.maximum_volume) + user << "[src] is full." + else + user << "You break [E] in [src]." + reagents.add_reagent("eggyolk", 5) + qdel(E) + return + else + ..() diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm index 02419159876..bff39b0e262 100644 --- a/code/modules/food&drinks/food/condiment.dm +++ b/code/modules/food&drinks/food/condiment.dm @@ -8,7 +8,7 @@ /obj/item/weapon/reagent_containers/food/condiment name = "condiment container" desc = "Just your average condiment container." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/containers.dmi' icon_state = "emptycondiment" flags = OPENCONTAINER possible_transfer_amounts = list(1,5,10) @@ -69,11 +69,11 @@ if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) - user << "[target] is empty." + user << "[target] is empty!" return if(reagents.total_volume >= reagents.maximum_volume) - user << "[src] is full." + user << "[src] is full!" return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) @@ -82,10 +82,10 @@ //Something like a glass or a food item. Player probably wants to transfer TO it. else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) if(!reagents.total_volume) - user << "[src] is empty." + user << "[src] is empty!" return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "you can't add anymore to [target]." + user << "you can't add anymore to [target]!" return var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "You transfer [trans] units of the condiment to [target]." @@ -157,7 +157,6 @@ /obj/item/weapon/reagent_containers/food/condiment/flour name = "flour sack" desc = "A big bag of flour. Good for baking!" - icon = 'icons/obj/food.dmi' icon_state = "flour" item_state = "flour" list_reagents = list("flour" = 30) @@ -171,6 +170,13 @@ list_reagents = list("soymilk" = 50) possible_states = list() +/obj/item/weapon/reagent_containers/food/condiment/rice + name = "rice sack" + desc = "A big bag of rice. Good for cooking!" + icon_state = "rice" + item_state = "flour" + list_reagents = list("rice" = 30) + possible_states = list() diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food&drinks/food/customizables.dm index 627a3b58b80..3f6b7aba90f 100644 --- a/code/modules/food&drinks/food/customizables.dm +++ b/code/modules/food&drinks/food/customizables.dm @@ -15,7 +15,7 @@ /obj/item/weapon/reagent_containers/food/snacks/customizable bitesize = 4 w_class = 3 - volume = 60 + volume = 80 var/ingMax = 12 var/list/ingredients = list() @@ -40,9 +40,9 @@ if(istype(I,/obj/item/weapon/reagent_containers/food/snacks)) var/obj/item/weapon/reagent_containers/food/snacks/S = I if(I.w_class > 2) - user << "The ingredient is too big for [src]." + user << "The ingredient is too big for [src]!" else if((ingredients.len >= ingMax) || (reagents.total_volume >= volume)) - user << "You can't add more ingredients to [src]." + user << "You can't add more ingredients to [src]!" else user.drop_item() if(S.trash) @@ -50,7 +50,7 @@ S.trash = null //we remove the plate before adding the ingredient ingredients += S S.loc = src - filling_color = S.filling_color + mix_filling_color(S) S.reagents.trans_to(src,min(S.reagents.total_volume, 15)) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume. update_overlays(S) user << "You add the [I.name] to the [name]." @@ -77,24 +77,43 @@ customname = "custom" break if(ingredients.len == 1) //first ingredient - if(istype(S, /obj/item/weapon/reagent_containers/food/snacks/meat/human)) - var/obj/item/weapon/reagent_containers/food/snacks/meat/human/H = S - if(H.subjectname) - customname = "[H.subjectname]" - else if(H.subjectjob) - customname = "[H.subjectjob]" + if(istype(S, /obj/item/weapon/reagent_containers/food/snacks/meat)) + var/obj/item/weapon/reagent_containers/food/snacks/meat/M = S + if(M.subjectname) + customname = "[M.subjectname]" + else if(M.subjectjob) + customname = "[M.subjectjob]" + else + customname = S.name else - customname = "[initial(S.name)]" + customname = S.name name = "[customname] [initial(name)]" /obj/item/weapon/reagent_containers/food/snacks/customizable/proc/initialize_custom_food(obj/item/BASE, obj/item/I, mob/user) if(istype(BASE,/obj/item/weapon/reagent_containers)) var/obj/item/weapon/reagent_containers/RC = BASE RC.reagents.trans_to(src,RC.reagents.total_volume) + for(var/obj/O in BASE.contents) + contents += O if(I && user) attackby(I, user) + user.unEquip(BASE) qdel(BASE) +/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/mix_filling_color(obj/item/weapon/reagent_containers/food/snacks/S) + + if(ingredients.len == 1) + filling_color = S.filling_color + else + var/list/rgbcolor = list(0,0,0,0) + var/customcolor = GetColors(filling_color) + var/ingcolor = GetColors(S.filling_color) + rgbcolor[1] = (customcolor[1]+ingcolor[1])/2 + rgbcolor[2] = (customcolor[2]+ingcolor[2])/2 + rgbcolor[3] = (customcolor[3]+ingcolor[3])/2 + rgbcolor[4] = (customcolor[4]+ingcolor[4])/2 + filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4]) + /obj/item/weapon/reagent_containers/food/snacks/customizable/update_overlays(obj/item/weapon/reagent_containers/food/snacks/S) var/image/I = new(icon, "[initial(icon_state)]_filling") @@ -122,6 +141,7 @@ return if(INGREDIENTS_FILL) overlays.Cut() + I.color = filling_color if(INGREDIENTS_LINE) I.pixel_y = rand(-8,3) I.pixel_x = I.pixel_y @@ -153,6 +173,7 @@ name = "burger" desc = "A timeless classic." Ingredientsplacement = INGREDIENTS_STACKPLUSTOP + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "bun" @@ -161,6 +182,7 @@ ingMax = 6 slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/custom slices_num = 5 + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "tofubread" @@ -169,6 +191,7 @@ ingMax = 6 slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/custom slices_num = 5 + icon = 'icons/obj/food/piecake.dmi' icon_state = "plaincake" @@ -187,12 +210,14 @@ desc = "Noodles. With stuff. Delicious." Ingredientsplacement = INGREDIENTS_SCATTER ingMax = 6 + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "spaghettiboiled" /obj/item/weapon/reagent_containers/food/snacks/customizable/pie name = "pie" ingMax = 6 + icon = 'icons/obj/food/piecake.dmi' icon_state = "pie" @@ -203,6 +228,7 @@ ingMax = 8 slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/custom slices_num = 6 + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "pizzamargherita" @@ -211,6 +237,7 @@ desc = "Very tasty." trash = /obj/item/weapon/reagent_containers/glass/bowl ingMax = 6 + icon = 'icons/obj/food/soupsalad.dmi' icon_state = "bowl" @@ -218,6 +245,7 @@ name = "toast" desc = "A timeless classic." Ingredientsplacement = INGREDIENTS_STACK + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "breadslice" var/finished = 0 @@ -254,9 +282,12 @@ desc = "A bowl with liquid and... stuff in it." trash = /obj/item/weapon/reagent_containers/glass/bowl ingMax = 8 + icon = 'icons/obj/food/soupsalad.dmi' icon_state = "wishsoup" - +/obj/item/weapon/reagent_containers/food/snacks/customizable/soup/New() + ..() + eatverb = pick("slurp","sip","suck","inhale","drink") @@ -269,7 +300,7 @@ icon_state = "snack_bowl" name = "bowl" desc = "A simple bowl, used for soups and salads." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/soupsalad.dmi' icon_state = "bowl" flags = OPENCONTAINER w_class = 3 @@ -278,9 +309,9 @@ if(istype(I,/obj/item/weapon/reagent_containers/food/snacks)) var/obj/item/weapon/reagent_containers/food/snacks/S = I if(I.w_class > 2) - user << "The ingredient is too big for [src]." + user << "The ingredient is too big for [src]!" else if(contents.len >= 20) - user << "You can't add more ingredients to [src]." + user << "You can't add more ingredients to [src]!" else if(reagents.has_reagent("water", 10)) //are we starting a soup or a salad? var/obj/item/weapon/reagent_containers/food/snacks/customizable/A = new/obj/item/weapon/reagent_containers/food/snacks/customizable/soup(get_turf(src)) @@ -298,7 +329,9 @@ /obj/item/weapon/reagent_containers/glass/bowl/update_icon() overlays.Cut() if(reagents.total_volume) - icon_state = "wishsoup" + var/image/filling = image('icons/obj/food/soupsalad.dmi', "fullbowl") + filling.color = mix_color_from_reagents(reagents.reagent_list) + overlays += filling else icon_state = "bowl" diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm index 3199cde393a..f34b33fb441 100644 --- a/code/modules/food&drinks/food/snacks.dm +++ b/code/modules/food&drinks/food/snacks.dm @@ -1,7 +1,7 @@ /obj/item/weapon/reagent_containers/food/snacks name = "snack" desc = "yummy" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = null var/bitesize = 2 var/bitecount = 0 @@ -18,7 +18,7 @@ var/custom_food_type = null //for food customizing. path of the custom food to create var/junkiness = 0 //for junk food. used to lower human satiety. var/list/bonus_reagents = list() //the amount of reagents (usually nutriment and vitamin) added to crafted/cooked snacks, on top of the ingredients reagents. - + var/customfoodfilling = 1 // whether it can be used as filling in custom food //Placeholder for effect that trigger on eating that aren't tied to reagents. /obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume() @@ -65,7 +65,7 @@ return 0 if(wrapped) - M << "You can't eat wrapped food!" + M << "You can't eat wrapped food!" return 0 else if(fullness <= 50) M << "You hungrily [eatverb] some of \the [src] and gobble it down!" @@ -76,7 +76,7 @@ else if(fullness > 500 && fullness < 600) M << "You unwillingly [eatverb] a bit of \the [src]." else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat - M << "You cannot force any more of \the [src] to go down your throat." + M << "You cannot force any more of \the [src] to go down your throat!" return 0 else if(!isbrain(M)) //If you're feeding it to someone else. @@ -86,8 +86,8 @@ M.visible_message("[user] attempts to feed [M] [src].", \ "[user] attempts to feed [M] [src].") else - M.visible_message("[user] cannot force anymore of [src] down [M]'s throat!", \ - "[user] cannot force anymore of [src] down [M]'s throat!") + M.visible_message("[user] cannot force anymore of [src] down [M]'s throat!", \ + "[user] cannot force anymore of [src] down [M]'s throat!") return 0 if(!do_mob(user, M)) @@ -97,7 +97,7 @@ "[user] feeds [M] to eat [src].") else - user << "[M] doesn't seem to have a mouth!" + user << "[M] doesn't seem to have a mouth!" return if(reagents) //Handle ingestion of the reagent. @@ -142,10 +142,13 @@ var/obj/item/weapon/reagent_containers/food/snacks/S = W if(custom_food_type && ispath(custom_food_type)) if(S.w_class > 2) - user << "The ingredient is too big for [src]." + user << "[S] is too big for [src]!" + return 0 + if(!S.customfoodfilling) + user << "[src] can't be filled with [S]!" return 0 if(contents.len >= 20) - user << "You can't add more ingredients to [src]." + user << "You can't add more ingredients to [src]!" return 0 var/obj/item/weapon/reagent_containers/food/snacks/customizable/C = new custom_food_type(get_turf(src)) C.initialize_custom_food(src, S, user) @@ -172,24 +175,22 @@ !(locate(/obj/structure/optable) in src.loc) && \ !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \ ) - user << "You cannot slice [src] here! You need a table or at least a tray." + user << "You cannot slice [src] here! You need a table or at least a tray." return 1 var/slices_lost = 0 if (accuracy > 1) user.visible_message( \ - "[user] slices [src].", \ + "[user] slices [src].", \ "You slice [src]." \ ) else user.visible_message( \ - "[user] inaccurately slices [src] with [W]!", \ + "[user] inaccurately slices [src] with [W]!", \ "You inaccurately slice [src] with your [W]!" \ ) slices_lost = rand(1,min(1,round(slices_num/2))) - if(!slice_path && !slices_num) - return var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) var/obj/item/weapon/reagent_containers/food/snacks/slice = new slice_path (loc) @@ -275,17 +276,31 @@ /obj/item/weapon/reagent_containers/food/snacks/store w_class = 3 + var/stored_item = 0 /obj/item/weapon/reagent_containers/food/snacks/store/attackby(obj/item/weapon/W, mob/user, params) - if(W.w_class > 2 || custom_food_type) //can't store objects inside food needed to start a customizable snack. - ..() - else - if(contents.len) + ..() + if(W.w_class <= 2 & !istype(W, /obj/item/weapon/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods. + if(is_sharp(W)) + return 0 + if(stored_item) return 0 if(!iscarbon(user)) return 0 + if(contents.len >= 20) + user << "[src] is full." + return 0 user << "You slip [W] inside [src]." user.unEquip(W) add_fingerprint(user) contents += W + stored_item = 1 return 1 // no afterattack here + +/obj/item/weapon/reagent_containers/food/snacks/MouseDrop(atom/over) + var/turf/T = get_turf(src) + var/obj/structure/table/TB = locate(/obj/structure/table) in T + if(TB) + TB.MouseDrop(over) + else + ..() diff --git a/code/modules/food&drinks/food/snacks/dough.dm b/code/modules/food&drinks/food/snacks/dough.dm index d03339809cd..866a3d6fa12 100644 --- a/code/modules/food&drinks/food/snacks/dough.dm +++ b/code/modules/food&drinks/food/snacks/dough.dm @@ -5,7 +5,7 @@ /obj/item/weapon/reagent_containers/food/snacks/dough name = "dough" desc = "A piece of dough." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "dough" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain list_reagents = list("nutriment" = 6) @@ -20,7 +20,7 @@ user << "You flatten [src]." qdel(src) else - user << "You need to put [src] on a surface to roll it out!" + user << "You need to put [src] on a surface to roll it out!" else ..() @@ -29,7 +29,7 @@ /obj/item/weapon/reagent_containers/food/snacks/flatdough name = "flat dough" desc = "A flattened dough." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "flat dough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 @@ -40,7 +40,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pizzabread name = "pizza bread" desc = "Add ingredients to make a pizza" - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "pizzabread" custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/pizza list_reagents = list("nutriment" = 7) @@ -50,7 +50,7 @@ /obj/item/weapon/reagent_containers/food/snacks/doughslice name = "dough slice" desc = "A slice of dough. Can be cooked into a bun." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "doughslice" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/bun filling_color = "#CD853F" @@ -59,7 +59,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun name = "bun" desc = "A base for any self-respecting burger." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "bun" list_reagents = list("nutriment" = 1) custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/burger @@ -68,7 +68,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cakebatter name = "cake batter" desc = "Cook it to get a cake." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "cakebatter" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain list_reagents = list("nutriment" = 9) @@ -82,14 +82,14 @@ user << "You flatten [src]." qdel(src) else - user << "You need to put [src] on a surface to roll it out!" + user << "You need to put [src] on a surface to roll it out!" else ..() /obj/item/weapon/reagent_containers/food/snacks/piedough name = "pie dough" desc = "Cook it to get a pie." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "piedough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase slices_num = 3 @@ -100,7 +100,7 @@ /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase name = "raw pastry base" desc = "Must be cooked before use." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "rawpastrybase" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/pastrybase filling_color = "#CD853F" @@ -109,7 +109,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastrybase name = "pastry base" desc = "A base for any self-respecting pastry" - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "pastrybase" list_reagents = list("nutriment" = 1) filling_color = "#CD853F" diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food&drinks/food/snacks/meat.dm index 7fe20242799..1fbb0e409a3 100644 --- a/code/modules/food&drinks/food/snacks/meat.dm +++ b/code/modules/food&drinks/food/snacks/meat.dm @@ -1,16 +1,20 @@ /obj/item/weapon/reagent_containers/food/snacks/meat + var/subjectname = "" + var/subjectjob = null + +/obj/item/weapon/reagent_containers/food/snacks/meat/slab name = "meat" desc = "A slab of meat" icon_state = "meat" dried_type = /obj/item/weapon/reagent_containers/food/snacks/sosjerky bitesize = 3 list_reagents = list("nutriment" = 3) - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain - slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain slices_num = 3 filling_color = "#FF0000" -/obj/item/weapon/reagent_containers/food/snacks/meat/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/rawcutlet/slice, reagents_per_slice) +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/slice, reagents_per_slice) ..() var/image/I = new(icon, "rawcutlet_coloration") I.color = filling_color @@ -19,21 +23,19 @@ slice.name = "raw [name] cutlet" slice.meat_type = name -/obj/item/weapon/reagent_containers/food/snacks/meat/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) ..() S.name = "[name] steak" ///////////////////////////////////// HUMAN MEATS ////////////////////////////////////////////////////// -/obj/item/weapon/reagent_containers/food/snacks/meat/human +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human name = "-meat" - var/subjectname = "" - var/subjectjob = null - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human - slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human -/obj/item/weapon/reagent_containers/food/snacks/meat/human/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human/slice, reagents_per_slice) +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human/slice, reagents_per_slice) ..() if(subjectname) slice.subjectname = subjectname @@ -42,7 +44,7 @@ slice.subjectjob = subjectjob slice.name = "raw [subjectjob] cutlet" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) ..() if(subjectname) S.name = "[subjectname] meatsteak" @@ -50,51 +52,51 @@ S.name = "[subjectjob] meatsteak" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime icon_state = "slimemeat" desc = "Because jello wasn't offensive enough to vegans" list_reagents = list("nutriment" = 3, "slimejelly" = 3) filling_color = "#00FFFF" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem icon_state = "golemmeat" desc = "Edible rocks, welcome to the future" list_reagents = list("nutriment" = 3, "iron" = 3) filling_color = "#A9A9A9" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem/adamantine +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine icon_state = "agolemmeat" desc = "From the slime pen to the rune to the kitchen, science" filling_color = "#66CDAA" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/lizard +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard icon_state = "lizardmeat" desc = "Delicious dino damage" filling_color = "#6B8E23" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/plant +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant icon_state = "plantmeat" desc = "All the joys of healthy eating with all the fun of cannibalism" filling_color = "#E9967A" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/shadow +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow icon_state = "shadowmeat" desc = "Ow, the edge" filling_color = "#202020" -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/fly +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly icon_state = "flymeat" desc = "Nothing says tasty like maggot filled radioactive mutant flesh" list_reagents = list("nutriment" = 3, "uranium" = 3) -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton name = "-bone" icon_state = "skeletonmeat" desc = "There's a point where this needs to stop and clearly we have passed it" filling_color = "#F0F0F0" slice_path = null //can't slice a bone into cutlets -/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie name = "-meat (rotten)" icon_state = "lizardmeat" //Close enough. desc = "Halfway to becoming fertilizer for your garden." @@ -108,58 +110,58 @@ ////////////////////////////////////// OTHER MEATS //////////////////////////////////////////////////////// -/obj/item/weapon/reagent_containers/food/snacks/meat/synthmeat +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/synthmeat name = "synthmeat" desc = "A synthetic slab of meat." -/obj/item/weapon/reagent_containers/food/snacks/meat/monkey +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey name = "monkey meat" -/obj/item/weapon/reagent_containers/food/snacks/meat/corgi +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi name = "corgi meat" desc = "Tastes like... well you know..." -/obj/item/weapon/reagent_containers/food/snacks/meat/pug +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug name = "pug meat" desc = "Tastes like... well you know..." -/obj/item/weapon/reagent_containers/food/snacks/meat/killertomato +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/killertomato name = "killer tomato meat" desc = "A slice from a huge tomato." icon_state = "tomatomeat" list_reagents = list("nutriment" = 2) filling_color = "#FF0000" - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/killertomato - slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/killertomato + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/killertomato + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/killertomato -/obj/item/weapon/reagent_containers/food/snacks/meat/bear +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear name = "bear meat" desc = "A very manly slab of meat." icon_state = "bearmeat" list_reagents = list("nutriment" = 12, "morphine" = 5, "vitamin" = 2) filling_color = "#FFB6C1" - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/bear - slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/bear + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/bear -/obj/item/weapon/reagent_containers/food/snacks/meat/xeno +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno name = "xeno meat" desc = "A slab of meat" icon_state = "xenomeat" list_reagents = list("nutriment" = 3, "vitamin" = 1) bitesize = 4 filling_color = "#32CD32" - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/xeno - slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/xeno + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/xeno -/obj/item/weapon/reagent_containers/food/snacks/meat/spider +/obj/item/weapon/reagent_containers/food/snacks/meat/slab/spider name = "spider meat" desc = "A slab of spider meat." icon_state = "spidermeat" list_reagents = list("nutriment" = 3, "toxin" = 3, "vitamin" = 1) filling_color = "#7CFC00" - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/spider - slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/spider + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/spider + slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/spider @@ -167,7 +169,7 @@ ////////////////////////////////////// MEAT STEAKS /////////////////////////////////////////////////////////// -/obj/item/weapon/reagent_containers/food/snacks/meatsteak +/obj/item/weapon/reagent_containers/food/snacks/meat/steak name = "steak" desc = "A piece of hot spicy meat." icon_state = "meatsteak" @@ -176,17 +178,21 @@ trash = /obj/item/trash/plate filling_color = "#B22222" -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain +/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human +/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/killertomato +/obj/item/weapon/reagent_containers/food/snacks/meat/steak/killertomato + name = "killer tomato steak" -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/bear +/obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear + name = "bear steak" -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/xeno +/obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno + name = "xeno steak" -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/spider +/obj/item/weapon/reagent_containers/food/snacks/meat/steak/spider + name = "spider steak" @@ -194,47 +200,53 @@ //Raw cutlets -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet name = "raw cutlet" desc = "A raw meat cutlet." icon_state = "rawcutlet" - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/cutlet/plain + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain bitesize = 2 list_reagents = list("nutriment" = 1) filling_color = "#B22222" var/meat_type = "meat" -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) ..() S.name = "[meat_type] cutlet" -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human - cooked_type = /obj/item/weapon/reagent_containers/food/snacks/cutlet/plain/human - var/subjectname = "" - var/subjectjob = null +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain/human -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency) ..() if(subjectname) S.name = "[subjectname] [initial(S.name)]" else if(subjectjob) S.name = "[subjectjob] [initial(S.name)]" -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/killertomato +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/killertomato + name = "raw killer tomato cutlet" + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/killertomato -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/bear +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/bear + name = "raw bear cutlet" + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/bear -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/xeno +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/xeno + name = "raw xeno cutlet" + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno -/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/spider +/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/spider + name = "raw spider cutlet" + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider //Cooked cutlets -/obj/item/weapon/reagent_containers/food/snacks/cutlet +/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet name = "cutlet" desc = "A cooked meat cutlet." icon_state = "cutlet" @@ -243,14 +255,19 @@ bonus_reagents = list("nutriment" = 1, "vitamin" = 1) filling_color = "#B22222" -/obj/item/weapon/reagent_containers/food/snacks/cutlet/plain +/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain -/obj/item/weapon/reagent_containers/food/snacks/cutlet/plain/human +/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain/human -/obj/item/weapon/reagent_containers/food/snacks/cutlet/killertomato +/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/killertomato + name = "killer tomato cutlet" -/obj/item/weapon/reagent_containers/food/snacks/cutlet/bear +/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/bear + name = "bear cutlet" -/obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno +/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno + name = "xeno cutlet" + +/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider + name = "spider cutlet" -/obj/item/weapon/reagent_containers/food/snacks/cutlet/spider \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_bread.dm b/code/modules/food&drinks/food/snacks_bread.dm index 694ed000946..8ff5e2681a3 100644 --- a/code/modules/food&drinks/food/snacks_bread.dm +++ b/code/modules/food&drinks/food/snacks_bread.dm @@ -1,13 +1,18 @@ /obj/item/weapon/reagent_containers/food/snacks/store/bread + icon = 'icons/obj/food/burgerbread.dmi' + volume = 80 slices_num = 5 /obj/item/weapon/reagent_containers/food/snacks/breadslice + icon = 'icons/obj/food/burgerbread.dmi' bitesize = 2 custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich filling_color = "#FFA500" - slot_flags = SLOT_HEAD // i'm going to kill myself. i'm going to murder my own self. + list_reagents = list("nutriment" = 2) + slot_flags = SLOT_HEAD + customfoodfilling = 0 //to avoid infinite bread-ception /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain name = "bread" @@ -22,6 +27,7 @@ name = "bread slice" desc = "A slice of home." icon_state = "breadslice" + customfoodfilling = 1 /obj/item/weapon/reagent_containers/food/snacks/store/bread/meat name = "meatbread loaf" @@ -112,6 +118,21 @@ filling_color = "#FF8C00" list_reagents = list("nutriment" = 4, "vitamin" = 1) +/obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana + name = "mimana bread" + desc = "Best eaten in silence." + icon_state = "mimanabread" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/mimana + bonus_reagents = list("nutriment" = 5, "vitamin" = 5) + list_reagents = list("nutriment" = 20, "mutetoxin" = 5, "nothing" = 5, "vitamin" = 5) + +/obj/item/weapon/reagent_containers/food/snacks/breadslice/mimana + name = "mimana bread slice" + desc = "A slice of silence!" + icon_state = "mimanabreadslice" + filling_color = "#C0C0C0" + list_reagents = list("nutriment" = 2, "mutetoxin" = 1, "nothing" = 1, "vitamin" = 1) + /obj/item/weapon/reagent_containers/food/snacks/breadslice/custom name = "bread slice" icon_state = "tofubreadslice" @@ -120,8 +141,9 @@ /obj/item/weapon/reagent_containers/food/snacks/baguette name = "baguette" desc = "Bon appetit!" + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "baguette" bonus_reagents = list("nutriment" = 2, "vitamin" = 2) list_reagents = list("nutriment" = 6, "vitamin" = 1) bitesize = 3 - w_class = 3 \ No newline at end of file + w_class = 3 diff --git a/code/modules/food&drinks/food/snacks_burgers.dm b/code/modules/food&drinks/food/snacks_burgers.dm index 9f77bfce846..27f0b2b2bb2 100644 --- a/code/modules/food&drinks/food/snacks_burgers.dm +++ b/code/modules/food&drinks/food/snacks_burgers.dm @@ -1,6 +1,7 @@ /obj/item/weapon/reagent_containers/food/snacks/burger filling_color = "#CD853F" + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "hburger" bitesize = 3 list_reagents = list("nutriment" = 6, "vitamin" = 1) @@ -13,7 +14,7 @@ /obj/item/weapon/reagent_containers/food/snacks/burger/human var/hname = "" var/job = null - name = "-burger" + name = "human burger" desc = "A bloody burger." bonus_reagents = list("vitamin" = 4) @@ -163,4 +164,18 @@ bonus_reagents = list("vitamin" = 10) list_reagents = list("nutriment" = 40, "vitamin" = 5) w_class = 3 - volume = 80 + bitesize = 7 + volume = 100 + +/obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm + name = "five alarm burger" + desc = "HOT! HOT!" + icon_state = "fivealarmburger" + bonus_reagents = list("nutriment" = 2, "vitamin" = 5) + list_reagents = list("nutriment" = 6, "capsaicin" = 5, "condensedcapsaicin" = 5, "vitamin" = 1) + +/obj/item/weapon/reagent_containers/food/snacks/burger/rat + name = "rat burger" + desc = "Pretty much what you'd expect..." + icon_state = "ratburger" + bonus_reagents = list("nutriment" = 1, "vitamin" = 1) \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_cake.dm b/code/modules/food&drinks/food/snacks_cake.dm index f1ccae6255e..0d287060996 100644 --- a/code/modules/food&drinks/food/snacks_cake.dm +++ b/code/modules/food&drinks/food/snacks_cake.dm @@ -1,13 +1,17 @@ /obj/item/weapon/reagent_containers/food/snacks/store/cake + icon = 'icons/obj/food/piecake.dmi' slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/plain slices_num = 5 bitesize = 3 + volume = 80 list_reagents = list("nutriment" = 20, "vitamin" = 5) /obj/item/weapon/reagent_containers/food/snacks/cakeslice + icon = 'icons/obj/food/piecake.dmi' trash = /obj/item/trash/plate list_reagents = list("nutriment" = 4, "vitamin" = 1) + customfoodfilling = 0 //to avoid infinite cake-ception /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain name = "vanilla cake" @@ -21,6 +25,7 @@ desc = "Just a slice of cake, it is enough for everyone." icon_state = "plaincake_slice" filling_color = "#FFD700" + customfoodfilling = 1 /obj/item/weapon/reagent_containers/food/snacks/store/cake/carrot name = "carrot cake" @@ -174,10 +179,23 @@ desc = "A cake made of slimes. Probably not electrified." icon_state = "slimecake" slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/slimecake - slices_num = 5 bonus_reagents = list("nutriment" = 1, "vitamin" = 3) /obj/item/weapon/reagent_containers/food/snacks/cakeslice/slimecake - name = "Slime cake slice" + name = "slime cake slice" + desc = "A slice of slime cake." icon_state = "slimecake_slice" filling_color = "#00FFFF" + +/obj/item/weapon/reagent_containers/food/snacks/store/cake/pumpkinspice + name = "pumpkin spice cake" + desc = "A hollow cake with real pumpkin." + icon_state = "pumpkinspicecake" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/pumpkinspice + bonus_reagents = list("nutriment" = 3, "vitamin" = 5) + +/obj/item/weapon/reagent_containers/food/snacks/cakeslice/pumpkinspice + name = "pumpkin spice cake slice" + desc = "A spicy slice of pumpkin goodness." + icon_state = "pumpkinspicecakeslice" + filling_color = "#FFD700" \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm index 23c80a6bf4b..608064ed01b 100644 --- a/code/modules/food&drinks/food/snacks_egg.dm +++ b/code/modules/food&drinks/food/snacks_egg.dm @@ -100,12 +100,12 @@ /obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user, params) if(istype(W,/obj/item/weapon/kitchen/utensil/fork)) if(W.icon_state == "forkloaded") - user << "You already have omelette on your fork." + user << "You already have omelette on your fork!" return W.icon_state = "forkloaded" user.visible_message( \ - "[user] takes a piece of omelette with their fork!", \ - "You take a piece of omelette with your fork!" \ + "[user] takes a piece of omelette with their fork!", \ + "You take a piece of omelette with your fork." \ ) reagents.remove_reagent("nutriment", 1) if(reagents.total_volume <= 0) diff --git a/code/modules/food&drinks/food/snacks_meat.dm b/code/modules/food&drinks/food/snacks_meat.dm index 62cf5fcc05b..30a12799e00 100644 --- a/code/modules/food&drinks/food/snacks_meat.dm +++ b/code/modules/food&drinks/food/snacks_meat.dm @@ -98,14 +98,6 @@ ..() eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") -/obj/item/weapon/reagent_containers/food/snacks/wingfangchu - name = "wing fang chu" - desc = "A savory dish of alien wing wang in soy." - icon_state = "wingfangchu" - trash = /obj/item/weapon/reagent_containers/glass/bowl - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 2) - /obj/item/weapon/reagent_containers/food/snacks/kebab trash = /obj/item/stack/rods icon_state = "kebab" diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food&drinks/food/snacks_other.dm index 735b65f5048..f11f863aad2 100644 --- a/code/modules/food&drinks/food/snacks_other.dm +++ b/code/modules/food&drinks/food/snacks_other.dm @@ -1,7 +1,7 @@ ////////////////////////////////////////////OTHER//////////////////////////////////////////// -/obj/item/weapon/reagent_containers/food/snacks/cheesewheel +/obj/item/weapon/reagent_containers/food/snacks/store/cheesewheel name = "cheese wheel" desc = "A big wheel of delcious Cheddar." icon_state = "cheesewheel" @@ -141,10 +141,10 @@ list_reagents = list("minttoxin" = 1) filling_color = "#800000" -/obj/item/weapon/reagent_containers/food/snacks/wrap +/obj/item/weapon/reagent_containers/food/snacks/eggwrap name = "egg wrap" desc = "The precursor to Pigs in a Blanket." - icon_state = "wrap" + icon_state = "eggwrap" bonus_reagents = list("nutriment" = 1, "vitamin" = 3) list_reagents = list("nutriment" = 5) filling_color = "#F0E68C" @@ -187,4 +187,127 @@ trash = /obj/item/trash/plate bonus_reagents = list("nutriment" = 1, "vitamin" = 3) list_reagents = list("nutriment" = 6, "vitamin" = 2) - filling_color = "#BA55D3" \ No newline at end of file + filling_color = "#BA55D3" + +/obj/item/weapon/reagent_containers/food/snacks/tortilla + name = "tortilla" + desc = "The base for all your burritos." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "tortilla" + list_reagents = list("nutriment" = 3, "vitamin" = 1) + filling_color = "#FFEFD5" + +/obj/item/weapon/reagent_containers/food/snacks/burrito + name = "burrito" + desc = "Tortilla wrapped goodness." + icon_state = "burrito" + bonus_reagents = list("nutriment" = 2, "vitamin" = 2) + list_reagents = list("nutriment" = 4, "vitamin" = 1) + filling_color = "#FFEFD5" + +/obj/item/weapon/reagent_containers/food/snacks/cheesyburrito + name = "cheesy burrito" + desc = "It's a burrito filled with cheese." + icon_state = "cheesyburrito" + bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + list_reagents = list("nutriment" = 4, "vitamin" = 2) + filling_color = "#FFD800" + +/obj/item/weapon/reagent_containers/food/snacks/carneburrito + name = "carne asada burrito" + desc = "The best burrito for meat lovers." + icon_state = "carneburrito" + bonus_reagents = list("nutriment" = 2, "vitamin" = 1) + list_reagents = list("nutriment" = 5, "vitamin" = 1) + filling_color = "#A0522D" + +/obj/item/weapon/reagent_containers/food/snacks/fuegoburrito + name = "fuego plasma burrito" + desc = "A super spicy burrito." + icon_state = "fuegoburrito" + bonus_reagents = list("nutriment" = 2, "vitamin" = 3) + list_reagents = list("nutriment" = 4, "capsaicin" = 5, "vitamin" = 3) + filling_color = "#FF2000" + +/obj/item/weapon/reagent_containers/food/snacks/yakiimo + name = "yaki imo" + desc = "Made with roasted sweet potatoes!" + icon_state = "yakiimo" + trash = /obj/item/trash/plate + list_reagents = list("nutriment" = 5, "vitamin" = 4) + filling_color = "#8B1105" + +/obj/item/weapon/reagent_containers/food/snacks/roastparsnip + name = "roast parsnip" + desc = "Sweet and crunchy." + icon_state = "roastparsnip" + trash = /obj/item/trash/plate + list_reagents = list("nutriment" = 3, "vitamin" = 4) + filling_color = "#FF5500" + +/obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl + name = "melon fruit bowl" + desc = "For people who wants edible fruit bowls." + icon_state = "melonfruitbowl" + bonus_reagents = list("nutriment" = 2, "vitamin" = 2) + list_reagents = list("nutriment" = 6, "vitamin" = 4) + filling_color = "#FF5500" + w_class = 3 + +/obj/item/weapon/reagent_containers/food/snacks/spacefreezy + name = "space freezy" + desc = "The best icecream in space." + icon_state = "spacefreezy" + bonus_reagents = list("nutriment" = 2, "vitamin" = 2) + list_reagents = list("nutriment" = 6, "bluecherryjelly" = 5, "vitamin" = 4) + filling_color = "#87CEFA" + +/obj/item/weapon/reagent_containers/food/snacks/sundae + name = "sundae" + desc = "A classic dessert." + icon_state = "sundae" + bonus_reagents = list("nutriment" = 2, "vitamin" = 1) + list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2) + filling_color = "#FFFACD" + +/obj/item/weapon/reagent_containers/food/snacks/honkdae + name = "honkdae" + desc = "The clown's favorite dessert." + icon_state = "honkdae" + bonus_reagents = list("nutriment" = 2, "vitamin" = 2) + list_reagents = list("nutriment" = 6, "banana" = 10, "vitamin" = 4) + filling_color = "#FFFACD" + +/obj/item/weapon/reagent_containers/food/snacks/nachos + name = "nachos" + desc = "Chips from Space Mexico." + icon_state = "nachos" + bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list("nutriment" = 6, "vitamin" = 2) + filling_color = "#F4A460" + +/obj/item/weapon/reagent_containers/food/snacks/cheesynachos + name = "cheesy nachos" + desc = "The delicious combination of nachos and melting cheese." + icon_state = "cheesynachos" + bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + list_reagents = list("nutriment" = 6, "vitamin" = 3) + filling_color = "#FFD700" + +/obj/item/weapon/reagent_containers/food/snacks/cubannachos + name = "cuban nachos" + desc = "That's some dangerously spicy nachos." + icon_state = "cubannachos" + bonus_reagents = list("nutriment" = 2, "vitamin" = 3) + list_reagents = list("nutriment" = 7, "capsaicin" = 8, "vitamin" = 4) + filling_color = "#DC143C" + +/obj/item/weapon/reagent_containers/food/snacks/melonkeg + name = "melon keg" + desc = "Who knew vodka was a fruit?" + icon_state = "melonkeg" + bonus_reagents = list("nutriment" = 3, "vitamin" = 3) + list_reagents = list("nutriment" = 9, "vodka" = 15, "vitamin" = 4) + filling_color = "#FFD700" + volume = 80 + bitesize = 5 \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food&drinks/food/snacks_pastry.dm index ffd7f5dc9fc..1af2b47ad8a 100644 --- a/code/modules/food&drinks/food/snacks_pastry.dm +++ b/code/modules/food&drinks/food/snacks_pastry.dm @@ -93,7 +93,6 @@ name = "chawanmushi" desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." icon_state = "chawanmushi" - trash = /obj/item/weapon/reagent_containers/glass/bowl bonus_reagents = list("vitamin" = 1) list_reagents = list("nutriment" = 5) filling_color = "#FFE4E1" @@ -156,7 +155,7 @@ filling_color = "#CD853F" /obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm - name = "\improper Warm Donk-pocket" + name = "warm Donk-pocket" desc = "The heated food of choice for the seasoned traitor." bonus_reagents = list("omnizine" = 3) list_reagents = list("nutriment" = 4, "omnizine" = 3) @@ -234,3 +233,35 @@ bonus_reagents = list("nutriment" = 1, "vitamin" = 1) list_reagents = list("nutriment" = 5, "vitamin" = 1) filling_color = "#FFE4C4" + +/obj/item/weapon/reagent_containers/food/snacks/oatmealcookie + name = "oatmeal cookie" + desc = "The best of both cookie and oat" + icon_state = "oatmealcookie" + bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list("nutriment" = 5, "vitamin" = 1) + filling_color = "#D2691E" + +/obj/item/weapon/reagent_containers/food/snacks/raisincookie + name = "raisin cookie" + desc = "Why would you put raisins on a cookie?" + icon_state = "raisincookie" + bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list("nutriment" = 5, "vitamin" = 1) + filling_color = "#F0E68C" + +/obj/item/weapon/reagent_containers/food/snacks/cherrycupcake + name = "cherry cupcake" + desc = "A sweet cupcake with cherry bits." + icon_state = "cherrycupcake" + bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list("nutriment" = 5, "vitamin" = 1) + filling_color = "#F0E68C" + +/obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake + name = "blue cherry cupcake" + desc = "Blue cherries inside a delicious cupcake" + icon_state = "bluecherrycupcake" + bonus_reagents = list("nutriment" = 1, "vitamin" = 3) + list_reagents = list("nutriment" = 5, "vitamin" = 1) + filling_color = "#F0E68C" diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food&drinks/food/snacks_pie.dm index 1a69a62b334..e4fe6700f67 100644 --- a/code/modules/food&drinks/food/snacks_pie.dm +++ b/code/modules/food&drinks/food/snacks_pie.dm @@ -1,8 +1,10 @@ /obj/item/weapon/reagent_containers/food/snacks/pie + icon = 'icons/obj/food/piecake.dmi' trash = /obj/item/trash/plate bitesize = 3 w_class = 3 + volume = 80 list_reagents = list("nutriment" = 10, "vitamin" = 2) /obj/item/weapon/reagent_containers/food/snacks/pie/plain @@ -102,7 +104,7 @@ bonus_reagents = list("nutriment" = 1, "vitamin" = 2) -/obj/item/weapon/reagent_containers/food/snacks/pumpkinpie +/obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie name = "pumpkin pie" desc = "A delicious treat for the autumn months." icon_state = "pumpkinpie" @@ -113,8 +115,10 @@ /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice name = "pumpkin pie slice" desc = "A slice of pumpkin pie, with whipped cream on top. Perfection." + icon = 'icons/obj/food/piecake.dmi' icon_state = "pumpkinpieslice" trash = /obj/item/trash/plate + filling_color = "#FFA500" list_reagents = list("nutriment" = 2) /obj/item/weapon/reagent_containers/food/snacks/pie/appletart @@ -123,3 +127,43 @@ icon_state = "gappletart" bonus_reagents = list("nutriment" = 1, "vitamin" = 4) list_reagents = list("nutriment" = 8, "gold" = 5, "vitamin" = 4) + +/obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie + name = "blumpkin pie" + desc = "An odd blue pie made with toxic blumpkin." + icon_state = "blumpkinpie" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/blumpkinpieslice + slices_num = 5 + bonus_reagents = list("nutriment" = 3, "vitamin" = 6) + +/obj/item/weapon/reagent_containers/food/snacks/blumpkinpieslice + name = "blumpkin pie slice" + desc = "A slice of blumpkin pie, with whipped cream on top. Is this edible?" + icon = 'icons/obj/food/piecake.dmi' + icon_state = "blumpkinpieslice" + trash = /obj/item/trash/plate + filling_color = "#1E90FF" + list_reagents = list("nutriment" = 2) + +/obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata + name = "dulce de batata" + desc = "A delicious jelly made with sweet potatoes." + icon_state = "dulcedebatata" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/dulcedebatataslice + slices_num = 5 + bonus_reagents = list("nutriment" = 4, "vitamin" = 8) + +/obj/item/weapon/reagent_containers/food/snacks/dulcedebatataslice + name = "dulce de batata slice" + desc = "A slice of sweet dulce de batata jelly." + icon = 'icons/obj/food/piecake.dmi' + icon_state = "dulcedebatataslice" + trash = /obj/item/trash/plate + filling_color = "#8B4513" + list_reagents = list("nutriment" = 2) + +/obj/item/weapon/reagent_containers/food/snacks/pie/frostypie + name = "frosty pie" + desc = "Tastes like blue and cold." + icon_state = "frostypie" + bonus_reagents = list("nutriment" = 4, "vitamin" = 6) diff --git a/code/modules/food&drinks/food/snacks_pizza.dm b/code/modules/food&drinks/food/snacks_pizza.dm index 6237ce52192..c9f993c17f7 100644 --- a/code/modules/food&drinks/food/snacks_pizza.dm +++ b/code/modules/food&drinks/food/snacks_pizza.dm @@ -2,10 +2,14 @@ /////////////////////////////////////////////////PIZZA//////////////////////////////////////// /obj/item/weapon/reagent_containers/food/snacks/pizza + icon = 'icons/obj/food/pizzaspaghetti.dmi' w_class = 3 slices_num = 6 + volume = 80 + list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5) /obj/item/weapon/reagent_containers/food/snacks/pizzaslice + icon = 'icons/obj/food/pizzaspaghetti.dmi' list_reagents = list("nutriment" = 5) /obj/item/weapon/reagent_containers/food/snacks/pizza/margherita @@ -13,9 +17,7 @@ desc = "The most cheezy pizza in galaxy." icon_state = "pizzamargherita" slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/margherita - slices_num = 6 bonus_reagents = list("nutriment" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5) /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/margherita name = "margherita slice" @@ -23,51 +25,89 @@ icon_state = "pizzamargheritaslice" filling_color = "#FFA500" -/obj/item/weapon/reagent_containers/food/snacks/pizza/meatpizza +/obj/item/weapon/reagent_containers/food/snacks/pizza/meat name = "meatpizza" desc = "Greasy pizza with delicious meat." icon_state = "meatpizza" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meatpizza - slices_num = 6 + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meat bonus_reagents = list("nutriment" = 5, "vitamin" = 8) list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 8) -/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meatpizza +/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meat name = "meatpizza slice" desc = "A nutritious slice of meatpizza." icon_state = "meatpizzaslice" filling_color = "#A52A2A" -/obj/item/weapon/reagent_containers/food/snacks/pizza/mushroompizza +/obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom name = "mushroom pizza" desc = "Very special pizza." icon_state = "mushroompizza" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza - slices_num = 6 + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom bonus_reagents = list("nutriment" = 5, "vitamin" = 5) list_reagents = list("nutriment" = 30, "vitamin" = 5) -/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza +/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom name = "mushroom pizza slice" desc = "Maybe it is the last slice of pizza in your life." icon_state = "mushroompizzaslice" filling_color = "#FFE4C4" -/obj/item/weapon/reagent_containers/food/snacks/pizza/vegetablepizza +/obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable name = "vegetable pizza" desc = "No one of Tomatos Sapiens were harmed during making this pizza." icon_state = "vegetablepizza" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetablepizza - slices_num = 6 + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetable bonus_reagents = list("nutriment" = 5, "vitamin" = 5) list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 5) -/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetablepizza +/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetable name = "vegetable pizza slice" desc = "A slice of the most green pizza of all pizzas not containing green ingredients." icon_state = "vegetablepizzaslice" filling_color = "#FFA500" +/obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket + name = "donkpocket pizza" + desc = "Who thought this would be a good idea?" + icon_state = "donkpocketpizza" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/donkpocket + bonus_reagents = list("nutriment" = 5, "vitamin" = 5) + list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "omnizine" = 10, "vitamin" = 5) + +/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/donkpocket + name = "donkpocket pizza slice" + desc = "Smells like donkpocket." + icon_state = "donkpocketpizzaslice" + filling_color = "#FFA500" + +/obj/item/weapon/reagent_containers/food/snacks/pizza/dank + name = "dank pizza" + desc = "The hippie's pizza of choice." + icon_state = "dankpizza" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/dank + bonus_reagents = list("nutriment" = 2, "vitamin" = 6) + list_reagents = list("nutriment" = 25, "doctorsdelight" = 5, "tomatojuice" = 6, "vitamin" = 5) + +/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/dank + name = "dank pizza slice" + desc = "So good, man..." + icon_state = "dankpizzaslice" + filling_color = "#2E8B57" + +/obj/item/weapon/reagent_containers/food/snacks/pizza/sassysage + name = "sassysage pizza" + desc = "You can really smell the sassiness." + icon_state = "sassysagepizza" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/sassysage + bonus_reagents = list("nutriment" = 6, "vitamin" = 6) + +/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/sassysage + name = "sassysage pizza slice" + desc = "Deliciously sassy." + icon_state = "sassysagepizzaslice" + filling_color = "#FF4500" + /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/custom name = "pizza slice" icon_state = "pizzamargheritaslice" @@ -76,7 +116,7 @@ /obj/item/pizzabox name = "pizza box" desc = "A box suited for pizzas." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/containers.dmi' icon_state = "pizzabox1" var/open = 0 // Is the box open? var/ismessy = 0 // Fancy mess on the lid @@ -111,7 +151,7 @@ icon_state = "pizzabox_open" if(pizza) - var/image/pizzaimg = image("food.dmi", icon_state = pizza.icon_state) + var/image/pizzaimg = image('icons/obj/food/pizzaspaghetti.dmi', icon_state = pizza.icon_state) pizzaimg.pixel_y = -3 overlays += pizzaimg @@ -128,7 +168,7 @@ doimgtag = 1 if(doimgtag) - var/image/tagimg = image("food.dmi", icon_state = "pizzabox_tag") + var/image/tagimg = image('icons/obj/food/containers.dmi', icon_state = "pizzabox_tag") tagimg.pixel_y = boxes.len * 3 overlays += tagimg @@ -235,16 +275,16 @@ update_icon() /obj/item/pizzabox/vegetable/New() - pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetablepizza(src) + pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable(src) boxtag = "Gourmet Vegatable" update_icon() /obj/item/pizzabox/mushroom/New() - pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroompizza(src) + pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom(src) boxtag = "Mushroom Special" update_icon() /obj/item/pizzabox/meat/New() - pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/meatpizza(src) + pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/meat(src) boxtag = "Meatlover's Supreme" update_icon() \ No newline at end of file diff --git a/code/modules/food&drinks/food/snacks_salad.dm b/code/modules/food&drinks/food/snacks_salad.dm index 0e9cb68f107..d98273c4fb3 100644 --- a/code/modules/food&drinks/food/snacks_salad.dm +++ b/code/modules/food&drinks/food/snacks_salad.dm @@ -1,9 +1,11 @@ //this category is very little but I think that it has great potential to grow ////////////////////////////////////////////SALAD//////////////////////////////////////////// /obj/item/weapon/reagent_containers/food/snacks/salad + icon = 'icons/obj/food/soupsalad.dmi' trash = /obj/item/weapon/reagent_containers/glass/bowl bitesize = 3 w_class = 3 + list_reagents = list("nutriment" = 7, "vitamin" = 2) /obj/item/weapon/reagent_containers/food/snacks/salad/New() ..() @@ -29,3 +31,62 @@ icon_state = "validsalad" bonus_reagents = list("doctorsdelight" = 5, "vitamin" = 4) list_reagents = list("nutriment" = 8, "doctorsdelight" = 5, "vitamin" = 2) + +/obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal + name = "oatmeal" + desc = "A nice bowl of oatmeal." + icon_state = "oatmeal" + bonus_reagents = list("nutriment" = 4, "vitamin" = 4) + list_reagents = list("nutriment" = 7, "milk" = 10, "vitamin" = 2) + +/obj/item/weapon/reagent_containers/food/snacks/salad/fruit + name = "fruit salad" + desc = "Your standard fruit salad." + icon_state = "fruitsalad" + bonus_reagents = list("nutriment" = 2, "vitamin" = 4) + +/obj/item/weapon/reagent_containers/food/snacks/salad/jungle + name = "jungle salad" + desc = "Exotic fruits in a bowl." + icon_state = "junglesalad" + bonus_reagents = list("nutriment" = 4, "vitamin" = 4) + list_reagents = list("nutriment" = 7, "banana" = 5, "vitamin" = 4) + +/obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight + name = "citrus delight" + desc = "Citrus overload!" + icon_state = "citrusdelight" + bonus_reagents = list("nutriment" = 4, "vitamin" = 4) + list_reagents = list("nutriment" = 7, "vitamin" = 5) + +/obj/item/weapon/reagent_containers/food/snacks/salad/ricebowl + name = "ricebowl" + desc = "A bowl of raw rice." + icon_state = "ricebowl" + cooked_type = /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice + list_reagents = list("nutriment" = 4) + +/obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice + name = "boiled rice" + desc = "A warm bowl of rice." + icon_state = "boiledrice" + bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list("nutriment" = 5, "vitamin" = 1) + +/obj/item/weapon/reagent_containers/food/snacks/salad/ricepudding + name = "rice pudding" + desc = "Everybody loves rice pudding!" + icon_state = "ricepudding" + bonus_reagents = list("nutriment" = 4, "vitamin" = 2) + +/obj/item/weapon/reagent_containers/food/snacks/salad/ricepork + name = "rice and pork" + desc = "Well, it looks like pork..." + icon_state = "riceporkbowl" + bonus_reagents = list("nutriment" = 4, "vitamin" = 4) + +/obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl + name = "egg bowl" + desc = "A bowl of rice with a fried egg." + icon_state = "eggbowl" + bonus_reagents = list("nutriment" = 4, "vitamin" = 4) diff --git a/code/modules/food&drinks/food/snacks_sandwichtoast.dm b/code/modules/food&drinks/food/snacks_sandwichtoast.dm index b1196ce7ff5..cef39b6836b 100644 --- a/code/modules/food&drinks/food/snacks_sandwichtoast.dm +++ b/code/modules/food&drinks/food/snacks_sandwichtoast.dm @@ -2,6 +2,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sandwich name = "sandwich" desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud." + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "sandwich" trash = /obj/item/trash/plate bonus_reagents = list("nutriment" = 1, "vitamin" = 1) @@ -11,6 +12,7 @@ /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich name = "toasted sandwich" desc = "Now if you only had a pepper bar." + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "toastedsandwich" trash = /obj/item/trash/plate bonus_reagents = list("nutriment" = 1, "carbon" = 2) @@ -19,6 +21,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grilledcheese name = "grilled cheese sandwich" desc = "Goes great with Tomato soup!" + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "toastedsandwich" trash = /obj/item/trash/plate bonus_reagents = list("nutriment" = 1, "vitamin" = 1) @@ -27,6 +30,7 @@ /obj/item/weapon/reagent_containers/food/snacks/jellysandwich name = "jelly sandwich" desc = "You wish you had some peanut butter to go with this..." + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "jellysandwich" trash = /obj/item/trash/plate bitesize = 3 @@ -42,6 +46,7 @@ /obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich name = "icecream sandwich" desc = "Portable Ice-cream in it's own packaging." + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "icecreamsandwich" bonus_reagents = list("nutriment" = 1, "ice" = 2) list_reagents = list("nutriment" = 2, "ice" = 2) @@ -49,6 +54,7 @@ /obj/item/weapon/reagent_containers/food/snacks/notasandwich name = "not-a-sandwich" desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache." + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "notasandwich" trash = /obj/item/trash/plate bonus_reagents = list("vitamin" = 6) @@ -57,6 +63,7 @@ /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast name = "jellied toast" desc = "A slice of bread covered with delicious jam." + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "jellytoast" trash = /obj/item/trash/plate bitesize = 3 @@ -72,6 +79,7 @@ /obj/item/weapon/reagent_containers/food/snacks/twobread name = "two bread" desc = "This seems awfully bitter." + icon = 'icons/obj/food/burgerbread.dmi' icon_state = "twobread" bonus_reagents = list("nutriment" = 1, "vitamin" = 2) list_reagents = list("nutriment" = 2, "vitamin" = 2) diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food&drinks/food/snacks_soup.dm index 3df14169642..8248ab27aeb 100644 --- a/code/modules/food&drinks/food/snacks_soup.dm +++ b/code/modules/food&drinks/food/snacks_soup.dm @@ -1,7 +1,9 @@ /obj/item/weapon/reagent_containers/food/snacks/soup w_class = 3 + icon = 'icons/obj/food/soupsalad.dmi' trash = /obj/item/weapon/reagent_containers/glass/bowl bitesize = 5 + volume = 80 list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4) /obj/item/weapon/reagent_containers/food/snacks/soup/New() @@ -42,6 +44,14 @@ bonus_reagents = list("nutriment" = 1, "vitamin" = 6) list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5, "vitamin" = 4) +/obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu + name = "wing fang chu" + desc = "A savory dish of alien wing wang in soy." + icon_state = "wingfangchu" + trash = /obj/item/weapon/reagent_containers/glass/bowl + bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2) + /obj/item/weapon/reagent_containers/food/snacks/soup/clownstears name = "clown's tears" desc = "Not very funny." @@ -120,7 +130,6 @@ desc = "Wait, how do you spell it again..?" icon_state = "beetsoup" bonus_reagents = list("nutriment" = 1, "vitamin" = 5) - list_reagents = list("nutriment" = 8, "vitamin" = 4) /obj/item/weapon/reagent_containers/food/snacks/soup/beet/New() ..() @@ -150,3 +159,18 @@ bonus_reagents = list("nutriment" = 1, "tomatojuice" = 5, "vitamin" = 5) list_reagents = list("nutriment" = 10, "oculine" = 5, "tomatojuice" = 5, "vitamin" = 5) bitesize = 7 + volume = 100 + +/obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato + name = "sweet potato soup" + desc = "Delicious sweet potato in soup form." + icon_state = "sweetpotatosoup" + bonus_reagents = list("nutriment" = 4, "vitamin" = 5) + +/obj/item/weapon/reagent_containers/food/snacks/soup/beet/red + name = "red beet soup" + desc = "Quite a delicacy." + icon_state = "redbeetsoup" + bonus_reagents = list("nutriment" = 4, "vitamin" = 6) + + diff --git a/code/modules/food&drinks/food/snacks_spaghetti.dm b/code/modules/food&drinks/food/snacks_spaghetti.dm index 1545ae518fc..251217a54ed 100644 --- a/code/modules/food&drinks/food/snacks_spaghetti.dm +++ b/code/modules/food&drinks/food/snacks_spaghetti.dm @@ -2,6 +2,7 @@ /obj/item/weapon/reagent_containers/food/snacks/spaghetti name = "spaghetti" desc = "Now that's a nic'e pasta!" + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "spaghetti" list_reagents = list("nutriment" = 1, "vitamin" = 1) cooked_type = /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti @@ -10,6 +11,7 @@ /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti name = "boiled spaghetti" desc = "A plain dish of noodles, this needs more ingredients." + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "spaghettiboiled" trash = /obj/item/trash/plate bonus_reagents = list("nutriment" = 2) @@ -20,6 +22,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pastatomato name = "spaghetti" desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "pastatomato" trash = /obj/item/trash/plate bitesize = 4 @@ -30,6 +33,7 @@ /obj/item/weapon/reagent_containers/food/snacks/copypasta name = "copypasta" desc = "You probably shouldn't try this, you always hear people talking about how bad it is..." + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "copypasta" trash = /obj/item/trash/plate bitesize = 4 @@ -40,6 +44,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti name = "spaghetti and meatballs" desc = "Now that's a nic'e meatball!" + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "meatballspaghetti" trash = /obj/item/trash/plate bonus_reagents = list("nutriment" = 1, "vitamin" = 4) @@ -49,8 +54,26 @@ /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "spesslaw" desc = "A lawyers favourite." + icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "spesslaw" trash = /obj/item/trash/plate bonus_reagents = list("nutriment" = 1, "vitamin" = 6) list_reagents = list("nutriment" = 8, "vitamin" = 6) filling_color = "#F0E68C" + +/obj/item/weapon/reagent_containers/food/snacks/chowmein + name = "chow mein" + desc = "A nice mix of noodles and fried vegetables." + icon = 'icons/obj/food/pizzaspaghetti.dmi' + icon_state = "chowmein" + trash = /obj/item/trash/plate + bonus_reagents = list("nutriment" = 3, "vitamin" = 4) + list_reagents = list("nutriment" = 7, "vitamin" = 6) + +/obj/item/weapon/reagent_containers/food/snacks/beefnoodle + name = "beef noodle" + desc = "Nutritious, beefy and noodly." + icon = 'icons/obj/food/pizzaspaghetti.dmi' + icon_state = "beefnoodle" + trash = /obj/item/weapon/reagent_containers/glass/bowl + bonus_reagents = list("nutriment" = 5, "vitamin" = 6) \ No newline at end of file diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm index 640e9d9024a..064e0aeb379 100644 --- a/code/modules/food&drinks/kitchen machinery/gibber.dm +++ b/code/modules/food&drinks/kitchen machinery/gibber.dm @@ -124,10 +124,10 @@ if(src.operating) return if(!src.occupant) - visible_message("You hear a loud metallic grinding sound.") + visible_message("You hear a loud metallic grinding sound.") return use_power(1000) - visible_message("You hear a loud squelchy grinding sound.") + visible_message("You hear a loud squelchy grinding sound.") src.operating = 1 update_icon() var/sourcename = src.occupant.real_name @@ -136,16 +136,16 @@ var/sourcetotalreagents = src.occupant.reagents.total_volume var/totalslabs = 3 - var/obj/item/weapon/reagent_containers/food/snacks/meat/human/allmeat[totalslabs] + var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/allmeat[totalslabs] if(ishuman(occupant)) var/mob/living/carbon/human/gibee = occupant if(gibee.dna && gibee.dna.species) typeofmeat = gibee.dna.species.meat else - typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/human + typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human for (var/i=1 to totalslabs) - var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new typeofmeat + var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/newmeat = new typeofmeat newmeat.name = sourcename + newmeat.name newmeat.subjectname = sourcename newmeat.subjectjob = sourcejob diff --git a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm b/code/modules/food&drinks/kitchen machinery/icecream_vat.dm index 1965f4cdde4..a42158fca57 100644 --- a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm +++ b/code/modules/food&drinks/kitchen machinery/icecream_vat.dm @@ -126,7 +126,7 @@ else src.visible_message("[user] whips up some [flavour] icecream.") else - user << "You don't have the ingredients to make this." + user << "You don't have the ingredients to make this!" /obj/machinery/icecream_vat/Topic(href, href_list) if(..()) diff --git a/code/modules/food&drinks/kitchen machinery/juicer.dm b/code/modules/food&drinks/kitchen machinery/juicer.dm index 3cf4bc60a2a..4894af742f3 100644 --- a/code/modules/food&drinks/kitchen machinery/juicer.dm +++ b/code/modules/food&drinks/kitchen machinery/juicer.dm @@ -23,6 +23,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = "watermelonjuice", /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = "watermelonjuice", /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = "poisonberryjuice", + /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = "pumpkinjuice", + /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = "blumpkinjuice", ) /obj/machinery/juicer/New() @@ -42,7 +44,7 @@ return 1 else if(!user.unEquip(O)) - user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [O] is stuck to your hand, you cannot put it in \the [src]!" return 0 O.loc = src beaker = O @@ -54,7 +56,7 @@ user << "It looks as not containing any juice." return 1 if(!user.unEquip(O)) - user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [O] is stuck to your hand, you cannot put it in \the [src]!" return 0 O.loc = src src.updateUsrDialog() diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm index 48b0cff7ad5..4db5f5ea817 100644 --- a/code/modules/food&drinks/kitchen machinery/microwave.dm +++ b/code/modules/food&drinks/kitchen machinery/microwave.dm @@ -59,24 +59,24 @@ if(src.broken > 0) if(src.broken == 2 && istype(O, /obj/item/weapon/wirecutters)) // If it's broken and they're using a screwdriver user.visible_message( \ - "[user] starts to fix part of the microwave.", \ - "You start to fix part of the microwave." \ + "[user] starts to fix part of the microwave.", \ + "You start to fix part of the microwave..." \ ) if (do_after(user,20)) user.visible_message( \ - "[user] fixes part of the microwave.", \ - "You have fixed part of the microwave." \ + "[user] fixes part of the microwave.", \ + "You fix part of the microwave." \ ) src.broken = 1 // Fix it a bit else if(src.broken == 1 && istype(O, /obj/item/weapon/weldingtool)) // If it's broken and they're doing the wrench user.visible_message( \ - "[user] starts to fix part of the microwave.", \ - "You start to fix part of the microwave." \ + "[user] starts to fix part of the microwave.", \ + "You start to fix part of the microwave..." \ ) if (do_after(user,20)) user.visible_message( \ - "[user] fixes the microwave.", \ - "You have fixed the microwave." \ + "[user] fixes the microwave.", \ + "You fix the microwave." \ ) src.icon_state = "mw" src.broken = 0 // Fix it! @@ -84,7 +84,7 @@ src.flags = OPENCONTAINER return 0 //to use some fuel else - user << "It's broken!" + user << "It's broken!" return 1 else if(istype(O, /obj/item/weapon/reagent_containers/spray/)) var/obj/item/weapon/reagent_containers/spray/clean_spray = O @@ -92,8 +92,8 @@ clean_spray.reagents.remove_reagent("cleaner",clean_spray.amount_per_transfer_from_this,1) playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) user.visible_message( \ - "[user] has cleaned the microwave.", \ - "You have cleaned the microwave." \ + "[user] has cleaned the microwave.", \ + "You clean the microwave." \ ) src.dirty = 0 // It's clean! src.broken = 0 // just to be sure @@ -102,19 +102,19 @@ src.updateUsrDialog() return 1 // Disables the after-attack so we don't spray the floor/user. else - user << "You need more space cleaner!" + user << "You need more space cleaner!" return 1 else if(istype(O, /obj/item/weapon/soap/)) // If they're trying to clean it then let them var/obj/item/weapon/soap/P = O user.visible_message( \ - "[user] starts to clean the microwave.", \ - "You start to clean the microwave." \ + "[user] starts to clean the microwave.S", \ + "You start to clean the microwave..." \ ) if (do_after(user, P.cleanspeed)) user.visible_message( \ - "[user] has cleaned the microwave.", \ - "You have cleaned the microwave." \ + "[user] has cleaned the microwave.", \ + "You clean the microwave." \ ) src.dirty = 0 // It's clean! src.broken = 0 // just to be sure @@ -122,7 +122,7 @@ src.flags = OPENCONTAINER else if(src.dirty==100) // The microwave is all dirty so can't be used! - user << "It's dirty!" + user << "It's dirty!" return 1 else if(istype(O, /obj/item/weapon/storage/bag/tray)) @@ -130,7 +130,7 @@ var/loaded = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/S in T.contents) if (contents.len>=max_n_of_items) - user << "[src] is full, you cannot put more." + user << "[src] is full, you cannot put more!" return 1 T.remove_from_storage(S, src) loaded++ @@ -141,16 +141,16 @@ else if(istype(O,/obj/item/weapon/reagent_containers/food/snacks)) if (contents.len>=max_n_of_items) - user << "[src] is full, you cannot put more." + user << "[src] is full, you cannot put more!" return 1 else // user.unEquip(O) //This just causes problems so far as I can tell. -Pete if(!user.drop_item()) - user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + user << "\the [O] is stuck to your hand, you cannot put it in \the [src]!" return 0 O.loc = src user.visible_message( \ - "[user] has added \the [O] to \the [src].", \ + "[user] has added \the [O] to \the [src].", \ "You add \the [O] to \the [src].") else @@ -272,7 +272,7 @@ return 0 /obj/machinery/microwave/proc/start() - visible_message("The microwave turns on.", "You hear a microwave.") + visible_message("The microwave turns on.", "You hear a microwave humming.") operating = 1 icon_state = "mw1" updateUsrDialog() @@ -298,7 +298,7 @@ /obj/machinery/microwave/proc/muck_finish() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - visible_message("The microwave gets covered in muck!") + visible_message("The microwave gets covered in muck!") dirty = 100 // Make it dirty so it can't be used util cleaned icon_state = "mwbloody" // Make it look dirty too operating = 0 // Turn it off again aferwards @@ -313,7 +313,7 @@ s.set_up(2, 1, src) s.start() icon_state = "mwb" // Make it look all busted up and shit - visible_message("The microwave breaks!") //Let them know they're stupid + visible_message("The microwave breaks!") //Let them know they're stupid broken = 2 // Make it broken so it can't be used util fixed flags = null //So you can't add condiments operating = 0 // Turn it off again aferwards diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm index 470c09315ae..cd87e36e038 100644 --- a/code/modules/food&drinks/kitchen machinery/processor.dm +++ b/code/modules/food&drinks/kitchen machinery/processor.dm @@ -27,7 +27,7 @@ /* objs */ /datum/food_processor_process/meat - input = /obj/item/weapon/reagent_containers/food/snacks/meat + input = /obj/item/weapon/reagent_containers/food/snacks/meat/slab output = /obj/item/weapon/reagent_containers/food/snacks/faggot /datum/food_processor_process/potato @@ -46,13 +46,25 @@ input = /obj/item/weapon/reagent_containers/food/snacks/doughslice output = /obj/item/weapon/reagent_containers/food/snacks/spaghetti +/datum/food_processor_process/corn + input = /obj/item/weapon/reagent_containers/food/snacks/grown/corn + output = /obj/item/weapon/reagent_containers/food/snacks/tortilla + +/datum/food_processor_process/parsnip + input = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip + output = /obj/item/weapon/reagent_containers/food/snacks/roastparsnip + +/datum/food_processor_process/sweetpotato + input = /obj/item/weapon/reagent_containers/food/snacks/grown/sweetpotato + output = /obj/item/weapon/reagent_containers/food/snacks/yakiimo + /* mobs */ -/datum/food_processor_process/mob/process(loc, what) +/datum/food_processor_process/mob/process_food(loc, what) ..() -/datum/food_processor_process/mob/slime/process(loc, what) +/datum/food_processor_process/mob/slime/process_food(loc, what) var/mob/living/simple_animal/slime/S = what var/C = S.cores if(S.stat != DEAD) @@ -67,13 +79,13 @@ /datum/food_processor_process/mob/slime/input = /mob/living/simple_animal/slime /datum/food_processor_process/mob/slime/output = null -/datum/food_processor_process/mob/monkey/process(loc, what) +/datum/food_processor_process/mob/monkey/process_food(loc, what) var/mob/living/carbon/monkey/O = what if (O.client) //grief-proof O.loc = loc O.visible_message("Suddenly [O] jumps out from the processor!", \ - "You jump out from the processor", \ - "You hear chimpering") + "You jump out from the processor!", \ + "You hear chimpering.") return var/obj/item/weapon/reagent_containers/glass/bucket/bucket_of_blood = new(loc) var/datum/reagent/blood/B = new() @@ -109,10 +121,10 @@ /obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(src.processing) - user << "The processor is in the process of processing." + user << "The processor is in the process of processing!" return 1 if(src.contents.len > 0) //TODO: several items at once? several different items? - user << "Something is already in the processing chamber." + user << "Something is already in the processing chamber!" return 1 if(default_unfasten_wrench(user, O)) return @@ -125,7 +137,7 @@ var/datum/food_processor_process/P = select_recipe(what) if (!P) - user << "That probably won't blend." + user << "That probably won't blend!" return 1 user.visible_message("[user] put [what] into [src].", \ "You put the [what] into [src].") @@ -137,10 +149,10 @@ if (src.stat != 0) //NOPOWER etc return if(src.processing) - user << "The processor is in the process of processing." + user << "The processor is in the process of processing!" return 1 if(src.contents.len == 0) - user << "The processor is empty." + user << "The processor is empty!" return 1 for(var/O in src.contents) var/datum/food_processor_process/P = select_recipe(O) @@ -148,15 +160,15 @@ log_admin("DEBUG: [O] in processor havent suitable recipe. How do you put it in?") //-rastaf0 continue src.processing = 1 - user.visible_message("[user] turns on \a [src].", \ - "You turn on \a [src].", \ - "You hear a food processor") + user.visible_message("[user] turns on \a [src].", \ + "You turn on \a [src].", \ + "You hear a food processor.") playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) use_power(500) sleep(P.time) - P.process(src.loc, O) + P.process_food(src.loc, O) src.processing = 0 - src.visible_message("\the [src] finished processing.") + src.visible_message("\the [src] finishes processing.") /obj/machinery/processor/verb/eject() set category = "Object" diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food&drinks/kitchen machinery/smartfridge.dm index f9c5bdb002e..35c84a26620 100644 --- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm +++ b/code/modules/food&drinks/kitchen machinery/smartfridge.dm @@ -42,12 +42,12 @@ return 0 if(contents.len >= max_n_of_items) - user << "\The [src] is full." + user << "\The [src] is full!" return 0 if(accept_check(O)) load(O) - user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") + user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") updateUsrDialog() return 1 @@ -62,7 +62,7 @@ load(G) loaded++ else - user << "\The [src] smartly refuses [O]." + user << "\The [src] smartly refuses [O]." updateUsrDialog() return 0 @@ -70,15 +70,15 @@ // this code follows storage items and trays only. if(loaded) if(contents.len >= max_n_of_items) - user.visible_message("[user] loads \the [src] with \the [O].", \ + user.visible_message("[user] loads \the [src] with \the [O].", \ "You fill \the [src] with \the [O].") else - user.visible_message("[user] loads \the [src] with \the [O].", \ + user.visible_message("[user] loads \the [src] with \the [O].", \ "You load \the [src] with \the [O].") if(O.contents.len > 0) - user << "Some items are refused." + user << "Some items are refused." else - user << "There is nothing in [O] to put in [src]." + user << "There is nothing in [O] to put in [src]!" return 0 updateUsrDialog() @@ -95,7 +95,7 @@ if(istype(O.loc,/mob)) var/mob/M = O.loc if(!M.unEquip(O)) - usr << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + usr << "\the [O] is stuck to your hand, you cannot put it in \the [src]!" return else if(istype(O.loc,/obj/item/weapon/storage)) var/obj/item/weapon/storage/S = O.loc diff --git a/code/modules/food&drinks/recipes/drinks_recipes.dm b/code/modules/food&drinks/recipes/drinks_recipes.dm index 2f23ceee03f..6af179bf2f1 100644 --- a/code/modules/food&drinks/recipes/drinks_recipes.dm +++ b/code/modules/food&drinks/recipes/drinks_recipes.dm @@ -506,3 +506,59 @@ result = "thirteenloko" required_reagents = list("vodka" = 1, "coffee" = 1, "limejuice" = 1) result_amount = 3 + +/datum/chemical_reaction/chocolatepudding + name = "Chocolate Pudding" + id = "chocolatepudding" + result = "chocolatepudding" + required_reagents = list("cocoa" = 5, "milk" = 5, "eggyolk" = 5) + result_amount = 20 + +/datum/chemical_reaction/vanillapudding + name = "Vanilla Pudding" + id = "vanillapudding" + result = "vanillapudding" + required_reagents = list("vanilla" = 5, "milk" = 5, "eggyolk" = 5) + result_amount = 20 + +/datum/chemical_reaction/cherryshake + name = "Cherry Shake" + id = "cherryshake" + result = "cherryshake" + required_reagents = list("cherryjelly" = 1, "ice" = 1, "cream" = 1) + result_amount = 3 + +/datum/chemical_reaction/bluecherryshake + name = "Blue Cherry Shake" + id = "bluecherryshake" + result = "bluecherryshake" + required_reagents = list("bluecherryjelly" = 1, "ice" = 1, "cream" = 1) + result_amount = 3 + +/datum/chemical_reaction/drunkenblumpkin + name = "Drunken Blumpkin" + id = "drunkenblumpkin" + result = "drunkenblumpkin" + required_reagents = list("blumpkinjuice" = 1, "irishcream" = 2, "ice" = 1) + result_amount = 4 + +/datum/chemical_reaction/pumpkin_latte + name = "Pumpkin latte" + id = "pumpkin_latte" + result = "pumpkin_latte" + required_reagents = list("pumpkinjuice" = 5, "coffee" = 5, "cream" = 5) + result_amount = 15 + +/datum/chemical_reaction/gibbfloats + name = "Gibb Floats" + id = "gibbfloats" + result = "gibbfloats" + required_reagents = list("dr_gibb" = 5, "ice" = 5, "cream" = 5) + result_amount = 15 + +/datum/chemical_reaction/triple_citrus + name = "triple_citrus" + id = "triple_citrus" + result = "triple_citrus" + required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) + result_amount = 5 \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food&drinks/recipes/food_mixtures.dm index 593dce5b8db..f6d4bf2145f 100644 --- a/code/modules/food&drinks/recipes/food_mixtures.dm +++ b/code/modules/food&drinks/recipes/food_mixtures.dm @@ -71,6 +71,14 @@ required_reagents = list("soymilk" = 4, "sacid" = 1) result_amount = 5 +/datum/chemical_reaction/corn_syrup + name = "corn_syrup" + id = "corn_syrup" + result = "corn_syrup" + required_reagents = list("corn_starch" = 1, "sacid" = 1) + result_amount = 5 + required_temp = 374 + /datum/chemical_reaction/cheesewheel name = "Cheesewheel" id = "cheesewheel" @@ -81,7 +89,7 @@ /datum/chemical_reaction/cheesewheel/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/cheesewheel(location) + new /obj/item/weapon/reagent_containers/food/snacks/store/cheesewheel(location) return /datum/chemical_reaction/synthmeat @@ -94,7 +102,7 @@ /datum/chemical_reaction/synthmeat/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - new /obj/item/weapon/reagent_containers/food/snacks/meat/synthmeat(location) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/synthmeat(location) return /datum/chemical_reaction/hot_ramen @@ -157,3 +165,17 @@ id = "vegancakebatter" required_reagents = list("soymilk" = 15, "flour" = 15, "sugar" = 5) +/datum/chemical_reaction/ricebowl + name = "Rice Bowl" + id = "ricebowl" + result = null + required_reagents = list("rice" = 10, "water" = 10) + result_amount = 1 + required_container = /obj/item/weapon/reagent_containers/glass/bowl + mix_message = "The rice absorbs the water." + +/datum/chemical_reaction/ricebowl/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/salad/ricebowl + S.loc = get_turf(holder.my_atom) + if(holder && holder.my_atom) + qdel(holder.my_atom) diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm index 9e820b3791c..8dd5494537d 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm @@ -7,7 +7,7 @@ name = "Meat bread" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet/plain = 3, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain = 3, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/meat @@ -16,7 +16,7 @@ name = "Xenomeat bread" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno = 3, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 3, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/xenomeat @@ -25,7 +25,7 @@ name = "Spidermeat bread" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet/spider = 3, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider = 3, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3 ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/spidermeat @@ -58,3 +58,12 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/creamcheese +/datum/table_recipe/mimanabread + name = "Mimana bread" + reqs = list( + /datum/reagent/consumable/soymilk = 5, + /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/tofu = 3, + /obj/item/weapon/reagent_containers/food/snacks/grown/mimana = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm index 53fea3217ec..feafb78594e 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm @@ -8,14 +8,14 @@ name = "Human burger" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/bun = 1, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human = 1 + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/human /datum/table_recipe/burger name = "Burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) @@ -40,7 +40,7 @@ /datum/table_recipe/xenoburger name = "Xeno burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/xeno = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/xeno @@ -48,7 +48,7 @@ datum/table_recipe/bearger name = "Bearger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/bear = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/bearger @@ -96,7 +96,7 @@ datum/table_recipe/bearger /datum/table_recipe/redburger name = "Red burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1, /obj/item/toy/crayon/red = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) @@ -105,7 +105,7 @@ datum/table_recipe/bearger /datum/table_recipe/orangeburger name = "Orange burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1, /obj/item/toy/crayon/orange = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) @@ -114,7 +114,7 @@ datum/table_recipe/bearger /datum/table_recipe/yellowburger name = "Yellow burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1, /obj/item/toy/crayon/yellow = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) @@ -123,7 +123,7 @@ datum/table_recipe/bearger /datum/table_recipe/greenburger name = "Green burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1, /obj/item/toy/crayon/green = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) @@ -132,7 +132,7 @@ datum/table_recipe/bearger /datum/table_recipe/blueburger name = "Blue burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1, /obj/item/toy/crayon/blue = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) @@ -141,7 +141,7 @@ datum/table_recipe/bearger /datum/table_recipe/purpleburger name = "Purple burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1, /obj/item/toy/crayon/purple = 1, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) @@ -165,7 +165,7 @@ datum/table_recipe/bearger /datum/table_recipe/bigbiteburger name = "Big bite burger" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 3, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 3, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/bigbite @@ -175,7 +175,7 @@ datum/table_recipe/bearger reqs = list( /datum/reagent/consumable/sodiumchloride = 5, /datum/reagent/consumable/blackpepper = 5, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 5, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 5, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 4, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3, /obj/item/weapon/reagent_containers/food/snacks/boiledegg = 2, @@ -198,4 +198,20 @@ datum/table_recipe/bearger /datum/reagent/consumable/cherryjelly = 5, /obj/item/weapon/reagent_containers/food/snacks/bun = 1 ) - result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry \ No newline at end of file + result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry + +/datum/table_recipe/fivealarmburger + name = "Five alarm burger" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili = 2, + /obj/item/weapon/reagent_containers/food/snacks/bun = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm + +/datum/table_recipe/ratburger + name = "Rat burger" + reqs = list( + /obj/item/trash/deadmouse = 1, + /obj/item/weapon/reagent_containers/food/snacks/bun = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/burger/rat \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm index e9fbbdacc7a..c5615809633 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm @@ -81,4 +81,12 @@ /obj/item/slime_extract = 1, /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1 ) - result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake \ No newline at end of file + result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake + +/datum/table_recipe/pumpkinspicecake + name = "Pumpkin spice cake" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 2 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/pumpkinspice \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm index 98dee93aed5..4a0dbc40a07 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm @@ -32,7 +32,7 @@ name = "Eggs benedict" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/friedegg = 1, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 1, /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/benedict diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm index d0855fabe69..9681bea3478 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm @@ -6,7 +6,7 @@ name = "Human kebab" reqs = list( /obj/item/stack/rods = 1, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human = 2 + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/kebab/human @@ -14,7 +14,7 @@ name = "Kebab" reqs = list( /obj/item/stack/rods = 1, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 2 + /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/kebab/monkey @@ -72,7 +72,7 @@ reqs = list( /datum/reagent/consumable/sodiumchloride = 1, /obj/item/weapon/reagent_containers/food/snacks/spidereggs = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet/spider = 2 + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/spidereggsham @@ -82,7 +82,7 @@ name = "Corned beef" reqs = list( /datum/reagent/consumable/sodiumchloride = 5, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef @@ -91,25 +91,17 @@ name = "Filet migrawr" reqs = list( /datum/reagent/consumable/ethanol/manly_dorf = 5, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/bear = 1, - /obj/item/weapon/lighter/grayscale + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1, ) + tools = list(/obj/item/weapon/lighter) result = /obj/item/weapon/reagent_containers/food/snacks/bearsteak -/datum/table_recipe/wingfangchu - name = "Wingfangchu" - reqs = list( - /datum/reagent/consumable/soysauce = 5, - /obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno = 2 - ) - result = /obj/item/weapon/reagent_containers/food/snacks/wingfangchu - /datum/table_recipe/enchiladas name = "Enchiladas" reqs = list( - /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2, /obj/item/weapon/reagent_containers/food/snacks/grown/chili = 2, - /obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1 + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas @@ -126,6 +118,6 @@ name = "Sausage" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/faggot = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2 + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/sausage diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm index f185b8e5cba..77389e00239 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm @@ -50,7 +50,7 @@ /obj/item/weapon/reagent_containers/food/snacks/friedegg = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1, ) - result = /obj/item/weapon/reagent_containers/food/snacks/wrap + result = /obj/item/weapon/reagent_containers/food/snacks/eggwrap /datum/table_recipe/beans name = "Beans" @@ -103,3 +103,115 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/twobread +/datum/table_recipe/burrito + name ="Burrito" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 2 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/burrito + +/datum/table_recipe/cheesyburrito + name ="Cheesy burrito" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2, + /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cheesyburrito + +/datum/table_recipe/carneburrito + name ="Carne de asada burrito" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2, + /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/carneburrito + +/datum/table_recipe/fuegoburrito + name ="Fuego plasma burrito" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,, + /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili = 2, + /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito + +/datum/table_recipe/melonfruitbowl + name ="Melon fruit bowl" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl + +/datum/table_recipe/spacefreezy + name ="Space freezy" + reqs = list( + /datum/reagent/consumable/bluecherryjelly = 5, + /datum/reagent/consumable/spacemountainwind = 15, + /obj/item/weapon/reagent_containers/food/snacks/icecream = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/spacefreezy + +/datum/table_recipe/sundae + name ="Sundae" + reqs = list( + /datum/reagent/consumable/cream = 5, + /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, + /obj/item/weapon/reagent_containers/food/snacks/icecream = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sundae + +/datum/table_recipe/honkdae + name ="Honkdae" + reqs = list( + /datum/reagent/consumable/cream = 5, + /obj/item/clothing/mask/gas/clown_hat = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 2, + /obj/item/weapon/reagent_containers/food/snacks/icecream = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/honkdae + +/datum/table_recipe/nachos + name ="Nachos" + reqs = list( + /datum/reagent/consumable/sodiumchloride = 1, + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/nachos + +/datum/table_recipe/cheesynachos + name ="Cheesy nachos" + reqs = list( + /datum/reagent/consumable/sodiumchloride = 1, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cheesynachos + +/datum/table_recipe/cubannachos + name ="Cuban nachos" + reqs = list( + /datum/reagent/consumable/ketchup = 5, + /obj/item/weapon/reagent_containers/food/snacks/grown/chili = 2, + /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cubannachos + +/datum/table_recipe/melonkeg + name ="Melon keg" + reqs = list( + /datum/reagent/consumable/ethanol/vodka = 25, + /obj/item/weapon/reagent_containers/food/snacks/grown/holymelon = 1, + /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 1 + ) + parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 1) + result = /obj/item/weapon/reagent_containers/food/snacks/melonkeg \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm index aba37404d2f..7742687f49c 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm @@ -68,7 +68,7 @@ name = "Soylent green" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2, - /obj/item/weapon/reagent_containers/food/snacks/meat/human = 2 + /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human = 2 ) result = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen @@ -210,3 +210,36 @@ /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/chococornet + +/datum/table_recipe/oatmealcookie + name = "Oatmeal cookie" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/oatmealcookie + +/datum/table_recipe/raisincookie + name = "Raisin cookie" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1, + /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/raisincookie + +/datum/table_recipe/cherrycupcake + name = "Cherry cupcake" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cherrycupcake + +/datum/table_recipe/bluecherrycupcake + name = "Blue cherry cupcake" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm index 56bd20f6b4b..ea19ac642bc 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm @@ -18,7 +18,7 @@ /datum/reagent/consumable/blackpepper = 1, /datum/reagent/consumable/sodiumchloride = 1, /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1 + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/meatpie @@ -34,7 +34,7 @@ name = "Xeno pie" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno = 1 + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/xemeatpie @@ -59,7 +59,7 @@ reqs = list( /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/berries = 1, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak/bear = 1 + /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/bearypie @@ -95,7 +95,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 1 ) - result = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpie + result = /obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie /datum/table_recipe/goldenappletart name = "Golden apple tart" @@ -107,3 +107,29 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/pie/appletart +/datum/table_recipe/blumpkinpie + name = "Blumpkin pie" + reqs = list( + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie + +/datum/table_recipe/dulcedebatata + name = "Dulce de batata" + reqs = list( + /datum/reagent/consumable/vanilla = 5, + /datum/reagent/water = 5, + /obj/item/weapon/reagent_containers/food/snacks/grown/sweetpotato = 2 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata + +/datum/table_recipe/frostypie + name = "Frosty pie" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/pie/frostypie \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm index ea7273b4514..66702272f7b 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm @@ -16,11 +16,11 @@ name = "Meat pizza" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet = 4, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 4, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) - result = /obj/item/weapon/reagent_containers/food/snacks/pizza/meatpizza + result = /obj/item/weapon/reagent_containers/food/snacks/pizza/meat /datum/table_recipe/mushroompizza name = "Mushroom pizza" @@ -28,7 +28,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom = 5 ) - result = /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroompizza + result = /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom /datum/table_recipe/vegetablepizza name = "Vegetable pizza" @@ -39,6 +39,34 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) - result = /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetablepizza + result = /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable +/datum/table_recipe/donpocketpizza + name = "Donkpocket pizza" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1, + /obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm = 3, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket +/datum/table_recipe/dankpizza + name = "Dank pizza" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/pizza/dank + +/datum/table_recipe/sassysagepizza + name = "Sassysage pizza" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1, + /obj/item/weapon/reagent_containers/food/snacks/faggot = 3, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/pizza/sassysage \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm index 3121f865b81..900b636be07 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm @@ -42,3 +42,74 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/monkeysdelight + +/datum/table_recipe/oatmeal + name = "Oatmeal" + reqs = list( + /datum/reagent/consumable/milk = 10, + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal + +/datum/table_recipe/fruitsalad + name = "Fruit salad" + reqs = list( + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = 1, + /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = 2 + + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salad/fruit + +/datum/table_recipe/junglesalad + name = "Jungle salad" + reqs = list( + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 2, + /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = 2 + + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salad/jungle + +/datum/table_recipe/citrusdelight + name = "Citrus delight" + reqs = list( + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1 + + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight + +/datum/table_recipe/ricepork + name = "Rice and pork" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepork + +/datum/table_recipe/eggbowl + name = "Egg bowl" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1, + /obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl + +/datum/table_recipe/ricepudding + name = "Rice pudding" + reqs = list( + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepudding diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm index 57e1a1f6614..e95748af722 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm @@ -10,7 +10,7 @@ name = "Sandwich" reqs = list( /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2, - /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 1, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1 ) result = /obj/item/weapon/reagent_containers/food/snacks/sandwich diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm index dbbb2233035..b6e16173562 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm @@ -37,6 +37,15 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/nettle +/datum/table_recipe/wingfangchu + name = "Wingfangchu" + reqs = list( + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /datum/reagent/consumable/soysauce = 5, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 2 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu + /datum/table_recipe/wishsoup name = "Wish soup" reqs = list( @@ -49,7 +58,7 @@ name = "Hot chili" reqs = list( /obj/item/weapon/reagent_containers/glass/bowl = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2, /obj/item/weapon/reagent_containers/food/snacks/grown/chili = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) @@ -59,7 +68,7 @@ name = "Cold chili" reqs = list( /obj/item/weapon/reagent_containers/glass/bowl = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2, /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1 ) @@ -150,7 +159,7 @@ /datum/reagent/water = 10, /obj/item/weapon/reagent_containers/glass/bowl = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1, - /obj/item/weapon/reagent_containers/food/snacks/cutlet = 3, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 3, /obj/item/weapon/reagent_containers/food/snacks/grown/potato = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant = 1, @@ -176,5 +185,22 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/soup/amanitajelly +/datum/table_recipe/sweetpotatosoup + name = "Sweet potato soup" + reqs = list( + /datum/reagent/water = 10, + /datum/reagent/consumable/sugar = 5, + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/sweetpotato = 2 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato - +/datum/table_recipe/redbeetsoup + name = "Red beet soup" + reqs = list( + /datum/reagent/water = 10, + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/redbeet = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/soup/beet/red diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm index c33b2cd7a5b..a23c2b09c2d 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm @@ -34,4 +34,22 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/spesslaw +/datum/table_recipe/beefnoodle + name = "Beef noodle" + reqs = list( + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/beefnoodle +/datum/table_recipe/chowmein + name = "Chowmein" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1, + /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 2, + /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/chowmein \ No newline at end of file diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index d6cfdca9759..36c20650400 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -44,7 +44,7 @@ speak_emote = list("sniffles","twitches") emote_hear = list("hops.") emote_see = list("hops around","bounces up and down") - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab egg_type = /obj/item/weapon/reagent_containers/food/snacks/egg/loaded food_type = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot meat_amount = 1 diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm index 1f74c911de0..5f83a701ac6 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween.dm @@ -279,11 +279,11 @@ /mob/living/simple_animal/hostile/retaliate/clown/insane/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O,/obj/item/weapon/nullrod)) if(prob(5)) - visible_message("[src] finally found the peace it deserves. You hear honks echoing off into the distance.") + visible_message("[src] finally found the peace it deserves. You hear honks echoing off into the distance.") playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) qdel(src) else - visible_message("[src] seems to be resisting the effect!") + visible_message("[src] seems to be resisting the effect!") else ..() diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 50190ce4e67..4aa5c710d8f 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -71,6 +71,15 @@ begin_month = FEBRUARY end_day = 15 //1 day extra + +/datum/holiday/birthday + name = "Birthday of Space Station 13" + begin_day = 16 + begin_month = FEBRUARY + +/datum/holiday/birthday/greet() + return "Say 'Happy Birthday' to Space Station 13, first publicly playable on February 16th, 2003!" + /datum/holiday/random_kindness name = "Random Acts of Kindness Day" begin_day = 17 @@ -93,7 +102,7 @@ name = APRIL_FOOLS begin_day = 1 begin_month = APRIL - end_day = 8 //7 days extra so everyone can enjoy the festivities + end_day = 2 //1 day extra only because this shit just gets annoying fast /datum/holiday/fourtwenty name = "Four-Twenty" diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 3c4002b026b..41d7dedaaa5 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -82,7 +82,7 @@ else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) - user << "You cannot put this in [src.name]" + user << "You cannot put this in [src.name]!" else var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 51a9e433c6f..75e14801e91 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -204,7 +204,7 @@ qdel(src) return else - user << "You need five lengths of cable to make a potato battery." + user << "You need five lengths of cable to make a potato battery!" return @@ -466,6 +466,8 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/holymelon/add_juice() if(..()) + reagents.add_reagent("nutriment", 1 + round((potency / 15), 1)) + reagents.add_reagent("vitamin", 1 + round((potency / 25), 1)) reagents.add_reagent("holywater", 1 + round((potency / 6), 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) @@ -493,7 +495,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin seed = /obj/item/seeds/blumpkinseed name = "blumpkin" - desc = "When you're making a mess this blumpkin's there to clean you up." + desc = "The pumpkin's toxic sibling." icon_state = "blumpkin" filling_color = "#87CEFA" @@ -804,7 +806,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice() /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/proc/squish(atom/target) new splat(src.loc) - src.visible_message("The [src.name] has been squashed.","You hear a smack.") + src.visible_message("The [src.name] has been squashed.","You hear a smack.") for(var/atom/A in get_turf(target)) src.reagents.reaction(A) @@ -832,7 +834,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice() /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user as mob) if(awakening || istype(user.loc,/turf/space)) return - user << "You begin to awaken the Killer Tomato." + user << "You begin to awaken the Killer Tomato..." awakening = 1 spawn(30) @@ -896,7 +898,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice() /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace/attack_self(var/mob/user) squish(user) user.drop_item() - src.visible_message("[user] squashes the [src.name].","You hear a smack.") + src.visible_message("[user] squashes the [src.name].","You hear a smack.") qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace/squish(atom/squishee) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index f3993846124..0de365ecdfc 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -75,7 +75,7 @@ if(ST != plank && istype(ST, plank_type) && ST.amount < ST.max_amount) ST.attackby(plank, user) //we try to transfer all old unfinished stacks to the new stack we created. if(plank.amount > old_plank_amount) - user << "You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name]." + user << "You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name]." qdel(src) if(is_type_in_list(W,accepted)) @@ -89,7 +89,7 @@ qdel(src) return else - usr << " You must dry this first." + usr << " You must dry this first!" /obj/item/weapon/grown/log/steel seed = /obj/item/seeds/steelmycelium @@ -152,7 +152,7 @@ if(endurance > 0) endurance -= rand(1, (endurance / 3) + 1) else - usr << "All the petals have fallen off the [name] from violent whacking." + usr << "All the petals have fallen off the [name] from violent whacking!" usr.unEquip(src) qdel(src) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index d3a74ed88be..361fe6843b0 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -586,7 +586,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe)) var/obj/item/weapon/reagent_containers/syringe/syr = reagent_source if(syr.mode != 1) - user << "You can't get any extract out of this plant." //That. Gives me an idea... + user << "You can't get any extract out of this plant." //That. Gives me an idea... return if(!reagent_source.reagents.total_volume) @@ -650,7 +650,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p else if(istype(O, /obj/item/seeds/)) if(!planted) user.unEquip(O) - user << "You plant [O]." + user << "You plant [O]." dead = 0 myseed = O planted = 1 @@ -692,11 +692,11 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p else if(istype(O, /obj/item/weapon/minihoe)) if(weedlevel > 0) - user.visible_message("[user] uproots the weeds.", "You remove the weeds from [src].") + user.visible_message("[user] uproots the weeds.", "You remove the weeds from [src].") weedlevel = 0 update_icon() else - user << "This plot is completely devoid of weeds. It doesn't need uprooting." + user << "This plot is completely devoid of weeds! It doesn't need uprooting." else if(istype(O, /obj/item/weapon/storage/bag/plants)) attack_hand(user) @@ -708,28 +708,28 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p else if(istype(O, /obj/item/weapon/wrench) && unwrenchable) if(anchored == 2) - user << "Unscrew the hoses first!" + user << "Unscrew the hoses first!" return if(!anchored && !isinspace()) - user.visible_message("[user] begins to wrench [src] into place.", \ - "You begin to wrench [src] in place.") + user.visible_message("[user] begins to wrench [src] into place.", \ + "You begin to wrench [src] in place...") playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if (do_after(user, 20)) if(anchored) return anchored = 1 - user.visible_message("[user] wrenches [src] into place.", \ + user.visible_message("[user] wrenches [src] into place.", \ "You wrench [src] in place.") else if(anchored) - user.visible_message("[user] begins to unwrench [src].", \ - "You begin to unwrench [src].") + user.visible_message("[user] begins to unwrench [src].", \ + "You begin to unwrench [src]...") playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if (do_after(user, 20)) if(!anchored) return anchored = 0 - user.visible_message("[user] unwrenches [src].", \ + user.visible_message("[user] unwrenches [src].", \ "You unwrench [src].") else if(istype(O, /obj/item/weapon/screwdriver) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY @@ -737,12 +737,12 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p if(anchored == 2) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) anchored = 1 - user << "You unscrew \the [src]'s hoses." + user << "You unscrew \the [src]'s hoses." else if(anchored == 1) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) anchored = 2 - user << "You screw in \the [src]'s hoses." + user << "You screw in \the [src]'s hoses." for(var/obj/machinery/hydroponics/h in range(1,src)) spawn() @@ -758,7 +758,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p else if(dead) planted = 0 dead = 0 - user << "You remove the dead plant from [src]." + user << "You remove the dead plant from [src]." qdel(myseed) update_icon() else @@ -870,11 +870,11 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p harvest = 0 lastproduce = age if(istype(myseed,/obj/item/seeds/replicapod/)) - user << "You harvest from the [myseed.plantname]." + user << "You harvest from the [myseed.plantname]." else if(myseed.getYield() <= 0) - user << "You fail to harvest anything useful." + user << "You fail to harvest anything useful!" else - user << "You harvest [myseed.getYield()] items from the [myseed.plantname]." + user << "You harvest [myseed.getYield()] items from the [myseed.plantname]." if(myseed.oneharvest) qdel(myseed) planted = 0 @@ -986,5 +986,5 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p /obj/machinery/hydroponics/soil/attackby(var/obj/item/O as obj, var/mob/user as mob, params) ..() if(istype(O, /obj/item/weapon/shovel)) - user << "You clear up [src]!" + user << "You clear up [src]!" qdel(src) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 24c611329c0..d3b7b030ea4 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -71,7 +71,7 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob return if(!user.drop_item()) //couldn't drop the item - user << "\The [O] is stuck to your hand, you cannot put it in the seed extractor!" + user << "\The [O] is stuck to your hand, you cannot put it in the seed extractor!" return if(O && O.loc) @@ -86,7 +86,7 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob updateUsrDialog() return else - user << "You can't extract any seeds from \the [O.name]." + user << "You can't extract any seeds from \the [O.name]!" datum/seed_pile var/name = "" @@ -171,7 +171,7 @@ obj/machinery/seed_extractor/proc/add(var/obj/item/seeds/O as obj) if(istype(O.loc,/mob)) var/mob/M = O.loc if(!M.unEquip(O)) - usr << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + usr << "\the [O] is stuck to your hand, you cannot put it in \the [src]!" return else if(istype(O.loc,/obj/item/weapon/storage)) var/obj/item/weapon/storage/S = O.loc diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 56c309a95fc..3d63316edaa 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -107,12 +107,12 @@ mutant_color = bloodSample.data["mutant_color"] factions = bloodSample.data["factions"] W.reagents.clear_reagents() - user << "You inject the contents of the syringe into the seeds." + user << "You inject the contents of the syringe into the seeds." contains_sample = 1 else - user << "The seeds reject the sample!" + user << "The seeds reject the sample!" else - user << "The seeds already contain a genetic sample." + user << "The seeds already contain a genetic sample!" ..() diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 1e5aa530242..1b0fc3f450d 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -81,7 +81,7 @@ name = ("bookcase ([sanitize(newname)])") else if(istype(I, /obj/item/weapon/crowbar)) if(contents.len) - user << "You need to remove the books first." + user << "You need to remove the books first!" else playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) user << "You pry the shelf out." @@ -191,7 +191,7 @@ if(is_blind(user)) return if(unique) - user << "These pages don't seem to take the ink well. Looks like you can't modify it." + user << "These pages don't seem to take the ink well! Looks like you can't modify it." return var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel") switch(choice) @@ -251,7 +251,7 @@ user << "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'" else if(istype(I, /obj/item/weapon/kitchenknife) || istype(I, /obj/item/weapon/wirecutters)) - user << "You begin to carve out [title]." + user << "You begin to carve out [title]..." if(do_after(user, 30)) user << "You carve out the pages from [title]! You didn't want to read it anyway." var/obj/item/weapon/storage/book/B = new diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm new file mode 100644 index 00000000000..7c7eb7264a5 --- /dev/null +++ b/code/modules/lighting/lighting_system.dm @@ -0,0 +1,382 @@ +/* + This is /tg/'s 'newer' lighting system. It's basically a combination of Forum_Account's and ShadowDarke's + respective lighting libraries heavily modified by Carnwennan for /tg/station with further edits by + MrPerson. Credits, where due, to them. + + Originally, like all other lighting libraries on BYOND, we used areas to render different hard-coded light levels. + The idea was that this was cheaper than using objects. Well as it turns out, the cost of the system is primarily from the + massive loops the system has to run, not from the areas or objects actually doing any work. Thus the newer system uses objects + so we can have more lighting states and smooth transitions between them. + + This is a queueing system. Everytime we call a change to opacity or luminosity throwgh SetOpacity() or SetLuminosity(), + we are simply updating variables and scheduling certain lights/turfs for an update. Actual updates are handled + periodically by the SSlighting subsystem. Specifically, it runs check() on every light datum that ran changed(). + Then it runs redraw_lighting() on every turf that ran update_lumcount(). + + Unlike our older system, there are hardcoded maximum luminosities (different for certain atoms). + This is to cap the cost of creating lighting effects. + (without this, an atom with luminosity of 20 would have to update 41^2 turfs!) :s + + Each light remembers the effect it casts on each turf. It reduces cost of removing lighting effects by a lot! + + Known Issues/TODO: + Shuttles still do not have support for dynamic lighting (I hope to fix this at some point) -probably trivial now + No directional lighting support. (prototype looked ugly) + Allow lights to be weaker than 'cap' radius + Colored lights +*/ + +#define LIGHTING_CIRCULAR 1 //comment this out to use old square lighting effects. +#define LIGHTING_LAYER 15 //Drawing layer for lighting +#define LIGHTING_CAP 10 //The lumcount level at which alpha is 0 and we're fully lit. +#define LIGHTING_CAP_FRAC (255/LIGHTING_CAP) //A precal'd variable we'll use in turf/redraw_lighting() +#define LIGHTING_ICON 'icons/effects/alphacolors.dmi' +#define LIGHTING_ICON_STATE "white" +#define LIGHTING_TIME 1.2 //Time to do any lighting change. Actual number pulled out of my ass +#define LIGHTING_DARKEST_VISIBLE_ALPHA 230 //Anything darker than this is so dark, we'll just consider the whole tile unlit + +/datum/light_source + var/atom/owner + var/radius = 0 + var/changed = 1 + var/list/effect = list() + var/__x = 0 //x coordinate at last update + var/__y = 0 //y coordinate at last update + +/datum/light_source/New(atom/A) + if(!istype(A)) + CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.") + ..() + owner = A + radius = A.luminosity + __x = owner.x + __y = owner.y + SSlighting.changed_lights |= src + +/datum/light_source/Destroy() + if(owner && owner.light == src) + remove_effect() + owner.light = null + owner = null + return ..() + +//Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one +/datum/light_source/proc/check() + if(!owner) + remove_effect() + return 0 + + if(changed) + changed = 0 + remove_effect() + return add_effect() + + return 1 + +//Tell the lighting subsystem to check() next fire +/datum/light_source/proc/changed() + if(owner) + __x = owner.x + __y = owner.y + if(!changed) + changed = 1 + SSlighting.changed_lights |= src + +//Remove current effect +/datum/light_source/proc/remove_effect(). + for(var/turf/T in effect) + T.update_lumcount(-effect[T]) + + if(T.affecting_lights && T.affecting_lights.len) + T.affecting_lights -= src + + effect.Cut() + +//Apply a new effect +/datum/light_source/proc/add_effect() + // only do this if the light is turned on and is on the map + if(owner && owner.loc && radius > 0) + effect = list() + var/turf/To = get_turf(owner) + var/range = owner.get_light_range(radius) + for(var/atom/movable/AM in To) + if(AM == owner) + continue + if(AM.opacity) + range = 0 + break + + for(var/turf/T in view(range, To)) + var/delta_lumcount = T.lumen(src) + if(delta_lumcount > 0) + effect[T] = delta_lumcount + T.update_lumcount(delta_lumcount) + + if(!T.affecting_lights) + T.affecting_lights = list() + T.affecting_lights |= src + + return 1 + else + return 0 + +//How much light light_source L should apply to src +/turf/proc/lumen(datum/light_source/L) + var/distance = 0 +#ifdef LIGHTING_CIRCULAR + distance = cheap_hypotenuse(x, y, L.__x, L.__y) +#else + distance = max(abs(x - L.__x), abs(y - L.__y)) +#endif + return LIGHTING_CAP * (L.radius - distance) / L.radius +//LIGHTING_CAP == strength for now + + +/atom + var/datum/light_source/light + + +//Turfs with opacity when they are constructed will trigger nearby lights to update +//Turfs and atoms with luminosity when they are constructed will create a light_source automatically +/turf/New() + ..() + if(luminosity) + light = new(src) +// luminosity = 0 + +//Movable atoms with opacity when they are constructed will trigger nearby lights to update +//Movable atoms with luminosity when they are constructed will create a light_source automatically +/atom/movable/New() + ..() + if(opacity) + UpdateAffectingLights() + if(luminosity) + light = new(src) +// luminosity = 0 + +//Objects with opacity will trigger nearby lights to update at next SSlighting fire +/atom/movable/Destroy() + qdel(light) + if(opacity) + UpdateAffectingLights() + return ..() + +//Objects with opacity will trigger nearby lights of the old location to update at next SSlighting fire +/atom/movable/Moved(atom/OldLoc, Dir) + if(isturf(loc)) + if(opacity) + OldLoc.UpdateAffectingLights() + else + if(light) + light.changed() + return ..() + +//Sets our luminosity. +//If we have no light it will create one. +//If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its +//queues are complete. +//if we have a light already it is merely updated, rather than making a new one. +/atom/proc/SetLuminosity(new_luminosity) + if(new_luminosity < 0) + new_luminosity = 0 + + if(!light) + if(!new_luminosity) + return + light = new(src) + else + if(light.radius == new_luminosity) + return + light.radius = new_luminosity + luminosity = new_luminosity + light.changed() + +/atom/proc/AddLuminosity(delta_luminosity) + if(light) + SetLuminosity(light.radius + delta_luminosity) + else + SetLuminosity(delta_luminosity) + +/area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas + luminosity = !!new_luminosity + + +//change our opacity (defaults to toggle), and then update all lights that affect us. +/atom/proc/SetOpacity(new_opacity) + if(new_opacity == null) + new_opacity = !opacity //default = toggle opacity + else if(opacity == new_opacity) + return 0 //opacity hasn't changed! don't bother doing anything + opacity = new_opacity //update opacity, the below procs now call light updates. + UpdateAffectingLights() + return 1 + +/atom/movable/light + icon = LIGHTING_ICON + icon_state = LIGHTING_ICON_STATE + layer = LIGHTING_LAYER + mouse_opacity = 0 + blend_mode = BLEND_OVERLAY + invisibility = INVISIBILITY_LIGHTING + color = "#000" + luminosity = 0 + infra_luminosity = 1 + anchored = 1 + +/atom/movable/light/Destroy() + return 1 + +/atom/movable/light/Move() + return 0 + +/turf + var/lighting_lumcount = 0 + var/lighting_changed = 0 + var/atom/movable/light/lighting_object //Will be null for space turfs and anything in a static lighting area + var/list/affecting_lights //not initialised until used (even empty lists reserve a fair bit of memory) + +/turf/ChangeTurf(var/path) + if(!path || path == type) //Sucks this is here but it would cause problems otherwise. + return ..() + + for(var/obj/effect/decal/cleanable/decal in src.contents) + qdel(decal) + + if(light) + qdel(light) + + var/old_lumcount = lighting_lumcount - initial(lighting_lumcount) + + var/list/our_lights //reset affecting_lights if needed + if(opacity != initial(path:opacity) && old_lumcount) + UpdateAffectingLights() + + if(affecting_lights) + our_lights = affecting_lights.Copy() + + . = ..() //At this point the turf has changed + + affecting_lights = our_lights + + lighting_changed = 1 //Don't add ourself to SSlighting.changed_turfs + update_lumcount(old_lumcount) + lighting_object = locate() in src + init_lighting() + + for(var/turf/space/S in orange(src,1)) + S.update_starlight() + +/turf/proc/update_lumcount(amount) + lighting_lumcount += amount + if(!lighting_changed) + SSlighting.changed_turfs += src + lighting_changed = 1 + +/turf/space/update_lumcount(amount) //Keep track in case the turf becomes a floor at some point, but don't process. + lighting_lumcount += amount + +/turf/proc/init_lighting() + var/area/A = loc + if(!A.lighting_use_dynamic || istype(src, /turf/space)) + lighting_changed = 0 + if(lighting_object) + lighting_object.alpha = 0 + lighting_object = null + else + if(!lighting_object) + lighting_object = new (src) + redraw_lighting(1) + +/turf/space/init_lighting() + . = ..() + if(config.starlight) + update_starlight() + +/turf/proc/redraw_lighting(var/instantly = 0) + if(lighting_object) + var/newalpha + if(lighting_lumcount <= 0) + newalpha = 255 + else + lighting_object.luminosity = 1 + if(lighting_lumcount < LIGHTING_CAP) + var/num = Clamp(lighting_lumcount * LIGHTING_CAP_FRAC, 0, 255) + newalpha = 255-num + else //if(lighting_lumcount >= LIGHTING_CAP) + newalpha = 0 + + if(lighting_object.alpha != newalpha) + var/change_time = LIGHTING_TIME + if(instantly) + change_time = 0 + animate(lighting_object, alpha = newalpha, time = change_time) + if(newalpha >= LIGHTING_DARKEST_VISIBLE_ALPHA) //Doesn't actually make it darker or anything, just tells byond you can't see the tile + animate(luminosity = 0, time = 0) + + lighting_changed = 0 + +/area + var/lighting_use_dynamic = 1 //Turn this flag off to make the area fullbright + +/area/New() + . = ..() + if(!lighting_use_dynamic) + luminosity = 1 + +/area/proc/SetDynamicLighting() + lighting_use_dynamic = 1 + luminosity = 0 + for(var/turf/T in src.contents) + T.init_lighting() + T.update_lumcount(0) + +#undef LIGHTING_LAYER +#undef LIGHTING_CIRCULAR +#undef LIGHTING_ICON +#undef LIGHTING_ICON_STATE +#undef LIGHTING_TIME +#undef LIGHTING_CAP +#undef LIGHTING_CAP_FRAC +#undef LIGHTING_DARKEST_VISIBLE_ALPHA + + +//set the changed status of all lights which could have possibly lit this atom. +//We don't need to worry about lights which lit us but moved away, since they will have change status set already +//This proc can cause lots of lights to be updated. :( +/atom/proc/UpdateAffectingLights() + +/atom/movable/UpdateAffectingLights() + if(isturf(loc)) + loc.UpdateAffectingLights() + +/turf/UpdateAffectingLights() + if(affecting_lights) + for(var/datum/light_source/thing in affecting_lights) + thing.changed() //force it to update at next process() + + +#define LIGHTING_MAX_LUMINOSITY_STATIC 8 //Maximum luminosity to reduce lag. +#define LIGHTING_MAX_LUMINOSITY_MOBILE 5 //Moving objects have a lower max luminosity since these update more often. (lag reduction) +#define LIGHTING_MAX_LUMINOSITY_MOB 5 +#define LIGHTING_MAX_LUMINOSITY_TURF 8 //turfs are static too, why was this 1?! + +//caps luminosity effects max-range based on what type the light's owner is. +/atom/proc/get_light_range(radius) + return min(radius, LIGHTING_MAX_LUMINOSITY_STATIC) + +/atom/movable/get_light_range(radius) + return min(radius, LIGHTING_MAX_LUMINOSITY_MOBILE) + +/mob/get_light_range(radius) + return min(radius, LIGHTING_MAX_LUMINOSITY_MOB) + +/obj/machinery/light/get_light_range(radius) + return min(radius, LIGHTING_MAX_LUMINOSITY_STATIC) + +/turf/get_light_range(radius) + return min(radius, LIGHTING_MAX_LUMINOSITY_TURF) + +#undef LIGHTING_MAX_LUMINOSITY_STATIC +#undef LIGHTING_MAX_LUMINOSITY_MOBILE +#undef LIGHTING_MAX_LUMINOSITY_MOB +#undef LIGHTING_MAX_LUMINOSITY_TURF diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 283110de387..13bc4ca5951 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -244,7 +244,6 @@ 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("Plasma Cutter", /obj/item/weapon/gun/energy/plasmacutter/charged, 950), new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 1200), new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 1500), @@ -345,7 +344,7 @@ ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/weapon/mining_voucher/voucher, mob/redeemer) - var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Mining Drill", "Kinetic Accelerator", "Plasma Cutter", "Resonator", "Mining Drone", "Advanced Scanner") + var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Mining Drill", "Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner") if(!selection || !Adjacent(redeemer) || voucher.gc_destroyed || voucher.loc != redeemer) return switch(selection) @@ -354,12 +353,8 @@ new /obj/item/weapon/stock_parts/cell/high(src.loc) if("Kinetic Accelerator") new /obj/item/weapon/gun/energy/kinetic_accelerator(src.loc) - new /obj/item/weapon/screwdriver(src.loc) - if("Plasma Cutter") - new /obj/item/weapon/gun/energy/plasmacutter/charged(src.loc) if("Resonator") new /obj/item/weapon/resonator(src.loc) - new /obj/item/weapon/screwdriver(src.loc) if("Mining Drone") new /mob/living/simple_animal/hostile/mining_drone(src.loc) new /obj/item/weapon/weldingtool/hugetank(src.loc) @@ -486,36 +481,23 @@ var/fieldlimit = 3 /obj/item/weapon/resonator/proc/CreateResonance(var/target, var/creator) + var/turf/T = get_turf(target) + if(locate(/obj/effect/resonance) in T) + return if(fieldsactive < fieldlimit) playsound(src,'sound/weapons/resonator_fire.ogg',50,1) - new /obj/effect/resonance(get_turf(target), creator, burst_time) + new /obj/effect/resonance(T, creator, burst_time) fieldsactive++ - spawn(50) + spawn(burst_time) fieldsactive-- /obj/item/weapon/resonator/attack_self(mob/user as mob) - CreateResonance(src, user) - ..() - -/obj/item/weapon/resonator/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/screwdriver)) - if(burst_time == 50) - burst_time = 30 - user << "You set the resonator's fields to detonate after 3 seconds." - else - burst_time = 50 - user << "You set the resonator's fields to detonate after 5 seconds." - - else if(istype(W, /obj/item/stack)) - var/obj/item/stack/S = W - - if(istype(S, /obj/item/stack/sheet/mineral/diamond)) - if(fieldlimit < 8) - fieldlimit++ - user << "You upgrade [src]'s field generator with diamonds." - S.use(1) - else - user << "The [src.name]'s field generator is at the limit." + if(burst_time == 50) + burst_time = 30 + user << "You set the resonator's fields to detonate after 3 seconds." + else + burst_time = 50 + user << "You set the resonator's fields to detonate after 5 seconds." /obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag) @@ -574,7 +556,7 @@ /**********************Mining drone**********************/ -/mob/living/simple_animal/hostile/mining_drone/ +/mob/living/simple_animal/hostile/mining_drone name = "nanotrasen minebot" desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder." icon = 'icons/obj/aibots.dmi' @@ -604,6 +586,7 @@ ranged_cooldown_cap = 3 projectiletype = /obj/item/projectile/kinetic projectilesound = 'sound/weapons/Gunshot4.ogg' + speak_emote = list("states") wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, /obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron, /obj/item/weapon/ore/bananium) @@ -774,23 +757,10 @@ cooldown = 1 spawn(40) cooldown = 0 - var/client/C = user.client - var/list/L = list() - var/turf/simulated/mineral/M - for(M in range(7, user)) - if(M.scan_state) - L += M - if(!L.len) - user << "[src] reports that nothing was detected nearby." - return - else - for(M in L) - var/turf/T = get_turf(M) - var/image/I = image('icons/turf/mining.dmi', loc = T, icon_state = M.scan_state, layer = 18) - C.images += I - spawn(30) - if(C) - C.images -= I + var/list/mobs = list() + mobs |= user + mineral_scan_pulse(mobs, get_turf(user)) + //Debug item to identify all ore spread quickly /obj/item/device/mining_scanner/admin @@ -820,22 +790,24 @@ var/list/mobs = recursive_mob_check(t, 1,0,0) if(!mobs.len) return - var/list/L = list() - var/turf/simulated/mineral/M - for(M in range(7, t)) - if(M.scan_state) - L += M - if(L.len) - for(var/mob/user in mobs) - if(user.client) - var/client/C = user.client - for(M in L) - var/turf/T = get_turf(M) - var/image/I = image('icons/turf/mining.dmi', loc = T, icon_state = M.scan_state, layer = 18) - C.images += I - spawn(30) - if(C) - C.images -= I + mineral_scan_pulse(mobs, t) + +/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view) + var/list/minerals = list() + for(var/turf/simulated/mineral/M in range(range, T)) + if(M.scan_state) + minerals += M + if(minerals.len) + for(var/mob/user in mobs) + if(user.client) + var/client/C = user.client + for(var/turf/simulated/mineral/M in minerals) + var/turf/F = get_turf(M) + var/image/I = image('icons/turf/mining.dmi', loc = F, icon_state = M.scan_state, layer = 18) + C.images += I + spawn(30) + if(C) + C.images -= I /**********************Xeno Warning Sign**********************/ /obj/structure/sign/xeno_warning_mining diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index 5588b29e662..7f0992a502f 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -20,10 +20,10 @@ if(href_list["move"]) var/obj/docking_port/mobile/M = SSshuttle.getShuttle("laborcamp") if(!M) - usr << "Cannot locate shuttle." + usr << "Cannot locate shuttle!" return 0 var/obj/docking_port/stationary/S = M.get_docked() if(S && S.name == "laborcamp_away") - usr << "Shuttle is already at the outpost." + usr << "Shuttle is already at the outpost!" return 0 ..() \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 550e282b0ce..e420be8f389 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -79,7 +79,7 @@ hitsound = 'sound/weapons/drill.ogg' origin_tech = "materials=2;powerstorage=3;engineering=2" desc = "An electric mining drill for the especially scrawny." - var/drillcost = 50 //80 mineral walls by default + var/drillcost = 15 //666 mineral walls by default var/obj/item/weapon/stock_parts/cell/high/bcell = null /obj/item/weapon/pickaxe/drill/New() //this one starts with a cell pre-installed. @@ -105,16 +105,18 @@ bcell = W user << "You install a cell in [src]." update_icon() - else if(istype(W, /obj/item/weapon/screwdriver)) - if(bcell) - bcell.updateicon() - bcell.loc = get_turf(src.loc) - bcell = null - user << "You remove the cell from [src]." - update_icon() - return + else ..() - return + +/obj/item/weapon/pickaxe/drill/attack_self(mob/user) + if(bcell) + bcell.updateicon() + bcell.loc = get_turf(src.loc) + bcell = null + user << "You remove the cell from [src]." + update_icon() + else + user << "There is no cell in [src]." /obj/item/weapon/pickaxe/drill/examine(mob/user) ..() @@ -128,6 +130,9 @@ desc = "An integrated electric mining drill." var/warned = 0 +/obj/item/weapon/pickaxe/drill/cyborg/attack_self(mob/user) + return //can't remove the drill's cell + /obj/item/weapon/pickaxe/drill/cyborg/proc/use_robot_power(var/mob/living/silicon/robot/R) if(!bcell.use(drillcost)) if(!warned) @@ -135,28 +140,28 @@ playsound(src, 'sound/weapons/smg_empty_alarm.ogg',50,1) warned = 1 if(!R.cell.use(drillcost)) - R << "You don't have enough charge to drill." + R << "You don't have enough charge to drill!" return 0 return 1 /obj/item/weapon/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" icon_state = "diamonddrill" - digspeed = 8 //it's a fast drill with a relatively low power cost. what more could you ask for? + digspeed = 10 //it's a fast drill with a relatively low power cost. what more could you ask for? origin_tech = "materials=6;powerstorage=4;engineering=5" desc = "Yours is the drill that will pierce the heavens!" - drillcost = 75 //66 mineral walls by default, but very quickly + drillcost = 25 //400 mineral walls by default, but very quickly /obj/item/weapon/pickaxe/drill/jackhammer name = "sonic jackhammer" icon_state = "jackhammer" item_state = "jackhammer" - digspeed = 4 //the epitome of powertools. high power consumption, extremely fast mining, laughs at puny walls + digspeed = 5 //the epitome of powertools. high power consumption, extremely fast mining, laughs at puny walls origin_tech = "materials=3;powerstorage=2;engineering=2" digsound = list('sound/weapons/sonic_jackhammer.ogg') hitsound = 'sound/weapons/sonic_jackhammer.ogg' desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls." - drillcost = 100 + drillcost = 30 //333 mineral walls by default, but very quickly /*****************************Shovel********************************/ @@ -190,4 +195,5 @@ /obj/structure/closet/crate/miningcar desc = "A mining car. This one doesn't work on rails, but has to be dragged." name = "Mining car (not for rails)" - icon_crate = "miningcar" \ No newline at end of file + icon_crate = "miningcar" + icon_state = "miningcar" diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index cdde315c9c5..c8469966af4 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -238,7 +238,7 @@ name = "gibtonite deposit" desc = "An active gibtonite reserve. Run!" stage = 1 - visible_message("There was gibtonite inside! It's going to explode!") + visible_message("There was gibtonite inside! It's going to explode!") var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) @@ -406,7 +406,7 @@ /turf/simulated/mineral/attackby(var/obj/item/weapon/pickaxe/P as obj, mob/user as mob, params) if (!user.IsAdvancedToolUser()) - usr << "You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return if (istype(P, /obj/item/weapon/pickaxe)) @@ -421,13 +421,13 @@ if(!RD.use_robot_power(user)) return else if(!D.bcell.use(D.drillcost)) - user << "Your [D.name] doesn't have enough charge." + user << "Your [D.name] doesn't have enough charge!" return if(last_act+P.digspeed > world.time)//prevents message spam return last_act = world.time - user << "You start picking." + user << "You start picking..." P.playDigSound() if(do_after(user,P.digspeed)) @@ -544,15 +544,15 @@ return if (dug) - user << "This area has already been dug." + user << "This area has already been dug!" return - user << "You start digging." + user << "You start digging..." playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE sleep(20) if ((user.loc == T && user.get_active_hand() == W)) - user << "You dug a hole." + user << "You dig a hole." gets_dug() return @@ -563,15 +563,15 @@ return if (dug) - user << "This area has already been dug." + user << "This area has already been dug!" return - user << "You start digging." + user << "You start digging..." playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE sleep(P.digspeed) if ((user.loc == T && user.get_active_hand() == W)) - user << "You dug a hole." + user << "You dig a hole." gets_dug() return diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index eeed29889c6..bf394e7ac21 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -68,7 +68,7 @@ if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = I if(W.welding) - user << "You can't hit a high enough temperature to smelt [src] properly." + user << "You can't hit a high enough temperature to smelt [src] properly!" else ..() @@ -123,7 +123,7 @@ /obj/item/weapon/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params) if(!wires && istype(I, /obj/item/device/assembly/igniter)) - user.visible_message("[user] attaches [I] to [src]!") + user.visible_message("[user] attaches [I] to [src].", "You attach [I] to [src].") wires = new(src) attacher = key_name(user) qdel(I) @@ -141,7 +141,7 @@ if(primed) if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) || istype(I, /obj/item/device/multitool)) primed = 0 - user.visible_message("The chain reaction was stopped! ...The ore's quality went down.") + user.visible_message("The chain reaction was stopped! ...The ore's quality looks diminished.", "You stopped the chain reaction. ...The ore's quality looks diminished.") icon_state = "Gibtonite ore" quality = 1 return @@ -185,7 +185,7 @@ else if(triggered_by == 2) log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [attacher].") else - user.visible_message("[user] strikes \the [src], causing a chain reaction!") + user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.") log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") spawn(det_time) if(primed) @@ -280,12 +280,22 @@ sideslist = list("heads") value = 20 +/obj/item/weapon/coin/antagtoken + name = "antag token" + icon_state = "coin_valid_valid" + cmineral = "valid" + desc = "A novelty coin that helps the heart know what hard evidence cannot prove." + sideslist = list("valid", "salad") + value = 20 + +/obj/item/weapon/coin/antagtoken/New() + return /obj/item/weapon/coin/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(string_attached) - user << "There already is a string attached to this coin." + user << "There already is a string attached to this coin!" return if (CC.use(1)) @@ -293,7 +303,7 @@ string_attached = 1 user << "You attach a string to the coin." else - user << "You need one length of cable to attach a string to the coin." + user << "You need one length of cable to attach a string to the coin!" return else if(istype(W,/obj/item/weapon/wirecutters)) @@ -317,6 +327,6 @@ icon_state = "coin_[cmineral]_[coinflip]" playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1) if(do_after(user, 15)) - user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \ + user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \ "You flip [src]. It lands on [coinflip].", \ - "You hear the clattering of loose change.") \ No newline at end of file + "You hear the clattering of loose change.") \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 850f4d63cf7..56bcf7503cb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -61,9 +61,8 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi verbs -= /mob/dead/observer/verb/possess animate(src, pixel_y = 2, time = 10, loop = -1) - - ..() + /mob/dead/observer/Destroy() if (ghostimage) ghost_darkness_images -= ghostimage @@ -102,7 +101,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return //didn't want to ghost after-all - resting = 1 ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 return @@ -205,7 +203,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(following && following == target) return following = target - src << "Now following [target]" + src << "Now following [target]." spawn(0) var/turf/pos = get_turf(src) while(loc == pos && target && following == target && client) @@ -338,7 +336,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/pointed(atom/A as mob|obj|turf in view()) if(!..()) return 0 - usr.visible_message("[src] points to [A]") + usr.visible_message("[src] points to [A].") return 1 /mob/dead/observer/verb/view_manfiest() @@ -351,6 +349,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src << browse(dat, "window=manifest;size=387x420;can_close=1") +//this is called when a ghost is drag clicked to something. +/mob/dead/observer/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + /mob/dead/observer/Topic(href, href_list) if(href_list["follow"]) var/atom/movable/target = locate(href_list["follow"]) diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 00194761fb7..b23a2d439ec 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -286,6 +286,9 @@ else unEquip(I,TRUE) update_hands = 1 + +/mob/living/carbon/human/interactive/proc/targetRange(var/towhere) + return get_dist(get_turf(towhere), get_turf(src)) /mob/living/carbon/human/interactive/Life() ..() @@ -579,7 +582,7 @@ if((TARGET && (doing & FIGHTING)) || graytide) // this is a redundancy check var/mob/living/M = TARGET if(istype(M,/mob/living)) - if(M in range(FUZZY_CHANCE_LOW,src)) + if(targetRange(M) <= FUZZY_CHANCE_LOW) if(M.health > 1) if(main_hand) if(main_hand.force != 0) @@ -609,14 +612,14 @@ W.attack(TARGET,src) sleep(1) else - if(get_dist(src,TARGET) > 2) + if(targetRange(TARGET) > 2) tryWalk(TARGET) else if(Adjacent(TARGET)) M.attack_hand(src) sleep(1) timeout++ - else if(timeout >= 10 || M.health <= 1 || !(M in range(14,src))) + else if(timeout >= 10 || M.health <= 1 || !(targetRange(M) > 14)) doing = doing & ~FIGHTING timeout = 0 TARGET = null @@ -665,4 +668,4 @@ TRAITS |= TRAIT_DUMB faction = list("bot_grey") graytide = 1 - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 0936e3978f4..0b33449b5ef 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -12,7 +12,6 @@ ventcrawler = 2 languages = ALIEN verb_say = "hisses" - lying_pixel_offset = 0 var/nightvision = 1 var/storedPlasma = 250 var/max_plasma = 500 @@ -28,12 +27,13 @@ var/heat_protection = 0.5 var/leaping = 0 + var/list/obj/effect/proc_holder/alien/abilities = list() /mob/living/carbon/alien/New() verbs += /mob/living/proc/mob_sleep verbs += /mob/living/proc/lay_down internal_organs += new /obj/item/organ/brain/alien - + AddAbility(new/obj/effect/proc_holder/alien/nightvisiontoggle(null)) ..() /mob/living/carbon/alien/adjustToxLoss(amount) @@ -73,22 +73,18 @@ var/loc_temp = get_temperature(environment) - //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Fire protection: [heat_protection] - Location: [loc] - src: [src]" - // Aliens are now weak to fire. //After then, it reacts to the surrounding atmosphere based on your thermal protection if(!on_fire) // If you're on fire, ignore local air temperature if(loc_temp > bodytemperature) //Place is hotter than we are - var/thermal_protection = heat_protection //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + var/thermal_protection = heat_protection //This returns a 0 - 1 value, which corresponds to the percentage of heat protection. if(thermal_protection < 1) bodytemperature += (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR) else bodytemperature += 1 * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR) - // bodytemperature -= max((loc_temp - bodytemperature / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) - // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. if(bodytemperature > 360.15) //Body temperature is too hot. throw_alert("alien_fire") @@ -134,12 +130,12 @@ bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up! return +/mob/living/carbon/alien/reagent_check(var/datum/reagent/R) //can metabolize all reagents + return 0 + /mob/living/carbon/alien/IsAdvancedToolUser() return has_fine_manipulation -/mob/living/carbon/alien/SpeciesCanConsume() - return 1 // Aliens can eat, and they can be fed food/drink - /mob/living/carbon/alien/Stat() ..() @@ -148,6 +144,26 @@ stat(null, "Move Mode: [m_intent]") stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]") + add_abilities_to_panel() + +/mob/living/carbon/alien/proc/AddAbility(var/obj/effect/proc_holder/alien/A) + abilities.Add(A) + A.on_gain(src) + if(A.has_action) + if(!A.action) + A.action = new/datum/action/spell_action/alien + A.action.target = A + A.action.name = A.name + A.action.button_icon = A.action_icon + A.action.button_icon_state = A.action_icon_state + A.action.background_icon_state = A.action_background_icon_state + A.action.Grant(src) + + +/mob/living/carbon/alien/proc/add_abilities_to_panel() + for(var/obj/effect/proc_holder/alien/A in abilities) + statpanel("[A.panel]",A.plasma_cost > 0?"([A.plasma_cost])":"",A) + /mob/living/carbon/alien/Stun(amount) if(status_flags & CANSTUN) stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun @@ -159,21 +175,6 @@ /mob/living/carbon/alien/getTrail() return "xltrails" -/mob/living/carbon/alien/verb/nightvisiontoggle() - set name = "Toggle Night Vision" - set category = "Alien" - - if(!nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - nightvision = 1 - hud_used.nightvisionicon.icon_state = "nightvision1" - else if(nightvision == 1) - see_in_dark = 4 - see_invisible = 45 - nightvision = 0 - hud_used.nightvisionicon.icon_state = "nightvision0" - /*---------------------------------------- Proc: AddInfectionImages() Des: Gives the client of the alien an image on each infected mob. @@ -202,6 +203,10 @@ Des: Removes all infected images from the alien. /mob/living/carbon/alien/canBeHandcuffed() return 1 +/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0) + return initial(pixel_y) + + #undef HEAT_DAMAGE_LEVEL_1 #undef HEAT_DAMAGE_LEVEL_2 #undef HEAT_DAMAGE_LEVEL_3 diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index c758e3e4f7a..8b27de42f94 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -5,171 +5,281 @@ These are general powers. Specific powers are stored under the appropriate alien /*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit. Doesn't work on other aliens/AI.*/ +/datum/action/spell_action/alien -/mob/living/carbon/alien/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null. - if(stat) - src << "You must be conscious to do this." - return 0 - else if(X && getPlasma() < X) - src << "Not enough plasma stored." - return 0 - else if(Y && (!isturf(src.loc) || istype(src.loc, /turf/space))) - src << "Bad place for a garden!" - return 0 - else return 1 +/datum/action/spell_action/alien/UpdateName() + var/obj/effect/proc_holder/alien/ab = target + return ab.name -/mob/living/carbon/alien/humanoid/verb/plant() - set name = "Plant Weeds (50)" - set desc = "Plants some alien weeds" - set category = "Alien" +/datum/action/spell_action/alien/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/alien/ab = target - if(locate(/obj/structure/alien/weeds/node) in get_turf(src)) + if(usr) + return ab.cost_check(ab.check_turf,usr,1) + else + if(owner) + return ab.cost_check(ab.check_turf,owner,1) + return 1 + +/datum/action/spell_action/alien/CheckRemoval() + return !isalien(owner) + + +/obj/effect/proc_holder/alien + name = "Alien Power" + panel = "Alien" + var/plasma_cost = 0 + var/check_turf = 0 + + var/has_action = 1 + var/datum/action/spell_action/alien/action = null + var/action_icon = 'icons/mob/actions.dmi' + var/action_icon_state = "spell_default" + var/action_background_icon_state = "bg_alien" + +/obj/effect/proc_holder/alien/Click() + if(!istype(usr,/mob/living/carbon/alien)) + return 1 + var/mob/living/carbon/alien/user = usr + if(cost_check(check_turf,user)) + if(fire(user) && user) // Second check to prevent runtimes when evolving + user.adjustToxLoss(-plasma_cost) + return 1 + +/obj/effect/proc_holder/alien/proc/on_gain(var/mob/living/carbon/alien/user) + return + +/obj/effect/proc_holder/alien/proc/fire(var/mob/living/carbon/alien/user) + return 1 + +/obj/effect/proc_holder/alien/proc/cost_check(check_turf=0,var/mob/living/carbon/alien/user,var/silent = 0) + if(user.stat) + if(!silent) + user << "You must be conscious to do this." + return 0 + if(user.getPlasma() < plasma_cost) + if(!silent) + user << "Not enough plasma stored." + return 0 + if(check_turf && (!isturf(user.loc) || istype(user.loc, /turf/space))) + if(!silent) + user << "Bad place for a garden!" + return 0 + return 1 + +/obj/effect/proc_holder/alien/plant + name = "Plant Weeds" + desc = "Plants some alien weeds" + plasma_cost = 50 + check_turf = 1 + + action_icon_state = "alien_plant" + +/obj/effect/proc_holder/alien/plant/fire(var/mob/living/carbon/alien/user) + if(locate(/obj/structure/alien/weeds/node) in get_turf(user)) src << "There's already a weed node here." - return + return 0 + for(var/mob/O in viewers(user, null)) + O.show_message(text("[user] has planted some alien weeds!"), 1) + new/obj/structure/alien/weeds/node(user.loc) + return 1 - if(powerc(50,1)) - adjustToxLoss(-50) - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] has planted some alien weeds!"), 1) - new /obj/structure/alien/weeds/node(loc) - return +/obj/effect/proc_holder/alien/whisper + name = "Whisper" + desc = "Whisper to someone" + plasma_cost = 10 -/* -/mob/living/carbon/alien/humanoid/verb/ActivateHuggers() - set name = "Activate facehuggers (5)" - set desc = "Makes all nearby facehuggers activate" - set category = "Alien" + action_icon_state = "alien_whisper" - if(powerc(5)) - adjustToxLoss(-5) - for(var/obj/item/clothing/mask/facehugger/F in range(8,src)) - F.GoActive() - emote("roar") - return -*/ -/mob/living/carbon/alien/humanoid/verb/whisp(mob/M as mob in oview()) - set name = "Whisper (10)" - set desc = "Whisper to someone" - set category = "Alien" +/obj/effect/proc_holder/alien/whisper/fire(var/mob/living/carbon/alien/user) + var/mob/M = input("Select who to whisper to:","Whisper to?",null) as mob in oview(user) + if(!M) + return 0 + var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) + if(msg) + log_say("AlienWhisper: [key_name(user)]->[M.key] : [msg]") + M << "You hear a strange, alien voice in your head...[msg]" + user << {"You said: "[msg]" to [M]"} + else + return 0 + return 1 - if(powerc(10)) - adjustToxLoss(-10) - var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) - if(msg) - log_say("AlienWhisper: [key_name(src)]->[M.key] : [msg]") - M << "You hear a strange, alien voice in your head...[msg]" - src << {"You said: "[msg]" to [M]"} - return +/obj/effect/proc_holder/alien/transfer + name = "Transfer Plasma" + desc = "Transfer Plasma to another alien" + plasma_cost = 0 -/mob/living/carbon/alien/humanoid/verb/transfer_plasma(mob/living/carbon/alien/M as mob in oview()) - set name = "Transfer Plasma" - set desc = "Transfer Plasma to another alien" - set category = "Alien" + action_icon_state = "alien_transfer" +/obj/effect/proc_holder/alien/transfer/fire(var/mob/living/carbon/alien/user) + var/list/mob/living/carbon/alien/aliens_around = list() + for(var/mob/living/carbon/alien/A in oview(user)) + aliens_around.Add(A) + var/mob/living/carbon/alien/M = input("Select who to transfer to:","Transfer plasma to?",null) as mob in aliens_around + if(!M) + return 0 if(isalien(M)) var/amount = input("Amount:", "Transfer Plasma to [M]") as num if (amount) amount = abs(round(amount)) - if(powerc(amount)) - if (get_dist(src,M) <= 1) + if(user.getPlasma() > amount) + if (get_dist(user,M) <= 1) M.adjustToxLoss(amount) - adjustToxLoss(-amount) - M << "[src] has transfered [amount] plasma to you." - src << {"You have trasferred [amount] plasma to [M]"} + user.adjustToxLoss(-amount) + M << "[user] has transfered [amount] plasma to you." + user << {"You trasfer [amount] plasma to [M]"} else - src << "You need to be closer." + user << "You need to be closer!" return +/obj/effect/proc_holder/alien/acid + name = "Corrossive Acid" + desc = "Drench an object in acid, destroying it over time." + plasma_cost = 200 -/mob/living/carbon/alien/humanoid/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N - set name = "Corrossive Acid (200)" - set desc = "Drench an object in acid, destroying it over time." - set category = "Alien" + action_icon_state = "alien_acid" - if(powerc(200)) - if(O in oview(1)) - // OBJ CHECK - if(isobj(O)) - var/obj/I = O - if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. - src << "You cannot dissolve this object." - return - // TURF CHECK - else if(istype(O, /turf/simulated)) - var/turf/T = O - // R WALL - if(istype(T, /turf/simulated/wall/r_wall)) - src << "You cannot dissolve this object." - return - // R FLOOR - if(istype(T, /turf/simulated/floor/engine)) - src << "You cannot dissolve this object." - return - else// Not a type we can acid. - return +/obj/effect/proc_holder/alien/acid/on_gain(var/mob/living/carbon/alien/user) + user.verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid) - adjustToxLoss(-200) - new /obj/effect/acid(get_turf(O), O) - visible_message("[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") - else - src << "Target is too far away." +/obj/effect/proc_holder/alien/acid/proc/corrode(var/target,var/mob/living/carbon/alien/user = usr) + if(target in oview(1,user)) + // OBJ CHECK + if(isobj(target)) + var/obj/I = target + if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. + user << "You cannot dissolve this object." + return 0 + // TURF CHECK + else if(istype(target, /turf/simulated)) + var/turf/T = target + // R WALL + if(istype(T, /turf/simulated/wall/r_wall)) + user << "You cannot dissolve this object." + return 0 + // R FLOOR + if(istype(T, /turf/simulated/floor/engine)) + user << "You cannot dissolve this object." + return 0 + else// Not a type we can acid. + return 0 + new /obj/effect/acid(get_turf(target), target) + user.visible_message("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!") + return 1 + else + src << "Target is too far away." + return 0 + + +/obj/effect/proc_holder/alien/acid/fire(var/mob/living/carbon/alien/user) + var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user) + if(!O) + return 0 + return corrode(O,user) + +/mob/living/carbon/alien/humanoid/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh + set name = "Corrossive Acid" + + if(!isalien(usr)) + return + var/mob/living/carbon/alien/humanoid/user = usr + var/obj/effect/proc_holder/alien/acid/A = locate() in user.abilities + if(!A) + return + if(user.getPlasma() > A.plasma_cost && A.corrode(O)) + user.adjustToxLoss(-A.plasma_cost) + + +/obj/effect/proc_holder/alien/neurotoxin + name = "Spit Neurotoxin" + desc = "Spits neurotoxin at someone, paralyzing them for a short time." + plasma_cost = 50 + + action_icon_state = "alien_neurotoxin" + +/obj/effect/proc_holder/alien/neurotoxin/fire(var/mob/living/carbon/alien/user) + user.visible_message("[user] spits neurotoxin!", "You spit neurotoxin.") + + var/turf/T = user.loc + var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction + if(!isturf(U) || !isturf(T)) + return 0 + + var/obj/item/projectile/bullet/neurotoxin/A = new /obj/item/projectile/bullet/neurotoxin(user.loc) + A.current = U + A.yo = U.y - T.y + A.xo = U.x - T.x + A.fire() + + return 1 + + +/obj/effect/proc_holder/alien/resin + name = "Secrete Resin" + desc = "Secrete tough malleable resin." + plasma_cost = 55 + check_turf = 1 + + action_icon_state = "alien_resin" + +/obj/effect/proc_holder/alien/resin/fire(var/mob/living/carbon/alien/user) + if(locate(/obj/structure/alien/resin) in user.loc.contents) + user << "There is already a resin structure there." + return 0 + var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist + + if(!choice) + return 0 + + user << "You shape a [choice]." + user.visible_message("[user] vomits up a thick purple substance and begins to shape it.") + + switch(choice) + if("resin wall") + new /obj/structure/alien/resin/wall(user.loc) + if("resin membrane") + new /obj/structure/alien/resin/membrane(user.loc) + if("resin nest") + new /obj/structure/stool/bed/nest(user.loc) + return 1 + +/obj/effect/proc_holder/alien/regurgitate + name = "Regurgitate" + desc = "Empties the contents of your stomach" + plasma_cost = 0 + + action_icon_state = "alien_barf" + +/obj/effect/proc_holder/alien/regurgitate/fire(var/mob/living/carbon/alien/user) + if(user.stomach_contents.len) + for(var/atom/movable/A in user.stomach_contents) + user.stomach_contents.Remove(A) + A.loc = user.loc + A.update_pipe_vision() + user.visible_message("[user] hurls out the contents of their stomach!") return +/obj/effect/proc_holder/alien/nightvisiontoggle + name = "Toggle Night Vision" + desc = "Toggles Night Vision" + plasma_cost = 0 -/mob/living/carbon/alien/humanoid/proc/neurotoxin() // ok - set name = "Spit Neurotoxin (50)" - set desc = "Spits neurotoxin at someone, paralyzing them for a short time." - set category = "Alien" + has_action = 0 // Has dedicated GUI button already - if(powerc(50)) - adjustToxLoss(-50) - src.visible_message("[src] spits neurotoxin!", "You spit neurotoxin.") +/obj/effect/proc_holder/alien/nightvisiontoggle/fire(var/mob/living/carbon/alien/user) - var/turf/T = loc - var/turf/U = get_step(src, dir) // Get the tile infront of the move, based on their direction - if(!isturf(U) || !isturf(T)) - return + if(!user.nightvision) + user.see_in_dark = 8 + user.see_invisible = SEE_INVISIBLE_MINIMUM + user.nightvision = 1 + user.hud_used.nightvisionicon.icon_state = "nightvision1" + else if(user.nightvision == 1) + user.see_in_dark = 4 + user.see_invisible = 45 + user.nightvision = 0 + user.hud_used.nightvisionicon.icon_state = "nightvision0" - var/obj/item/projectile/bullet/neurotoxin/A = new /obj/item/projectile/bullet/neurotoxin(usr.loc) - A.current = U - A.yo = U.y - T.y - A.xo = U.x - T.x - A.fire() - return + return 1 -/mob/living/carbon/alien/humanoid/proc/resin() - set name = "Secrete Resin (55)" - set desc = "Secrete tough malleable resin." - set category = "Alien" - - if(powerc(55,1)) - if(locate(/obj/structure/alien/resin) in loc.contents) - src << "There is already a resin structure there." - return - var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist - if(!choice || !powerc(55)) return - adjustToxLoss(-55) - src << "You shape a [choice]." - visible_message("[src] vomits up a thick purple substance and begins to shape it.") - switch(choice) - if("resin wall") - new /obj/structure/alien/resin/wall(loc) - if("resin membrane") - new /obj/structure/alien/resin/membrane(loc) - if("resin nest") - new /obj/structure/stool/bed/nest(loc) - return - -/mob/living/carbon/alien/humanoid/verb/regurgitate() - set name = "Regurgitate" - set desc = "Empties the contents of your stomach" - set category = "Alien" - - if(powerc() && stomach_contents.len) - for(var/atom/movable/A in stomach_contents) - if(A in stomach_contents) - stomach_contents.Remove(A) - A.loc = loc - //Paralyse(10) - src.visible_message("[src] hurls out the contents of their stomach!") - return diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index bae52d99d01..a18f4b2ee00 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -12,7 +12,11 @@ if(src.name == "alien drone") src.name = text("alien drone ([rand(1, 1000)])") src.real_name = src.name - verbs.Add(/mob/living/carbon/alien/humanoid/proc/resin,/mob/living/carbon/alien/humanoid/proc/corrosive_acid) + + AddAbility(new/obj/effect/proc_holder/alien/resin(null)) + AddAbility(new/obj/effect/proc_holder/alien/acid(null)) + AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) + ..() //Drones use the same base as generic humanoids. @@ -20,29 +24,26 @@ . = ..() . += 1 +/obj/effect/proc_holder/alien/evolve + name = "Evolve" + desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time." + plasma_cost = 500 -//Drone verbs -/mob/living/carbon/alien/humanoid/drone/verb/evolve() - set name = "Evolve (500)" - set desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time." - set category = "Alien" + action_icon_state = "alien_evolve_drone" - if(powerc(500)) - // Queen check - var/no_queen = 1 - for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list) - if(!Q.key || !Q.getorgan(/obj/item/organ/brain)) - continue - no_queen = 0 - - if(no_queen) - adjustToxLoss(-500) - src << "You begin to evolve!" - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] begins to twist and contort!"), 1) - var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc) - mind.transfer_to(new_xeno) - qdel(src) - else - src << "We already have an alive queen." - return \ No newline at end of file +/obj/effect/proc_holder/alien/evolve/fire(var/mob/living/carbon/alien/user) + var/no_queen = 1 + for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list) + if(!Q.key || !Q.getorgan(/obj/item/organ/brain)) + continue + no_queen = 0 + if(no_queen) + user << "You begin to evolve!" + user.visible_message("[user] begins to twist and contort!") + var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (user.loc) + user.mind.transfer_to(new_xeno) + qdel(user) + return 1 + else + user << "We already have an alive queen." + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 4ace45627ab..a34c6337786 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -36,13 +36,6 @@ else healths.icon_state = "health7" - -/mob/living/carbon/alien/humanoid/hunter/handle_environment() - if(m_intent == "run" || resting) - ..() - else - adjustToxLoss(-heal_rate) - /mob/living/carbon/alien/humanoid/hunter/movement_delay() . = -1 //hunters are sanic . += ..() //but they still need to slow down on stun diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index c277695df7c..ecd8a193a33 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -14,7 +14,10 @@ if(name == "alien sentinel") name = text("alien sentinel ([rand(1, 1000)])") real_name = name - verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin) + + AddAbility(new/obj/effect/proc_holder/alien/acid(null)) + AddAbility(new/obj/effect/proc_holder/alien/neurotoxin(null)) + ..() /mob/living/carbon/alien/humanoid/sentinel/handle_hud_icons_health() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 3a6f10f3780..02b856d2356 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -8,6 +8,8 @@ var/leap_on_click = 0 var/pounce_cooldown = 0 var/pounce_cooldown_time = 30 + var/custom_pixel_x_offset = 0 //for admin fuckery. + var/custom_pixel_y_offset = 0 //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/humanoid/New() @@ -15,6 +17,12 @@ if(name == "alien") name = text("alien ([rand(1, 1000)])") real_name = name + + AddAbility(new/obj/effect/proc_holder/alien/plant(null)) + AddAbility(new/obj/effect/proc_holder/alien/whisper(null)) + AddAbility(new/obj/effect/proc_holder/alien/transfer(null)) + AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null)) + ..() /mob/living/carbon/alien/humanoid/movement_delay() @@ -116,9 +124,25 @@ unEquip(r_store) unEquip(l_store) -/mob/living/carbon/alien/humanoid/reagent_check(var/datum/reagent/R) - return 0 - /mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I) playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free - ..(I, cuff_break = 1) + ..(I, cuff_break = 1) + +/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) + if(leaping) + return -32 + else if(custom_pixel_y_offset) + return custom_pixel_y_offset + else + return initial(pixel_y) + +/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0) + if(leaping) + return -32 + else if(custom_pixel_x_offset) + return custom_pixel_x_offset + else + return initial(pixel_x) + +/mob/living/carbon/alien/humanoid/check_ear_prot() + return 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index e1aae3cc6e2..9670240e4aa 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -22,7 +22,12 @@ break real_name = src.name - verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin) + + AddAbility(new/obj/effect/proc_holder/alien/acid(null)) + AddAbility(new/obj/effect/proc_holder/alien/neurotoxin(null)) + AddAbility(new/obj/effect/proc_holder/alien/resin(null)) + AddAbility(new/obj/effect/proc_holder/alien/lay_egg(null)) + ..() /mob/living/carbon/alien/humanoid/queen/handle_hud_icons_health() @@ -52,23 +57,21 @@ //Queen verbs -/mob/living/carbon/alien/humanoid/queen/verb/lay_egg() +/obj/effect/proc_holder/alien/lay_egg + name = "Lay Egg" + desc = "Lay an egg to produce huggers to impregnate prey with." + plasma_cost = 75 + check_turf = 1 - set name = "Lay Egg (75)" - set desc = "Lay an egg to produce huggers to impregnate prey with." - set category = "Alien" - - if(locate(/obj/structure/alien/egg) in get_turf(src)) - src << "There's already an egg here." - return - - if(powerc(75,1))//Can't plant eggs on spess tiles. That's silly. - adjustToxLoss(-75) - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] has laid an egg!"), 1) - new /obj/structure/alien/egg(loc) - return + action_icon_state = "alien_egg" +/obj/effect/proc_holder/alien/lay_egg/fire(var/mob/living/carbon/alien/user) + if(locate(/obj/structure/alien/egg) in get_turf(user)) + user << "There's already an egg here." + return 0 + user.visible_message("[user] has laid an egg!") + new /obj/structure/alien/egg(user.loc) + return 1 /mob/living/carbon/alien/humanoid/queen/large icon = 'icons/mob/alienqueen.dmi' diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 2ccc95f56cf..85a63338919 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -14,7 +14,6 @@ for(var/image/I in overlays_standing) overlays += I - if(stat == DEAD) //If we mostly took damage from fire if(fireloss > 125) @@ -35,9 +34,10 @@ icon_state = "alien[caste]_s" if(leaping) - var/old_icon = icon - icon = alt_icon - alt_icon = old_icon + if(alt_icon == initial(alt_icon)) + var/old_icon = icon + icon = alt_icon + alt_icon = old_icon icon_state = "alien[caste]_leap" pixel_x = -32 pixel_y = -32 @@ -46,9 +46,8 @@ var/old_icon = icon icon = alt_icon alt_icon = old_icon - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - + pixel_x = get_standard_pixel_x_offset(lying) + pixel_y = get_standard_pixel_y_offset(lying) /mob/living/carbon/alien/humanoid/regenerate_icons() ..() diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index c560c3d7f3e..096f1e353a8 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -4,6 +4,7 @@ icon_state = "larva0" pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL + density = 0 maxHealth = 25 health = 25 @@ -21,6 +22,8 @@ name = "alien larva ([rand(1, 1000)])" real_name = name regenerate_icons() + AddAbility(new/obj/effect/proc_holder/alien/hide(null)) + AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null)) ..() //This needs to be fixed diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index efbdcdafe9b..469e4023946 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -1,51 +1,61 @@ +/obj/effect/proc_holder/alien/hide + name = "Hide" + desc = "Allows to hide beneath tables or certain items. Toggled on or off." + plasma_cost = 0 -/mob/living/carbon/alien/larva/verb/hide() - set name = "Hide" - set desc = "Allows to hide beneath tables or certain items. Toggled on or off." - set category = "Alien" + action_icon_state = "alien_hide" - if(stat != CONSCIOUS) +/obj/effect/proc_holder/alien/hide/fire(var/mob/living/carbon/alien/user) + if(user.stat != CONSCIOUS) return - if (layer != TURF_LAYER+0.2) - layer = TURF_LAYER+0.2 - visible_message("[src] scurries to the ground!", \ + if (user.layer != TURF_LAYER+0.2) + user.layer = TURF_LAYER+0.2 + user.visible_message("[user] scurries to the ground!", \ "You are now hiding.") else - layer = MOB_LAYER - visible_message("[src] slowly peaks up from the ground...", \ - "You have stopped hiding.") + user.layer = MOB_LAYER + user.visible_message("[user.] slowly peaks up from the ground...", \ + "You stop hiding.") + return 1 -/mob/living/carbon/alien/larva/verb/evolve() - set name = "Evolve" - set desc = "Evolve into a fully grown Alien." - set category = "Alien" - if(stat != CONSCIOUS) +/obj/effect/proc_holder/alien/larva_evolve + name = "Evolve" + desc = "Evolve into a fully grown Alien." + plasma_cost = 0 + + action_icon_state = "alien_evolve_larva" + +/obj/effect/proc_holder/alien/larva_evolve/fire(var/mob/living/carbon/alien/user) + if(!islarva(user)) return + var/mob/living/carbon/alien/larva/L = user - if(handcuffed || legcuffed) - src << "You cannot evolve when you are cuffed." + if(L.stat != CONSCIOUS) + return + if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ? + user << "You cannot evolve when you are cuffed." - if(amount_grown >= max_grown) //TODO ~Carn - src << "You are growing into a beautiful alien! It is time to choose a caste." - src << "There are three to choose from:" - src << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves." - src << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters." - src << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen." - var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") + if(L.amount_grown >= L.max_grown) //TODO ~Carn + L << "You are growing into a beautiful alien! It is time to choose a caste." + L << "There are three to choose from:" + L << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves." + L << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters." + L << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen." + var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") var/mob/living/carbon/alien/humanoid/new_xeno switch(alien_caste) if("Hunter") - new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc) + new_xeno = new /mob/living/carbon/alien/humanoid/hunter(L.loc) if("Sentinel") - new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc) + new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(L.loc) if("Drone") - new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) - if(mind) mind.transfer_to(new_xeno) - qdel(src) - return + new_xeno = new /mob/living/carbon/alien/humanoid/drone(L.loc) + if(L.mind) L.mind.transfer_to(new_xeno) + qdel(L) + return 0 else - src << "You are not fully grown." - return + user << "You are not fully grown." + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 4df5469296f..858d3ec155b 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -30,7 +30,6 @@ //BREATH TEMPERATURE handle_breath_temperature(breath) - /mob/living/carbon/alien/handle_status_effects() ..() //natural reduction of movement delay due to stun. @@ -62,4 +61,4 @@ handle_hud_icons_health() - return 1 + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index a4c27b35cf4..f24f47f8f65 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -123,7 +123,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.head && H.head.flags & HEADCOVERSMOUTH) + if(H.is_mouth_covered(head_only = 1)) H.visible_message("[src] smashes against [H]'s [H.head]!", \ "[src] smashes against [H]'s [H.head]!") Die() @@ -239,7 +239,7 @@ var/const/MAX_ACTIVE_TIME = 400 var/mob/living/carbon/C = M if(ishuman(C)) var/mob/living/carbon/human/H = C - if(H.head && H.head.flags & HEADCOVERSMOUTH) + if(H.is_mouth_covered(head_only = 1)) return 0 return 1 return 0 diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 49a3bc558d3..0b649aec99d 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -22,12 +22,12 @@ if(istype(O,/obj/item/organ/brain)) //Time to stick a brain in it --NEO var/obj/item/organ/brain/newbrain = O if(brain) - user << "There's already a brain in the MMI!" + user << "There's already a brain in the MMI!" return if(!newbrain.brainmob) - user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain." + user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain!" return - visible_message("[user] sticks \a [newbrain] into \the [src]") + visible_message("[user] sticks \a [newbrain] into \the [src].") brainmob = newbrain.brainmob newbrain.brainmob = null @@ -67,9 +67,9 @@ /obj/item/device/mmi/attack_self(mob/user as mob) if(!brain) - user << "You upend the MMI, but there's nothing in it." + user << "You upend the MMI, but there's nothing in it!" else if(locked) - user << "You upend the MMI, but the brain is clamped into place." + user << "You upend the MMI, but the brain is clamped into place!" else user << "You upend the MMI, spilling the brain onto the floor." @@ -123,7 +123,7 @@ set popup_menu = 0 if(brainmob.stat) - brainmob << "Can't do that while incapacitated or dead." + brainmob << "Can't do that while incapacitated or dead!" radio.listening = radio.listening==1 ? 0 : 1 brainmob << "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast." diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 3600cdc4de9..2197876bc1c 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -6,6 +6,7 @@ var/timeofhostdeath = 0 var/emp_damage = 0//Handles a type of MMI damage var/alert = null + has_limbs = 0 /mob/living/carbon/brain/New() create_reagents(1000) @@ -28,11 +29,11 @@ /mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. return - + /mob/living/carbon/brain/blob_act() return - -/mob/living/carbon/brain/on_forcemove(var/atom/newloc) + +/mob/living/carbon/brain/on_forcemove(var/atom/newloc) if(container) container.loc = newloc else //something went very wrong. diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 4bd461376ed..ed151132066 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -52,7 +52,7 @@ var/mob/living/carbon/human/H = M if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) - user << "You're going to need to remove their head cover first." + user << "You're going to need to remove their head cover first!" return //since these people will be dead M != usr @@ -63,15 +63,15 @@ if(O == (user || M)) continue if(M == user) - O << "[user] inserts [src] into \his head!" + O << "[user] inserts [src] into \his head!" else - O << "[M] has [src] inserted into \his head by [user]." + O << "[M] has [src] inserted into \his head by [user]." if(M != user) - M << "[user] inserts [src] into your head!" - user << "You insert [src] into [M]'s head!" + M << "[user] inserts [src] into your head." + user << "You insert [src] into [M]'s head." else - user << "You insert [src] into your head!" //LOL + user << "You insert [src] into your head." //LOL //this might actually be outdated since barring badminnery, a debrain'd body will have any client sucked out to the brain's internal mob. Leaving it anyway to be safe. --NEO if(M.key) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 05cc69ba948..5490d786297 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -1,8 +1,8 @@ /mob/living/carbon/brain/death(gibbed) if(stat == DEAD) return if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container. - container.visible_message("[src]'s MMI flatlines!", \ - "You hear something flatline.") + container.visible_message("[src]'s MMI flatlines!", \ + "You hear something flatline.") if(istype(src,/obj/item/organ/brain/alien)) container.icon_state = "mmi_alien_dead" else diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a673cb37fec..bae07c42c8d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -38,9 +38,9 @@ /mob/living/carbon/relaymove(var/mob/user, direction) if(user in src.stomach_contents) if(prob(40)) - audible_message("You hear something rumbling inside [src]'s stomach...", \ - "You hear something rumbling.", 4,\ - "Something is rumbling inside your stomach!") + audible_message("You hear something rumbling inside [src]'s stomach...", \ + "You hear something rumbling.", 4,\ + "Something is rumbling inside your stomach!") var/obj/item/I = user.get_active_hand() if(I && I.force) var/d = rand(round(I.force / 4), I.force) @@ -84,7 +84,7 @@ src.visible_message( "[src] was shocked by \the [source]!", \ "You feel a powerful shock coursing through your body!", \ - "You hear a heavy electrical crack." \ + "You hear a heavy electrical crack." \ ) if(prob(25) && heart_attack) heart_attack = 0 @@ -170,7 +170,7 @@ eye_stat += rand(2, 4) else - src << "Your eyes itch and burn severely!" + src << "Your eyes itch and burn severely!" eye_stat += rand(12, 16) if(eye_stat > 10) @@ -406,8 +406,8 @@ var/const/GALOSHES_DONT_HELP = 8 changeNext_move(CLICK_CD_BREAKOUT) last_special = world.time + CLICK_CD_BREAKOUT visible_message("[src] attempts to unbuckle themself!", \ - "You attempt to unbuckle yourself. (This will take around one minute and you need to stay still.)") - if(do_after(src, 600)) + "You attempt to unbuckle yourself... (This will take around one minute and you need to stay still.)") + if(do_after(src, 600, needhand = 0)) if(!buckled) return buckled.user_unbuckle_mob(src,src) @@ -449,8 +449,8 @@ var/const/GALOSHES_DONT_HELP = 8 var/displaytime = breakouttime / 600 if(!cuff_break) visible_message("[src] attempts to remove [I]!") - src << "You attempt to remove [I]. (This will take around [displaytime] minutes and you need to stand still.)" - if(do_after(src, breakouttime, 10)) + src << "You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)" + if(do_after(src, breakouttime, 10, 0)) if(I.loc != src || buckled) return visible_message("[src] manages to remove [I]!") @@ -458,6 +458,7 @@ var/const/GALOSHES_DONT_HELP = 8 if(handcuffed) handcuffed.loc = loc + handcuffed.dropped(src) handcuffed = null if(buckled && buckled.buckle_requires_restraints) buckled.unbuckle_mob() @@ -473,8 +474,8 @@ var/const/GALOSHES_DONT_HELP = 8 else breakouttime = 50 visible_message("[src] is trying to break [I]!") - src << "You attempt to break [I]. (This will take around 5 seconds and you need to stand still.)" - if(do_after(src, breakouttime)) + src << "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)" + if(do_after(src, breakouttime, needhand = 0)) if(!I.loc || buckled) return visible_message("[src] manages to break [I]!") @@ -489,4 +490,18 @@ var/const/GALOSHES_DONT_HELP = 8 legcuffed = null update_inv_legcuffed(0) else - src << "You fail to break [I]!" \ No newline at end of file + src << "You fail to break [I]!" + +/mob/living/carbon/proc/is_mouth_covered(head_only = 0, mask_only = 0) + if( (!mask_only && head && (head.flags & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)) ) + return 1 + +/mob/living/carbon/get_standard_pixel_y_offset(lying = 0) + if(lying) + return -6 + else + return initial(pixel_y) + +/mob/living/carbon/check_ear_prot() + if(head && (head.flags & HEADBANGPROTECT)) + return 1 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 2afddf617fa..41a04d1273f 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -22,5 +22,6 @@ var/co2overloadtime = null var/temperature_resistance = T0C+75 + has_limbs = 1 - lying_pixel_offset = -6 //offset for pixel_y when lying down. + var/remote_view = 0 diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index 48da639f97e..ac4e518258b 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -153,7 +153,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 */ for(var/datum/disease/D in src.viruses) - B.data["viruses"] += new D.type(0, D, 1) + B.data["viruses"] += D.Copy() B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) if(src.resistances&&src.resistances.len) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a8683a1f49c..c1a0e21b364 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -282,20 +282,20 @@ if(!I || !L || I.loc != src) //no item, no limb, or item is not in limb (the person atleast) anymore return var/time_taken = I.embedded_unsafe_removal_time*I.w_class - usr.visible_message("[usr] attempts to remove [I] from their [L.getDisplayName()]!","You attempt to remove [I] from your [L.getDisplayName()], it will take [time_taken/10] seconds.") + usr.visible_message("[usr] attempts to remove [I] from their [L.getDisplayName()].","You attempt to remove [I] from your [L.getDisplayName()]... (It will take [time_taken/10] seconds.)") if(do_after(usr, time_taken, needhand = 1)) L.embedded_objects -= I L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. I.loc = get_turf(src) usr.put_in_hands(I) usr.emote("scream") - usr.visible_message("[usr] successfully rips [I] out of their [L.getDisplayName()]!","You successfully remove [I] from your [L.getDisplayName()]!") + usr.visible_message("[usr] successfully rips [I] out of their [L.getDisplayName()]!","You successfully remove [I] from your [L.getDisplayName()].") return if(href_list["item"]) var/slot = text2num(href_list["item"]) if(slot in check_obscured_slots()) - usr << "You can't reach that. Something is covering it." + usr << "You can't reach that! Something is covering it." return if(href_list["pockets"]) @@ -309,7 +309,7 @@ var/delay_denominator = 1 if(pocket_item && !(pocket_item.flags&ABSTRACT)) if(pocket_item.flags & NODROP) - usr << "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!" + usr << "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!" usr << "You try to empty [src]'s [pocket_side] pocket." else if(place_item && place_item.mob_can_equip(src, pocket_id, 1) && !(place_item.flags&ABSTRACT)) usr << "You try to place [place_item] into [src]'s [pocket_side] pocket." @@ -665,13 +665,12 @@ if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand)) step_towards(hand, src) src << "\The [S] pulls \the [hand] from your grip!" - apply_effect(current_size * 3, IRRADIATE) + irradiate(current_size * 3) if(mob_negates_gravity()) return ..() - /mob/living/carbon/human/help_shake_act(mob/living/carbon/M) if(!istype(M)) return @@ -679,7 +678,7 @@ if(health >= 0) if(src == M) visible_message( \ - "[src] examines \himself.", \ + "[src] examines \himself.", \ "You check yourself for injuries.") for(var/obj/item/organ/limb/org in organs) @@ -730,6 +729,34 @@ ..() +/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C) + if(C.stat == DEAD) + src << "[C.name] is dead!" + return + if(is_mouth_covered()) + src << "Remove your mask first!" + return 0 + if(C.is_mouth_covered()) + src << "Remove their mask first!" + return 0 + + if(C.cpr_time < world.time + 30) + add_logs(src, C, "CPRed") + visible_message("[src] is trying to perform CPR on [C.name]!", \ + "You try to perform CPR on [C.name]... Hold still!") + if(!do_mob(src, C)) + src << "You fail to perform CPR on [C]!" + return 0 + + if(C.health <= config.health_threshold_crit) + C.cpr_time = world.time + var/suff = min(C.getOxyLoss(), 7) + C.adjustOxyLoss(-suff) + C.updatehealth() + src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") + C << "You feel a breath of fresh air enter your lungs... It feels good..." + + /mob/living/carbon/human/generateStaticOverlay() var/image/staticOverlay = image(icon('icons/effects/effects.dmi', "static"), loc = src) staticOverlay.override = 1 diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 3a34e1f3acb..844f2399a19 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -124,12 +124,14 @@ mob/living/carbon/human/proc/hat_fall_prob() var/update = 0 while(parts.len && (brute>0 || burn>0) ) var/obj/item/organ/limb/picked = pick(parts) + var/brute_per_part = brute/parts.len + var/burn_per_part = burn/parts.len var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam - update |= picked.take_damage(brute,burn) + update |= picked.take_damage(brute_per_part,burn_per_part) brute -= (picked.brute_dam - brute_was) burn -= (picked.burn_dam - burn_was) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index fd919216a09..980ba2ce475 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -146,7 +146,7 @@ emp_act else return 0 - var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].") + var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].") if(armor >= 100) return 0 var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) @@ -220,7 +220,7 @@ emp_act for(var/obj/item/organ/limb/L in src.organs) if(L.status == ORGAN_ROBOTIC) if(!informed) - src << "You feel a sharp pain as your robotic limbs overload." + src << "You feel a sharp pain as your robotic limbs overload." informed = 1 switch(severity) if(1) @@ -250,7 +250,7 @@ emp_act update_inv_wear_mask() update_inv_head() else - src << "Your [head_clothes.name] protects your head and face from the acid!" + src << "Your [head_clothes.name] protects your head and face from the acid!" else . = get_organ("head") if(.) @@ -270,7 +270,7 @@ emp_act update_inv_w_uniform() update_inv_wear_suit() else - src << "Your [chest_clothes.name] protects your body from the acid!" + src << "Your [chest_clothes.name] protects your body from the acid!" else . = get_organ("chest") if(.) @@ -300,7 +300,7 @@ emp_act update_inv_w_uniform() update_inv_wear_suit() else - src << "Your [arm_clothes.name] protects your arms and hands from the acid!" + src << "Your [arm_clothes.name] protects your arms and hands from the acid!" else . = get_organ("r_arm") if(.) @@ -325,7 +325,7 @@ emp_act update_inv_w_uniform() update_inv_wear_suit() else - src << "Your [leg_clothes.name] protects your legs and feet from the acid!" + src << "Your [leg_clothes.name] protects your legs and feet from the acid!" else . = get_organ("r_leg") if(.) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index df617e2c68e..9b373ba72f4 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -15,6 +15,7 @@ var/skin_tone = "caucasian1" //Skin tone var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup + var/lip_color = "white" var/age = 30 //Player's age (pure fluff) var/blood_type = "A+" //Player's bloodtype @@ -39,11 +40,15 @@ var/icon/base_icon_state = "caucasian1_m" - var/list/organs = list() //Gets filled up in the constructor (human.dm, New() proc, line 24. I'm sick and tired of missing comments. -Agouri - var/special_voice = "" // For changing our voice. Used by a symptom. var/gender_ambiguous = 0 //if something goes wrong during gender reassignment this generates a line in examine var/blood_max = 0 //how much are we bleeding - var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding \ No newline at end of file + var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding + + var/list/organs = list() //Gets filled up in the constructor (human.dm, New() proc. + + var/datum/martial_art/martial_art = null + + var/name_override //For temporary visible name changes \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 902cce6896a..ecc7c49649e 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -39,6 +39,8 @@ /mob/living/carbon/human/get_visible_name() var/face_name = get_face_name("") var/id_name = get_id_name("") + if(name_override) + return name_override if(face_name) if(id_name && (id_name != face_name)) return "[face_name] (as [id_name])" @@ -125,9 +127,6 @@ /mob/living/carbon/human/IsAdvancedToolUser() return 1//Humans can use guns and such -/mob/living/carbon/human/SpeciesCanConsume() - return 1 // Humans can eat, drink, and be forced to do so - /mob/living/carbon/human/InCritical() return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 5e914e68242..58189d56b4b 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -15,10 +15,11 @@ var/obj/item/weapon/tank/jetpack/J = back if((movement_dir || J.stabilization_on) && J.allow_thrust(0.01, src)) return 1 - if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit/engine) && isturf(loc)) //Second check is so you can't use a jetpack in a mech - var/obj/item/clothing/suit/space/hardsuit/engine/C = wear_suit - if((movement_dir || C.jetpack.stabilization_on) && C.jetpack.allow_thrust(0.01, src)) - return 1 + if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit) && isturf(loc)) //Second check is so you can't use a jetpack in a mech + var/obj/item/clothing/suit/space/hardsuit/C = wear_suit + if(C.jetpack) + if((movement_dir || C.jetpack.stabilization_on) && C.jetpack.allow_thrust(0.01, src)) + return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index c1e89721f8a..c7db2dc90c6 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -46,7 +46,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]!" return 0 if( !(I.slot_flags & SLOT_BELT) ) return @@ -80,7 +80,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]!" return 0 if( !(I.slot_flags & SLOT_ID) ) return 0 @@ -92,7 +92,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]!" return 0 if(I.slot_flags & SLOT_DENYPOCKET) return @@ -105,7 +105,7 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [I.name]." + src << "You need a jumpsuit before you can attach this [I.name]!" return 0 if(I.slot_flags & SLOT_DENYPOCKET) return 0 @@ -119,15 +119,15 @@ return 0 if(!wear_suit) if(!disable_warning) - src << "You need a suit before you can attach this [I.name]." + src << "You need a suit before you can attach this [I.name]!" return 0 if(!wear_suit.allowed) if(!disable_warning) - usr << "You somehow have a suit with no defined allowed items for suit storage, stop that." //should be src? + usr << "You somehow have a suit with no defined allowed items for suit storage, stop that!" //should be src? return 0 if(I.w_class > 4) if(!disable_warning) - usr << "The [I.name] is too big to attach." //should be src? + usr << "The [I.name] is too big to attach!" //should be src? return 0 if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, wear_suit.allowed) ) //ugly and un-polymorphic. return 1 @@ -163,7 +163,7 @@ var/obj/item/I = H.get_active_hand() var/obj/item/weapon/storage/S = H.get_inactive_hand() if(!I) - H << "You are not holding anything to equip." + H << "You are not holding anything to equip!" return if(H.equip_to_appropriate_slot(I)) if(hand) @@ -183,7 +183,7 @@ if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) S.handle_item_insertion(I) else - H << "You are unable to equip that." + H << "You are unable to equip that!" /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) @@ -301,9 +301,6 @@ s_store = null update_inv_s_store(0) - update_action_buttons() - - //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() //set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc. /mob/living/carbon/human/equip_to_slot(obj/item/I, slot, redraw_mob = 1) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d14b746171c..d3aa47771a2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -52,20 +52,10 @@ /mob/living/carbon/human/calculate_affecting_pressure(var/pressure) - ..() - var/pressure_difference = abs( pressure - ONE_ATMOSPHERE ) - - var/pressure_adjustment_coefficient = 1 //Determins how much the clothing you are wearing protects you in percent. - if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE)) - pressure_adjustment_coefficient -= PRESSURE_SUIT_REDUCTION_COEFFICIENT - if(head && (head.flags & STOPSPRESSUREDMAGE)) - pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT - pressure_adjustment_coefficient = max(pressure_adjustment_coefficient,0) //So it isn't less than 0 - pressure_difference = pressure_difference * pressure_adjustment_coefficient - if(pressure > ONE_ATMOSPHERE) - return ONE_ATMOSPHERE + pressure_difference + if((wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE)) && (head && (head.flags & STOPSPRESSUREDMAGE))) + return ONE_ATMOSPHERE else - return ONE_ATMOSPHERE - pressure_difference + return pressure /mob/living/carbon/human/handle_disabilities() @@ -146,21 +136,6 @@ //END FIRE CODE -/mob/living/carbon/human/proc/stabilize_temperature_from_calories() - switch(bodytemperature) - if(-INFINITY to 260.15) //260.15 is 310.15 - 50, the temperature where you start to feel effects. - if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. - nutrition -= 2 - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) - if(260.15 to 360.15) - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR - if(360.15 to INFINITY) //360.15 is 310.15 + 50, the temperature where you start to feel effects. - //We totally need a sweat system cause it totally makes sense...~ - var/body_temperature_difference = 310.15 - bodytemperature - bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers - //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, CHEST, GROIN, etc. See setup.dm for the full list) /mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. var/thermal_protection_flags = 0 diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d66d73d0e1c..090bc46f055 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1,12 +1,5 @@ // This code handles different species in the game. -#define SPECIES_LAYER 26 -#define BODY_BEHIND_LAYER 25 -#define BODY_LAYER 24 -#define BODY_ADJ_LAYER 23 -#define HAIR_LAYER 9 -#define BODY_FRONT_LAYER 2 - #define TINT_IMPAIR 2 #define TINT_BLIND 3 @@ -41,7 +34,7 @@ var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans) var/exotic_blood = null // If your race wants to bleed something other than bog standard blood, change this. - var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human //What the species drops on gibbing + var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing var/list/no_equip = list() // slots the race can't equip stuff to var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids @@ -92,9 +85,6 @@ var/g = (H.gender == FEMALE) ? "f" : "m" - if(!config.mutant_colors) - H.dna.mutant_color = default_color - if(MUTCOLORS in specflags) var/image/spec_base var/icon_state_string = "[id]_" @@ -128,10 +118,7 @@ if(hair_color) if(hair_color == "mutcolor") - if(!config.mutant_colors) - img_facial_s.color = "#" + default_color - else - img_facial_s.color = "#" + H.dna.mutant_color + img_facial_s.color = "#" + H.dna.mutant_color else img_facial_s.color = "#" + hair_color else @@ -159,10 +146,7 @@ if(hair_color) if(hair_color == "mutcolor") - if(!config.mutant_colors) - img_hair_s.color = "#" + default_color - else - img_hair_s.color = "#" + H.dna.mutant_color + img_hair_s.color = "#" + H.dna.mutant_color else img_hair_s.color = "#" + hair_color else @@ -186,7 +170,9 @@ // lipstick if(H.lip_style && LIPS in specflags) - standing += image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]_s", "layer" = -BODY_LAYER) + var/image/lips = image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]_s", "layer" = -BODY_LAYER) + lips.color = H.lip_color + standing += lips // eyes if(EYECOLOR in specflags) @@ -252,13 +238,11 @@ else icon_state_string += "_s" - if(!config.mutant_colors) - H.dna.mutant_color = default_color - for(var/layer in relevent_layers) for(var/bodypart in bodyparts_to_add) I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]", "layer" =- layer) - I.color = "#[H.dna.mutant_color]" + if(!(H.disabilities & HUSK)) + I.color = "#[H.dna.mutant_color]" standing += I H.overlays_standing[layer] = standing.Copy() standing = list() @@ -326,7 +310,7 @@ return 0 if(!H.w_uniform && !nojumpsuit) if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." + H << "You need a jumpsuit before you can attach this [I.name]!" return 0 if( !(I.slot_flags & SLOT_BELT) ) return @@ -360,7 +344,7 @@ return 0 if(!H.w_uniform && !nojumpsuit) if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." + H << "You need a jumpsuit before you can attach this [I.name]!" return 0 if( !(I.slot_flags & SLOT_ID) ) return 0 @@ -372,7 +356,7 @@ return 0 if(!H.w_uniform && !nojumpsuit) if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." + H << "You need a jumpsuit before you can attach this [I.name]!" return 0 if(I.slot_flags & SLOT_DENYPOCKET) return @@ -385,7 +369,7 @@ return 0 if(!H.w_uniform && !nojumpsuit) if(!disable_warning) - H << "You need a jumpsuit before you can attach this [I.name]." + H << "You need a jumpsuit before you can attach this [I.name]!" return 0 if(I.slot_flags & SLOT_DENYPOCKET) return 0 @@ -399,7 +383,7 @@ return 0 if(!H.wear_suit) if(!disable_warning) - H << "You need a suit before you can attach this [I.name]." + H << "You need a suit before you can attach this [I.name]!" return 0 if(!H.wear_suit.allowed) if(!disable_warning) @@ -517,6 +501,11 @@ if(!(SEE_OBJS & H.permanent_sight_flags)) H.sight &= ~SEE_OBJS + if(H.remote_view) + H.sight |= SEE_TURFS + H.sight |= SEE_MOBS + 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 @@ -666,7 +655,7 @@ if(istype(H.back, /obj/item/weapon/tank/jetpack)) J = H.back if(istype(H.wear_suit,/obj/item/clothing/suit/space/hardsuit)) //copypasta but faster implementation currently - var/obj/item/clothing/suit/space/hardsuit/engine/C = H.wear_suit + var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit P = C.jetpack if(J) if(J.allow_thrust(0.01, H)) @@ -695,8 +684,8 @@ if((H.disabilities & FAT)) mspeed += 1.5 - if(H.bodytemperature < 283.222) - mspeed += (283.222 - H.bodytemperature) / 10 * (grav+0.5) + if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + mspeed += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR mspeed += speedmod @@ -713,11 +702,15 @@ ////////////////// /datum/species/proc/spec_attack_hand(var/mob/living/carbon/human/M, var/mob/living/carbon/human/H) + if(!istype(M)) //sanity check for drones. + return if((M != H) && H.check_shields(0, M.name)) add_logs(M, H, "attempted to touch") H.visible_message("[M] attempted to touch [H]!") return 0 + var/datum/martial_art/attacker_style = M.martial_art + switch(M.a_intent) if("help") if(H.health >= 0) @@ -725,132 +718,119 @@ if(H != M) add_logs(M, H, "shaked") return 1 - - //CPR - if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH))) - M << "Remove your mask!" - return 0 - if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH))) - M << "Remove their mask!" - return 0 - - if(H.cpr_time < world.time + 30) - add_logs(M, H, "CPRed") - M.visible_message("[M] is trying to perform CPR on [H]!", \ - "You try to perform CPR on [H]. Hold still!") - if(!do_mob(M, H)) - M << "You fail to perform CPR on [H]!" - return 0 - if((H.health >= -99 && H.health <= 0)) - H.cpr_time = world.time - var/suff = min(H.getOxyLoss(), 7) - H.adjustOxyLoss(-suff) - H.updatehealth() - M.visible_message("[M] performs CPR on [H]!") - H << "You feel a breath of fresh air enter your lungs. It feels good." + else + M.do_cpr(H) if("grab") - H.grabbedby(M) - return 1 + if(attacker_style && attacker_style.grab_act(M,H)) + return 1 + else + H.grabbedby(M) + return 1 if("harm") - add_logs(M, H, "punched") - M.do_attack_animation(H) - - var/atk_verb = "punch" - if(H.lying) - atk_verb = "kick" - else if(M.dna) - atk_verb = M.dna.species.attack_verb - - var/damage = rand(0, 9) - if(M.dna) - damage += M.dna.species.punchmod - - if(!damage) - if(M.dna) - playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1) - else - playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - H.visible_message("[M] has attempted to [atk_verb] [H]!") - return 0 - - - var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) - var/armor_block = H.run_armor_check(affecting, "melee") - - if(M.dna) - playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) + if(attacker_style && attacker_style.harm_act(M,H)) + return 1 else - playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) + add_logs(M, H, "punched") + M.do_attack_animation(H) + + var/atk_verb = "punch" + if(H.lying) + atk_verb = "kick" + else if(M.dna) + atk_verb = M.dna.species.attack_verb + + var/damage = rand(0, 9) + if(M.dna) + damage += M.dna.species.punchmod + + if(!damage) + if(M.dna) + playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1) + else + playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + H.visible_message("[M] has attempted to [atk_verb] [H]!") + return 0 - H.visible_message("[M] has [atk_verb]ed [H]!", \ - "[M] has [atk_verb]ed [H]!") + var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) + var/armor_block = H.run_armor_check(affecting, "melee") - H.apply_damage(damage, BRUTE, affecting, armor_block) - if((H.stat != DEAD) && damage >= 9) - H.visible_message("[M] has weakened [H]!", \ - "[M] has weakened [H]!") - H.apply_effect(4, WEAKEN, armor_block) - H.forcesay(hit_appends) - else if(H.lying) - H.forcesay(hit_appends) + if(M.dna) + playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) + else + playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1) + + H.visible_message("[M] has [atk_verb]ed [H]!", \ + "[M] has [atk_verb]ed [H]!") + + H.apply_damage(damage, BRUTE, affecting, armor_block) + if((H.stat != DEAD) && damage >= 9) + H.visible_message("[M] has weakened [H]!", \ + "[M] has weakened [H]!") + H.apply_effect(4, WEAKEN, armor_block) + H.forcesay(hit_appends) + else if(H.lying) + H.forcesay(hit_appends) if("disarm") - M.do_attack_animation(H) - add_logs(M, H, "disarmed") + if(attacker_style && attacker_style.disarm_act(M,H)) + return 1 + else + M.do_attack_animation(H) + add_logs(M, H, "disarmed") - if(H.w_uniform) - H.w_uniform.add_fingerprint(M) - var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) - var/randn = rand(1, 100) - if(randn <= 25) - H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee")) - playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - H.visible_message("[M] has pushed [H]!", - "[M] has pushed [H]!") - H.forcesay(hit_appends) - return + if(H.w_uniform) + H.w_uniform.add_fingerprint(M) + var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting)) + var/randn = rand(1, 100) + if(randn <= 25) + playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + H.visible_message("[M] has pushed [H]!", + "[M] has pushed [H]!") + H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!")) + H.forcesay(hit_appends) + return - var/talked = 0 // BubbleWrap + var/talked = 0 // BubbleWrap - if(randn <= 60) - //BubbleWrap: Disarming breaks a pull - if(H.pulling) - H.visible_message("[M] has broken [H]'s grip on [H.pulling]!") - talked = 1 - H.stop_pulling() - - //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? - if(istype(H.l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/lgrab = H.l_hand - if(lgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!") + if(randn <= 60) + //BubbleWrap: Disarming breaks a pull + if(H.pulling) + H.visible_message("[M] has broken [H]'s grip on [H.pulling]!") talked = 1 - spawn(1) - qdel(lgrab) - if(istype(H.r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/rgrab = H.r_hand - if(rgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!") - talked = 1 - spawn(1) - qdel(rgrab) - //End BubbleWrap + H.stop_pulling() - if(!talked) //BubbleWrap - if(H.drop_item()) - H.visible_message("[M] has disarmed [H]!", \ - "[M] has disarmed [H]!") - playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - return + //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? + if(istype(H.l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/lgrab = H.l_hand + if(lgrab.affecting) + H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!") + talked = 1 + spawn(1) + qdel(lgrab) + if(istype(H.r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/rgrab = H.r_hand + if(rgrab.affecting) + H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!") + talked = 1 + spawn(1) + qdel(rgrab) + //End BubbleWrap + + if(!talked) //BubbleWrap + if(H.drop_item()) + H.visible_message("[M] has disarmed [H]!", \ + "[M] has disarmed [H]!") + playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return - playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - H.visible_message("[M] attempted to disarm [H]!", \ - "[M] attemped to disarm [H]!") + playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + H.visible_message("[M] attempted to disarm [H]!", \ + "[M] attemped to disarm [H]!") return /datum/species/proc/spec_attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/obj/item/organ/limb/affecting, var/hit_area, var/intent, var/obj/item/organ/limb/target_limb, target_area, var/mob/living/carbon/human/H) @@ -869,7 +849,7 @@ else return 0 - var/armor = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].") + var/armor = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].") if(armor >= 100) return 0 var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) @@ -1163,7 +1143,7 @@ return 1 /datum/species/proc/handle_breath_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures - if( (abs(310.15 - breath.temperature) > 50) && !(mutations_list[COLDRES] in H.dna.mutations) && !(COLDRES in specflags)) // Hot air hurts :( + if(abs(310.15 - breath.temperature) > 50) if(!(mutations_list[COLDRES] in H.dna.mutations)) // COLD DAMAGE switch(breath.temperature) @@ -1182,18 +1162,18 @@ H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head") if(1000 to INFINITY) H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head") + /datum/species/proc/handle_environment(datum/gas_mixture/environment, var/mob/living/carbon/human/H) if(!environment) return var/loc_temp = H.get_temperature(environment) - //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]" - //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit. - if(H.stat != 2) - H.stabilize_temperature_from_calories() + //Body temperature is adjusted in two steps. First, your body tries to stabilize itself a bit. + if(H.stat != DEAD) + H.natural_bodytemperature_stabilization() - //After then, it reacts to the surrounding atmosphere based on your thermal protection + //Then, it reacts to the surrounding atmosphere based on your thermal protection if(!H.on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases if(loc_temp < H.bodytemperature) //Place is colder than we are @@ -1298,13 +1278,6 @@ H.AddLuminosity(-3) H.update_fire() -#undef SPECIES_LAYER -#undef BODY_BEHIND_LAYER -#undef BODY_LAYER -#undef BODY_ADJ_LAYER -#undef HAIR_LAYER -#undef BODY_FRONT_LAYER - #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 74248154ddf..f87374ee822 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -34,7 +34,7 @@ attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/lizard + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard /datum/species/lizard/handle_speech(message) // jesus christ why @@ -58,7 +58,7 @@ miss_sound = 'sound/weapons/slashmiss.ogg' burnmod = 1.25 heatmod = 1.5 - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/plant + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant /datum/species/plant/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "plantbgone") @@ -70,10 +70,9 @@ switch(proj_type) if(/obj/item/projectile/energy/floramut) if(prob(15)) - H.apply_effect((rand(30,80)),IRRADIATE) + H.irradiate(rand(30,80)) H.Weaken(5) - for (var/mob/V in viewers(H)) - V.show_message("[H] writhes in pain as \his vacuoles boil.", 3, "You hear the crunching of leaves.", 2) + H.visible_message("[H] writhes in pain as \his vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.") if(prob(80)) randmutb(H) domutcheck(H,null) @@ -82,7 +81,7 @@ domutcheck(H,null) else H.adjustFireLoss(rand(5,15)) - H.show_message("The radiation beam singes you!") + H.show_message("The radiation beam singes you!") if(/obj/item/projectile/energy/florayield) H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL) return @@ -127,7 +126,7 @@ darksight = 8 sexes = 0 ignored_by = list(/mob/living/simple_animal/hostile/faithless) - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/shadow + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow specflags = list(NOBREATH,NOBLOOD,RADIMMUNE) /datum/species/shadow/spec_life(mob/living/carbon/human/H) @@ -158,7 +157,7 @@ hair_color = "mutcolor" hair_alpha = 150 ignored_by = list(/mob/living/simple_animal/slime) - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimejelly var/recently_changed = 1 @@ -198,7 +197,7 @@ say_mod = "chirps" eyes = "jelleyes" specflags = list(MUTCOLORS,EYECOLOR,NOBLOOD) - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimejelly var/recently_changed = 1 @@ -233,13 +232,13 @@ // Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck. name = "Golem" id = "golem" - specflags = list(NOBREATH,HEATRES,COLDRES,NOGUNS,NOBLOOD,RADIMMUNE) + specflags = list(NOBREATH,HEATRES,COLDRES,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE) speedmod = 3 armor = 55 punchmod = 5 no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_head, slot_w_uniform) nojumpsuit = 1 - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem /* @@ -249,7 +248,7 @@ /datum/species/golem/adamantine name = "Adamantine Golem" id = "adamantine" - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem/adamantine + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine /* FLIES @@ -260,7 +259,7 @@ name = "Human?" id = "fly" say_mod = "buzzes" - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/fly + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "pestkiller") @@ -281,8 +280,8 @@ id = "skeleton" say_mod = "rattles" sexes = 0 - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton - specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE) + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton + specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE,VIRUSIMMUNE) /* ZOMBIES */ @@ -293,7 +292,7 @@ id = "zombie" say_mod = "moans" sexes = 0 - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE) /datum/species/zombie/handle_speech(message) @@ -316,4 +315,32 @@ name = "Human" id = "zombie" sexes = 0 - meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie + + +/datum/species/abductor + name = "Abductor" + id = "abductor" + darksight = 3 + say_mod = "gibbers" + sexes = 0 + invis_sight = SEE_INVISIBLE_LEVEL_ONE + specflags = list(NOBLOOD,NOBREATH,VIRUSIMMUNE) + var/scientist = 0 // vars to not pollute spieces list with castes + var/agent = 0 + var/team = 1 + +/datum/species/abductor/handle_speech(message) + //Hacks + var/mob/living/carbon/human/user = usr + for(var/mob/living/carbon/human/H in mob_list) + if(H.dna.species.id != "abductor") + continue + else + var/datum/species/abductor/target_spec = H.dna.species + if(target_spec.team == team) + H << "[user.name]: [message]" + //return - technically you can add more aliens to a team + for(var/mob/M in dead_mob_list) + M << "[user.name]: [message]" + return "" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8d1c801472a..c33e23bbf8e 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -260,17 +260,22 @@ Please contact me on #coderbus IRC. ~Carnie x if(!t_color) t_color = icon_state var/image/standing + + var/iconfile2use //Which icon file to use to generate the overlay and any female alterations. + if(U.alternate_worn_icon) - standing = image("icon"=U.alternate_worn_icon, "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER) - if(!standing) - standing = image("icon"='icons/mob/uniform.dmi', "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER) + iconfile2use = U.alternate_worn_icon + if(!iconfile2use) + iconfile2use = 'icons/mob/uniform.dmi' + + standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER) overlays_standing[UNIFORM_LAYER] = standing if(dna && dna.species.sexes) var/G = (gender == FEMALE) ? "f" : "m" if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) - standing = wear_female_version(t_color, 'icons/mob/uniform.dmi', UNIFORM_LAYER, U.fitted) + standing = wear_female_version(t_color, iconfile2use, UNIFORM_LAYER, U.fitted) overlays_standing[UNIFORM_LAYER] = standing if(w_uniform.blood_DNA) @@ -626,6 +631,14 @@ Please contact me on #coderbus IRC. ~Carnie x var/standing = image("icon"=female_clothing_icons["[t_color]_s"], "layer"=-layer) return(standing) +/mob/living/carbon/human/proc/get_overlays_copy(var/list/unwantedLayers) + var/list/out = new + for(var/i=1;i<=TOTAL_LAYERS;i++) + if(overlays_standing[i]) + if(i in unwantedLayers) + continue + out += overlays_standing[i] + return out //Human Overlays Indexes///////// #undef SPECIES_LAYER diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index daebf276b12..997387dd784 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -238,15 +238,8 @@ if(reagents) reagents.metabolize(src) -/mob/living/carbon/handle_blood() - return - -/mob/living/carbon/handle_random_events() - return - /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) @@ -375,8 +368,6 @@ /mob/living/carbon/handle_regular_hud_updates() if(!client) return 0 - update_action_buttons() - if(damageoverlay) if(damageoverlay.overlays) damageoverlay.overlays = list() @@ -472,7 +463,10 @@ sight &= ~SEE_MOBS if(!(SEE_OBJS & permanent_sight_flags)) sight &= ~SEE_OBJS - + if(remote_view) + sight |= SEE_TURFS + sight |= SEE_MOBS + 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) @@ -502,3 +496,20 @@ healths.icon_state = "health6" else healths.icon_state = "health7" + + +//used in human and monkey handle_environment() +/mob/living/carbon/proc/natural_bodytemperature_stabilization() + var/body_temperature_difference = 310.15 - bodytemperature + switch(bodytemperature) + if(-INFINITY to 260.15) //260.15 is 310.15 - 50, the temperature where you start to feel effects. + if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. + nutrition -= 2 + bodytemperature += max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) + if(260.15 to 310.15) + bodytemperature += max(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, min(body_temperature_difference, BODYTEMP_AUTORECOVERY_MINIMUM/4)) + if(310.15 to 360.15) + bodytemperature += min(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, max(body_temperature_difference, -BODYTEMP_AUTORECOVERY_MINIMUM/4)) + if(360.15 to INFINITY) //360.15 is 310.15 + 50, the temperature where you start to feel effects. + //We totally need a sweat system cause it totally makes sense...~ + bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 12cac68350c..1a11316bb04 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -18,10 +18,6 @@ if(prob(1)) emote(pick("scratch","jump","roll","tail")) -/mob/living/carbon/monkey/calculate_affecting_pressure(var/pressure) - ..() - return pressure - /mob/living/carbon/monkey/handle_mutations_and_radiation() if (radiation) @@ -46,23 +42,69 @@ emote("gasp") ..() +/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath) + if(abs(310.15 - breath.temperature) > 50) + switch(breath.temperature) + if(-INFINITY to 120) + adjustFireLoss(3) + if(120 to 200) + adjustFireLoss(1.5) + if(200 to 260) + adjustFireLoss(0.5) + if(360 to 400) + adjustFireLoss(2) + if(400 to 1000) + adjustFireLoss(3) + if(1000 to INFINITY) + adjustFireLoss(8) /mob/living/carbon/monkey/handle_environment(datum/gas_mixture/environment) if(!environment) return - var/environment_heat_capacity = environment.heat_capacity() - if(istype(get_turf(src), /turf/space)) - var/turf/heat_turf = get_turf(src) - environment_heat_capacity = heat_turf.heat_capacity - if(!on_fire) - if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) - var/transfer_coefficient = 1 + var/loc_temp = get_temperature(environment) - handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) + if(stat != DEAD) + natural_bodytemperature_stabilization() - if(stat != 2) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) + if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases + if(loc_temp < bodytemperature) + bodytemperature += min(((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX) + else + bodytemperature += min(((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX) + + if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) + switch(bodytemperature) + if(360 to 400) + throw_alert("temp","hot",1) + adjustFireLoss(2) + if(400 to 460) + throw_alert("temp","hot",2) + adjustFireLoss(3) + if(460 to INFINITY) + throw_alert("temp","hot",3) + if(on_fire) + adjustFireLoss(8) + else + adjustFireLoss(3) + + else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) + switch(bodytemperature) + if(200 to 260) + throw_alert("temp","cold",1) + adjustFireLoss(0.5) + if(120 to 200) + throw_alert("temp","cold",2) + adjustFireLoss(1.5) + if(-INFINITY to 120) + throw_alert("temp","cold",3) + adjustFireLoss(3) + else + clear_alert("temp") + + else + clear_alert("temp") //Account for massive pressure differences @@ -84,14 +126,6 @@ return -/mob/living/carbon/monkey/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(status_flags & GODMODE) return - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - - if(exposed_temperature > bodytemperature) - adjustFireLoss(20.0*discomfort) - else - adjustFireLoss(5.0*discomfort) /mob/living/carbon/monkey/handle_hud_icons() @@ -107,7 +141,7 @@ /mob/living/carbon/monkey/handle_changeling() - if(mind) + if(mind && hud_used) if(mind.changeling) mind.changeling.regenerate() hud_used.lingchemdisplay.invisibility = 0 @@ -120,10 +154,8 @@ if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) return 1 -///FIRE CODE /mob/living/carbon/monkey/handle_fire() if(..()) return - adjustFireLoss(6) + bodytemperature += BODYTEMP_HEATING_MAX return -//END FIRE CODE diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d275d0744ba..51b73cc9a7a 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -204,6 +204,9 @@ /mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools return 0 +/mob/living/carbon/monkey/reagent_check(var/datum/reagent/R) //can metabolize all reagents + return 0 + /mob/living/carbon/monkey/canBeHandcuffed() return 1 @@ -241,10 +244,6 @@ return threatcount -/mob/living/carbon/monkey/SpeciesCanConsume() - return 1 // Monkeys can eat, drink, and be forced to do so - - /mob/living/carbon/monkey/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) if(wear_mask) if(!wear_mask.unacidable) @@ -255,3 +254,10 @@ return take_organ_damage(min(6*toxpwr, acid_volume * toxpwr)) + +/mob/living/carbon/monkey/help_shake_act(mob/living/carbon/M) + if(health < 0 && ishuman(M)) + var/mob/living/carbon/human/H = M + H.do_cpr(src) + else + ..() diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 1136f3533bb..40c8b4f11e2 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -11,11 +11,11 @@ changed++ ntransform.TurnTo(lying_prev,lying) if(lying == 0) //Lying to standing - final_pixel_y = initial(pixel_y) + final_pixel_y = get_standard_pixel_y_offset() else //if(lying != 0) if(lying_prev == 0) //Standing to lying - pixel_y = initial(pixel_y) - final_pixel_y = lying_pixel_offset + pixel_y = get_standard_pixel_y_offset() + final_pixel_y = get_standard_pixel_y_offset(lying) if(dir & (EAST|WEST)) //Facing east or west final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index d420721feef..89a35a4e605 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -51,7 +51,7 @@ if(PARALYZE) Paralyse(effect * blocked) if(IRRADIATE) - radiation += max(effect * ((100-run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm."))/100),0)//Rads auto check armor + radiation += max(effect * blocked, 0) if(SLUR) slurring = max(slurring,(effect * blocked)) if(STUTTER) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index e2f440bcfb5..af02c55f543 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -47,6 +47,8 @@ handle_disabilities() // eye, ear, brain damages handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc + handle_actions() + update_canmove() if(client) @@ -131,6 +133,22 @@ if(ear_damage < 100) adjustEarDamage(-0.05,-1) +/mob/living/proc/handle_actions() + //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent + for(var/datum/action/A in actions) + if(A.CheckRemoval(src)) + A.Remove(src) + for(var/obj/item/I in src) + if(I.action_button_name) + if(!I.action) + if(I.action_button_is_hands_free) + I.action = new/datum/action/item_action/hands_free + else + I.action = new/datum/action/item_action + I.action.name = I.action_button_name + I.action.target = I + I.action.Grant(src) + return //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() @@ -138,6 +156,7 @@ handle_vision() handle_hud_icons() + update_action_buttons() return 1 @@ -185,3 +204,56 @@ /mob/living/proc/handle_hud_icons_health() return + +/mob/living/update_action_buttons() + if(!hud_used) return + if(!client) return + + if(hud_used.hud_shown != 1) //Hud toggled to minimal + return + + client.screen -= hud_used.hide_actions_toggle + for(var/datum/action/A in actions) + if(A.button) + client.screen -= A.button + + if(hud_used.action_buttons_hidden) + if(!hud_used.hide_actions_toggle) + hud_used.hide_actions_toggle = new(hud_used) + hud_used.hide_actions_toggle.UpdateIcon() + + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1) + //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1) + + client.screen += hud_used.hide_actions_toggle + return + + var/button_number = 0 + for(var/datum/action/A in actions) + button_number++ + if(A.button == null) + var/obj/screen/movable/action_button/N = new(hud_used) + N.owner = A + A.button = N + + var/obj/screen/movable/action_button/B = A.button + + B.UpdateIcon() + + B.name = A.UpdateName() + + client.screen += B + + if(!B.moved) + B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + //hud_used.SetButtonCoords(B,button_number) + + if(button_number > 0) + if(!hud_used.hide_actions_toggle) + hud_used.hide_actions_toggle = new(hud_used) + hud_used.hide_actions_toggle.InitialiseIcon(src) + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) + //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) + client.screen += hud_used.hide_actions_toggle diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index eed82116b44..8c64cbf773e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -193,7 +193,7 @@ Sorry Giacom. Please don't be mad :( //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage /mob/living/proc/calculate_affecting_pressure(var/pressure) - return 0 + return pressure //sort of a legacy burn method for /electrocute, /shock, and the e_chair @@ -551,9 +551,8 @@ Sorry Giacom. Please don't be mad :( if ((s_active && !( s_active in contents ) )) s_active.close(src) - if(update_slimes) - for(var/mob/living/simple_animal/slime/M in view(1,src)) - M.UpdateFeed(src) + for(var/mob/living/simple_animal/slime/M in oview(1,src)) + M.UpdateFeed(src) /mob/living/proc/makeTrail(var/turf/T, var/mob/living/M) if(ishuman(M)) @@ -667,13 +666,13 @@ Sorry Giacom. Please don't be mad :( float(!has_gravity) /mob/living/proc/float(on) + if(throwing) + return if(on && !floating) animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) floating = 1 else if(!on && floating) - var/final_pixel_y = initial(pixel_y) - if(lying && !buckled) - final_pixel_y = lying_pixel_offset + var/final_pixel_y = get_standard_pixel_y_offset(lying) animate(src, pixel_y = final_pixel_y, time = 10) floating = 0 @@ -695,7 +694,7 @@ Sorry Giacom. Please don't be mad :( // Override if a certain type of mob should be behave differently when stripping items (can't, for example) /mob/living/stripPanelUnequip(obj/item/what, mob/who, where) if(what.flags & NODROP) - src << "You can't remove \the [what.name], it appears to be stuck!" + src << "You can't remove \the [what.name], it appears to be stuck!" return who.visible_message("[src] tries to remove [who]'s [what.name].", \ "[src] tries to remove [who]'s [what.name].") @@ -710,7 +709,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/stripPanelEquip(obj/item/what, mob/who, where) what = src.get_active_hand() if(what && (what.flags & NODROP)) - src << "You can't put \the [what.name] on [who], it's stuck to your hand!" + src << "You can't put \the [what.name] on [who], it's stuck to your hand!" return if(what && what.mob_can_equip(who, where, 1)) visible_message("[src] tries to put [what] on [who].") @@ -771,9 +770,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/do_attack_animation(atom/A) - var/final_pixel_y = initial(pixel_y) - if(lying && !buckled) - final_pixel_y = lying_pixel_offset + var/final_pixel_y = get_standard_pixel_y_offset(lying) ..(A, final_pixel_y) floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life(). @@ -781,11 +778,10 @@ Sorry Giacom. Please don't be mad :( var/amplitude = min(4, (jitteriness/100) + 1) var/pixel_x_diff = rand(-amplitude, amplitude) var/pixel_y_diff = rand(-amplitude/3, amplitude/3) - var/final_pixel_y = initial(pixel_y) - if(lying && !buckled) - final_pixel_y = lying_pixel_offset + var/final_pixel_x = get_standard_pixel_x_offset(lying) + var/final_pixel_y = get_standard_pixel_y_offset(lying) animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) - animate(pixel_x = initial(pixel_x) , pixel_y = final_pixel_y , time = 2) + animate(pixel_x = final_pixel_x , pixel_y = final_pixel_y , time = 2) floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life(). /mob/living/proc/get_temperature(var/datum/gas_mixture/environment) @@ -813,3 +809,9 @@ Sorry Giacom. Please don't be mad :( loc_temp = environment.temperature return loc_temp + +/mob/living/proc/get_standard_pixel_x_offset(lying = 0) + return initial(pixel_x) + +/mob/living/proc/get_standard_pixel_y_offset(lying = 0) + return initial(pixel_y) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index cbacdc681cd..6aa9bda4d25 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -158,7 +158,7 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I) /mob/living/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) take_organ_damage(min(10*toxpwr, acid_volume * toxpwr)) -/mob/living/proc/grabbedby(mob/living/carbon/user) +/mob/living/proc/grabbedby(mob/living/carbon/user,var/supress_message = 0) if(user == src || anchored) return 0 if(!(status_flags & CANPUSH)) @@ -168,7 +168,7 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I) var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src) if(buckled) - user << "You cannot grab [src], \he is buckled in!" + user << "You cannot grab [src], \he is buckled in!" if(!G) //the grab will delete itself in New if src is anchored return 0 user.put_in_active_hand(G) @@ -176,7 +176,8 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I) LAssailant = user playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[user] has grabbed [src] passively!") + if(!supress_message) + visible_message("[user] has grabbed [src] passively!") /mob/living/attack_slime(mob/living/simple_animal/slime/M as mob) @@ -277,3 +278,8 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I) /mob/living/incapacitated() if(stat || paralysis || stunned || weakened || restrained()) return 1 + +/mob/living/proc/irradiate(amount) + if(amount) + var/blocked = run_armor_check(null, "rad", "Your clothes feel warm", "Your clothes feel warm") + apply_effect(amount, IRRADIATE, blocked) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index a9e6d1863c4..59436c1028b 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -32,7 +32,6 @@ var/cameraFollow = null var/tod = null // Time of death - var/update_slimes = 1 var/on_fire = 0 //The "Are we on fire?" var var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20 @@ -41,7 +40,9 @@ var/floating = 0 var/mob_size = MOB_SIZE_HUMAN var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature.. - var/list/image/staticOverlays = list() + var/has_limbs = 0 //does the mob have distinct limbs?(arms,legs, chest,head) + var/list/datum/action/actions = list() - var/lying_pixel_offset = 0 //offset for pixel_y when the mob is lying down. \ No newline at end of file + var/list/pipes_shown = list() + var/last_played_vent \ No newline at end of file diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index eb582bbcfa1..0b46914c42b 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -10,7 +10,11 @@ if("sandbox") CanBuild() + //Vents if(ventcrawler) src << "You can ventcrawl! Use alt+click on vents to quickly travel about the station." + //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. + update_pipe_vision() + update_interface() return . diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c7a13f69e26..e5986aa8589 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -16,6 +16,7 @@ var/list/department_radio_keys = list( ":v" = "Service", "#v" = "Service", ".v" = "Service", ":o" = "AI Private", "#o" = "AI Private", ".o" = "AI Private", ":g" = "changeling", "#g" = "changeling", ".g" = "changeling", + ":y" = "Centcom", "#y" = "Centcom", ".y" = "Centcom", ":R" = "right hand", "#R" = "right hand", ".R" = "right hand", ":L" = "left hand", "#L" = "left hand", ".L" = "left hand", @@ -34,6 +35,7 @@ var/list/department_radio_keys = list( ":V" = "Service", "#V" = "Service", ".V" = "Service", ":O" = "AI Private", "#O" = "AI Private", ".O" = "AI Private", ":G" = "changeling", "#G" = "changeling", ".G" = "changeling", + ":Y" = "Centcom", "#Y" = "Centcom", ".Y" = "Centcom", //kinda localization -- rastaf0 //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index a25993a8161..2c7083a8206 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -224,6 +224,11 @@ var/list/ai_list = list() else stat(null, text("Systems nonfunctional")) +/mob/living/silicon/ai/canUseTopic() + if(stat) + return + return 1 + /mob/living/silicon/ai/proc/ai_alerts() var/dat = "Current Station Alerts\n" dat += "Close

      " diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index faab21b72d3..48adee0e407 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -21,26 +21,24 @@ // Add an AI eye to the chunk, then update if changed. -/datum/camerachunk/proc/add(mob/camera/aiEye/ai) - if(!ai.ai) - return - ai.visibleCameraChunks += src - if(ai.ai.client) - ai.ai.client.images += obscured +/datum/camerachunk/proc/add(mob/camera/aiEye/eye) + var/client/client = eye.GetViewerClient() + if(client) + client.images += obscured + eye.visibleCameraChunks += src visible++ - seenby += ai + seenby += eye if(changed && !updating) update() // Remove an AI eye from the chunk, then update if changed. -/datum/camerachunk/proc/remove(mob/camera/aiEye/ai) - if(!ai.ai) - return - ai.visibleCameraChunks -= src - if(ai.ai.client) - ai.ai.client.images -= obscured - seenby -= ai +/datum/camerachunk/proc/remove(mob/camera/aiEye/eye) + var/client/client = eye.GetViewerClient() + if(client) + client.images -= obscured + eye.visibleCameraChunks -= src + seenby -= eye if(visible > 0) visible-- @@ -106,10 +104,11 @@ obscured -= t.obscured for(var/eye in seenby) var/mob/camera/aiEye/m = eye - if(!m || !m.ai) + if(!m) continue - if(m.ai.client) - m.ai.client.images -= t.obscured + var/client/client = m.GetViewerClient() + if(client) + client.images -= t.obscured for(var/turf in visRemoved) var/turf/t = turf @@ -120,11 +119,12 @@ obscured += t.obscured for(var/eye in seenby) var/mob/camera/aiEye/m = eye - if(!m || !m.ai) + if(!m) seenby -= m continue - if(m.ai.client) - m.ai.client.images += t.obscured + var/client/client = m.GetViewerClient() + if(client) + client.images += t.obscured changed = 0 diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index b5e313bb050..d24c734f219 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -31,6 +31,11 @@ /mob/camera/aiEye/Move() return 0 +/mob/camera/aiEye/proc/GetViewerClient() + if(ai) + return ai.client + return null + // AI MOVEMENT @@ -120,3 +125,6 @@ acceleration = !acceleration usr << "Camera acceleration has been toggled [acceleration ? "on" : "off"]." + + + diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index c0017863de6..bc665bd4ec5 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -4,7 +4,7 @@ if(src.cable) if(get_dist(src, src.cable) > 1) var/turf/T = get_turf(src.loc) - T.visible_message("[src.cable] rapidly retracts back into its spool.", "You hear a click and the sound of wire spooling rapidly.") + T.visible_message("[src.cable] rapidly retracts back into its spool.", "You hear a click and the sound of wire spooling rapidly.") qdel(src.cable) cable = null if(silence_time) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index c2062b46546..a324cdbbfe7 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -108,7 +108,7 @@ // 33% chance of no additional effect if(prob(20)) - visible_message("A shower of sparks spray from [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2) + visible_message("A shower of sparks spray from [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2) return src.death(0) silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index c7e6135380f..4144a3a3ef2 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -264,7 +264,7 @@ var/turf/T = get_turf(src.loc) src.cable = new /obj/item/weapon/pai_cable(T) for (var/mob/M in viewers(T)) - M.show_message("A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "You hear the soft click of something light and hard falling to the ground.", 2) + M.show_message("A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "You hear the soft click of something light and hard falling to the ground.", 2) //src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window src.paiInterface() // So we'll just call the update directly rather than doing some default checks return diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 4934daa8060..fe91e38e37d 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -74,7 +74,7 @@ if(istype(module_state_3,/obj/item/borg/sight)) sight_mode |= module_state_3:sight_mode else - src << "You need to disable a module first!" + src << "You need to disable a module first!" /mob/living/silicon/robot/proc/uneq_active() uneq_module(module_active) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 6fcf7c2c9d1..df8ebcfd28d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -8,6 +8,7 @@ var/sight_mode = 0 var/custom_name = "" designation = "Default" //used for displaying the prefix & getting the current module of cyborg + has_limbs = 1 //Hud stuff @@ -399,19 +400,19 @@ user.changeNext_move(CLICK_CD_MELEE) var/obj/item/weapon/weldingtool/WT = W if (src == user) - user << "You lack the reach to be able to repair yourself." + user << "You lack the reach to be able to repair yourself!" return 1 if (src.health >= src.maxHealth) - user << "[src] is already in good condition." + user << "[src] is already in good condition!" return 1 if (WT.remove_fuel(0, user)) adjustBruteLoss(-30) updatehealth() add_fingerprint(user) - visible_message("[user] has fixed some of the dents on [src].") + visible_message("[user] has fixed some of the dents on [src].") return 0 else - user << "The welder must be on for this task." + user << "The welder must be on for this task!" return 1 else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) @@ -419,33 +420,33 @@ if (coil.use(1)) adjustFireLoss(-30) updatehealth() - visible_message("[user] has fixed some of the burnt wires on [src].") + user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].") else - user << "You need one length of cable to repair [src]." + user << "You need one length of cable to repair [src]!" else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover if(opened) - user << "You close the cover." + user << "You close the cover." opened = 0 update_icons() else if(locked) - user << "The cover is locked and cannot be opened." + user << "The cover is locked and cannot be opened!" else - user << "You open the cover." + user << "You open the cover." opened = 1 update_icons() else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside if(wiresexposed) - user << "Close the cover first." + user << "Close the cover first!" else if(cell) - user << "There is a power cell already installed." + user << "There is a power cell already installed!" else user.drop_item() W.loc = src cell = W - user << "You insert the power cell." + user << "You insert the power cell." // chargecount = 0 update_icons() @@ -453,7 +454,7 @@ if (wiresexposed) wires.Interact(user) else - user << "You can't reach the wiring." + user << "You can't reach the wiring!" else if(istype(W, /obj/item/weapon/screwdriver) && opened && !cell) // haxing wiresexposed = !wiresexposed @@ -464,7 +465,7 @@ if(radio) radio.attackby(W,user)//Push it to the radio to let it handle everything else - user << "Unable to locate a radio." + user << "Unable to locate a radio!" update_icons() else if(istype(W, /obj/item/weapon/wrench) && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module. @@ -474,20 +475,21 @@ return else playsound(src, 'sound/items/Ratchet.ogg', 50, 1) + user << "You start to unfasten [src]'s securing bolts..." if(do_after(user, 50) && !cell) - user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") + user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") deconstruct() else if(istype(W, /obj/item/weapon/aiModule)) var/obj/item/weapon/aiModule/MOD = W if(!opened) - user << "You need access to the robot's insides to do that." + user << "You need access to the robot's insides to do that!" return if(wiresexposed) - user << "You need to close the wire panel to do that." + user << "You need to close the wire panel to do that!" return if(!cell) - user << "You need to install a power cell to do that." + user << "You need to install a power cell to do that!" return if(emagged || (connected_ai && lawupdate)) //Can't be sure which, metagamers emote("buzz-[user.name]") @@ -499,17 +501,17 @@ if(radio)//sanityyyyyy radio.attackby(W,user)//GTFO, you have your own procs else - user << "Unable to locate a radio." + user << "Unable to locate a radio!" else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged)//still allow them to open the cover - user << "The interface seems slightly damaged" + user << "The interface seems slightly damaged." if(opened) - user << "You must close the cover to swipe an ID card." + user << "You must close the cover to swipe an ID card!" else if(allowed(usr)) locked = !locked - user << "You [ locked ? "lock" : "unlock"] [src]'s cover." + user << "You [ locked ? "lock" : "unlock"] [src]'s cover." update_icons() else user << "Access denied." @@ -517,27 +519,27 @@ else if(istype(W, /obj/item/borg/upgrade/)) var/obj/item/borg/upgrade/U = W if(!opened) - usr << "You must access the borgs internals!" + usr << "You must access the borgs internals!" else if(!src.module && U.require_module) - usr << "The borg must choose a module before it can be upgraded!" + usr << "The borg must choose a module before it can be upgraded!" else if(U.locked) - usr << "The upgrade is locked and cannot be used yet!" + usr << "The upgrade is locked and cannot be used yet!" else if(U.action(src)) - usr << "You apply the upgrade to [src]!" + usr << "You apply the upgrade to [src]." usr.drop_item() U.loc = src else - usr << "Upgrade error!" + usr << "Upgrade error." else if(istype(W, /obj/item/device/toner)) if(toner >= tonermax) - usr << "The toner level of [src] is at it's highest level possible" + usr << "The toner level of [src] is at it's highest level possible!" else toner = 40 usr.drop_item() qdel(W) - usr << "You fill the toner level of [src] to it's max capacity" + usr << "You fill the toner level of [src] to its max capacity." else if(W.force && W.damtype != STAMINA) //only sparks if real damage is dealt. @@ -549,19 +551,19 @@ if(!opened)//Cover is closed if(locked) if(prob(90)) - user << "You emag the cover lock." + user << "You emag the cover lock." locked = 0 else - user << "You fail to emag the cover lock." + user << "You fail to emag the cover lock!" if(prob(25)) - src << "Hack attempt detected." + src << "Hack attempt detected." else - user << "The cover is already unlocked." + user << "The cover is already unlocked!" return if(opened)//Cover is open if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice if(wiresexposed) - user << "You must close the cover first" + user << "You must close the cover first!" return else sleep(6) @@ -570,7 +572,7 @@ SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown lawupdate = 0 connected_ai = null - user << "You emag [src]'s interface." + user << "You emag [src]'s interface." message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") clear_supplied_laws() @@ -598,9 +600,9 @@ SetLockdown(0) update_icons() else - user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface." + user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface!" if(prob(25)) - src << "Hack attempt detected." + src << "ALERT: Hack attempt detected." /mob/living/silicon/robot/verb/unlock_own_cover() set category = "Robot Commands" @@ -611,7 +613,7 @@ if("Yes") locked = 0 update_icons() - usr << "You unlock your cover." + usr << "You unlock your cover." /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (M.a_intent =="disarm") @@ -665,7 +667,7 @@ cell.updateicon() cell.add_fingerprint(user) user.put_in_active_hand(cell) - user << "You remove \the [cell]." + user << "You remove \the [cell]." cell = null update_icons() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 374bfa98088..0dd8e573b71 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -212,7 +212,8 @@ modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) modules += new /obj/item/weapon/pen(src) modules += new /obj/item/weapon/razor(src) - modules += new /obj/item/device/violin(src) + modules += new /obj/item/device/instrument/violin(src) + modules += new /obj/item/device/instrument/guitar(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.matter = 30 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 24bb007c3d2..82a7a0be1e9 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -389,7 +389,7 @@ /mob/living/silicon/attack_larva(mob/living/carbon/alien/larva/L) if(L.a_intent == "help") - visible_message("[L.name] rubs its head against [src].") + visible_message("[L.name] rubs its head against [src].") return /mob/living/silicon/attack_hulk(mob/living/carbon/human/user) @@ -405,15 +405,15 @@ /mob/living/silicon/attack_hand(mob/living/carbon/human/M) switch(M.a_intent) if ("help") - M.visible_message("[M] pets [src]!", \ - "You pet [src]!") + M.visible_message("[M] pets [src].", \ + "You pet [src].") if("grab") grabbedby(M) else M.do_attack_animation(src) playsound(src.loc, 'sound/effects/bang.ogg', 10, 1) - visible_message("[M] punches [src], but doesn't leave a dent.", \ - "[M] punches [src], but doesn't leave a dent.!") + visible_message("[M] punches [src], but doesn't leave a dent.", \ + "[M] punches [src], but doesn't leave a dent.") return 0 /mob/living/silicon/adjustEarDamage() diff --git a/code/modules/mob/living/simple_animal/ascendant_shadowling.dm b/code/modules/mob/living/simple_animal/ascendant_shadowling.dm new file mode 100644 index 00000000000..9445db7592c --- /dev/null +++ b/code/modules/mob/living/simple_animal/ascendant_shadowling.dm @@ -0,0 +1,33 @@ +/mob/living/simple_animal/ascendant_shadowling + name = "Ascendant Shadowling" + desc = "A large, floating eldritch horror. It has pulsing markings all about its body and large horns. It seems to be floating without any form of support." + icon = 'icons/mob/mob.dmi' + icon_state = "shadowling_ascended" + icon_living = "shadowling_ascended" + speak_emote = list("telepathically thunders", "telepathically booms") + force_threshold = INFINITY //Can't die by normal means + health = 100000 + maxHealth = 100000 + speed = 0 + var/phasing = 0 + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + + response_help = "stares at" + response_disarm = "flails at" + response_harm = "flails at" + + harm_intent_damage = 0 + melee_damage_lower = 35 + melee_damage_upper = 35 + attacktext = "claws at" + attack_sound = 'sound/weapons/slash.ogg' + + minbodytemp = 0 + maxbodytemp = INFINITY + environment_smash = 2 + + faction = list("faithless") + +/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(var/movement_dir = 0) + return 1 //copypasta from carp code diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index d361cfb978c..91595c5c13e 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -14,7 +14,8 @@ health = 2 harm_intent_damage = 1 friendly = "nudges" - pass_flags = PASSTABLE + density = 0 + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = 2 mob_size = MOB_SIZE_TINY diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 8308bf698f8..4af47db2a9f 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -16,7 +16,7 @@ see_in_dark = 6 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_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab meat_amount = 3 response_help = "pets" response_disarm = "gently pushes aside" @@ -79,3 +79,6 @@ icon_living = "kitten" icon_dead = "kitten_dead" gender = NEUTER + density = 0 + pass_flags = PASSMOB + mob_size = MOB_SIZE_SMALL diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 4733bf988bb..29fbf497b7d 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -54,7 +54,7 @@ emote_see = list("shakes its head.", "shivers.") speak_chance = 1 turns_per_move = 10 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi meat_amount = 3 response_help = "pets" response_disarm = "bops" @@ -109,18 +109,18 @@ //helmet and armor = 100% protection if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) ) if( O.force ) - user << "[src] is wearing too much armor. You can't cause \him any damage." + user << "[src] is wearing too much armor! You can't cause \him any damage." visible_message(" [user] hits [src] with [O], however [src] is too armored.") else - user << "[src] is wearing too much armor. You can't reach \his skin." - visible_message("[user] gently taps [src] with [O].") + user << "[src] is wearing too much armor! You can't reach \his skin." + visible_message("[user] gently taps [src] with [O].") if(health>0 && prob(15)) emote("me", 1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.") return if(istype(O, /obj/item/weapon/newspaper)) if(!stat) - user.visible_message("[user] baps [name] on the nose with the rolled up [O]") + user.visible_message("[user] baps [name] on the nose with the rolled up [O].") spawn(0) for(var/i in list(1,2,4,8,4,2,1,2)) dir = i @@ -128,16 +128,19 @@ if (istype(O, /obj/item/weapon/razor)) if (shaved) - user << "You can't shave this corgi, it's already been shaved." + user << "You can't shave this corgi, it's already been shaved!" return - user.visible_message("[user] starts to shave [src] using \the [O].") + user.visible_message("[user] starts to shave [src] using \the [O].", "You start to shave [src] using \the [O]...") if(do_after(user, 50)) - user.visible_message("[user] shaves [src]'s hair using \the [O]. ") + user.visible_message("[user] shaves [src]'s hair using \the [O].") playsound(loc, 'sound/items/Welder2.ogg', 20, 1) shaved = 1 - icon_state = "[initial(icon_living)]_shaved" icon_living = "[initial(icon_living)]_shaved" icon_dead = "[initial(icon_living)]_shaved_dead" + if(stat == CONSCIOUS) + icon_state = icon_living + else + icon_state = icon_dead return ..() @@ -191,13 +194,13 @@ if("back") if(inventory_back) - usr << "It's already wearing something." + usr << "It's already wearing something!" return else var/obj/item/item_to_add = usr.get_active_hand() if(!item_to_add) - usr.visible_message("[usr] pets [src]","You rest your hand on [src]'s back for a moment.") + usr.visible_message("[usr] pets [src].","You rest your hand on [src]'s back for a moment.") return if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess item_to_add.afterattack(src,usr,1) @@ -206,7 +209,7 @@ //The objects that corgis can wear on their backs. var/list/allowed_types = list( /obj/item/clothing/suit/armor/vest, - /obj/item/clothing/suit/space/deathsquad, + /obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/device/radio, /obj/item/device/radio/off, /obj/item/clothing/suit/cardborg, @@ -216,9 +219,9 @@ ) if( ! ( item_to_add.type in allowed_types ) ) - usr << "You set [item_to_add] on [src]'s back, but \he shakes it off!" + usr << "You set [item_to_add] on [src]'s back, but \he shakes it off!" if(!usr.drop_item()) - usr << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!" + usr << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!" return item_to_add.loc = loc if(prob(25)) @@ -247,10 +250,10 @@ return if(inventory_head) - if(user) user << "You can't put more than one hat on [src]!" + if(user) user << "You can't put more than one hat on [src]!" return if(!item_to_add) - user.visible_message("[user] pets [src]","You rest your hand on [src]'s head for a moment.") + user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment.") return @@ -382,30 +385,30 @@ desc = "Can actually be trusted to not run off on his own." valid = 1 - if(/obj/item/clothing/head/helmet/space/deathsquad) + if(/obj/item/clothing/head/helmet/space/hardsuit/deathsquad) name = "Trooper [real_name]" desc = "That's not red paint. That's real corgi blood." valid = 1 if(valid) if(user && !user.drop_item()) - user << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!" + user << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!" return 0 if(health <= 0) user << "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on \him." else if(user) user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.", - "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags \his tail once and barks.", - "You hear a friendly-sounding bark.") + "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags \his tail once and barks.", + "You hear a friendly-sounding bark.") item_to_add.loc = src src.inventory_head = item_to_add regenerate_icons() else if(user && !user.drop_item()) - user << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!" + user << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!" return 0 - user << "You set [item_to_add] on [src]'s head, but \he shakes it off!" + user << "You set [item_to_add] on [src]'s head, but \he shakes it off!" item_to_add.loc = loc if(prob(25)) step_rand(item_to_add) @@ -525,11 +528,14 @@ icon_living = "puppy" icon_dead = "puppy_dead" shaved = 0 + density = 0 + pass_flags = PASSMOB + mob_size = MOB_SIZE_SMALL //puppies cannot wear anything. /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]" + usr << "You can't fit this on [src]!" return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index e4a1f52301c..752b939055a 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -10,7 +10,7 @@ emote_see = list("clacks") speak_chance = 1 turns_per_move = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab meat_amount = 2 response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 6b7f731e675..713710173f4 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -23,6 +23,7 @@ wander = 0 speed = 0 ventcrawler = 2 + density = 0 pass_flags = PASSTABLE | PASSMOB sight = (SEE_TURFS | SEE_OBJS) status_flags = (CANPUSH | CANSTUN | CANWEAKEN) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index d5d8cf19f5c..61ffbe0eecf 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -30,34 +30,34 @@ "can't tell if their ethernet detour is moving or not", "won't be able to reseed enough"+\ " kernels to function properly","can't start their neurotube console") - D << "You can't seem to find the [pick(faux_gadgets)]. Without it, [src] [pick(faux_problems)]." + D << "You can't seem to find the [pick(faux_gadgets)]! Without it, [src] [pick(faux_problems)]." return - D.visible_message("[D] begins to reactivate [src].") + D.visible_message("[D] begins to reactivate [src].", "You begin to reactivate [src]...") if(do_after(user,30,needhand = 1)) health = health_repair_max stat = CONSCIOUS icon_state = icon_living dead_mob_list -= src living_mob_list += src - D.visible_message("[D] reactivates [src]!") + D.visible_message("[D] reactivates [src]!", "You reactivate [src].") alert_drones(DRONE_NET_CONNECT) if(G) G << "DRONE NETWORK: You were reactivated by [D]!" else - D << "You need to remain still to reactivate [src]." + D << "You need to remain still to reactivate [src]!" if("Cannibalize") if(D.health < D.maxHealth) - D.visible_message("[D] begins to cannibalize parts from [src].") + D.visible_message("[D] begins to cannibalize parts from [src].", "You begin to cannibalize parts from [src]...") if(do_after(D, 60,5,0)) - D.visible_message("[D] repairs itself using [src]'s remains!") + D.visible_message("[D] repairs itself using [src]'s remains!", "You repair yourself using [src]'s remains.") D.adjustBruteLoss(-src.maxHealth) new /obj/effect/decal/cleanable/oil/streak(get_turf(src)) qdel(src) else - D << "You need to remain still to cannibalize [src]." + D << "You need to remain still to cannibalize [src]!" else - D << "You're already in perfect condition!" + D << "You're already in perfect condition!" if("Nothing") return @@ -69,9 +69,9 @@ ..() return if(user.get_active_hand()) - user << "Your hands are full." + user << "Your hands are full!" return - src << "[user] is trying to pick you up!" + src << "[user] is trying to pick you up!" if(buckled) user << "[src] is buckled to the [buckled.name] and cannot be picked up!" return @@ -92,15 +92,15 @@ /mob/living/simple_animal/drone/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/screwdriver) && stat != DEAD) if(health < health_repair_max) - user << "You start to tighten loose screws on [src]." + user << "You start to tighten loose screws on [src]..." if(do_after(user,80)) var/repair = health_repair_max - health adjustBruteLoss(-repair) - visible_message("[user] tightens [src == user ? "their" : "[src]'s"] loose screws!") + visible_message("[user] tightens [src == user ? "their" : "[src]'s"] loose screws!", "You tighten [src == user ? "their" : "[src]'s"] loose screws.") else - user << "You need to remain still to tighten [src]'s screws." + user << "You need to remain still to tighten [src]'s screws!" else - user << "[src]'s screws can't get any tighter!" + user << "[src]'s screws can't get any tighter!" else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm b/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm index cd5f65f9274..754f75632f2 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm @@ -22,7 +22,7 @@ light_on = !light_on - src << "Your light is now [light_on ? "on" : "off"]" + src << "Your light is now [light_on ? "on" : "off"]." /mob/living/simple_animal/drone/verb/drone_ping() set category = "Drone" @@ -43,7 +43,7 @@ set category = "Drone" if(!seeStatic) - src << "You have no vision filter to change!" + src << "You have no vision filter to change!" return var/selectedStatic = input("Select a vision filter", "Vision Filter") as null|anything in staticChoices diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 6fd0862b09d..22a7e584ac6 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -12,7 +12,7 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab meat_amount = 4 response_help = "pets" response_disarm = "gently pushes aside" @@ -74,13 +74,13 @@ /mob/living/simple_animal/hostile/retaliate/goat/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass)) - user.visible_message("[user] milks [src] using \the [O].") + user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].") var/obj/item/weapon/reagent_containers/glass/G = O var/transfered = udder.trans_id_to(G, "milk", rand(5,10)) if(G.reagents.total_volume >= G.volume) - user << "[O] is full." + user << "[O] is full!" if(!transfered) - user << "The udder is dry. Wait a bit longer..." + user << "The udder is dry! Wait a bit longer..." else ..() //cow @@ -98,7 +98,7 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab meat_amount = 6 response_help = "pets" response_disarm = "gently pushes aside" @@ -115,7 +115,7 @@ /mob/living/simple_animal/cow/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass)) - user.visible_message("[user] milks [src] using \the [O].") + user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].") var/obj/item/weapon/reagent_containers/glass/G = O var/transfered = udder.trans_id_to(G, "milk", rand(5,10)) if(G.reagents.total_volume >= G.volume) @@ -158,9 +158,10 @@ speak_emote = list("cheeps") emote_hear = list("cheeps") emote_see = list("pecks at the ground","flaps its tiny wings") + density = 0 speak_chance = 2 turns_per_move = 2 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab meat_amount = 1 response_help = "pets" response_disarm = "gently pushes aside" @@ -169,7 +170,7 @@ health = 1 ventcrawler = 2 var/amount_grown = 0 - pass_flags = PASSTABLE | PASSGRILLE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY /mob/living/simple_animal/chick/New() @@ -200,9 +201,10 @@ var/global/chicken_count = 0 speak_emote = list("clucks","croons") emote_hear = list("clucks") emote_see = list("pecks at the ground","flaps its wings viciously") + density = 0 speak_chance = 2 turns_per_move = 3 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab var/egg_type = /obj/item/weapon/reagent_containers/food/snacks/egg var/food_type = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat meat_amount = 2 @@ -216,7 +218,8 @@ var/global/chicken_count = 0 var/eggsFertile = TRUE var/body_color var/icon_prefix = "chicken" - pass_flags = PASSTABLE + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL var/list/feedMessages = list("It clucks happily.","It clucks happily.") var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") var/list/validColors = list("brown","black","white") @@ -239,14 +242,14 @@ var/global/chicken_count = 0 /mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, food_type)) //feedin' dem chickens if(!stat && eggsleft < 8) - var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]" + var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]" user.visible_message(feedmsg) user.drop_item() qdel(O) eggsleft += rand(1, 4) //world << eggsleft else - user << "[name] doesn't seem hungry!" + user << "[name] doesn't seem hungry!" else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index d9322aa283d..b02ff8415f5 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -13,7 +13,7 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 68b8702a403..b03101df7f1 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -15,4 +15,6 @@ response_disarm = "shoos" response_harm = "stomps on" ventcrawler = 2 - mob_size = MOB_SIZE_TINY \ No newline at end of file + density = 0 + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index ad493cebe4c..d2de3523fdd 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -13,14 +13,14 @@ see_in_dark = 6 maxHealth = 5 health = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab meat_amount = 1 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "splats" density = 0 ventcrawler = 2 - pass_flags = PASSTABLE | PASSGRILLE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY var/body_color //brown, gray and white, leave blank for random diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index 5d0359f7478..1086486142d 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -12,7 +12,7 @@ emote_see = list("shakes its head.", "chases its tail.","shivers.") speak_chance = 1 turns_per_move = 10 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/pug + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug meat_amount = 3 response_help = "pets" response_disarm = "bops" @@ -33,7 +33,7 @@ /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]") + user.visible_message("[user] baps [name] on the nose with the rolled up [O].") spawn(0) for(var/i in list(1,2,4,8,4,2,1,2)) dir = i diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 0af9b62a638..49ac9d74de1 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -10,7 +10,7 @@ response_disarm = "shoves" response_harm = "hits" speed = 0 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/xeno + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno skin_type = /obj/item/stack/sheet/animalhide/xeno meat_amount = 3 maxHealth = 100 @@ -19,6 +19,7 @@ melee_damage_lower = 25 melee_damage_upper = 25 attacktext = "slashes" + speak_emote = list("hisses") a_intent = "harm" attack_sound = 'sound/weapons/bladeslice.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 37b2624f63b..47e4f317b8d 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -13,7 +13,7 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/bear + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear meat_amount = 3 response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index a59a31517af..a1a0cd68c9f 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -18,7 +18,8 @@ move_to_delay = 0 environment_smash = 0 mouse_opacity = 2 - pass_flags = PASSTABLE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_SMALL flying = 1 //Spaceborn beings don't get hurt by space diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 27a71e7d037..243159ff767 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -21,6 +21,7 @@ melee_damage_upper = 15 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' + speak_emote = list("gnashes") //Space carp aren't affected by cold. atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index f9477069a5a..173d8ff913f 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -12,4 +12,5 @@ attacktext = "chomps" attack_sound = 'sound/weapons/bite.ogg' faction = list("creature") + speak_emote = list("screams") diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index 84886c63dae..3ca8816a3b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -13,6 +13,7 @@ response_harm = "hits" maxHealth = 45 health = 45 + speak_emote = list("telepathically cries") harm_intent_damage = 15 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index aa8912cb618..e80f1899294 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -18,6 +18,7 @@ melee_damage_upper = 15 attacktext = "grips" attack_sound = 'sound/hallucinations/growl1.ogg' + speak_emote = list("growls") atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 649059d093b..750e20450f8 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -33,7 +33,7 @@ speak_chance = 5 turns_per_move = 5 see_in_dark = 10 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/spider + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/spider meat_amount = 2 response_help = "pets" response_disarm = "gently pushes aside" @@ -97,7 +97,7 @@ // Chops off each leg with a 50/50 chance of harvesting one, until finally calling // default harvest action -/mob/living/simple_animal/hostile/poison/giant_spider/harvest() +/mob/living/simple_animal/hostile/poison/giant_spider/harvest(mob/living/user, sharpness = 1) if(butcher_state > 0) butcher_state-- icon_state = icon_dead + "[butcher_state]" @@ -245,7 +245,7 @@ var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) if(E) - src << "There is already a cluster of eggs here!" + src << "There is already a cluster of eggs here!" else if(!fed) src << "You are too hungry to do this!" else if(busy != LAYING_EGGS) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 4065fcfe198..8df6b5460fc 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -16,20 +16,32 @@ robust_searching = 1 stat_attack = 2 environment_smash = 0 + speak_emote = list("squeaks") + ventcrawler = 2 var/datum/mind/origin + var/egg_lain = 0 /mob/living/simple_animal/hostile/headcrab/proc/Infect(var/mob/living/carbon/human/victim) var/obj/item/body_egg/changeling_egg/egg = new(victim) - egg.owner = origin + if(origin) + egg.owner = origin + else if(mind) // Let's make this a feature + egg.owner = mind victim.internal_organs += egg - visible_message("[src] lays an egg in a [victim]!") + visible_message("[src] lays an egg in a [victim].") + egg_lain = 1 /mob/living/simple_animal/hostile/headcrab/AttackingTarget() + if(egg_lain) + target.attack_animal(src) + return if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.stat == DEAD) Infect(target) - death() + src << "With your egg laid you feel your death rapidly approaching, time to die..." + spawn(100) + death() return target.attack_animal(src) @@ -41,6 +53,7 @@ desc = "Twitching and disgusting" var/datum/mind/owner var/time + var/used /obj/item/body_egg/changeling_egg/egg_process() //Changeling eggs grow in dead people @@ -49,11 +62,17 @@ Pop() obj/item/body_egg/changeling_egg/proc/Pop() - var/mob/living/carbon/monkey/M = new(affected_mob.loc) - owner.transfer_to(M) - owner.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) - M.key = owner.key - affected_mob.gib() + if(!used) + var/mob/living/carbon/monkey/M = new(affected_mob.loc) + if(owner) + owner.transfer_to(M) + owner.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) + M.key = owner.key + if(ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + H.internal_organs.Remove(src) + affected_mob.gib() + used = 1 qdel(src) #undef EGG_INCUBATION_TIME diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 1d19f738c5e..eebd7efb44a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -20,6 +20,7 @@ faction = list("hivebot") atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 + speak_emote = list("states") /mob/living/simple_animal/hostile/hivebot/range name = "hivebot" diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 94dd5acea78..cea4a9d31bd 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -9,7 +9,7 @@ maxHealth = 30 health = 30 see_in_dark = 3 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/killertomato + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/killertomato meat_amount = 1 response_help = "prods" response_disarm = "pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index d9759e6c39d..869100f6e94 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -5,7 +5,7 @@ /mob/living/simple_animal/hostile/mimic name = "crate" desc = "A rectangular steel crate." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/crates.dmi' icon_state = "crate" icon_living = "crate" @@ -22,6 +22,7 @@ attacktext = "attacks" attack_sound = 'sound/weapons/punch1.ogg' var/Attackemote = "growls at" + speak_emote = list("creaks") atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 @@ -36,7 +37,7 @@ /mob/living/simple_animal/hostile/mimic/death() ..(1) - visible_message("[src] stops moving!") + visible_message("[src] stops moving!") ghostize() qdel(src) @@ -51,6 +52,7 @@ /mob/living/simple_animal/hostile/mimic/crate attacktext = "bites" + speak_emote = list("clatters") stop_automated_movement = 1 wander = 0 @@ -172,6 +174,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca icon = O.icon icon_state = O.icon_state icon_living = icon_state + overlays = O.overlays if(istype(O, /obj/structure) || istype(O, /obj/machinery)) health = (anchored * 50) + 50 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index cfc5730e7b7..de377488aeb 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -66,6 +66,7 @@ melee_damage_upper = 12 attacktext = "bites into" a_intent = "harm" + speak_emote = list("chitters") attack_sound = 'sound/weapons/bladeslice.ogg' ranged_cooldown_cap = 4 aggro_vision_range = 9 @@ -131,6 +132,7 @@ attacktext = "barrels into" attack_sound = 'sound/weapons/punch1.ogg' a_intent = "help" + speak_emote = list("screeches") throw_message = "sinks in slowly, before being pushed out of " status_flags = CANPUSH search_objects = 1 @@ -230,6 +232,7 @@ melee_damage_lower = 0 melee_damage_upper = 0 attacktext = "lashes out at" + speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "falls right through the strange body of the" ranged_cooldown = 0 @@ -257,7 +260,7 @@ /obj/item/asteroid/hivelord_core name = "hivelord remains" desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly. Try not to think about what you're eating." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "boiledrorocore" var/inert = 0 @@ -277,7 +280,7 @@ user << "[src] are useless on the dead." return if(H != user) - H.visible_message("[user] forces [H] to eat [src]... they quickly regenerate all injuries!") + H.visible_message("[user] forces [H] to eat [src]... they quickly regenerate all injuries!") else user << "You chomp into [src], barely managing to hold it down, but feel amazingly refreshed in mere moments." playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) @@ -305,6 +308,7 @@ melee_damage_lower = 2 melee_damage_upper = 2 attacktext = "slashes" + speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "falls right through the strange body of the" environment_smash = 0 @@ -334,6 +338,7 @@ ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight ranged_cooldown_cap = 8 friendly = "wails at" + speak_emote = list("bellows") vision_range = 4 speed = 3 maxHealth = 300 @@ -456,7 +461,7 @@ user << "You strengthen [target], improving its resistance against melee attacks." qdel(src) else - user << "You can't improve [C] any further." + user << "You can't improve [C] any further!" return if(istype(target, /obj/mecha/working/ripley)) var/obj/mecha/D = target @@ -478,9 +483,9 @@ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." else - user << "You can't add armour onto the mech while someone is inside!" + user << "You can't add armour onto the mech while someone is inside!" else - user << "You can't improve [D] any further." + user << "You can't improve [D] any further!" return /mob/living/simple_animal/hostile/asteroid/handle_temperature_damage() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index fcfb32ecf65..f75f91096a1 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -26,6 +26,7 @@ speed = 1 ventcrawler = 2 robust_searching = 1 + speak_emote = list("squeaks") var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight @@ -70,10 +71,10 @@ if(istype(L, /mob/living/simple_animal/hostile/mushroom) && stat == DEAD) var/mob/living/simple_animal/hostile/mushroom/M = L if(faint_ticker < 2) - M.visible_message("[M] chews a bit on [src].") + M.visible_message("[M] chews a bit on [src].") faint_ticker++ return - M.visible_message("[M] devours [src]!") + M.visible_message("[M] devours [src]!") var/level_gain = (powerlevel - M.powerlevel) if(level_gain >= -1 && !bruised && !M.ckey)//Player shrooms can't level up to become robust gods. if(level_gain < 1)//So we still gain a level if two mushrooms were the same level @@ -90,7 +91,7 @@ /mob/living/simple_animal/hostile/mushroom/death(gibbed) if(!gibbed) - visible_message("[src] fainted.") + visible_message("[src] fainted.") ..(gibbed) UpdateMushroomCap() @@ -102,7 +103,7 @@ overlays += cap_living /mob/living/simple_animal/hostile/mushroom/proc/Recover() - visible_message("[src] slowly begins to recover.") + visible_message("[src] slowly begins to recover.") faint_ticker = 0 revive() UpdateMushroomCap() @@ -122,7 +123,7 @@ /mob/living/simple_animal/hostile/mushroom/proc/Bruise() if(!bruised && !stat) - src.visible_message("The [src.name] was bruised!") + src.visible_message("The [src.name] was bruised!") bruised = 1 /mob/living/simple_animal/hostile/mushroom/attackby(obj/item/I as obj, mob/user as mob, params) @@ -131,7 +132,7 @@ Recover() qdel(I) else - user << "[src] won't eat it!" + user << "[src] won't eat it!" return if(I.force) Bruise() diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index f707265c255..fa9a2164d9b 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -21,6 +21,7 @@ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 15 + speak_emote = list("yarrs") var/corpse = /obj/effect/landmark/mobcorpse/pirate var/weapon1 = /obj/item/weapon/melee/energy/sword/pirate @@ -43,7 +44,7 @@ /mob/living/simple_animal/hostile/pirate/death() ..(1) - visible_message("[src] stops moving.") + visible_message("[src] stops moving.") if(corpse) new corpse (src.loc) if(weapon1) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index ab47c8992bc..2e45befbe40 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -24,6 +24,7 @@ ventcrawler = 2 mob_size = MOB_SIZE_TINY flying = 1 + speak_emote = list("squeaks") var/max_co2 = 0 //to be removed once metastation map no longer use those for Sgt Araneus var/min_oxy = 0 var/max_tox = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index c9ef9685534..64796ad7e99 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -46,7 +46,7 @@ /mob/living/simple_animal/hostile/russian/death(gibbed) ..(1) - visible_message("[src] stops moving.") + visible_message("[src] stops moving.") if(corpse) new corpse (src.loc) if(weapon1) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 66fc43acd76..d01462502f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -63,8 +63,8 @@ visible_message("[src] blocks [O] with its shield!") playsound(loc, O.hitsound, 25, 1, -1) else - usr << "This weapon is ineffective, it does no damage." - visible_message("[user] gently taps [src] with [O].") + usr << "This weapon is ineffective, it does no damage!" + visible_message("[user] gently taps [src] with [O].") /mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj) @@ -133,6 +133,7 @@ minbodytemp = 0 mob_size = MOB_SIZE_TINY flying + speak_emote = list("states") /mob/living/simple_animal/hostile/viscerator/death(gibbed) ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 79edd57a33f..2643fcc9964 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -23,6 +23,7 @@ melee_damage_upper = 12 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' + speak_emote = list("pines") //Space carp aren't affected by atmos. atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -59,4 +60,5 @@ icon_dead = "festivus_pole" icon_gib = "festivus_pole" drop_type = /obj/item/stack/rods + speak_emote = list("polls") diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 83590e4bc90..939a4a2e942 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -33,7 +33,8 @@ icon_state = "parrot_fly" icon_living = "parrot_fly" icon_dead = "parrot_dead" - pass_flags = PASSTABLE + density = 0 + pass_flags = PASSTABLE | PASSMOB speak = list("Hi!","Hello!","Cracker?","BAWWWWK george mellons griffing me!") speak_emote = list("squawks","says","yells") @@ -203,19 +204,19 @@ if(copytext(possible_phrase,1,3) in department_radio_keys) possible_phrase = copytext(possible_phrase,3) else - usr << "There is nothing to remove from its [remove_from]." + usr << "There is nothing to remove from its [remove_from]!" return //Adding things to inventory else if(href_list["add_inv"]) var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) - usr << "You have nothing in your hand to put on its [add_to]." + usr << "You have nothing in your hand to put on its [add_to]!" return switch(add_to) if("ears") if(ears) - usr << "It's already wearing something." + usr << "It's already wearing something!" return else var/obj/item/item_to_add = usr.get_active_hand() @@ -223,7 +224,7 @@ return if( !istype(item_to_add, /obj/item/device/radio/headset) ) - usr << "This object won't fit." + usr << "This object won't fit!" return var/obj/item/device/radio/headset/headset_to_add = item_to_add @@ -231,7 +232,7 @@ usr.drop_item() headset_to_add.loc = src src.ears = headset_to_add - usr << "You fit the headset onto [src]." + usr << "You fit the headset onto [src]." clearlist(available_channels) for(var/ch in headset_to_add.channels) @@ -488,7 +489,7 @@ if(!parrot_perch || parrot_interest.loc != parrot_perch.loc) held_item = parrot_interest parrot_interest.loc = src - visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") parrot_interest = null parrot_state = PARROT_SWOOP | PARROT_RETURN @@ -662,7 +663,7 @@ return -1 if(held_item) - src << "You are already holding [held_item]" + src << "You are already holding [held_item]!" return 1 for(var/obj/item/I in view(1,src)) @@ -675,10 +676,10 @@ held_item = I I.loc = src - visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") return held_item - src << "There is nothing of interest to take." + src << "There is nothing of interest to take!" return 0 /mob/living/simple_animal/parrot/proc/steal_from_mob() @@ -690,7 +691,7 @@ return -1 if(held_item) - src << "You are already holding [held_item]" + src << "You are already holding [held_item]!" return 1 var/obj/item/stolen_item = null @@ -706,10 +707,10 @@ C.unEquip(stolen_item) held_item = stolen_item stolen_item.loc = src - visible_message("[src] grabs [held_item] out of [C]'s hand!", "You snag [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") + visible_message("[src] grabs [held_item] out of [C]'s hand!", "You snag [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") return held_item - src << "There is nothing of interest to take." + src << "There is nothing of interest to take!" return 0 /mob/living/simple_animal/parrot/verb/drop_held_item_player() @@ -778,7 +779,7 @@ src.loc = AM.loc icon_state = "parrot_sit" return - src << "There is no perch nearby to sit on." + src << "There is no perch nearby to sit on!" return /mob/living/simple_animal/parrot/proc/toggle_mode() diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm new file mode 100644 index 00000000000..e14a9902ee9 --- /dev/null +++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm @@ -0,0 +1,172 @@ +//Revenants: based off of wraiths from Goon +//"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible +//Don't hear deadchat and are NOT normal ghosts +//Admin-spawn or random event + +/mob/living/simple_animal/revenant + name = "revenant" + desc = "A malevolent spirit." + icon = 'icons/mob/mob.dmi' + icon_state = "revenant_idle" + incorporeal_move = 1 + invisibility = INVISIBILITY_OBSERVER + health = 25 + maxHealth = 25 + see_in_dark = 255 + see_invisible = SEE_INVISIBLE_OBSERVER + languages = ALL + response_help = "passes through" + response_disarm = "swings at" + response_harm = "punches" + minbodytemp = 0 + maxbodytemp = INFINITY + harm_intent_damage = 5 + speak_emote = list("hisses", "spits", "growls") + friendly = "touches" + status_flags = 0 + wander = 0 + density = 0 + + var/essence = 25 //The resource of revenants. Max health is equal to twice this amount + var/essence_regen_cap = 25 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount. + var/essence_regen = 1 //If the revenant regenerates essence or not; 1 for yes, 0 for no + var/essence_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one + var/strikes = 3 //How many times a revenant can die before dying for good + var/revealed = 0 //If the revenant can take damage from normal sources. + var/inhibited = 0 //If the revenant's abilities are blocked by a chaplain's power. + +/mob/living/simple_animal/revenant/Life() + ..() + if(essence < essence_min) + essence = essence_min + if(strikes > 0) + strikes-- + src << "Your essence has dropped below critical levels. You barely manage to save yourself - [strikes ? "you can't keep this up!" : "next time, it's death."]" + else if(strikes <= 0) + src << "NO! No... it's too late, you can feel yourself fading..." + src.notransform = 1 + src.revealed = 1 + src.invisibility = 0 + playsound(src, 'sound/effects/screech.ogg', 100, 1) + src.visible_message("The revenant lets out a waning screech as violet mist swirls around its dissolving body!") + src.icon_state = "revenant_draining" + sleep(30) + src.death() + maxHealth = essence * 2 + if(!revealed) + health = maxHealth //Heals to full when not revealed + if(essence_regen && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate + essence++ + +/mob/living/simple_animal/revenant/Process_Spacemove(var/movement_dir = 0) + return 1 //Mainly to prevent the no-grav effect + +/mob/living/simple_animal/revenant/ex_act(severity, target) + return 1 //Immune to the effects of explosions. + +/mob/living/simple_animal/revenant/ClickOn(var/atom/A, var/params) //Copypaste from ghost code - revenants can't interact with the world directly. + if(client.buildmode) + build_click(src, client.buildmode, params, A) + return + + var/list/modifiers = params2list(params) + if(modifiers["middle"]) + MiddleClickOn(A) + return + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) + AltClickOn(A) + return + if(modifiers["ctrl"]) + CtrlClickOn(A) + return + + if(world.time <= next_move) + return + A.attack_ghost(src) + +/mob/living/simple_animal/revenant/say(message) + return 0 //Revenants cannot speak out loud. + +/mob/living/simple_animal/revenant/Stat() + ..() + if(statpanel("Status")) + stat(null, "Current essence: [essence]E") + +/mob/living/simple_animal/revenant/New() + ..() + spawn(5) + if(src.mind) + src << 'sound/effects/ghost.ogg' + src.store_memory("I am a revenant. My spectral form has been empowered. My only goal is to gather essence from the humans of [world.name].") + src << "
      " + src << "You are a revenant!" + src << "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant." + src << "You are not dead, not alive, but somewhere in between. You are capable of very limited interaction with both worlds." + src << "You are invincible and invisible to everyone but other ghosts. Some abilities may change this." + src << "Your goal is to gather essence from humans. Your essence passively regenerates up to 25E over time. You can use the Harvest abilities to gather more from corpses." + src << "Be sure to read the wiki page at https://tgstation13.org/wiki/Revenant !" + src << "
      " + if(!src.giveSpells()) + message_admins("Revenant was created but has no mind. Trying again in five seconds.") + spawn(50) + if(!src.giveSpells()) + message_admins("Revenant still has no mind. Deleting...") + qdel(src) + +/mob/living/simple_animal/revenant/proc/giveSpells() + if(src.mind) + src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_harvest + src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_transmit + src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_light + src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_life_tap + src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_seed_drain + src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_mindspike + return 1 + return 0 + +/mob/living/simple_animal/revenant/death() + if(!src.strikes) + return 0 //Impossible to die with strikes still active + ..(1) + src.invisibility = 0 + visible_message("[src] pulses with an eldritch purple light as its form unwinds into smoke.") + ghostize() + qdel(src) + return + +/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params) + ..() + if(istype(W, /obj/item/weapon/nullrod)) + src.visible_message("The revenant screeches and flails!", \ + "The null rod invokes agony in you! You feel your essence draining away!") + src.essence -= 25 //hella effective + src.inhibited = 1 + spawn(30) + src.inhibited = 0 + + + +/obj/effect/proc_holder/spell/proc/essence_check(var/essence_cost, var/silent = 0) + var/mob/living/simple_animal/revenant/W = usr + if(W.essence < essence_cost) + if(!silent) + W << "You need [essence_cost]E to use [name] but you only have [W.essence]E available. Harvest some more things." + return 0 + W.essence -= essence_cost + return 1 + + + +/mob/living/simple_animal/revenant/proc/change_essence_amount(var/essence_amt, var/silent = 0, var/source = null, var/mob/living/simple_animal/revenant/user = usr) + if(!essence_amt) + return + user.essence += essence_amt + if(!silent) + if(essence_amt >= 0) + user << "Gained [essence_amt]E from [source]." + else + user << "Lost [essence_amt]E." + return 1 diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm new file mode 100644 index 00000000000..0abb8ac46ee --- /dev/null +++ b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm @@ -0,0 +1,346 @@ +//Harvest Essence: The bread and butter of the revenant. The basic way of harvesting additional essence. +/obj/effect/proc_holder/spell/targeted/revenant_harvest + name = "Harvest (0E)" + desc = "Siphons the lingering spectral essence from a human, empowering yourself." + panel = "Revenant Abilities" + charge_max = 100 //Short cooldown + clothes_req = 0 + range = 5 + var/essence_drained = 0 + var/draining + var/list/drained_mobs = list() //Cannot harvest the same mob twice + +/obj/effect/proc_holder/spell/targeted/revenant_harvest/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + user << "Something is blocking the use of [src]!" + charge_counter = charge_max + return + for(var/mob/living/carbon/human/target in targets) + spawn(0) + if(draining) + user << "You are already siphoning the essence of a soul!" + return + if(target in drained_mobs) + user << "[target]'s soul is dead and empty." + return + if(!target.stat) + user << "This being's soul is too strong to harvest." + if(prob(10)) + target << "You feel as if you are being watched." + return + draining = 1 + essence_drained = 1 + user << "You search for the still-living soul of [target]." + sleep(10) + if(target.ckey) + user << "Their soul burns with intelligence." + essence_drained += 3 + if(target.stat == UNCONSCIOUS) + user << "They still cling to life, but are not powerful enough to resist. A large amount of essence lies unguarded." + essence_drained += 5 + else if(target.stat == DEAD) + user << "They have passed on." + essence_drained += 1 + sleep(20) + switch(essence_drained) + if(1 to 2) + user << "[target] will not yield much essence. Still, every bit counts." + if(3 to 4) + user << "[target] will yield an average amount of essence." + if(5 to INFINITY) + user << "Such a feast! [target] will yield much essence to you." + sleep(30) + if(!in_range(user, target)) + user << "You are not close enough to siphon [target]'s soul. The link has been broken." + draining = 0 + return + if(!target.stat) + user << "They are now powerful enough to fight off your draining." + target << "You feel something tugging across your body before subsiding." + user << "You begin siphoning essence from [target]'s soul. You can not move while this is happening." + if(target.stat != DEAD) + target << "You feel a horribly unpleasant draining sensation as your grip on life weakens..." + user.icon_state = "revenant_draining" + user.notransform = 1 + user.revealed = 1 + user.invisibility = 0 + target.visible_message("[target] suddenly rises slightly into the air, their skin turning an ashy gray.") + target.Beam(user,icon_state="drain_life",icon='icons/effects/effects.dmi',time=80) + target.death(0) + target.visible_message("[target] gently slumps back onto the ground.") + user.icon_state = "revenant_idle" + user.change_essence_amount(essence_drained * 5, 0, target) + user << "[target]'s soul has been considerably weakened and will yield no more essence for the time being." + user.revealed = 0 + user.notransform = 0 + user.invisibility = INVISIBILITY_OBSERVER + drained_mobs.Add(target) + draining = 0 + + +//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob for 5E. +/obj/effect/proc_holder/spell/targeted/revenant_transmit + name = "Unlock: Transmit (5E)" + desc = "Telepathically transmits a message to the target." + panel = "Revenant Abilities (Locked)" + charge_max = 50 + clothes_req = 0 + range = -1 + include_user = 1 + var/locked = 1 + +/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + user << "Something is blocking the use of [src]!" + charge_counter = charge_max + return + if(locked && essence_check(5, 1)) + usr << "You have unlocked Transmit!" + name = "Transmit (5E)" + locked = 0 + charge_counter = charge_max + panel = "Revenant Abilities" + range = 7 + include_user = 0 + return + if(locked) + charge_counter = charge_max + return + if(!essence_check(5)) + charge_counter = charge_max + return + for(var/mob/living/M in targets) + spawn(0) + var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") + usr << "You transmit to [M]: [msg]" + M << "Suddenly a strange voice resonates in your head... [msg]" + + +//Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. +/obj/effect/proc_holder/spell/aoe_turf/revenant_light + name = "Unlock: Overload Light (25E)" + desc = "Directs a large amount of essence into an electrical light, causing an impressive light show." + panel = "Revenant Abilities (Locked)" + charge_max = 300 + clothes_req = 0 + range = -1 + var/locked = 1 + +/obj/effect/proc_holder/spell/aoe_turf/revenant_light/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + user << "Something is blocking the use of [src]!" + charge_counter = charge_max + return + if(locked && essence_check(25, 1)) + user << "You have unlocked Overload Light!" + name = "Overload Light (25E)" + panel = "Revenant Abilities" + locked = 0 + range = 5 + charge_counter = charge_max + return + if(locked) + charge_counter = charge_max + return + if(!essence_check(25)) + charge_counter = charge_max + return + for(var/turf/T in targets) + spawn(0) + for(var/obj/machinery/light/L in T.contents) + spawn(0) + if(!L.on) + return + L.visible_message("\The [L] suddenly flares brightly and begins to spark!") + sleep(20) + for(var/mob/living/M in orange(4, L)) + if(M == user) + return + M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) + M.electrocute_act(25, "[L.name]") + playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1) + user.revealed = 1 + user.invisibility = 0 + spawn(30) + user.revealed = 0 + user.invisibility = INVISIBILITY_OBSERVER + + +//Life Tap: Drains one 'strike' to gain 50E +/obj/effect/proc_holder/spell/targeted/revenant_life_tap + name = "Unlock: Life Tap (25E)" + desc = "Draws from your own life pool to gain more essence. Can only be cast three times." + panel = "Revenant Abilities (Locked)" + charge_max = 600 + clothes_req = 0 + range = -1 + include_user = 1 + var/locked = 1 + +/obj/effect/proc_holder/spell/targeted/revenant_life_tap/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + user << "Something is blocking the use of [src]!" + charge_counter = charge_max + return + if(locked && essence_check(25, 1)) + user << "You have unlocked Life Tap!" + name = "Life Tap (0E)" + panel = "Revenant Abilities" + locked = 0 + charge_counter = charge_max + return + if(locked) + charge_counter = charge_max + return + for(var/mob/living/simple_animal/revenant/target in targets) + if(!target.strikes) + target << "Your life force has grown too weak to life tap again." + target.strikes-- + target << "You convert your own life into energy.[target.strikes ? "" : " This is the last time you can do this."]" + target.change_essence_amount(50, 0, "your life pool") + + +//Seed of Draining: Plants a 'seed' in the target that will slowly siphon essence silently from them. +/obj/effect/proc_holder/spell/targeted/revenant_seed_drain + name = "Unlock: Seed of Draining (20E)" + desc = "Corrupts a target with dark energies. Their essence will slowly drain for some time." + panel = "Revenant Abilities (Locked)" + charge_max = 1200 + clothes_req = 0 + range = -1 + include_user = 1 + var/locked = 1 + var/planted = 0 + +/obj/effect/proc_holder/spell/targeted/revenant_seed_drain/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + user << "Something is blocking the use of [src]!" + charge_counter = charge_max + return + if(locked && essence_check(20, 1)) + user << "You have unlocked Seed of Draining!" + charge_counter = charge_max + name = "Seed of Draining (20E)" + locked = 0 + panel = "Revenant Abilities" + range = 1 + include_user = 0 + return + if(locked) + charge_counter = charge_max + return + if(!essence_check(20)) + charge_counter = charge_max + return + if(planted) + user << "You are already passively draining essence." + charge_counter = charge_max + return + for(var/mob/living/carbon/human/target in targets) + if(target.stat == DEAD) + user << "[target] is dead and will not yield essence." + charge_counter = charge_max + user << "You plant a draining seed on [target]." + planted = 1 + for(var/i = 0, i < 120, i++) + sleep(10) + var/mob/living/carbon/human/M = target + user.essence += rand(0.3, 0.5) //Not a huge amount of essence; at the least it's 36 and at the most it's 60 + M.adjustStaminaLoss(1) + if(prob(3)) + target << "You feel sapped." //Letting the target know that they're not bugged and losing stamina 4nr + planted = 0 + user << "The energies siphoning [target] have fallen dormant. You will need to plant a new seed." + + +//Mind Spike: The typical straight damage ability. Does a decent amount of brute damage and small brain damage. +/obj/effect/proc_holder/spell/targeted/revenant_mindspike + name = "Unlock: Mind Spike (5E)" + desc = "Drives a spike of dark energy into the target's mind. Cheap but effective and doesn't take long to cool down." + panel = "Revenant Abilities (Locked)" + charge_max = 40 + clothes_req = 0 + range = -1 + include_user = 1 + var/locked = 1 + +/obj/effect/proc_holder/spell/targeted/revenant_mindspike/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + user << "Something is blocking the use of [src]!" + charge_counter = charge_max + return + if(locked && essence_check(5, 1)) + user << "You have unlocked Mind Spike!" + charge_counter = charge_max + name = "Mind Spike (5E)" + locked = 0 + panel = "Revenant Abilities" + range = 3 + include_user = 0 + return + if(locked) + charge_counter = charge_max + return + if(!essence_check(5)) + charge_counter = charge_max + return + for(var/mob/living/carbon/human/M in targets) + user << "You drive a spike of energy into [M]'s mind!" + M << "You feel a spike of pain in your head!" + M.apply_damage(12, BRUTE, "head") + M.adjustBrainLoss(3) + //M << 'sound/effects/mind_blast.ogg' + if(prob(20) && !M.stat) + M.Weaken(2) + M.visible_message("[M] clutches at their head!") + user.revealed = 1 + user.invisibility = 0 + spawn(10) + user.revealed = 0 + user.invisibility = INVISIBILITY_OBSERVER + +//Hypnotize: Makes the target fall asleep, make them vulnerable to draining. +/obj/effect/proc_holder/spell/targeted/revenant_hypnotize + name = "Unlock: Hypnotize (15E)" + desc = "Causes a target to fall asleep." + panel = "Revenant Abilities (Locked)" + charge_max = 900 + clothes_req = 0 + range = -1 + include_user = 1 + var/locked = 1 + +/obj/effect/proc_holder/spell/targeted/revenant_hypnotize/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr) + if(user.inhibited) + user << "Something is blocking the use of [src]!" + charge_counter = charge_max + return + if(locked && essence_check(15, 1)) + user << "You have unlocked Hypnotize!" + charge_counter = charge_max + name = "Hypnotize (15E)" + locked = 0 + range = 3 + panel = "Revenant Abilities" + include_user = 0 + return + if(locked) + charge_counter = charge_max + return + if(!essence_check(15)) + charge_counter = charge_max + return + for(var/mob/living/carbon/human/M in targets) + user << "You gently influence [M]'s mind toward deep sleep." + M << "Tired... so tired..." + M.drowsyness += 7 + spawn(70) + M.sleeping += 30 + + +/* (WIP) +Strangulate: Chokes the target with crushing force. +/obj/effect/proc_holder/spell/targeted/revenant_strangulate + name = "Unlock: Strangulate (30E)" + desc = "Strangles a target with an asphyxiating hand, dealing decent oxygen damage to them." +*/ diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm new file mode 100644 index 00000000000..fd897699a43 --- /dev/null +++ b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm @@ -0,0 +1,63 @@ +/datum/round_event_control/revenant + name = "Spawn Revenant" + typepath = /datum/round_event/revenant + weight = 15 + max_occurrences = 3 + earliest_start = 0 //Meant to mix things up early-game. + + + +/datum/round_event/revenant + var/key_of_revenant + + + +/datum/round_event/revenant/proc/get_revenant(var/end_if_fail = 0) + key_of_revenant = null + if(!key_of_revenant) + var/list/candidates = get_candidates(BE_REVENANT) + if(!candidates.len) + if(end_if_fail) + return 0 + return find_revenant() + var/client/C = pick(candidates) + key_of_revenant = C.key + if(!key_of_revenant) + if(end_if_fail) + return 0 + return find_revenant() + var/datum/mind/player_mind = new /datum/mind(key_of_revenant) + player_mind.active = 1 + var/list/spawn_locs = list() + for(var/obj/effect/landmark/L in landmarks_list) + if(isturf(L.loc)) + switch(L.name) + if("carpspawn") + spawn_locs += L.loc + if(!spawn_locs) + return find_revenant() + var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant/(pick(spawn_locs)) + player_mind.transfer_to(revvie) + player_mind.assigned_role = "revenant" + player_mind.special_role = "Revenant" + ticker.mode.traitors |= player_mind + message_admins("[key_of_revenant] has been made into a Revenant by an event.") + log_game("[key_of_revenant] was spawned as a Revenant by an event.") + return 1 + + + +/datum/round_event/revenant/start() + get_revenant() + + + +/datum/round_event/revenant/proc/find_revenant() + message_admins("Attempted to spawn a Revenant but there was no players available. Will try again momentarily, bear with me...") + spawn(50) + if(get_revenant(1)) + message_admins("Hooray! Situation has been resolved, [key_of_revenant] has been spawned as a Revenant.") + log_game("[key_of_revenant] was spawned as a Revenant by an event.") + return 0 + message_admins("Unfortunately, no candidates were available for becoming a Revenant. Shutting down. :(") + return kill() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 1864c0d1f84..0bdc709d15f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -462,7 +462,7 @@ // Harvest an animal's delicious byproducts /mob/living/simple_animal/proc/harvest(mob/living/user, sharpness = 1) - user << "You begin to butcher [src]." + user << "You begin to butcher [src]..." playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) if(do_mob(user, src, 80/sharpness)) visible_message("[user] butchers [src].") @@ -490,4 +490,4 @@ canmove = 0 else canmove = 1 - return canmove + return canmove diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index e8b647e5e8d..b6f4ed34b86 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -71,7 +71,7 @@ Victim.adjustToxLoss(rand(2,4)) if(prob(15) && Victim.client) - Victim << "[pick("You can feel your body becoming weak!", \ + Victim << "[pick("You can feel your body becoming weak!", \ "You feel like you're about to die!", \ "You feel every part of your body screaming in agony!", \ "A low, rolling pain passes through your body!", \ @@ -89,7 +89,7 @@ src << "[pick("This subject is incompatible", \ "This subject does not have a life energy", "This subject is empty", \ "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]..." + "I do not feel nourished", "This subject is not food")]!" if(fed_succesfully) add_nutrition(rand(15,30), lastnut) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index d9a0b893187..7dd50a1008d 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -29,7 +29,6 @@ nutrition = 700 see_in_dark = 8 - update_slimes = 0 verb_say = "telepathically chirps" verb_ask = "telepathically asks" @@ -285,7 +284,7 @@ ++Friends[user] else Friends[user] = 1 - user << "You feed the slime the plasma. It chirps happily." + user << "You feed the slime the plasma. It chirps happily." var/obj/item/stack/sheet/mineral/plasma/S = W S.use(1) return diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm new file mode 100644 index 00000000000..78ccc103d0a --- /dev/null +++ b/code/modules/mob/living/ventcrawling.dm @@ -0,0 +1,96 @@ + +var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /obj/machinery/atmospherics/unary/vent_scrubber) + +//VENTCRAWLING + +/mob/living/proc/handle_ventcrawl(var/atom/A) + if(!ventcrawler || !Adjacent(A)) + return + if(stat) + src << "You must be conscious to do this!" + return + if(lying) + src << "You can't vent crawl while you're stunned!" + return + + var/obj/machinery/atmospherics/unary/vent_found + + + if(A) + vent_found = A + if(!istype(vent_found) || !vent_found.can_crawl_through()) + vent_found = null + + if(!vent_found) + for(var/obj/machinery/atmospherics/machine in range(1,src)) + if(is_type_in_list(machine, ventcrawl_machinery)) + vent_found = machine + + if(!vent_found.can_crawl_through()) + vent_found = null + + if(vent_found) + break + + + if(vent_found) + if(vent_found.parent && (vent_found.parent.members.len || vent_found.parent.other_atmosmch)) + visible_message("[src] begins climbing into the ventilation system..." ,"You begin climbing into the ventilation system...") + + if(!do_after(src, 25)) + return + + if(!client) + return + + if(iscarbon(src) && contents.len && ventcrawler < 2)//It must have atleast been 1 to get this far + for(var/obj/item/I in contents) + var/failed = 0 + if(istype(I, /obj/item/weapon/implant)) + continue + else + failed++ + + if(failed) + src << "You can't crawl around in the ventilation ducts with items!" + return + + visible_message("[src] scrambles into the ventilation ducts!","You climb into the ventilation ducts.") + loc = vent_found + add_ventcrawl(vent_found) + else + src << "This ventilation duct is not connected to anything!" + + +/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/unary/starting_machine) + if(!starting_machine) + return + var/list/totalMembers = starting_machine.parent.members + starting_machine.parent.other_atmosmch + for(var/atom/A in totalMembers) + var/image/new_image = image(A, A.loc, dir = A.dir) + pipes_shown += new_image + if(client) + client.images += new_image + + +/mob/living/proc/remove_ventcrawl() + if(client) + for(var/image/current_image in pipes_shown) + client.images -= current_image + client.eye = src + pipes_shown.len = 0 + + + + +//OOP +/atom/proc/update_pipe_vision() + return + +/mob/living/update_pipe_vision() + if(pipes_shown.len) + if(!istype(loc, /obj/machinery/atmospherics)) + remove_ventcrawl() + else + if(istype(loc, /obj/machinery/atmospherics)) + add_ventcrawl(loc) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3a4af5d847c..c5d468e9ae9 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -266,7 +266,7 @@ var/next_mob_id = 0 qdel(W) else if(!disable_warning) - src << "You are unable to equip that." //Only print if qdel_on_fail is false + src << "You are unable to equip that!" //Only print if qdel_on_fail is false return 0 equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. return 1 @@ -731,6 +731,8 @@ var/list/slot_equipment_priority = list( \ else statpanel(listed_turf.name, null, listed_turf) for(var/atom/A in listed_turf) + if(!A.mouse_opacity) + continue if(A.invisibility > see_invisible) continue statpanel(listed_turf.name, null, A) @@ -788,6 +790,12 @@ var/list/slot_equipment_priority = list( \ fall(ko) canmove = !(ko || resting || stunned || buckled) density = !lying + if(lying) + if(layer == initial(layer)) //to avoid special cases like hiding larvas. + layer = MOB_LAYER - 0.2 //so mob lying always appear behind standing mobs + else + if(layer == MOB_LAYER - 0.2) + layer = initial(layer) update_transform() lying_prev = lying return canmove @@ -838,9 +846,6 @@ var/list/slot_equipment_priority = list( \ /mob/proc/activate_hand(var/selhand) return -/mob/proc/SpeciesCanConsume() - return 0 - /mob/proc/Jitter(amount) jitteriness = max(jitteriness,amount,0) @@ -946,4 +951,17 @@ var/list/slot_equipment_priority = list( \ return /mob/proc/setEarDamage() + return + +/mob/proc/AddSpell(var/obj/effect/proc_holder/spell/spell) + mob_spell_list += spell + if(!spell.action) + spell.action = new/datum/action/spell_action + spell.action.target = spell + spell.action.name = spell.name + spell.action.button_icon = spell.action_icon + spell.action.button_icon_state = spell.action_icon_state + spell.action.background_icon_state = spell.action_background_icon_state + if(isliving(src)) + spell.action.Grant(src) return \ No newline at end of file diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index c2a4fa9a1fe..233fcd4f485 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -115,6 +115,8 @@ affecting.Weaken(5) //Should keep you down unless you get help. affecting.losebreath = min(affecting.losebreath + 2, 3) +/obj/item/weapon/grab/attack_self(mob/user) + s_click(hud) /obj/item/weapon/grab/proc/s_click(obj/screen/S) if(!affecting) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 5b9be5c61c9..dd575cd6adf 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -442,6 +442,9 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h if("monkey") if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses)) return 2 + if("abductor") + if(M.mind in ticker.mode.abductors) + return 2 return 1 return 0 @@ -477,10 +480,10 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h affecting.heal_damage(brute,burn,1) H.update_damage_overlays(0) H.updatehealth() - user.visible_message("[user] has fixed some of the [dam ? "dents on" : "burnt wires in"] [H]'s [affecting.getDisplayName()]!") + user.visible_message("[user] has fixed some of the [dam ? "dents on" : "burnt wires in"] [H]'s [affecting.getDisplayName()].", "You fix some of the [dam ? "dents on" : "burnt wires in"] [H]'s [affecting.getDisplayName()].") return else - user << "[H]'s [affecting.getDisplayName()] is already in good condition" + user << "[H]'s [affecting.getDisplayName()] is already in good condition!" return else return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 1d34da24490..f2e81516823 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -3,6 +3,8 @@ if(istype(mover) && mover.checkpass(PASSMOB)) return 1 + if(istype(mover, /obj/item/projectile)) + return (!density || lying) if(ismob(mover)) var/mob/moving_mob = mover if ((other_mobs && moving_mob.other_mobs)) @@ -141,7 +143,7 @@ for(var/mob/M in range(mob, 1)) if(M.pulling == mob) if(!M.incapacitated() && mob.Adjacent(M)) - src << "You're restrained! You can't move!" + src << "You're restrained! You can't move!" move_delay += 10 return 0 else diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 1d362e4a498..3b8a4401cbd 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -78,6 +78,8 @@ if (tr_flags & TR_DEFAULTMSG) O << "You are now a monkey." + O.update_pipe_vision() + for(var/A in loc.vars) if(loc.vars[A] == src) loc.vars[A] = O @@ -191,6 +193,8 @@ if (tr_flags & TR_DEFAULTMSG) O << "You are now a human." + O.update_pipe_vision() + updateappearance(O) . = O @@ -238,6 +242,8 @@ else O.key = key + O.update_pipe_vision() + var/obj/loc_landmark for(var/obj/effect/landmark/start/sloc in landmarks_list) if (sloc.name != "AI") @@ -319,6 +325,8 @@ else O.key = key + O.update_pipe_vision() + if (config.rename_cyborg) O.rename_self("cyborg", 1) @@ -357,6 +365,7 @@ new_xeno.key = key new_xeno << "You are now an alien." + new_xeno.update_pipe_vision() . = new_xeno qdel(src) @@ -389,6 +398,7 @@ new_slime.key = key new_slime << "You are now a slime. Skreee!" + new_slime.update_pipe_vision() . = new_slime qdel(src) @@ -425,6 +435,7 @@ new_corgi.key = key new_corgi << "You are now a Corgi. Yap Yap!" + new_corgi.update_pipe_vision() . = new_corgi qdel(src) @@ -458,6 +469,7 @@ new_mob << "You suddenly feel more... animalistic." + new_mob.update_pipe_vision() . = new_mob qdel(src) @@ -475,6 +487,7 @@ new_mob.key = key new_mob.a_intent = "harm" new_mob << "You feel more... animalistic" + new_mob.update_pipe_vision() . = new_mob qdel(src) diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index ed6c7236267..f664c87a8b9 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -27,7 +27,7 @@ It is possible to destroy the net by the occupant or someone else. var/mob/living/carbon/M = affecting M.anchored = 0 for(var/mob/O in viewers(src, 3)) - O.show_message("[M.name] was recovered from the energy net!", 1, "You hear a grunt.", 2) + O.show_message("[M.name] was recovered from the energy net!", 1, "You hear a grunt.", 2) if(!isnull(master))//As long as they still exist. master << "ERROR: unable to initiate transport protocol. Procedure terminated." qdel(src) @@ -82,7 +82,7 @@ It is possible to destroy the net by the occupant or someone else. qdel(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0). for(var/mob/O in viewers(src, 3)) - O.show_message("[M] vanished!", 1, "You hear sparks flying!", 2) + O.show_message("[M] vanishes!", 1, "You hear sparks flying!", 2) if(!isnull(master))//As long as they still exist. master << "SUCCESS: transport procedure of \the [affecting] complete." diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm index 428f417ca44..b31d49c1d82 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm @@ -12,7 +12,7 @@ if(!locate(/obj/effect/energy_net) in C.loc)//Check if they are already being affected by an energy net. for(var/turf/T in getline(H.loc, C.loc)) if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. - H << "You may not use an energy net through solid obstacles!" + H << "You may not use an energy net through solid obstacles!" return spawn(0) H.Beam(C,"n_beam",,15) @@ -25,7 +25,7 @@ spawn(0)//Parallel processing. E.process(C) else - H << "They are already trapped inside an energy net." + H << "They are already trapped inside an energy net!" else - H << "They will bring no honor to your Clan!" + H << "They will bring no honor to your Clan!" return \ No newline at end of file diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm index 8d2ff7c3cfe..aef3d012dd8 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm @@ -9,11 +9,11 @@ if(!ninjacost(0,N_SMOKE_BOMB)) var/mob/living/carbon/human/H = affecting - H << "There are [s_bombs] smoke bombs remaining." var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() smoke.set_up(10, 0, H.loc) smoke.start() playsound(H.loc, 'sound/effects/bamf.ogg', 50, 2) s_bombs-- + H << "There are [s_bombs] smoke bombs remaining." s_coold = 1 return \ No newline at end of file diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 92077b14d4a..351443ec5bb 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -55,7 +55,7 @@ anchored = !anchored user << "You [anchored ? "wrench" : "unwrench"] [src]." else - user << "You can't put [P] in [src]!" + user << "You can't put [P] in [src]!" /obj/structure/filingcabinet/attack_hand(mob/user) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index d9a6b9527d4..96c8f83e2b0 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -16,22 +16,22 @@ return // don't set a label if(!labels_left) - user << "No labels left." + user << "No labels left!" return if(!label || !length(label)) - user << "No text set." + user << "No text set!" return if(length(A.name) + length(label) > 64) - user << "Label too big." + user << "Label too big!" return if(ishuman(A)) - user << "You can't label humans." + user << "You can't label humans!" return if(issilicon(A)) - user << "You can't label cyborgs." + user << "You can't label cyborgs!" return - user.visible_message("[user] labels [A] as [label].", \ + user.visible_message("[user] labels [A] as [label].", \ "You label [A] as [label].") A.name = "[A.name] ([label])" labels_left-- @@ -45,7 +45,7 @@ //Now let them chose the text. var/str = copytext(reject_bad_text(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) - user << "Invalid text." + user << "Invalid text!" return label = str user << "You set the text to '[str]'." diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index cf006b775cc..564411de900 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -336,12 +336,12 @@ /obj/item/weapon/paper/proc/burn(var/showmsg, var/burntime) if(showmsg) - src.visible_message("[src] catches on fire!") + src.visible_message("[src] catches on fire.") burning = 1 icon_state = "paper_onfire" info = "[stars(info)]" sleep(burntime) //7 seconds - src.visible_message("[src] burns away, leaving behind a pile of ashes.") + src.visible_message("[src] burns away, leaving behind a pile of ashes.") new /obj/effect/decal/cleanable/ash(src.loc) qdel(src) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index a26c0497223..8493cfb876a 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -57,7 +57,7 @@ user.put_in_hands(P) user << "You take [P] out of \the [src]." else - user << "[src] is empty!" + user << "[src] is empty!" add_fingerprint(user) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 2be061856d3..01ea0ee5d35 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -74,3 +74,48 @@ reagents.add_reagent("mutetoxin", 15) reagents.add_reagent("tirizene", 10) ..() + +/* + * Gang Boss Pens + */ +/obj/item/weapon/pen/gang + origin_tech = "materials=2;syndicate=5" + var/cooldown + +/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user) + if(!istype(M)) return + if(..()) + if(ishuman(M) && ishuman(user) && M.stat != DEAD) + if(user.mind && ((user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.B_bosses))) + if(cooldown) + user << "[src] needs more time to recharge before it can be used." + return + if(M.client) + M.mind_initialize() //give them a mind datum if they don't have one. + if(user.mind in ticker.mode.A_bosses) + if(ticker.mode.add_gangster(M.mind,"A")) + M.Paralyse(5) + cooldown(ticker.mode.A_gang.len, ) + else + user << "This mind is resistant to recruitment!" + else if(user.mind in ticker.mode.B_bosses) + if(ticker.mode.add_gangster(M.mind,"B")) + M.Paralyse(5) + cooldown(ticker.mode.B_gang.len) + else + user << "This mind is resistant to recruitment!" + else + user << "This mind is so vacant that it is not susceptible to influence!" + +/obj/item/weapon/pen/gang/proc/cooldown(modifier) + if(!modifier) + return + cooldown = 1 + icon_state = "pen_blink" + //The more gang members there are the longer the cooldown will be + var/time = 450 + (150 * modifier) //45 seconds + 15 seconds for every member in the gang + spawn(time) + cooldown = 0 + icon_state = "pen" + var/mob/M = get(src, /mob) + M << "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly." diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 95220c1e344..92f82705db9 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -230,7 +230,7 @@ flick("bigscanner1", src) updateUsrDialog() else - user << "There is already something in [src]." + user << "There is already something in [src]!" else if(istype(O, /obj/item/weapon/photo)) if(copier_empty()) @@ -241,7 +241,7 @@ flick("bigscanner1", src) updateUsrDialog() else - user << "There is already something in [src]." + user << "There is already something in [src]!" else if(istype(O, /obj/item/device/toner)) if(toner <= 0) @@ -251,14 +251,14 @@ user << "You insert [O] into [src]." updateUsrDialog() else - user << "This cartridge is not yet ready for replacement! Use up the rest of the toner." + user << "This cartridge is not yet ready for replacement! Use up the rest of the toner." else if(istype(O, /obj/item/weapon/wrench)) if(isinspace()) user << "There's nothing to fasten [src] to!" return playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You start [anchored ? "unwrenching" : "wrenching"] [src]" + user << "You start [anchored ? "unwrenching" : "wrenching"] [src]..." if(do_after(user, 20)) if(gc_destroyed) return @@ -302,30 +302,30 @@ return src.add_fingerprint(user) if(target == user) - visible_message("[user] starts climbing onto the photocopier!") + user.visible_message("[user] starts climbing onto the photocopier!", "You start climbing onto the photocopier...") else - visible_message("[user] starts putting [target] onto the photocopier!") + user.visible_message("[user] starts putting [target] onto the photocopier!", "You start putting [target] onto the photocopier...") if(do_after(user, 20)) if(!target || target.gc_destroyed || gc_destroyed || !Adjacent(target)) //check if the photocopier/target still exists. return if(target == user) - visible_message("[user] climbs onto the photocopier!") + user.visible_message("[user] climbs onto the photocopier!", "You climb onto the photocopier.") else - visible_message("[user] puts [target] onto the photocopier!") + user.visible_message("[user] puts [target] onto the photocopier!", "You put [target] onto the photocopier.") target.loc = get_turf(src) ass = target if(photocopy) photocopy.loc = src.loc - visible_message("[photocopy] is shoved out of the way by [ass]!") + visible_message("[photocopy] is shoved out of the way by [ass]!") photocopy = null else if(copy) copy.loc = src.loc - visible_message("[copy] is shoved out of the way by [ass]!") + visible_message("[copy] is shoved out of the way by [ass]!") copy = null updateUsrDialog() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index a759a817464..bfb76afccc0 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -53,7 +53,7 @@ if(in_range(user, src)) show(user) else - user << "You need to get closer to get a good look at this photo." + user << "You need to get closer to get a good look at this photo!" /obj/item/weapon/photo/proc/show(mob/user) @@ -427,4 +427,4 @@ obj/item/device/camera/siliconcam/robot_camera/proc/borgprint() p.pixel_y = rand(-10, 10) C.toner -= 20 //Cyborgs are very ineffeicient at printing an image visible_message("[C.name] spits out a photograph from a narrow slot on it's chassis.") - usr << "You print a photograph." + usr << "You print a photograph." diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 57e815508f7..e8270dafd52 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -143,24 +143,24 @@ if(!anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] secures the [src.name] to the floor.", \ - "You secure the anchor bolts to the floor.", \ - "You hear a ratchet") + "You secure the anchor bolts to the floor.", \ + "You hear a ratchet.") src.anchored = 1 connect_to_network() else if(!linked_shielding.len > 0) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] unsecures the [src.name].", \ - "You remove the anchor bolts.", \ - "You hear a ratchet") + "YYou remove the anchor bolts.", \ + "You hear a ratchet.") src.anchored = 0 disconnect_from_network() else - user << "Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" + user << "Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" return if(istype(W, /obj/item/weapon/am_containment)) if(fueljar) - user << "There is already a [fueljar] inside!" + user << "There is already a [fueljar] inside!" return fueljar = W W.loc = src @@ -169,8 +169,8 @@ user.unEquip(W) user.update_icons() user.visible_message("[user.name] loads an [W.name] into the [src.name].", \ - "You load an [W.name].", \ - "You hear a thunk.") + "You load an [W.name].", \ + "You hear a thunk.") return if(W.force >= 20) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 042d4731b63..44da3f238a0 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -377,22 +377,22 @@ if (istype(W, /obj/item/weapon/crowbar) && opened) if (has_electronics==1) if (terminal) - user << "Disconnect wires first." + user << "Disconnect the wires first!" return playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues + user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues if(do_after(user, 50)) if (has_electronics==1) has_electronics = 0 if ((stat & BROKEN) || malfhack) user.visible_message(\ - "[user.name] has broken the power control board inside [src.name]!",\ - "You broke the charred power control board and remove the remains.", - "You hear a crack!") + "[user.name] has broken the power control board inside [src.name]!",\ + "You break the charred power control board and remove the remains.", + "You hear a crack.") //ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0 else user.visible_message(\ - "[user.name] has removed the power control board from [src.name]!",\ + "[user.name] has removed the power control board from [src.name]!",\ "You remove the power control board.") new /obj/item/weapon/module/power_control(loc) else if (opened!=2) //cover isn't removed @@ -400,49 +400,49 @@ update_icon() else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) ) if(coverlocked && !(stat & MAINT)) - user << "The cover is locked and cannot be opened." + user << "The cover is locked and cannot be opened!" return else opened = 1 update_icon() else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside if(cell) - user << "There is a power cell already installed." + user << "There is a power cell already installed!" return else if (stat & MAINT) - user << "There is no connector for your power cell." + user << "There is no connector for your power cell!" return user.drop_item() W.loc = src cell = W user.visible_message(\ - "[user.name] has inserted the power cell to [src.name]!",\ + "[user.name] has inserted the power cell to [src.name]!",\ "You insert the power cell.") chargecount = 0 update_icon() else if (istype(W, /obj/item/weapon/screwdriver)) // haxing if(opened) if (cell) - user << "Close the APC first." //Less hints more mystery! + user << "Close the APC first!" //Less hints more mystery! return else if (has_electronics==1 && terminal) has_electronics = 2 stat &= ~MAINT playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You screw the circuit electronics into place." + user << "You screw the circuit electronics into place." else if (has_electronics==2) has_electronics = 1 stat |= MAINT playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You unfasten the electronics." + user << "You unfasten the electronics." else /* has_electronics==0 */ - user << "There is nothing to secure." + user << "There is nothing to secure!" return update_icon() else if(emagged) - user << "The interface is broken." + user << "The interface is broken!" else wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" @@ -450,30 +450,30 @@ else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged) - user << "The interface is broken." + user << "The interface is broken!" else if(opened) - user << "You must close the cover to swipe an ID card." + user << "You must close the cover to swipe an ID card!" else if(wiresexposed) - user << "You must close the panel" + user << "You must close the panel!" else if(stat & (BROKEN|MAINT)) - user << "Nothing happens." + user << "Nothing happens!" else if(src.allowed(usr) && !isWireCut(APC_WIRE_IDSCAN)) locked = !locked - user << "You [ locked ? "lock" : "unlock"] the APC interface." + user << "You [ locked ? "lock" : "unlock"] the APC interface." update_icon() else user << "Access denied." else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2) if (src.loc:intact) - user << "You must remove the floor plating in front of the APC first." + user << "You must remove the floor plating in front of the APC first!" return var/obj/item/stack/cable_coil/C = W if(C.get_amount() < 10) - user << "You need ten lengths of cable for APC." + user << "You need ten lengths of cable for APC!" return - user.visible_message("[user.name] adds cables to the APC frame.", \ - "You start adding cables to the APC frame...") + user.visible_message("[user.name] adds cables to the APC frame.", \ + "You start adding cables to the APC frame...") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20)) if (C.amount >= 10 && !terminal && opened && has_electronics != 2) @@ -492,8 +492,8 @@ terminal.dismantle(user) else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) - user.visible_message("[user.name] inserts the power control board into [src].", \ - "You start to insert the power control board into the frame...") + user.visible_message("[user.name] inserts the power control board into [src].", \ + "You start to insert the power control board into the frame...") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 10)) if(has_electronics==0) @@ -501,28 +501,28 @@ user << "You place the power control board inside the frame." qdel(W) else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack)) - user << "You cannot put the board inside, the frame is damaged." + user << "You cannot put the board inside, the frame is damaged!" return else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal) var/obj/item/weapon/weldingtool/WT = W if (WT.get_fuel() < 3) - user << "You need more welding fuel to complete this task." + user << "You need more welding fuel to complete this task!" return - user.visible_message("[user.name] welds [src].", \ - "You start welding the APC frame...", \ - "You hear welding.") + user.visible_message("[user.name] welds [src].", \ + "You start welding the APC frame...", \ + "You hear welding.") playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 50)) if(!src || !WT.remove_fuel(3, user)) return if (emagged || malfhack || (stat & BROKEN) || opened==2) new /obj/item/stack/sheet/metal(loc) user.visible_message(\ - "[user.name] has cut [src] apart with [W].",\ + "[user.name] has cut [src] apart with [W].",\ "You disassembled the broken APC frame.") else new /obj/item/apc_frame(loc) user.visible_message(\ - "[user.name] has cut [src] from the wall with [W].",\ + "[user.name] has cut [src] from the wall with [W].",\ "You cut the APC frame from the wall.") qdel(src) return @@ -531,18 +531,18 @@ if (opened==2) opened = 1 user.visible_message(\ - "[user.name] has replaced the damaged APC frontal panel with a new one.",\ + "[user.name] has replaced the damaged APC frontal panel with a new one.",\ "You replace the damaged APC frontal panel with a new one.") qdel(W) update_icon() else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack)) if (has_electronics) - user << "You cannot repair this APC until you remove the electronics still inside." + user << "You cannot repair this APC until you remove the electronics still inside!" return - user.visible_message("[user.name] replaces the damaged APC frame with a new one.",\ - "You begin to replace the damaged APC frame...") + user.visible_message("[user.name] replaces the damaged APC frame with a new one.",\ + "You begin to replace the damaged APC frame...") if(do_after(user, 50)) - user << "You've replaced the damaged APC frame with a new one." + user << "You replace the damaged APC frame with a new one." qdel(W) stat &= ~BROKEN malfai = null @@ -557,9 +557,9 @@ && W.w_class >= 3.0 \ && prob(20) ) opened = 2 - user.visible_message("[user.name] has knocked down the APC cover with the [W.name]!", \ + user.visible_message("[user.name] has knocked down the APC cover with the [W.name].", \ "You knock down the APC cover with your [W.name]!", \ - "You hear bang") + "You hear bang.") update_icon() else if (istype(user, /mob/living/silicon)) @@ -573,11 +573,11 @@ /obj/machinery/power/apc/emag_act(mob/user as mob) if(!emagged && !malfhack) if(opened) - user << "You must close the cover to swipe an ID card." + user << "You must close the cover to swipe an ID card!" else if(wiresexposed) - user << "You must close the panel first" + user << "You must close the panel first!" else if(stat & (BROKEN|MAINT)) - user << "Nothing happens." + user << "Nothing happens!" else flick("apc-spark", src) if (do_after(user,6)) @@ -587,7 +587,7 @@ user << "You emag the APC interface." update_icon() else - user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." + user << "You fail to [ locked ? "unlock" : "lock"] the APC interface!" // attack with hand - remove cell (if cover open) or interact with the APC @@ -604,7 +604,7 @@ cell.updateicon() src.cell = null - user.visible_message("[user.name] removes the power cell from [src.name]!",\ + user.visible_message("[user.name] removes the power cell from [src.name]!",\ "You remove the power cell.") //user << "You remove the power cell." charging = 0 @@ -785,7 +785,7 @@ var/mob/living/carbon/human/H = user if (istype(H)) if(H.getBrainLoss() >= 60) - H.visible_message("[H] stares cluelessly at [src] and drools.") + H.visible_message("[H] stares cluelessly at [src] and drools.") return 0 else if(prob(H.getBrainLoss())) user << "You momentarily forget how to use [src]." @@ -886,10 +886,10 @@ if(!istype(malf)) return if(istype(malf.loc, /obj/machinery/power/apc)) // Already in an APC - malf << "You must evacuate your current apc first." + malf << "You must evacuate your current APC first!" return if(!malf.can_shunt) - malf << "You cannot shunt." + malf << "You cannot shunt!" return if(src.z != 1) return @@ -956,8 +956,8 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \ - "You hear sizzling electronics.") + visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \ + "You hear sizzling electronics.") /obj/machinery/power/apc/surplus() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 10054d21e52..03c2ace4c12 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -135,7 +135,7 @@ By design, d1 is the smallest direction and d2 is the highest if(istype(W, /obj/item/weapon/wirecutters)) if (shock(user, 50)) return - visible_message("[user] cuts the cable.") + user.visible_message("[user] cuts the cable.", "You cut the cable.") stored.add_fingerprint(user) investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") Deconstruct() @@ -144,7 +144,7 @@ By design, d1 is the smallest direction and d2 is the highest else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) - user << "Not enough cable" + user << "Not enough cable!" return coil.cable_join(src, user) @@ -537,14 +537,14 @@ obj/structure/cable/proc/avail() if(!istype(usr.loc,/turf)) return if(src.amount <= 14) - usr << "You need at least 15 lengths to make restraints!" + usr << "You need at least 15 lengths to make restraints!" return var/obj/item/weapon/restraints/handcuffs/cable/B = new /obj/item/weapon/restraints/handcuffs/cable(usr.loc) B.icon_state = "cuff_[item_color]" usr << "You wind some cable together to make some restraints." src.use(15) else - usr << "You cannot do that." + usr << "You cannot do that!" ..() // Items usable on a cable coil : @@ -555,7 +555,7 @@ obj/structure/cable/proc/avail() if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1) src.amount-- new /obj/item/stack/cable_coil(user.loc, 1,item_color) - user << "You cut a piece off the cable coil." + user << "You cut a piece off the cable coil." src.update_icon() return @@ -567,18 +567,18 @@ obj/structure/cable/proc/avail() else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W if(C.amount >= MAXCOIL) - user << "The coil is too long, you cannot add any more cable to it." + user << "The coil is too long, you cannot add any more cable to it!" return if( (C.amount + src.amount <= MAXCOIL) ) - user << "You join the cable coils together." + user << "You join the cable coils together." C.give(src.amount) // give it cable src.use(src.amount) // make sure this one cleans up right return else var/amt = MAXCOIL - C.amount - user << "You transfer [amt] length\s of cable from one coil to the other." + user << "You transfer [amt] length\s of cable from one coil to the other." C.give(amt) src.use(amt) return @@ -628,15 +628,15 @@ obj/structure/cable/proc/avail() return if(!T.can_have_cabling()) - user << "You can only lay cables on catwalks and plating!" + user << "You can only lay cables on catwalks and plating!" return if(get_amount() < 1) // Out of cable - user << "There is no cable left." + user << "There is no cable left!" return if(get_dist(T,user) > 1) // Too far - user << "You can't lay cable at a place that far away." + user << "You can't lay cable at a place that far away!" return else @@ -649,7 +649,7 @@ obj/structure/cable/proc/avail() for(var/obj/structure/cable/LC in T) if(LC.d2 == dirn && LC.d1 == 0) - user << "There's already a cable at that position." + user << "There's already a cable at that position!" return var/obj/structure/cable/C = get_new_cable(T) @@ -690,7 +690,7 @@ obj/structure/cable/proc/avail() return if(get_dist(C, user) > 1) // make sure it's close enough - user << "You can't lay cable at a place that far away." + user << "You can't lay cable at a place that far away!" return @@ -703,10 +703,10 @@ obj/structure/cable/proc/avail() // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) if(!U.can_have_cabling()) //checking if it's a plating or catwalk - user << "You can only lay cables on catwalks and plating!" + user << "You can only lay cables on catwalks and plating!" return if(U.intact) //can't place a cable if it's a plating with a tile on it - user << "You can't lay cable there unless the floor tiles are removed." + user << "You can't lay cable there unless the floor tiles are removed!" return else // cable is pointing at us, we're standing on an open tile @@ -716,7 +716,7 @@ obj/structure/cable/proc/avail() for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already if(LC.d1 == fdirn || LC.d2 == fdirn) - user << "There's already a cable at that position." + user << "There's already a cable at that position!" return var/obj/structure/cable/NC = get_new_cable (U) @@ -760,7 +760,7 @@ obj/structure/cable/proc/avail() if(LC == C) // skip the cable we're interacting with continue if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - user << "There's already a cable at that position." + user << "There's already a cable at that position!" return diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index a73e924ee08..68bf7c270b0 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -63,7 +63,7 @@ if(istype(W, /obj/item/weapon/reagent_containers/syringe)) var/obj/item/weapon/reagent_containers/syringe/S = W - user << "You inject the solution into the power cell." + user << "You inject the solution into the power cell." if(S.reagents.has_reagent("plasma", 5)) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 61d2bb8a9f6..7196abe57e8 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -187,7 +187,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) broken_state++ else if(WT.isOn()) - user << "You don't have enough fuel to mend the damaged framework." + user << "You don't have enough fuel to mend the damaged framework!" if(GRAV_NEEDS_PLASTEEL) if(istype(I, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/PS = I @@ -197,7 +197,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 playsound(src.loc, 'sound/machines/click.ogg', 75, 1) broken_state++ else - user << "You need 10 sheets of plasteel." + user << "You need 10 sheets of plasteel!" if(GRAV_NEEDS_WRENCH) if(istype(I, /obj/item/weapon/wrench)) user << "You secure the plating to the framework." @@ -347,7 +347,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 /obj/machinery/gravity_generator/main/proc/pulse_radiation() for(var/mob/living/L in view(7, src)) - L.apply_effect(20, IRRADIATE) + L.irradiate(20) // Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. /obj/machinery/gravity_generator/main/proc/shake_everyone() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 31e2944aa96..00eb9f8c827 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -36,9 +36,9 @@ return var/turf/loc = get_turf(usr) if (!istype(loc, /turf/simulated/floor)) - usr << "[src.name] cannot be placed on this spot." + usr << "[src.name] cannot be placed on this spot!" return - usr << "Attaching [src] to the wall." + usr << "You begin attaching [src] to the wall..." playsound(src.loc, 'sound/machines/click.ogg', 75, 1) var/constrdir = usr.dir var/constrloc = usr.loc @@ -55,7 +55,7 @@ newlight.fingerprintslast = src.fingerprintslast usr.visible_message("[usr.name] attaches [src] to the wall.", \ - "You attach [src] to the wall.") + "You attach [src] to the wall.") qdel(src) /obj/item/light_fixture_frame/small @@ -99,20 +99,20 @@ if (istype(W, /obj/item/weapon/wrench)) if (src.stage == 1) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - usr << "You begin deconstructing [src]." + usr << "You begin deconstructing [src]..." if (!do_after(usr, 30)) return new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) user.visible_message("[user.name] deconstructs [src].", \ - "You deconstruct [src].", "You hear a noise.") + "You deconstruct [src].", "You hear a ratchet.") playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) qdel(src) if (src.stage == 2) - usr << "You have to remove the wires first." + usr << "You have to remove the wires first!" return if (src.stage == 3) - usr << "You have to unscrew the case first." + usr << "You have to unscrew the case first!" return if(istype(W, /obj/item/weapon/wirecutters)) @@ -125,7 +125,7 @@ src.icon_state = "bulb-construct-stage1" new /obj/item/stack/cable_coil(get_turf(src.loc), 1, "red") user.visible_message("[user.name] removes the wiring from [src].", \ - "You remove the wiring from [src].", "You hear a noise.") + "You remove the wiring from [src].", "You hear clicking.") playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) return @@ -140,9 +140,9 @@ src.icon_state = "bulb-construct-stage2" src.stage = 2 user.visible_message("[user.name] adds wires to [src].", \ - "You add wires to [src].") + "You add wires to [src].") else - user << "You need one length of cable to wire [src]." + user << "You need one length of cable to wire [src]!" return if(istype(W, /obj/item/weapon/screwdriver)) @@ -154,7 +154,7 @@ src.icon_state = "bulb-empty" src.stage = 3 user.visible_message("[user.name] closes [src]'s casing.", \ - "You close [src]'s casing.", "You hear a noise.") + "You close [src]'s casing.", "You hear screwing.") playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) switch(fixture_type) @@ -277,7 +277,7 @@ update_icon() if(on) - if(luminosity != brightness) + if(!light || light.radius != brightness) switchcount++ if(rigged) if(status == LIGHT_OK && trigger) @@ -295,11 +295,11 @@ use_power = 1 SetLuminosity(0) - active_power_usage = (luminosity * 10) + active_power_usage = (brightness * 10) if(on != on_gs) on_gs = on if(on) - static_power_used = luminosity * 20 //20W per unit luminosity + static_power_used = brightness * 20 //20W per unit luminosity addStaticPower(static_power_used, STATIC_LIGHT) else removeStaticPower(static_power_used, STATIC_LIGHT) @@ -341,14 +341,14 @@ // attempt to insert light if(istype(W, /obj/item/weapon/light)) if(status != LIGHT_EMPTY) - user << "There is a [fitting] already inserted." + user << "There is a [fitting] already inserted!" return else src.add_fingerprint(user) var/obj/item/weapon/light/L = W if(istype(L, light_type)) status = L.status - user << "You insert the [L.name]." + user << "You insert the [L.name]." switchcount = L.switchcount rigged = L.rigged brightness = L.brightness @@ -361,7 +361,7 @@ if(on && rigged) explode() else - user << "This type of light requires a [fitting]." + user << "This type of light requires a [fitting]!" return // attempt to break the light @@ -376,7 +376,7 @@ user.visible_message("[user.name] smashed the light!", \ "You hit the light, and it smashes!", \ - "You hear a tinkle of breaking glass") + "You hear a tinkle of breaking glass.") if(on && (W.flags & CONDUCT)) //if(!user.mutations & COLD_RESISTANCE) if (prob(12)) @@ -384,14 +384,14 @@ broken() else - user.visible_message("[user.name] hits the light.") + user.visible_message("[user.name] hits the light!") // attempt to stick weapon into light socket else if(status == LIGHT_EMPTY) if(istype(W, /obj/item/weapon/screwdriver)) //If it's a screwdriver open it. playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1) - user.visible_message("[user.name] opens [src]'s casing.", \ - "You open [src]'s casing.", "You hear a noise.") + user.visible_message("[user.name] opens [src]'s casing.", \ + "You open [src]'s casing.", "You hear a noise.") var/obj/machinery/light_construct/newlight = null switch(fitting) if("tube") @@ -409,7 +409,7 @@ qdel(src) return - user << "You stick \the [W] into the light socket!" + user << "You stick \the [W] into the light socket!" if(has_power() && (W.flags & CONDUCT)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) @@ -452,7 +452,7 @@ return else if (status == LIGHT_OK||status == LIGHT_BURNED) user.do_attack_animation(src) - visible_message("[user.name] smashed the light!", "You hear a tinkle of breaking glass") + visible_message("[user.name] smashed the light!", "You hear a tinkle of breaking glass.") broken() return @@ -463,7 +463,7 @@ return else if (status == LIGHT_OK||status == LIGHT_BURNED) M.do_attack_animation(src) - visible_message("[M.name] smashed the light!", "You hear a tinkle of breaking glass") + visible_message("[M.name] smashed the light!", "You hear a tinkle of breaking glass.") broken() return // attack with hand - remove tube/bulb @@ -492,11 +492,11 @@ prot = 1 if(prot > 0) - user << "You remove the light [fitting]" + user << "You remove the light [fitting]." else if(istype(user) && user.dna.check_mutation(TK)) - user << "You telekinetically remove the light [fitting]." + user << "You telekinetically remove the light [fitting]." else - user << "You try to remove the light [fitting], but you burn your hand on it!" + user << "You try to remove the light [fitting], but you burn your hand on it!" var/obj/item/organ/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm") if(affecting.take_damage( 0, 5 )) // 5 burn damage @@ -504,7 +504,7 @@ H.updatehealth() return // if burned, don't remove the light else - user << "You remove the light [fitting]." + user << "You remove the light [fitting]." // create a light tube/bulb item and put it in the user's hand var/obj/item/weapon/light/L = new light_type() L.status = status @@ -529,7 +529,7 @@ user << "There is no [fitting] in this light." return - user << "You telekinetically remove the light [fitting]." + user << "You telekinetically remove the light [fitting]." // create a light tube/bulb item and put it in the user's hand var/obj/item/weapon/light/L = new light_type() L.status = status @@ -681,7 +681,7 @@ if(istype(I, /obj/item/weapon/reagent_containers/syringe)) var/obj/item/weapon/reagent_containers/syringe/S = I - user << "You inject the solution into \the [src]." + user << "You inject the solution into \the [src]." if(S.reagents.has_reagent("plasma", 5)) @@ -707,7 +707,7 @@ /obj/item/weapon/light/proc/shatter() if(status == LIGHT_OK || status == LIGHT_BURNED) - src.visible_message("[name] shatters.","You hear a small glass object shatter.") + src.visible_message("[name] shatters.","You hear a small glass object shatter.") status = LIGHT_BROKEN force = 5 playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 79f25526b21..3202414ffb7 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -42,11 +42,11 @@ var/global/list/rad_collectors = list() if(!src.locked) toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ - "You turn the [src.name] [active? "on":"off"].") + "You turn the [src.name] [active? "on":"off"].") investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") return else - user << "The controls are locked!" + user << "The controls are locked!" return ..() @@ -59,10 +59,10 @@ var/global/list/rad_collectors = list() atmosanalyzer_scan(P.air_contents, user) else if(istype(W, /obj/item/weapon/tank/internals/plasma)) if(!src.anchored) - user << "The [src] needs to be secured to the floor first." + user << "The [src] needs to be secured to the floor first!" return 1 if(src.P) - user << "There's already a plasma tank loaded." + user << "There's already a plasma tank loaded!" return 1 user.drop_item() src.P = W @@ -74,32 +74,32 @@ var/global/list/rad_collectors = list() return 1 else if(istype(W, /obj/item/weapon/wrench)) if(P) - user << "Remove the plasma tank first." + user << "Remove the plasma tank first!" return 1 if(!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) anchored = 1 user.visible_message("[user.name] secures the [src.name].", \ - "You secure the external bolts.", \ - "You hear a ratchet") + "You secure the external bolts.", \ + "You hear a ratchet.") connect_to_network() else if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) anchored = 0 user.visible_message("[user.name] unsecures the [src.name].", \ - "You unsecure the external bolts.", \ - "You hear a ratchet") + "You unsecure the external bolts.", \ + "You hear a ratchet.") disconnect_from_network() else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (src.allowed(user)) if(active) src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + user << "You [src.locked ? "lock" : "unlock"] the controls." else src.locked = 0 //just in case it somehow gets locked - user << "The controls can only be locked when \the [src] is active." + user << "The controls can only be locked when \the [src] is active!" else - user << "Access denied!" + user << "Access denied." return 1 else ..() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 14062e210f5..ad420ffc5e6 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -94,8 +94,8 @@ user.Weaken(10) user.burn_skin(shock_damage) user.visible_message("[user.name] was shocked by the [src.name]!", \ - "You feel a powerful shock course through your body sending you flying!", \ - "You hear a heavy electrical crack.") + "You feel a powerful shock course through your body, sending you flying!", \ + "You hear a heavy electrical crack.") else if(issilicon(user)) if(prob(20)) @@ -103,7 +103,7 @@ user.take_overall_damage(0, shock_damage) user.visible_message("[user.name] was shocked by the [src.name]!", \ "Energy pulse detected, system damaged!", \ - "You hear an electrical crack.") + "You hear an electrical crack.") user.updatehealth() bump(user) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index fe3691f5415..007d10b427b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -30,7 +30,7 @@ if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "It is fastened to the floor!" + usr << "It is fastened to the floor!" return 0 src.dir = turn(src.dir, 90) return 1 @@ -58,26 +58,26 @@ src.add_fingerprint(user) if(state == 2) if(!powernet) - user << "The emitter isn't connected to a wire." + user << "The emitter isn't connected to a wire!" return 1 if(!src.locked) if(src.active==1) src.active = 0 - user << "You turn off \the [src]." + user << "You turn off \the [src]." message_admins("Emitter turned off by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])") investigate_log("turned off by [user.key]","singulo") else src.active = 1 - user << "You turn on \the [src]." + user << "You turn on \the [src]." src.shot_number = 0 src.fire_delay = 100 investigate_log("turned on by [user.key]","singulo") update_icon() else - user << "The controls are locked!" + user << "The controls are locked!" else - user << "The [src] needs to be firmly secured to the floor first." + user << "The [src] needs to be firmly secured to the floor first!" return 1 @@ -152,25 +152,25 @@ if(istype(W, /obj/item/weapon/wrench)) if(active) - user << "Turn off \the [src] first." + user << "Turn off \the [src] first!" return switch(state) if(0 && !isinspace()) state = 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the external reinforcing bolts to the floor.", \ - "You hear a ratchet") + "You secure the external reinforcing bolts to the floor.", \ + "You hear a ratchet") src.anchored = 1 if(1) state = 0 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ - "You undo the external reinforcing bolts.", \ - "You hear a ratchet") + "You undo the external reinforcing bolts.", \ + "You hear a ratchet.") src.anchored = 0 if(2) - user << "The [src.name] needs to be unwelded from the floor." + user << "The [src.name] needs to be unwelded from the floor!" return if(istype(W, /obj/item/weapon/weldingtool)) @@ -180,42 +180,42 @@ return switch(state) if(0) - user << "The [src.name] needs to be wrenched to the floor." + user << "The [src.name] needs to be wrenched to the floor!" if(1) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ - "You start to weld \the [src] to the floor.", \ - "You hear welding") + "You start to weld \the [src] to the floor...", \ + "You hear welding.") if (do_after(user,20)) if(!src || !WT.isOn()) return state = 2 - user << "You weld \the [src] to the floor." + user << "You weld \the [src] to the floor." connect_to_network() if(2) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ - "You start to cut \the [src] free from the floor.", \ - "You hear welding") + "You start to cut \the [src] free from the floor...", \ + "You hear welding.") if (do_after(user,20)) if(!src || !WT.isOn()) return state = 1 - user << "You cut \the [src] free from the floor." + user << "You cut \the [src] free from the floor." disconnect_from_network() return if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(emagged) - user << "The lock seems to be broken." + user << "The lock seems to be broken!" return if(src.allowed(user)) if(active) src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + user << "You [src.locked ? "lock" : "unlock"] the controls." else src.locked = 0 //just in case it somehow gets locked - user << "The controls can only be locked when \the [src] is online." + user << "The controls can only be locked when \the [src] is online!" else user << "Access denied." return @@ -227,4 +227,4 @@ if(!emagged) locked = 0 emagged = 1 - user.visible_message("[user.name] emags the [src.name].","You short out the lock.") + user.visible_message("[user.name] emags the [src.name].","You short out the lock.") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 4e05a8f837e..8cb5c1c626f 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -79,24 +79,24 @@ field_generator power level display if(state == 2) if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on if(src.active >= 1) - user << "You are unable to turn off the [src.name] once it is online." + user << "You are unable to turn off the [src.name] once it is online!" return 1 else - user.visible_message("[user.name] turns on the [src.name]", \ - "You turn on the [src.name].", \ - "You hear heavy droning") + user.visible_message("[user.name] turns on the [src.name].", \ + "You turn on the [src.name].", \ + "You hear heavy droning.") turn_on() investigate_log("activated by [user.key].","singulo") src.add_fingerprint(user) else - user << "The [src] needs to be firmly secured to the floor first." + user << "The [src] needs to be firmly secured to the floor first!" return /obj/machinery/field/generator/attackby(obj/item/W, mob/user, params) if(active) - user << "The [src] needs to be off." + user << "The [src] needs to be off!" return else if(istype(W, /obj/item/weapon/wrench)) switch(state) @@ -104,47 +104,47 @@ field_generator power level display state = 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the external reinforcing bolts to the floor.", \ - "You hear ratchet") + "You secure the external reinforcing bolts to the floor.", \ + "You hear ratchet.") src.anchored = 1 if(1) state = 0 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ - "You undo the external reinforcing bolts.", \ - "You hear ratchet") + "You undo the external reinforcing bolts.", \ + "You hear ratchet.") src.anchored = 0 if(2) - user << "The [src.name] needs to be unwelded from the floor." + user << "The [src.name] needs to be unwelded from the floor!" return else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W switch(state) if(0) - user << "The [src.name] needs to be wrenched to the floor." + user << "The [src.name] needs to be wrenched to the floor!" return if(1) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ - "You start to weld \the [src] to the floor.", \ - "You hear welding") + "You start to weld \the [src] to the floor...", \ + "You hear welding.") if (do_after(user,20)) if(!src || !WT.isOn()) return state = 2 - user << "You weld the field generator to the floor." + user << "You weld the field generator to the floor." else return if(2) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ - "You start to cut \the [src] free from the floor.", \ - "You hear welding") + "You start to cut \the [src] free from the floor...", \ + "You hear welding.") if (do_after(user,20)) if(!src || !WT.isOn()) return state = 1 - user << "You cut \the [src] free from the floor." + user << "You cut \the [src] free from the floor." else return else @@ -211,7 +211,7 @@ field_generator power level display if(draw_power(round(power_draw/2,1))) return 1 else - visible_message("The [src.name] shuts down!", "You hear something shutting down") + visible_message("The [src.name] shuts down!", "You hear something shutting down.") turn_off() investigate_log("ran out of power and deactivated","singulo") src.power = 0 diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index f73e3bcfa7d..6d8e6763389 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -20,14 +20,14 @@ if(!anchored && !isinspace()) user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the [src.name] to the floor.", \ - "You hear a ratchet") + "You secure the [src.name] to the floor.", \ + "You hear a ratchet.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) anchored = 1 else if(anchored) user.visible_message("[user.name] unsecures [src.name] from the floor.", \ - "You unsecure the [src.name] from the floor.", \ - "You hear a ratchet") + "You unsecure the [src.name] from the floor.", \ + "You hear a ratchet.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) anchored = 0 return diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index ed5d1f760d2..e7e3632b93e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -56,16 +56,8 @@ /obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) -/* var/radiation = (energy*2) //We don't need to do two multiplications and a single goddamn - if(istype(M,/mob/living/carbon/human)) - if(M:wear_suit) //TODO: check for radiation protection - radiation = round(radiation/2,1) - if(istype(M,/mob/living/carbon/monkey)) - if(M:wear_suit) //TODO: check for radiation protection - radiation = round(radiation/2,1)*/ - M.apply_effect((energy*6),IRRADIATE,0) + M.irradiate(energy*6) M.updatehealth() - //M << "\red You feel odd." return diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 77972f145b6..9c21da66e97 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -218,7 +218,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin "You add some wires.") temp_state++ else - user << "You need one length of cable to wire the [src.name]." + user << "You need one length of cable to wire the [src.name]!" return if(2) if(istype(O, /obj/item/weapon/wirecutters))//TODO:Shock user if its on? diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 66f6d9dac2d..85d8089d926 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -25,7 +25,7 @@ var/target = null //its target. moves towards the target if it has one var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing var/last_warning - + allow_spin = 0 /obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0) //CARN: admin-alert for chuckle-fuckery. admin_investigate_setup() @@ -341,7 +341,7 @@ radiation = round(((src.energy-150)/50)*5,1) radiationmin = round((radiation/5),1)// for(var/mob/living/M in view(toxrange, src.loc)) - M.apply_effect(rand(radiationmin,radiation), IRRADIATE) + M.irradiate(rand(radiationmin,radiation)) toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) M.apply_effect(toxdamage, TOX) return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index f3ace39921c..599cc293ec7 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -101,25 +101,25 @@ return if(terminal) //is there already a terminal ? - user << "This SMES already have a power terminal!" + user << "This SMES already have a power terminal!" return if(!panel_open) //is the panel open ? - user << "You must open the maintenance panel first!" + user << "You must open the maintenance panel first!" return var/turf/T = get_turf(user) if (T.intact) //is the floor plating removed ? - user << "You must first remove the floor plating!" + user << "You must first remove the floor plating!" return var/obj/item/stack/cable_coil/C = I if(C.amount < 10) - user << "You need more wires." + user << "You need more wires!" return - user << "You start building the power terminal..." + user << "You start building the power terminal..." playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20) && C.amount >= 10) @@ -132,8 +132,8 @@ C.use(10) user.visible_message(\ - "[user.name] has build a power terminal!",\ - "You build the power terminal.") + "[user.name] has built a power terminal.",\ + "You build the power terminal.") //build the terminal and link it to the network make_terminal(T) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index fa2254fd807..36d4fe99f60 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -59,14 +59,14 @@ if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] begins to take the glass off the solar panel.") + user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...") if(do_after(user, 50)) var/obj/item/solar_assembly/S = locate() in src if(S) S.loc = src.loc S.give_glass() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user.visible_message("[user] takes the glass off the solar panel.") + user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.") qdel(src) return else if (W) @@ -226,13 +226,13 @@ if(!anchored && isturf(loc)) if(istype(W, /obj/item/weapon/wrench)) anchored = 1 - user.visible_message("[user] wrenches the solar assembly into place.") + user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) return 1 else if(istype(W, /obj/item/weapon/wrench)) anchored = 0 - user.visible_message("[user] unwrenches the solar assembly from it's place.") + user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) return 1 @@ -241,13 +241,13 @@ if(S.use(2)) glass_type = W.type playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] places the glass on the solar assembly.") + user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.") if(tracker) new /obj/machinery/power/tracker(get_turf(src), src) else new /obj/machinery/power/solar(get_turf(src), src) else - user << "You need two sheets of glass to put them into a solar panel." + user << "You need two sheets of glass to put them into a solar panel!" return return 1 @@ -256,13 +256,13 @@ tracker = 1 user.drop_item() qdel(W) - user.visible_message("[user] inserts the electronics into the solar assembly.") + user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.") return 1 else if(istype(W, /obj/item/weapon/crowbar)) new /obj/item/weapon/tracker_electronics(src.loc) tracker = 0 - user.visible_message("[user] takes out the electronics from the solar assembly.") + user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.") return 1 ..() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 6152f0e07ab..a04bf8dda44 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -119,7 +119,7 @@ var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) + mob.irradiate(rads) explode() @@ -181,7 +181,7 @@ for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) ) - l.apply_effect(rads, IRRADIATE) + l.irradiate(rads) power -= (power/500)**3 @@ -214,18 +214,18 @@ if(Adjacent(user)) return attack_hand(user) else - user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update." + user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update." return /obj/machinery/power/supermatter_shard/attack_ai(mob/user as mob) - user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update." + user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update." /obj/machinery/power/supermatter_shard/attack_hand(mob/living/user as mob) if(!istype(user)) return - user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\ - "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ - "You hear an unearthly noise as a wave of heat washes over you.") + user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\ + "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ + "You hear an unearthly noise as a wave of heat washes over you.") playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) @@ -242,23 +242,23 @@ return if(user.drop_item(W)) Consume(W) - user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ - "You touch \the [src] with \the [W], and everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ - "Everything suddenly goes silent.") + user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ + "You touch \the [src] with \the [W], and everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ + "Everything suddenly goes silent.") playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) - user.apply_effect(150, IRRADIATE) + user.irradiate(150) /obj/machinery/power/supermatter_shard/Bumped(atom/AM as mob|obj) if(istype(AM, /mob/living)) - AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ - "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ - "You hear an unearthly noise as a wave of heat washes over you.") + AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\ + "You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\ + "You hear an unearthly noise as a wave of heat washes over you.") else if(isobj(AM) && !istype(AM, /obj/effect)) - AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.",\ - "You hear a loud crack as you are washed with a wave of heat.") + AM.visible_message("\The [AM] smacks into \the [src] and rapidly flashes to ash.",\ + "You hear a loud crack as you are washed with a wave of heat.") else return @@ -283,10 +283,10 @@ //Some poor sod got eaten, go ahead and irradiate people nearby. for(var/mob/living/L in range(10)) var/rads = 500 * sqrt( 1 / (get_dist(L, src) + 1) ) - L.apply_effect(rads, IRRADIATE) + L.irradiate(rads) investigate_log("has irradiated [L] after consuming [AM].", "supermatter") if(L in view()) - L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\ - "The unearthly ringing subsides and you notice you have new radiation burns.", 2) + L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\ + "The unearthly ringing subsides and you notice you have new radiation burns.", 2) else - L.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) + L.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 834f7e3f9b3..724de7a1b41 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -52,12 +52,12 @@ if(istype(loc, /turf/simulated)) var/turf/simulated/T = loc if(T.intact) - user << "You must first expose the power terminal!" + user << "You must first expose the power terminal!" return if(master && master.can_terminal_dismantle()) - user.visible_message("[user.name] dismantles the power terminal from [master].", \ - "You begin to cut the cables...") + user.visible_message("[user.name] dismantles the power terminal from [master].", \ + "You begin to cut the cables...") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50)) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 9b66f6afb91..2ce74ae88dd 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -62,14 +62,14 @@ if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] begins to take the glass off the solar tracker.") + user.visible_message("[user] begins to take the glass off the solar tracker.", "You begin to take the glass off the solar tracker...") if(do_after(user, 50)) var/obj/item/solar_assembly/S = locate() in src if(S) S.loc = src.loc S.give_glass() playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user.visible_message("[user] takes the glass off the tracker.") + user.visible_message("[user] takes the glass off the tracker.", "You take the glass off the tracker.") qdel(src) return ..() diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 5ff242be8aa..f2055dc64a3 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -51,7 +51,7 @@ box.update_icon() user << "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s." else - user << "You fail to collect anything." + user << "You fail to collect anything!" //Boxes of ammo /obj/item/ammo_box diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index aa1e1efa356..d170962a7ae 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -125,10 +125,14 @@ /obj/item/ammo_casing/energy/plasma projectile_type = /obj/item/projectile/plasma select_name = "plasma burst" - fire_sound = 'sound/weapons/pulse.ogg' + fire_sound = 'sound/weapons/Laser.ogg' + delay = 10 + e_cost = 25 /obj/item/ammo_casing/energy/plasma/adv projectile_type = /obj/item/projectile/plasma/adv + delay = 8 + e_cost = 10 /obj/item/ammo_casing/energy/wormhole projectile_type = /obj/item/projectile/beam/wormhole diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 57606d89072..4cc38cb4fc2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -91,7 +91,7 @@ if(!message) return if(pointblank) - user.visible_message("[user] fires [src] point blank at [pbtarget]!", "You fire [src] point blank at [pbtarget]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!") + user.visible_message("[user] fires [src] point blank at [pbtarget]!", "You fire [src] point blank at [pbtarget]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!") else user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!") @@ -119,7 +119,7 @@ if(istype(user, /mob/living)) var/mob/living/M = user if (M.disabilities & CLUMSY && prob(40)) - user << "You shoot yourself in the foot with \the [src]!" + user << "You shoot yourself in the foot with \the [src]!" process_fire(user,user,0,params) M.drop_item() return @@ -134,7 +134,7 @@ /obj/item/weapon/gun/proc/can_trigger_gun(mob/living/carbon/user) if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 0 if(!handle_pins(user)) @@ -143,10 +143,10 @@ if(trigger_guard) if(istype(user) && user.dna) if(user.dna.check_mutation(HULK)) - user << "Your meaty finger is much too large for the trigger guard!" + user << "Your meaty finger is much too large for the trigger guard!" return 0 if(NOGUNS in user.dna.species.specflags) - user << "Your fingers don't fit in the trigger guard!" + user << "Your fingers don't fit in the trigger guard!" return 0 return 1 @@ -159,7 +159,7 @@ pin.auth_fail(user) return 0 else - user << "\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!" + user << "\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!" return 0 @@ -232,7 +232,7 @@ if(can_flashlight) if(!F) if(user.l_hand != src && user.r_hand != src) - user << "You'll need [src] in your hands to do that." + user << "You'll need [src] in your hands to do that!" return user.drop_item() user << "You click [S] into place on [src]." @@ -247,7 +247,7 @@ if(istype(A, /obj/item/weapon/screwdriver)) if(F) if(user.l_hand != src && user.r_hand != src) - user << "You'll need [src] in your hands to do that." + user << "You'll need [src] in your hands to do that!" return for(var/obj/item/device/flashlight/seclite/S in src) user << "You unscrew the seclite from [src]." @@ -275,7 +275,7 @@ var/mob/living/carbon/human/user = usr if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]." + user << "You cannot turn the light on while in this [user.loc]!" F.on = !F.on user << "You toggle the gunlight [F.on ? "on":"off"]." diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index d342e89b0d4..b728fc3a886 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -67,7 +67,7 @@ fire_sound = shot.fire_sound fire_delay = shot.delay if (shot.select_name) - user << "[src] is now set to [shot.select_name]." + user << "[src] is now set to [shot.select_name]." update_icon() return diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index d5011d4e7d5..dff570dca52 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -62,14 +62,14 @@ M << "Your gun feels pleasantly warm for a moment." else M << "You feel a warm sensation." - M.apply_effect(rand(3,120), IRRADIATE) + M.irradiate(rand(3,120)) lightfail = 1 else for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES if (src in M.contents) M << "Your gun's reactor overloads!" M << "You feel a wave of heat wash over you." - M.apply_effect(300, IRRADIATE) + M.irradiate(300) crit_fail = 1 //break the gun so it stops recharging SSobj.processing.Remove(src) update_icon() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 9fb83e560f7..58baa81e928 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -125,51 +125,17 @@ cell_type = "/obj/item/weapon/stock_parts/cell/emproof" needs_permit = 0 // Aparently these are safe to carry? I'm sure Golliaths would disagree. var/overheat = 0 + var/overheat_time = 16 var/recent_reload = 1 - var/range_add = 0 - var/overheat_time = 20 - upgrades = list("diamond" = 0, "screwdriver" = 0, "plasma" = 0) unique_rename = 1 -/obj/item/weapon/gun/energy/kinetic_accelerator/newshot() - ..() - if(chambered && chambered.BB) - var/obj/item/projectile/kinetic/charge = chambered.BB - charge.range += range_add - - -/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/screwdriver) && upgrades["screwdriver"] < 3) - upgrades["screwdriver"]++ - overheat_time -= 1 - user << "You tweak [src]'s thermal exchanger." - - - else if(istype(W, /obj/item/stack)) - var/obj/item/stack/S = W - - if(istype(S, /obj/item/stack/sheet/mineral/diamond) && upgrades["diamond"] < 3) - upgrades["diamond"]++ - overheat_time -= 3 - user << "You upgrade [src]'s thermal exchanger with diamonds." - S.use(1) - - if(istype(S, /obj/item/stack/sheet/mineral/plasma) && upgrades["plasma"] < 2) - upgrades["plasma"]++ - range_add++ - user << "You upgrade [src]'s accelerating chamber with plasma." - if(prob(5 * (range_add + 1) * (range_add + 1)) && power_supply) - power_supply.rigged = 1 // This is dangerous! - S.use(1) - - ..() - /obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot() overheat = 1 spawn(overheat_time) overheat = 0 recent_reload = 0 ..() + /obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) return @@ -196,6 +162,7 @@ suppressed = 1 ammo_type = list(/obj/item/ammo_casing/energy/bolt) unique_rename = 0 + overheat_time = 20 /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large name = "energy crossbow" @@ -213,65 +180,36 @@ desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off of xenos! Or, you know, mine stuff." icon_state = "plasmacutter" item_state = "plasmacutter" - force = 15 - damtype = "fire" modifystate = -1 origin_tech = "combat=1;materials=3;magnets=2;plasmatech=2;engineering=1" ammo_type = list(/obj/item/ammo_casing/energy/plasma) flags = CONDUCT | OPENCONTAINER attack_verb = list("attacked", "slashed", "cut", "sliced") can_charge = 0 - var/volume = 15 -/obj/item/weapon/gun/energy/plasmacutter/New() +/obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) ..() - create_reagents(volume) - -/obj/item/weapon/gun/energy/plasmacutter/newshot() - if (!ammo_type || !reagents) return - var/obj/item/ammo_casing/energy/shot = ammo_type[select] - - var/amount = shot.e_cost / 100 - - if(!reagents.get_reagent_amount("plasma") >= amount) - return - - reagents.remove_reagent("plasma", amount) - chambered = shot - chambered.newshot() - return - -/obj/item/weapon/gun/energy/plasmacutter/examine() - ..() - usr << "Has [reagents.get_reagent_amount("plasma")] unit\s of plasma left." - return + if(power_supply) + user <<"[src] is [round(power_supply.percent())]% charged." /obj/item/weapon/gun/energy/plasmacutter/attackby(var/obj/item/A, var/mob/user) - if(reagents.maximum_volume > reagents.total_volume) - if(istype(A, /obj/item/stack/sheet/mineral/plasma)) - var/obj/item/stack/sheet/S = A - S.use(1) - reagents.add_reagent("plasma", 20) - user << "You refill [src] with [S]. [reagents.get_reagent_amount("plasma")] units of plasma left." - if(istype(A, /obj/item/weapon/ore/plasma)) - qdel(A) - reagents.add_reagent("plasma", 10) - user << "You refill [src] with [A]. [reagents.get_reagent_amount("plasma")] units of plasma left." - if(istype(A, /obj/item/weapon/storage/bag/ore)) - if(locate(/obj/item/weapon/ore/plasma) in A) - attackby(locate(/obj/item/weapon/ore/plasma) in A, user) - ..() - -/obj/item/weapon/gun/energy/plasmacutter/charged/New() - ..() - reagents.add_reagent("plasma", volume) + if(istype(A, /obj/item/stack/sheet/mineral/plasma)) + var/obj/item/stack/sheet/S = A + S.use(1) + power_supply.give(1000) + user << "You insert [A] in [src], recharging it." + else if(istype(A, /obj/item/weapon/ore/plasma)) + qdel(A) + power_supply.give(500) + user << "You insert [A] in [src], recharging it." + else + ..() /obj/item/weapon/gun/energy/plasmacutter/adv name = "advanced plasma cutter" icon_state = "adv_plasmacutter" origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2" ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv) - volume = 25 /obj/item/weapon/gun/energy/disabler name = "disabler" diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm new file mode 100644 index 00000000000..7e4071a78a9 --- /dev/null +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -0,0 +1,60 @@ +/obj/item/weapon/gun/grenadelauncher + name = "grenade launcher" + desc = "a terrible, terrible thing. it's really awful!" + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "riotgun" + item_state = "riotgun" + w_class = 4.0 + throw_speed = 2 + throw_range = 7 + force = 5.0 + var/list/grenades = new/list() + var/max_grenades = 3 + m_amt = 2000 + +/obj/item/weapon/gun/grenadelauncher/examine(mob/user) + ..() + user << "[grenades] / [max_grenades] grenades loaded." + +/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) + + if((istype(I, /obj/item/weapon/grenade))) + if(grenades.len < max_grenades) + user.drop_item() + I.loc = src + grenades += I + user << "You put the grenade in the grenade launcher." + user << "[grenades.len] / [max_grenades] Grenades." + else + usr << "The grenade launcher cannot hold more grenades." + +/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) + + if (istype(target, /obj/item/weapon/storage/backpack )) + return + + else if (locate (/obj/structure/table, src.loc)) + return + + else if(target == user) + return + + if(grenades.len) + spawn(0) fire_grenade(target,user) + else + usr << "The grenade launcher is empty." + +/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) + user.visible_message("[user] fired a grenade!", \ + "You fire the grenade launcher!") + var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! + grenades -= F + F.loc = user.loc + F.throw_at(target, 30, 2) + message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + F.active = 1 + F.icon_state = initial(icon_state) + "_active" + playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + spawn(15) + F.prime() diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index ad7246f8359..20cf03caaa3 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -48,7 +48,7 @@ /obj/item/weapon/gun/magic/wand/proc/zap_self(mob/living/user as mob) - user.visible_message("[user] zaps \himself with [src]!") + user.visible_message("[user] zaps \himself with [src].") playsound(user, fire_sound, 50, 1) user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] zapped \himself with a [src]" diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 1281adc83e5..66184119b45 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -79,10 +79,10 @@ update_icon() return else - user << "[src] already has a suppressor." + user << "[src] already has a suppressor!" return else - user << "You can't seem to figure out how to fit [S] on [src]." + user << "You can't seem to figure out how to fit [S] on [src]!" return return 0 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 5fe4cac6f8f..010b3686cc6 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -88,6 +88,9 @@ burst_size = 2 pin = /obj/item/device/firing_pin/implant/pindicate +/obj/item/weapon/gun/projectile/automatic/c20r/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/automatic/c20r/New() ..() update_icon() @@ -133,7 +136,7 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays if(cover_open) - user << "[src]'s cover is open! Close it before firing!" + user << "[src]'s cover is open! Close it before firing!" else ..() update_icon() @@ -157,7 +160,7 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/attackby(var/obj/item/A as obj, mob/user as mob, params) if(!cover_open) - user << "[src]'s cover is closed! You can't insert a new mag!" + user << "[src]'s cover is closed! You can't insert a new mag." return ..() @@ -175,6 +178,9 @@ fire_delay = 2 pin = /obj/item/device/firing_pin/implant/pindicate +/obj/item/weapon/gun/projectile/automatic/m90/unrestricted + pin = /obj/item/device/firing_pin + /obj/item/weapon/gun/projectile/automatic/m90/New() ..() underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src) diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 0073e04b2fe..471b5401196 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -39,7 +39,7 @@ if (num_unloaded) user << "You unload [num_unloaded] shell\s from [src]." else - user << "[src] is empty." + user << "[src] is empty!" /obj/item/weapon/gun/projectile/revolver/can_shoot() return get_ammo(0,0) @@ -77,7 +77,7 @@ if(magazine.caliber != initial(magazine.caliber)) if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 playsound(user, fire_sound, 50, 1) - user << "[src] blows up in your face!" + user << "[src] blows up in your face!" user.take_organ_damage(0,20) user.drop_item() qdel(src) @@ -88,31 +88,31 @@ ..() if(istype(A, /obj/item/weapon/screwdriver)) if(magazine.caliber == "38") - user << "You begin to reinforce the barrel of [src]." + user << "You begin to reinforce the barrel of [src]..." if(magazine.ammo_count()) afterattack(user, user) //you know the drill - user.visible_message("[src] goes off!", "[src] goes off in your face!") + user.visible_message("[src] goes off!", "[src] goes off in your face!") return if(do_after(user, 30)) if(magazine.ammo_count()) - user << "You can't modify it!" + user << "You can't modify it!" return magazine.caliber = "357" desc = "The barrel and chamber assembly seems to have been modified." - user << "You reinforce the barrel of [src]! Now it will fire .357 rounds." + user << "You reinforce the barrel of [src]. Now it will fire .357 rounds." else - user << "You begin to revert the modifications to [src]." + user << "You begin to revert the modifications to [src]..." if(magazine.ammo_count()) afterattack(user, user) //and again - user.visible_message("[src] goes off!", "[src] goes off in your face!") + user.visible_message("[src] goes off!", "[src] goes off in your face!") return if(do_after(user, 30)) if(magazine.ammo_count()) - user << "You can't modify it!" + user << "You can't modify it!" return magazine.caliber = "38" desc = initial(desc) - user << "You remove the modifications on [src]! Now it will fire .38 rounds." + user << "You remove the modifications on [src]. Now it will fire .38 rounds." /obj/item/weapon/gun/projectile/revolver/mateba @@ -147,9 +147,9 @@ /obj/item/weapon/gun/projectile/revolver/russian/attackby(var/obj/item/A as obj, mob/user as mob, params) var/num_loaded = ..() if(num_loaded) - user.visible_message("[user] loads a single bullet into the revolver and spins the chamber.", "You load a single bullet into the chamber and spin it.") + user.visible_message("[user] loads a single bullet into the revolver and spins the chamber.", "You load a single bullet into the chamber and spin it.") else - user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") + user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") if(get_ammo() > 0) Spin() update_icon() @@ -158,7 +158,7 @@ /obj/item/weapon/gun/projectile/revolver/russian/attack_self(mob/user as mob) if(!spun && can_shoot()) - user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") + user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") Spin() else var/num_unloaded = 0 @@ -170,7 +170,7 @@ CB.update_icon() num_unloaded++ if (num_unloaded) - user << "You unload [num_unloaded] shell\s from [src]!" + user << "You unload [num_unloaded] shell\s from [src]." else user << "[src] is empty." @@ -185,13 +185,13 @@ return if(target != user) if(ismob(target)) - user << "A mechanism prevents you from shooting anyone but yourself." + user << "A mechanism prevents you from shooting anyone but yourself!" return if(ishuman(user)) var/mob/living/carbon/human/H = user if(!spun) - user << "You need to spin the revolver's chamber first." + user << "You need to spin the revolver's chamber first!" return spun = 0 @@ -204,9 +204,9 @@ var/limb_name = affecting.getDisplayName() if(affecting.name == "head" || affecting.name == "eyes" || affecting.name == "mouth") user.apply_damage(300, BRUTE, affecting) - user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a gunshot!") + user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a gunshot!") else - user.visible_message("[user.name] cowardly fires [src] at \his [limb_name]!", "You cowardly fire [src] at your [limb_name]!", "You hear a gunshot!") + user.visible_message("[user.name] cowardly fires [src] at \his [limb_name]!", "You cowardly fire [src] at your [limb_name]!", "You hear a gunshot!") return user.visible_message("*click*") diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 0baee44780b..e5d5b462c6d 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -175,7 +175,7 @@ if (num_unloaded) user << "You break open \the [src] and unload [num_unloaded] shell\s." else - user << "[src] is empty." + user << "[src] is empty!" // IMPROVISED SHOTGUN // @@ -204,7 +204,7 @@ user << "You tie the lengths of cable to the shotgun, making a sling." update_icon() else - user << "You need at least ten lengths of cable if you want to make a sling." + user << "You need at least ten lengths of cable if you want to make a sling!" return // Sawing guns related procs // @@ -224,13 +224,13 @@ /obj/item/weapon/gun/projectile/proc/sawoff(mob/user as mob) if(sawn_state == SAWN_OFF) - user << "\The [src] is already shortened." + user << "\The [src] is already shortened!" return if(sawn_state == SAWN_SAWING) return - user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src].") + user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...") //if there's any live ammo inside the gun, makes it go off if(blow_up(user)) @@ -240,7 +240,7 @@ sawn_state = SAWN_SAWING if(do_after(user, 30)) - user.visible_message("[user] shortens \the [src]!", "You shorten \the [src]!") + user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].") name = "sawn-off [src.name]" desc = sawn_desc icon_state = "[icon_state]-sawn" diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm new file mode 100644 index 00000000000..2fb641d6c56 --- /dev/null +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -0,0 +1,79 @@ +/obj/item/weapon/gun/syringe + name = "syringe gun" + desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." + icon_state = "syringegun" + item_state = "syringegun" + w_class = 3 + throw_speed = 3 + throw_range = 7 + force = 4 + m_amt = 2000 + clumsy_check = 0 + fire_sound = 'sound/items/syringeproj.ogg' + var/list/syringes = list() + var/max_syringes = 1 + +/obj/item/weapon/gun/syringe/New() + ..() + chambered = new /obj/item/ammo_casing/syringegun(src) + +/obj/item/weapon/gun/syringe/proc/newshot() + if(!syringes.len) return + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] + + if(!S) return + + chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) + S.reagents.trans_to(chambered.BB, S.reagents.total_volume) + chambered.BB.name = S.name + syringes.Remove(S) + + qdel(S) + return + +/obj/item/weapon/gun/syringe/process_chamber() + return + +/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) + if(target == loc) + return + newshot() + ..() + +/obj/item/weapon/gun/syringe/examine(mob/user) + ..() + user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." + +/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) + if(!syringes.len) + user << "[src] is empty!" + return 0 + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] + + if(!S) return 0 + S.loc = user.loc + + syringes.Remove(S) + user << "You unload [S] from \the [src]." + + return 1 + +/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1) + if(istype(A, /obj/item/weapon/reagent_containers/syringe)) + if(syringes.len < max_syringes) + user.drop_item() + user << "You load [A] into \the [src]." + syringes.Add(A) + A.loc = src + return 1 + else + usr << "[src] cannot hold more syringes!" + return 0 + +/obj/item/weapon/gun/syringe/rapidsyringe + name = "rapid syringe gun" + desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." + icon_state = "rapidsyringegun" + max_syringes = 6 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8745de421ff..37a75e268dd 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -2,12 +2,11 @@ name = "projectile" icon = 'icons/obj/projectiles.dmi' icon_state = "bullet" - density = 1 + density = 0 unacidable = 1 pass_flags = PASSTABLE mouse_opacity = 0 hitsound = 'sound/weapons/pierce.ogg' - var/bumped = 0 //Prevents it from hitting more than one guy at once var/def_zone = "" //Aiming at var/mob/firer = null//Who shot it var/suppressed = 0 //Attack message @@ -41,7 +40,6 @@ var/forcedodge = 0 // 1 to pass solid objects, 2 to pass solid turfs (results in bugs, bugs and tons of bugs) var/range = 0 - var/proj_hit = 0 /obj/item/projectile/proc/Range() if(range) @@ -52,13 +50,34 @@ return /obj/item/projectile/proc/on_range() //if we want there to be effects when they reach the end of their range - proj_hit = 1 qdel(src) /obj/item/projectile/proc/on_hit(atom/target, blocked = 0, hit_zone) - if(!isliving(target)) return 0 - if(isanimal(target)) return 0 + if(!isliving(target)) + return 0 var/mob/living/L = target + + var/organ_hit_text = "" + if(L.has_limbs) + organ_hit_text = " in \the [parse_zone(def_zone)]" + if(suppressed) + playsound(loc, hitsound, 5, 1, -1) + L << "You're shot by \a [src][organ_hit_text]!" + else + if(hitsound) + var/volume = vol_by_damage() + playsound(loc, hitsound, volume, 1, -1) + L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \ + "[L] is hit by \a [src][organ_hit_text]!") //X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter + + var/reagent_note + if(reagents && reagents.reagent_list) + reagent_note = " REAGENTS:" + for(var/datum/reagent/R in reagents.reagent_list) + reagent_note += R.id + " (" + reagent_note += num2text(R.volume) + ") " + add_logs(firer, L, "shot", object="[src]", addition=reagent_note) + L.on_hit(type) return L.apply_effects(stun, weaken, paralyze, irradiate, stutter, slur, eyeblur, drowsy, blocked, stamina, jitter) @@ -68,52 +87,34 @@ else return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume -/obj/item/projectile/Bump(atom/A) +/obj/item/projectile/Bump(atom/A, yes) + if(!yes) //prevents multi bumps. + return if(A == firer || A == src) loc = A.loc return 0 //cannot shoot yourself - if(bumped)//Stops multihit projectiles - return 1 - bumped = 1 - if(isliving(A)) - var/mob/living/M = A - var/reagent_note - if(reagents && reagents.reagent_list) - reagent_note = " REAGENTS:" - for(var/datum/reagent/R in reagents.reagent_list) - reagent_note += R.id + " (" - reagent_note += num2text(R.volume) + ") " - var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. - def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. - if(suppressed) - playsound(loc, hitsound, 5, 1, -1) - M << "You've been shot by \a [src] in \the [parse_zone(def_zone)]!" - else - if(hitsound) - var/volume = vol_by_damage() - playsound(loc, hitsound, volume, 1, -1) - M.visible_message("[M] is hit by \a [src] in the [parse_zone(def_zone)]!", \ - "[M] is hit by \a [src] in the [parse_zone(def_zone)]!") //X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter - add_logs(firer, M, "shot", object="[src]", addition=reagent_note) + var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. + def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. + + var/turf/target_turf = get_turf(A) - var/turf/new_loc = get_turf(A) var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null if(permutation == -1 || forcedodge)// the bullet passes through a dense object! - bumped = 0 // reset bumped variable! - loc = new_loc - permutated.Add(A) + loc = target_turf + if(A) + permutated.Add(A) Range() return 0 - qdel(src) - -/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 - - if(istype(mover, /obj/item/projectile)) - return prob(95) else - return 1 + if(A && A.density && !ismob(A) && !(A.flags & ON_BORDER)) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs on that tile. + var/list/mobs_list = list() + for(var/mob/living/L in target_turf) + mobs_list += L + if(mobs_list.len) + var/mob/living/picked_mob = pick(mobs_list) + picked_mob.bullet_act(src, def_zone) + qdel(src) /obj/item/projectile/Process_Spacemove(var/movement_dir = 0) return 1 //Bullets don't drift in space @@ -129,9 +130,14 @@ if((!( current ) || loc == current)) current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) step_towards(src, current) - if(!bumped && ((original && original.layer>=2.75) || ismob(original))) + if((original && original.layer>=2.75) || ismob(original)) if(loc == get_turf(original)) if(!(original in permutated)) - Bump(original) + Bump(original, 1) Range() sleep(1) + +/obj/item/projectile/Crossed(atom/movable/AM as mob) //A mob moving on a tile with a projectile is hit by it. + ..() + if(isliving(AM) && AM.density && !checkpass(PASSMOB)) + Bump(AM, 1) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 785709398ea..88bacc76790 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -47,9 +47,9 @@ damage = 50 /obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0) + . = ..() if(istype(target,/turf/)||istype(target,/obj/structure/)) target.ex_act(2) - ..() /obj/item/projectile/beam/pulse/shot damage = 40 @@ -77,12 +77,13 @@ obj/item/projectile/beam/emitter/Destroy() var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) /obj/item/projectile/lasertag/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon/human)) + . = ..() + if(ishuman(target)) var/mob/living/carbon/human/M = target if(istype(M.wear_suit)) if(M.wear_suit.type in suit_types) M.adjustStaminaLoss(34) - return 1 + /obj/item/projectile/lasertag/redtag icon_state = "laser" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 78f8f83bfcf..09cae327199 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -57,8 +57,8 @@ color = "#FFFF00" /obj/item/projectile/bullet/incendiary/on_hit(var/atom/target, var/blocked = 0) - ..() - if(istype(target, /mob/living/carbon)) + . = ..() + if(iscarbon(target)) var/mob/living/carbon/M = target M.adjust_fire_stacks(1) M.IgniteMob() @@ -90,7 +90,7 @@ hitsound = 'sound/effects/meteorimpact.ogg' /obj/item/projectile/bullet/meteorshot/on_hit(var/atom/target, var/blocked = 0) - ..() + . = ..() if(istype(target, /atom/movable)) var/atom/movable/M = target var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) @@ -105,7 +105,8 @@ damage = 20 /obj/item/projectile/bullet/mime/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon)) + . = ..() + if(iscarbon(target)) var/mob/living/carbon/M = target M.silent = max(M.silent, 10) @@ -115,23 +116,28 @@ icon_state = "cbbolt" damage = 6 - New() - ..() - flags |= NOREACT - create_reagents(50) +/obj/item/projectile/bullet/dart/New() + ..() + flags |= NOREACT + create_reagents(50) - on_hit(var/atom/target, var/blocked = 0, var/hit_zone) - if(istype(target, /mob/living/carbon)) - var/mob/living/carbon/M = target - if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. - reagents.trans_to(M, reagents.total_volume) - return 1 - else - target.visible_message("The [name] was deflected!", \ - "You were protected against the [name]!") - flags &= ~NOREACT - reagents.handle_reactions() - return 1 +/obj/item/projectile/bullet/dart/on_hit(var/atom/target, var/blocked = 0, var/hit_zone) + var/deflect = 0 + if(iscarbon(target)) + var/mob/living/carbon/M = target + if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. + ..() + reagents.trans_to(M, reagents.total_volume) + return 1 + else + deflect = 1 + target.visible_message("The [name] was deflected!", \ + "You were protected against the [name]!") + if(!deflect) + ..() + flags &= ~NOREACT + reagents.handle_reactions() + return 1 /obj/item/projectile/bullet/dart/metalfoam New() @@ -155,5 +161,6 @@ /obj/item/projectile/bullet/neurotoxin/on_hit(var/atom/target, var/blocked = 0) if(isalien(target)) - return 0 - ..() // Execute the rest of the code. + weaken = 0 + nodamage = 1 + . = ..() // Execute the rest of the code. diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 4f4edc5dcd7..ea3b048e13e 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -19,27 +19,23 @@ range = 7 /obj/item/projectile/energy/electrode/on_hit(var/atom/target, var/blocked = 0) - if(!proj_hit) - if(!ismob(target) || blocked >= 2) //Fully blocked by mob or collided with dense object - burst into sparks! - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() - proj_hit = 1 - else if(iscarbon(target)) - var/mob/living/carbon/C = target - if(C.dna && C.dna.check_mutation(HULK)) - C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - else if(C.status_flags & CANWEAKEN) - spawn(5) - C.do_jitter_animation(jitter) - ..() - -/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet - if(!proj_hit) + . = ..() + if(!ismob(target) || blocked >= 2) //Fully blocked by mob or collided with dense object - burst into sparks! var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread sparks.set_up(1, 1, src) sparks.start() - proj_hit = 1 + else if(iscarbon(target)) + var/mob/living/carbon/C = target + if(C.dna && C.dna.check_mutation(HULK)) + C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if(C.status_flags & CANWEAKEN) + spawn(5) + C.do_jitter_animation(jitter) + +/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() ..() /obj/item/projectile/energy/declone diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index d485784109c..1dd1129f74f 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -11,6 +11,7 @@ icon_state = "pulse1_bl" /obj/item/projectile/magic/death/on_hit(var/target) + . = ..() if(ismob(target)) var/mob/M = target M.death(0) @@ -31,6 +32,7 @@ ..() /obj/item/projectile/magic/fireball/on_hit(var/target) + . = ..() var/turf/T = get_turf(target) explosion(T, -1, 0, 2, 3, 0, flame_range = 2) if(ismob(target)) //multiple flavors of pain @@ -46,8 +48,8 @@ flag = "magic" /obj/item/projectile/magic/resurrection/on_hit(var/mob/living/carbon/target) - - if(istype(target,/mob)) + . = ..() + if(ismob(target)) var/old_stat = target.stat target.revive() target.suiciding = 0 @@ -72,6 +74,7 @@ var/outer_tele_radius = 6 /obj/item/projectile/magic/teleport/on_hit(var/mob/target) + . = ..() var/teleammount = 0 var/teleloc = target if(!isturf(target)) @@ -93,6 +96,7 @@ flag = "magic" /obj/item/projectile/magic/door/on_hit(var/atom/target) + . = ..() var/atom/T = target.loc if(isturf(target) && target.density) CreateDoor(target) @@ -116,6 +120,7 @@ flag = "magic" /obj/item/projectile/magic/change/on_hit(var/atom/change) + . = ..() wabbajack(change) proc/wabbajack(mob/living/M) diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm index 0e9d010d3fe..414be55b31a 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable.dm @@ -4,25 +4,22 @@ var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/ /obj/item/projectile/bullet/reusable/on_hit(var/atom/target, var/blocked = 0) - if(!proj_hit) - proj_hit = 1 - if (src.contents.len) - var/obj/content - for(content in src.contents) - content.loc = src.loc - else - new ammo_type(src.loc) - ..() + . = ..() + if (src.contents.len) + var/obj/content + for(content in src.contents) + content.loc = src.loc + else + new ammo_type(src.loc) /obj/item/projectile/bullet/reusable/on_range() - if(!proj_hit) - if (src.contents.len) - var/obj/content - for(content in src.contents) - content.loc = src.loc - else - new ammo_type(src.loc) - ..() + if (src.contents.len) + var/obj/content + for(content in src.contents) + content.loc = src.loc + else + new ammo_type(src.loc) + ..() /obj/item/projectile/bullet/reusable/magspear name = "magnetic spear" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 689fc678d63..5714b2f7b12 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -8,6 +8,7 @@ /obj/item/projectile/ion/on_hit(atom/target, blocked = 0) + ..() empulse(target, 1, 1) return 1 @@ -15,6 +16,7 @@ /obj/item/projectile/ion/weak /obj/item/projectile/ion/weak/on_hit(atom/target, blocked = 0) + ..() empulse(target, 0, 0) return 1 @@ -26,6 +28,7 @@ flag = "bullet" /obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = 0) + ..() explosion(target, -1, 0, 2) return 1 @@ -37,6 +40,7 @@ flag = "bullet" /obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0) + ..() explosion(target, -1, 0, 2, 1, 0, flame_range = 3) return 1 @@ -51,7 +55,8 @@ /obj/item/projectile/temp/on_hit(atom/target, blocked = 0)//These two could likely check temp protection on the mob - if(istype(target, /mob/living)) + ..() + if(isliving(target)) var/mob/M = target M.bodytemperature = temperature return 1 @@ -69,7 +74,9 @@ nodamage = 1 flag = "bullet" -/obj/item/projectile/meteor/Bump(atom/A) +/obj/item/projectile/meteor/Bump(atom/A, yes) + if(!yes) //prevents multi bumps. + return if(A == firer) loc = A.loc return @@ -100,6 +107,7 @@ name = "flayer ray" /obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = 0) + . = ..() if(ishuman(target)) var/mob/living/carbon/human/M = target M.adjustBrainLoss(20) @@ -108,7 +116,7 @@ /obj/item/projectile/kinetic name = "kinetic force" icon_state = null - damage = 15 + damage = 10 damage_type = BRUTE flag = "bomb" range = 3 @@ -121,31 +129,24 @@ obj/item/projectile/kinetic/New() var/pressure = environment.return_pressure() if(pressure < 50) name = "full strength kinetic force" - damage *= 2 + damage *= 4 ..() /obj/item/projectile/kinetic/Range() range-- if(range <= 0) new /obj/item/effect/kinetic_blast(src.loc) - for(var/turf/T in range(1, src.loc)) - if(istype(T, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = T - M.gets_drilled(firer) qdel(src) /obj/item/projectile/kinetic/on_hit(atom/target) + . = ..() var/turf/target_turf= get_turf(target) if(istype(target_turf, /turf/simulated/mineral)) var/turf/simulated/mineral/M = target_turf M.gets_drilled(firer) new /obj/item/effect/kinetic_blast(target_turf) - if(isturf(target)) - for(var/turf/T in range(1, target_turf)) - if(istype(T, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = T - M.gets_drilled(firer) - ..() + + /obj/item/effect/kinetic_blast name = "kinetic explosion" @@ -178,14 +179,14 @@ obj/item/projectile/kinetic/New() /obj/item/projectile/beam/wormhole/on_hit(var/atom/target) if(ismob(target)) - ..() - return + return ..() if(!gun) qdel(src) gun.create_portal(src) /obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = 0) + ..() explosion(target, -1, 0, 2) return 1 @@ -196,40 +197,38 @@ obj/item/projectile/kinetic/New() weaken = 5 /obj/item/projectile/bullet/frag12/on_hit(atom/target, blocked = 0) + ..() explosion(target, -1, 0, 1) return 1 /obj/item/projectile/plasma name = "plasma blast" icon_state = "plasmacutter" - damage_type = BURN - damage = 10 - range = 6 - var/power = 9 + damage_type = BRUTE + damage = 5 + range = 1 + +obj/item/projectile/plasma/New() + var/turf/proj_turf = get_turf(src) + if(!istype(proj_turf, /turf)) + return + var/datum/gas_mixture/environment = proj_turf.return_air() + var/pressure = environment.return_pressure() + if(pressure < 30) + name = "full strength plasma blast" + damage *= 3 + range += 3 + ..() /obj/item/projectile/plasma/on_hit(var/atom/target) if(istype(target, /turf/simulated/mineral)) - while(target && target.density && range > 0 && power > 0) - power -= 1 - var/turf/simulated/mineral/M = target - M.gets_drilled() - if(range > 0 && power > 0) - return -1 + var/turf/simulated/mineral/M = target + M.gets_drilled(firer) return ..() /obj/item/projectile/plasma/adv - range = 9 - power = 12 - damage = 15 - -/obj/item/projectile/plasma/adv/on_hit(var/atom/target) - if(!ismob(target) && !istype(target, /turf/simulated/mineral)) - target.ex_act(3) - power -= 10 - if(range > 0 && power > 0 && (!target || !target.density)) - return -1 - return ..() + range = 2 /obj/item/projectile/plasma/adv/mech - range = 12 - power = 18 \ No newline at end of file + damage = 10 + range = 3 diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm index dacb964d7ab..06a63b7c8cd 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -25,7 +25,7 @@ datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) if(prob(20)) - M << "You feel like you smoked too much." + M << "You feel like you've smoked too much." M.adjustToxLoss(1*REM) M.adjustOxyLoss(1*REM) ..() diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index 88860f358f5..2659fed7197 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -683,7 +683,9 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac /mob/living/simple_animal/hostile/asteroid/hivelordbrood, /mob/living/simple_animal/hostile/carp/holocarp, /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/poison + /mob/living/simple_animal/hostile/poison, + /mob/living/simple_animal/hostile/blob, + /mob/living/simple_animal/ascendant_shadowling )//exclusion list for things you don't want the reaction to create. var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs var/atom/A = holder.my_atom diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index 53bb47c6f9e..0e3b34e44cb 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -410,9 +410,9 @@ /datum/chemical_reaction/napalm name = "Napalm" id = "napalm" - result = null - required_reagents = list("aluminium" = 1, "plasma" = 1, "sacid" = 1 ) - result_amount = 1 + result = "napalm" + required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 ) + result_amount = 3 datum/reagent/cryostylane name = "Cryostylane" diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm index 7693d241c0b..b8ebe016012 100644 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -230,7 +230,7 @@ datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) 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.visible_message("[H] clutches at their chest as if their heart stopped!", "You clutch at your chest as if your heart stopped!") H.heart_attack = 1 // rip in pepperoni else H.losebreath += 10 diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 98496d254fe..a43266291d2 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -215,26 +215,31 @@ datum/reagents/proc/metabolize(var/mob/M) if(M) chem_temp = M.bodytemperature handle_reactions() - if(last_tick == 3) - last_tick = 1 - for(var/A in reagent_list) - var/datum/reagent/R = A - if(M && R) - if(M.reagent_check(R) != 1) - if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + + for(var/A in reagent_list) + var/datum/reagent/R = A + if(!R.holder) + continue + if(!M) + M = R.holder.my_atom + if(M && R) + if(M.reagent_check(R) != 1) + if(R.overdose_threshold) + if(R.volume >= R.overdose_threshold && !R.overdosed) R.overdosed = 1 - M << "You feel like you took too much of [R.name]!" R.overdose_start(M) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) + if(R.addiction_threshold) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list)) var/datum/reagent/new_reagent = new R.type() addiction_list.Add(new_reagent) - if(R.overdosed) - R.overdose_process(M) - if(is_type_in_list(R,addiction_list)) - for(var/datum/reagent/addicted_reagent in addiction_list) - if(istype(R, addicted_reagent)) - addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. - R.on_mob_life(M) + if(R.overdosed) + R.overdose_process(M) + if(is_type_in_list(R,addiction_list)) + for(var/datum/reagent/addicted_reagent in addiction_list) + if(istype(R, addicted_reagent)) + addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. + R.on_mob_life(M) + if(addiction_tick == 6) addiction_tick = 1 for(var/A in addiction_list) @@ -258,7 +263,6 @@ datum/reagents/proc/metabolize(var/mob/M) M << "You feel like you've gotten over your need for [R.name]." addiction_list.Remove(R) addiction_tick++ - last_tick++ update_total() datum/reagents/process() diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 68118cdbcf4..4fd76334aab 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -153,13 +153,13 @@ return if(src.beaker) - user << "A beaker is already loaded into the machine." + user << "A beaker is already loaded into the machine!" return src.beaker = B user.drop_item() B.loc = src - user << "You add the beaker to the machine!" + user << "You add the beaker to the machine." SSnano.update_uis(src) // update all UIs attached to src if(!icon_beaker) @@ -286,23 +286,23 @@ if(istype(B, /obj/item/weapon/reagent_containers/glass)) if(src.beaker) - user << "A beaker is already loaded into the machine." + user << "A beaker is already loaded into the machine!" return src.beaker = B user.drop_item() B.loc = src - user << "You add the beaker to the machine!" + user << "You add the beaker to the machine." src.updateUsrDialog() icon_state = "mixer1" else if(!condi && istype(B, /obj/item/weapon/storage/pill_bottle)) if(src.loaded_pill_bottle) - user << "A pill bottle is already loaded into the machine." + user << "A pill bottle is already loaded into the machine!" return src.loaded_pill_bottle = B user.drop_item() B.loc = src - user << "You add the pill bottle into the dispenser slot!" + user << "You add the pill bottle into the dispenser slot." src.updateUsrDialog() return @@ -580,7 +580,7 @@ /obj/machinery/chem_master/constructable name = "ChemMaster 2999" desc = "Used to seperate chemicals and distribute them in a variety of forms." - + /obj/machinery/chem_master/constructable/New() ..() component_parts = list() @@ -589,10 +589,10 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(null) component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) - + /obj/machinery/chem_master/constructable/attackby(var/obj/item/B as obj, var/mob/user as mob, params) - if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0_", B)) + if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B)) if(beaker) beaker.loc = src.loc beaker = null @@ -601,37 +601,37 @@ loaded_pill_bottle.loc = src.loc loaded_pill_bottle = null return - + if(exchange_parts(user, B)) return - + if(panel_open) if(istype(B, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(B) return 1 else - user << "You can't use the [src.name] while it's panel is opened." + user << "You can't use the [src.name] while it's panel is opened!" return 1 if(istype(B, /obj/item/weapon/reagent_containers/glass)) if(src.beaker) - user << "A beaker is already loaded into the machine." + user << "A beaker is already loaded into the machine!" return src.beaker = B user.drop_item() B.loc = src - user << "You add the beaker to the machine!" + user << "You add the beaker to the machine." src.updateUsrDialog() icon_state = "mixer1" else if(!condi && istype(B, /obj/item/weapon/storage/pill_bottle)) if(src.loaded_pill_bottle) - user << "A pill bottle is already loaded into the machine." + user << "A pill bottle is already loaded into the machine!" return src.loaded_pill_bottle = B user.drop_item() B.loc = src - user << "You add the pill bottle into the dispenser slot!" + user << "You add the pill bottle into the dispenser slot." src.updateUsrDialog() return @@ -760,7 +760,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) if(!D) return var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN) - if(name == null) + if(name == null || wait) return var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) B.icon_state = "bottle3" @@ -915,13 +915,13 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(stat & (NOPOWER|BROKEN)) return if(src.beaker) - user << "A beaker is already loaded into the machine." + user << "A beaker is already loaded into the machine!" return src.beaker = I user.drop_item() I.loc = src - user << "You add the beaker to the machine!" + user << "You add the beaker to the machine." src.updateUsrDialog() icon_state = "mixer1" @@ -983,6 +983,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) /obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0), + /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0), /obj/item/weapon/reagent_containers/food/snacks/egg = list("eggyolk" = -5), //Grinder stuff, but only if dry @@ -1013,6 +1014,8 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = list("watermelonjuice" = 0), /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0), /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = list("poisonberryjuice" = 0), + /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = list("pumpkinjuice" = 0), + /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = list("blumpkinjuice" = 0), ) var/list/dried_items = list( @@ -1059,7 +1062,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O if(!G.dry) - user << "You must dry that first!" + user << "You must dry that first!" return 1 if(holdingitems && holdingitems.len >= limit) @@ -1074,17 +1077,17 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) B.remove_from_storage(G, src) holdingitems += G if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill - user << "You fill the All-In-One grinder to the brim." + user << "You fill the All-In-One grinder to the brim." break if(!O.contents.len) - user << "You empty the plant bag into the All-In-One grinder." + user << "You empty the plant bag into the All-In-One grinder." src.updateUsrDialog() return 0 if (!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items)) - user << "Cannot refine into a reagent." + user << "Cannot refine into a reagent!" return 1 user.unEquip(O) @@ -1438,13 +1441,13 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "A beaker is already loaded into the machine." + user << "A beaker is already loaded into the machine!" return if(user.drop_item()) beaker = I I.loc = src - user << "You add the beaker to the machine!" + user << "You add the beaker to the machine." icon_state = "mixer1b" SSnano.update_uis(src) diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index e3eab685c7b..74e9fe0b093 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -11,7 +11,7 @@ Structure: /////////////////// ////////////////////////// | | | V V V - reagents (datums) Reagents. I.e. Water , antitoxins or mercury. + reagents (datums) Reagents. I.e. Water , cryoxadone or mercury. Random important notes: @@ -198,7 +198,7 @@ About Recipes: of that reagent. The handle_reaction proc can detect mutiples of the same recipes so for most cases you want to set the required amount to 1. - required_catalysts (Added May 2011) + required_catalysts This is a list of the ids of the required catalysts. Functionally similar to required_reagents, it is a list of reagents that are required for the reaction. However, unlike required_reagents, catalysts are NOT consumed. @@ -216,6 +216,9 @@ About Recipes: Basically like a reagent's data variable. You can set extra requirements for a reaction with this. + required_temp + This is the required temperature. + About the Tools: @@ -244,4 +247,20 @@ About the Tools: transfer code since you will not be able to use the standard tools to manipulate it. +*/ + + + + +/* GOON CHEMS README: + + Credit goes to Cogwerks, and all the other goonstation coders + for the original idea and implementation of this over at goonstation. + + THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball + Any of the Secret Chems + Goon in-joke chems (Eg. Cat Drugs, Hairgrownium) + Liquid Electricity + Rajajajah + */ \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm new file mode 100644 index 00000000000..899f1312670 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -0,0 +1,140 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent) +//so that it can continue working when the reagent is deleted while the proc is still active. + + +//Various reagents +//Toxin & acid reagents +//Hydroponics stuff + +datum/reagent + var/name = "Reagent" + var/id = "reagent" + var/description = "" + var/datum/reagents/holder = null + var/reagent_state = LIQUID + var/list/data + var/current_cycle = 0 + var/volume = 0 + var/color = "#000000" // rgb: 0, 0, 0 + var/can_synth = 1 + var/metabolization_rate = REAGENTS_METABOLISM //how fast the reagent is metabolized by the mob + var/overrides_metab = 0 + var/overdose_threshold = 0 + var/addiction_threshold = 0 + 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 + var/datum/reagent/self = src + src = null //of the reagent to the mob on TOUCHING it. + + if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke)) + // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl + + if(method == TOUCH) + + var/chance = 1 + var/block = 0 + + for(var/obj/item/clothing/C in M.get_equipped_items()) + if(C.permeability_coefficient < chance) chance = C.permeability_coefficient + if(istype(C, /obj/item/clothing/suit/bio_suit)) + // bio suits are just about completely fool-proof - Doohl + // kind of a hacky way of making bio suits more resistant to chemicals but w/e + if(prob(75)) + block = 1 + + if(istype(C, /obj/item/clothing/head/bio_hood)) + if(prob(75)) + block = 1 + + chance = chance * 100 + + if(prob(chance) && !block) + if(M.reagents) + M.reagents.add_reagent(self.id,self.volume/2) + return 1 + +datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object + src = null //if it can hold reagents. nope! + //if(O.reagents) + // O.reagents.add_reagent(id,volume/3) + return + +datum/reagent/proc/reaction_turf(var/turf/T, var/volume) + src = null + return + +datum/reagent/proc/on_mob_life(var/mob/living/M as mob) + 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 + +// Called after add_reagents creates a new reagent. +datum/reagent/proc/on_new(var/data) + return + +// Called when two reagents of the same are mixing. +datum/reagent/proc/on_merge(var/data) + return + +datum/reagent/proc/on_update(var/atom/A) + return + +// Called every time reagent containers process. +datum/reagent/proc/on_tick(var/data) + return + +// Called when the reagent container is hit by an explosion +datum/reagent/proc/on_ex_act(var/severity) + return + +// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects +datum/reagent/proc/overdose_process(var/mob/living/M as mob) + return + +datum/reagent/proc/overdose_start(var/mob/living/M as mob) + M << "You feel like you took too much of [name]!" + return + +datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob) + if(prob(30)) + M << "You feel like some [name] right about now." + return + +datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob) + if(prob(30)) + M << "You feel like you need [name]. You just can't get enough." + return + +datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob) + if(prob(30)) + M << "You have an intense craving for [name]." + return + +datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) + if(prob(30)) + M << "You're not feeling good at all! You really need some [name]." + return + diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm index 0ddd41ef092..02c41c45711 100644 --- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm @@ -81,7 +81,7 @@ datum/reagent/blob/acid datum/reagent/blob/acid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) if(method == TOUCH) - if(prob(50)) + if(prob(50)) M.acid_act(5,1,5) if(show_message) M << "The blob's tendrils melt through your equipment!" @@ -97,7 +97,7 @@ datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/ if(method == TOUCH) if(istype(M, /mob/living/carbon/human)) M.apply_damage(10, BRUTE) - M.apply_effect(40,IRRADIATE,0) // irradiate the shit out of these fuckers + M.irradiate(40) if(prob(33)) randmuti(M) if(prob(98)) @@ -147,6 +147,44 @@ datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TO M << "The blob strikes you, and its tendrils explode!" explosion(M.loc, 0, 0, 1, 0, 0) +datum/reagent/blob/omnizine + name = "Omnizine" + id = "b_omnizine" + description = "" + color = "#C8A5DC" + +datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) + if(method == TOUCH) + if(show_message) + M << "The blob squirts something at you, and you feel great!" + M.reagents.add_reagent("omnizine", 11) + +datum/reagent/blob/morphine + name = "Morphine" + id = "b_morphine" + description = "" + color = "#335555" + +datum/reagent/blob/morphine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) + if(method == TOUCH) + if(show_message) + M << "The blob squirts something at you, and you feel numb!" + M.reagents.add_reagent("morphine", 16) + +datum/reagent/blob/spacedrugs + name = "Space drugs" + id = "b_space_drugs" + description = "" + color = "#60A584" + +datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) + if(method == TOUCH) + if(show_message) + M << "The blob squirts something at you, and you feel funny!" + M.reagents.add_reagent("space_drugs", 15) + M.apply_damage(10, TOX) + + /proc/reagent_vortex(var/mob/living/M as mob, var/setting_type) var/turf/pull = get_turf(M) for(var/atom/movable/X in orange(4,pull)) @@ -159,3 +197,7 @@ datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TO step_away(X,pull) else X.throw_at(pull) + + + + diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm index 33464948243..d86016f96ab 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm @@ -253,6 +253,10 @@ datum/reagent/water color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) var/cooling_temperature = 2 +/* + * Water reaction to turf + */ + datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) if (!istype(T)) return var/CT = cooling_temperature @@ -272,14 +276,29 @@ datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) qdel(hotspot) return +/* + * Water reaction to an object + */ + datum/reagent/water/reaction_obj(var/obj/O, var/volume) src = null + // Monkey cube if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O if(!cube.wrapped) cube.Expand() + + // Dehydrated carp + if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) + var/obj/item/toy/carpplushie/dehy_carp/dehy = O + dehy.Swell() // Makes a carp + return +/* + * Water reaction to a mob + */ + 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 @@ -376,6 +395,34 @@ datum/reagent/slimetoxin description = "A corruptive toxin produced by slimes." color = "#13BC5E" // rgb: 19, 188, 94 +datum/reagent/unstableslimetoxin + name = "Unstable Mutation Toxin" + id = "unstablemutationtoxin" + description = "An unstable and unpredictable corruptive toxin produced by slimes." + color = "#5EFF3B" //RGB: 94, 255, 59 + metabolization_rate = INFINITY //So it instantly removes all of itself + +datum/reagent/unstableslimetoxin/on_mob_life(var/mob/living/carbon/human/H as mob) + ..() + H << "You crumple in agony as your flesh wildly morphs into new forms!" + H.visible_message("[H] falls to the ground and screams as their skin bubbles and froths!") //'froths' sounds painful when used with SKIN. + H.Weaken(3) + sleep(30) + var/list/blacklisted_species = list(/datum/species/zombie, /datum/species/skeleton, /datum/species/human, /datum/species/golem, /datum/species/golem/adamantine, /datum/species/shadow) + var/list/possible_morphs = typesof(/datum/species/) - blacklisted_species + var/datum/species/mutation = pick(possible_morphs) + if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine) + H << "The pain subsides. You feel... different." + H.dna.species = new mutation() + H.regenerate_icons() + if(mutation == /datum/species/slime) + H.faction |= "slime" + else + H.faction -= "slime" + else + H << "The pain vanishes suddenly. You feel no different." + return 1 + datum/reagent/aslimetoxin name = "Advanced Mutation Toxin" id = "amutationtoxin" 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 f494d01b409..d375a9dcd65 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,7 +22,6 @@ 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) - current_cycle++ M.jitteriness = max(M.jitteriness-5,0) if(current_cycle >= boozepwr) if (!M.slurring) M.slurring = 1 @@ -617,3 +616,10 @@ datum/reagent/consumable/ethanol/silencer/on_mob_life(var/mob/living/M as mob) M.heal_organ_damage(1,1) ..() return + +datum/reagent/consumable/ethanol/drunkenblumpkin + name = "Drunken Blumpkin" + id = "drunkenblumpkin" + description = "A weird mix of whiskey and blumpkin juice." + color = "#1EA0FF" // rgb: 102, 67, 0 + boozepwr = 35 \ No newline at end of file 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 87496ff1a82..2ba1088cda7 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 @@ -1,8 +1,4 @@ -#define REM REAGENTS_EFFECT_MULTIPLIER - - - ///////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// @@ -59,7 +55,6 @@ datum/reagent/consumable/carrotjuice/on_mob_life(var/mob/living/M as mob) if(21 to INFINITY) if (prob(current_cycle-10)) M.disabilities &= ~NEARSIGHT - current_cycle++ ..() return @@ -400,6 +395,66 @@ datum/reagent/consumable/doctor_delight description = "A gulp a day keeps the MediBot away. That's probably for the best." color = "#FF8CFF" // rgb: 255, 140, 255 +datum/reagent/consumable/chocolatepudding + name = "Chocolate Pudding" + id = "chocolatepudding" + description = "A great dessert for chocolate lovers." + color = "#800000" + nutriment_factor = 4 * REAGENTS_METABOLISM + +datum/reagent/consumable/vanillapudding + name = "Vanilla Pudding" + id = "vanillapudding" + description = "A great dessert for vanilla lovers." + color = "#FAFAD2" + nutriment_factor = 4 * REAGENTS_METABOLISM + +datum/reagent/consumable/cherryshake + name = "Cherry Shake" + id = "cherryshake" + description = "A cherry flavored milkshake." + color = "#FFB6C1" + nutriment_factor = 4 * REAGENTS_METABOLISM + +datum/reagent/consumable/bluecherryshake + name = "Blue Cherry Shake" + id = "bluecherryshake" + description = "An exotic milkshake." + color = "#00F1FF" + nutriment_factor = 4 * REAGENTS_METABOLISM + +datum/reagent/consumable/pumpkin_latte + name = "Pumpkin Latte" + id = "pumpkin_latte" + description = "A mix of pumpkin juice and coffee." + color = "#F4A460" + nutriment_factor = 3 * REAGENTS_METABOLISM + +datum/reagent/consumable/gibbfloats + name = "Gibb Floats" + id = "gibbfloats" + description = "Icecream on top of a Dr. Gibb glass." + color = "#B22222" + nutriment_factor = 3 * REAGENTS_METABOLISM + +datum/reagent/consumable/pumpkinjuice + name = "Pumpkin Juice" + id = "pumpkinjuice" + description = "Juiced from real pumpkin." + color = "#FFA500" + +datum/reagent/consumable/blumpkinjuice + name = "Blumpkin Juice" + id = "blumpkinjuice" + description = "Juiced from real blumpkin." + color = "#00BFFF" + +datum/reagent/consumable/triple_citrus + name = "Triple Citrus" + id = "triple_citrus" + description = "A solution." + color = "#C8A5DC" + //////////////////////////////////////////////The ten friggen million reagents that get you drunk////////////////////////////////////////////// @@ -416,7 +471,6 @@ datum/reagent/consumable/atomicbomb/on_mob_life(var/mob/living/M as mob) if (!M.slurring) M.slurring = 1 M.slurring += 3 - current_cycle++ switch(current_cycle) if(51 to 200) M.sleeping += 1 @@ -433,18 +487,19 @@ 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) - current_cycle++ M.dizziness +=6 - if(current_cycle >= 15 && current_cycle <45) - if (!M.slurring) - M.slurring = 1 - M.slurring += 3 - else if(current_cycle >= 45 && prob(50) && current_cycle <55) - M.confused = max(M.confused+3,0) - else if(current_cycle >=55) - M.druggy = max(M.druggy, 55) - else if(current_cycle >=200) - M.adjustToxLoss(2) + switch(current_cycle) + if(15 to 45) + if(!M.slurring) + M.slurring = 1 + M.slurring += 3 + if(45 to 55) + if(prob(50)) + M.confused = max(M.confused+3,0) + if(55 to 200) + M.druggy = max(M.druggy, 55) + if(200 to INFINITY) + M.adjustToxLoss(2) ..() return @@ -456,18 +511,19 @@ datum/reagent/consumable/neurotoxin datum/reagent/consumable/neurotoxin/on_mob_life(var/mob/living/carbon/M as mob) M.weakened = max(M.weakened, 3) - current_cycle++ M.dizziness +=6 - if(current_cycle >= 15 && current_cycle <45) - if (!M.slurring) - M.slurring = 1 - M.slurring += 3 - else if(current_cycle >= 45 && prob(50) && current_cycle <55) - M.confused = max(M.confused+3,0) - else if(current_cycle >=55) - M.druggy = max(M.druggy, 55) - else if(current_cycle >=200) - M.adjustToxLoss(2) + switch(current_cycle) + if(15 to 45) + if(!M.slurring) + M.slurring = 1 + M.slurring += 3 + if(45 to 55) + if(prob(50)) + M.confused = max(M.confused+3,0) + if(55 to 200) + M.druggy = max(M.druggy, 55) + if(200 to INFINITY) + M.adjustToxLoss(2) ..() return @@ -481,7 +537,6 @@ 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) - current_cycle++ switch(current_cycle) if(1 to 5) if (!M.slurring) M.slurring = 1 @@ -508,7 +563,3 @@ datum/reagent/consumable/hippies_delight/on_mob_life(var/mob/living/M as mob) if(prob(30)) M.adjustToxLoss(2) ..() return - - -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM \ No newline at end of file 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 7343eb912c3..e10d2af11ec 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm @@ -13,6 +13,7 @@ datum/reagent/consumable var/nutriment_factor = 1 * REAGENTS_METABOLISM datum/reagent/consumable/on_mob_life(var/mob/living/M as mob) + current_cycle++ M.nutrition += nutriment_factor holder.remove_reagent(src.id, metabolization_rate) @@ -58,7 +59,6 @@ datum/reagent/consumable/sugar datum/reagent/consumable/sugar/overdose_start(var/mob/living/M as mob) M << "You go into hyperglycaemic shock! Lay off the twinkies!" M.sleeping += 30 - ..() return datum/reagent/consumable/sugar/overdose_process(var/mob/living/M as mob) @@ -288,7 +288,6 @@ 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")) - current_cycle++ ..() return @@ -383,6 +382,12 @@ datum/reagent/consumable/cherryjelly description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." color = "#801E28" // rgb: 128, 30, 40 +datum/reagent/consumable/bluecherryjelly + name = "Blue Cherry Jelly" + id = "bluecherryjelly" + description = "Blue and tastier kind of cherry jelly." + color = "#00F0FF" + datum/reagent/consumable/rice name = "Rice" id = "rice" @@ -404,3 +409,20 @@ datum/reagent/consumable/eggyolk id = "eggyolk" description = "It's full of protein." color = "#FFB500" + +datum/reagent/consumable/corn_starch + name = "Corn Starch" + id = "corn_starch" + description = "A slippery solution." + color = "#C8A5DC" + +datum/reagent/consumable/corn_syrup + name = "Corn Syrup" + id = "corn_syrup" + description = "Decays into sugar." + color = "#C8A5DC" + +datum/reagent/consumable/corn_syrup/on_mob_life(var/mob/living/M as mob) + M.reagents.add_reagent("sugar", 3) + M.reagents.remove_reagent("corn_syrup", 1) + ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm new file mode 100644 index 00000000000..17fea97c5dd --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm @@ -0,0 +1,326 @@ + + +datum/reagent/drug + name = "Drug" + id = "drug" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/drug/space_drugs + name = "Space drugs" + id = "space_drugs" + description = "An illegal chemical compound used as drug." + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 25 + +datum/reagent/drug/space_drugs/on_mob_life(var/mob/living/M as mob) + M.druggy = max(M.druggy, 15) + if(isturf(M.loc) && !istype(M.loc, /turf/space)) + if(M.canmove) + if(prob(10)) step(M, pick(cardinal)) + if(prob(7)) + M.emote(pick("twitch","drool","moan","giggle")) + ..() + return + +datum/reagent/drug/space_drugs/overdose_process(var/mob/living/M as mob) + if(prob(20)) + M.hallucination = max(M.hallucination, 5) + M.adjustBrainLoss(0.25*REM) + M.adjustToxLoss(0.25*REM) + ..() + return + +datum/reagent/drug/nicotine + name = "Nicotine" + id = "nicotine" + description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + addiction_threshold = 30 + +datum/reagent/drug/nicotine/on_mob_life(var/mob/living/M as mob) + var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.") + if(prob(5)) + M << "[smoke_message]" + M.AdjustStunned(-1) + M.adjustStaminaLoss(-0.5*REM) + ..() + +datum/reagent/drug/crank + name = "Crank" + id = "crank" + 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 + addiction_threshold = 10 + +datum/reagent/drug/crank/on_mob_life(var/mob/living/M as mob) + var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.") + if(prob(5)) + M << "[high_message]" + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + ..() + +datum/reagent/drug/crank/overdose_process(var/mob/living/M as mob) + M.adjustBrainLoss(2*REM) + M.adjustToxLoss(2*REM) + M.adjustBruteLoss(2*REM) + ..() + +datum/reagent/drug/crank/addiction_act_stage1(var/mob/living/M as mob) + M.adjustBrainLoss(5*REM) + ..() + +datum/reagent/drug/crank/addiction_act_stage2(var/mob/living/M as mob) + M.adjustToxLoss(5*REM) + ..() + +datum/reagent/drug/crank/addiction_act_stage3(var/mob/living/M as mob) + M.adjustBruteLoss(5*REM) + ..() + +datum/reagent/drug/crank/addiction_act_stage4(var/mob/living/M as mob) + M.adjustBrainLoss(5*REM) + M.adjustToxLoss(5*REM) + M.adjustBruteLoss(5*REM) + ..() + +/datum/reagent/drug/krokodil + name = "Krokodil" + id = "krokodil" + 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 + addiction_threshold = 15 + + +/datum/reagent/drug/krokodil/on_mob_life(var/mob/living/M as mob) + var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") + if(prob(5)) + M << "[high_message]" + ..() + return + +/datum/reagent/drug/krokodil/overdose_process(var/mob/living/M as mob) + M.adjustBrainLoss(0.25*REM) + M.adjustToxLoss(0.25*REM) + ..() + return + + +/datum/reagent/drug/krokodil/addiction_act_stage1(var/mob/living/M as mob) + M.adjustBrainLoss(2*REM) + M.adjustToxLoss(2*REM) + ..() + return +/datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob) + if(prob(25)) + M << "Your skin feels loose..." + ..() + return +/datum/reagent/drug/krokodil/addiction_act_stage3(var/mob/living/M as mob) + if(prob(25)) + M << "Your skin starts to peel away..." + M.adjustBruteLoss(3*REM) + ..() + return + +/datum/reagent/drug/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) + if(!istype(M.dna.species, /datum/species/cosmetic_zombie)) + M << "Your skin falls off easily!" + M.adjustBruteLoss(50*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/reagent/drug/methamphetamine + name = "Methamphetamine" + id = "methamphetamine" + 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 + addiction_threshold = 10 + metabolization_rate = 0.75 * REAGENTS_METABOLISM + +/datum/reagent/drug/methamphetamine/on_mob_life(var/mob/living/M as mob) + var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") + if(prob(5)) + M << "[high_message]" + M.AdjustParalysis(-2) + M.AdjustStunned(-2) + M.AdjustWeakened(-2) + M.adjustStaminaLoss(-2) + M.status_flags |= GOTTAGOREALLYFAST + M.Jitter(2) + M.adjustBrainLoss(0.25) + if(prob(5)) + M.emote(pick("twitch", "shiver")) + ..() + return + +/datum/reagent/drug/methamphetamine/overdose_process(var/mob/living/M as mob) + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 4, i++) + step(M, pick(cardinal)) + if(prob(20)) + M.emote("laugh") + if(prob(33)) + M.visible_message("[M]'s hands flip out and flail everywhere!") + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + ..() + M.adjustToxLoss(1) + M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) + return + +/datum/reagent/drug/methamphetamine/addiction_act_stage1(var/mob/living/M as mob) + M.Jitter(5) + if(prob(20)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/drug/methamphetamine/addiction_act_stage2(var/mob/living/M as mob) + M.Jitter(10) + M.Dizzy(10) + if(prob(30)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/drug/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 4, i++) + step(M, pick(cardinal)) + M.Jitter(15) + M.Dizzy(15) + if(prob(40)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/drug/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + M.Jitter(20) + M.Dizzy(20) + M.adjustToxLoss(5) + if(prob(50)) + M.emote(pick("twitch","drool","moan")) + ..() + return + +/datum/reagent/drug/bath_salts + name = "Bath Salts" + id = "bath_salts" + description = "Makes you nearly impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 20 + addiction_threshold = 10 + + +/datum/reagent/drug/bath_salts/on_mob_life(var/mob/living/M as mob) + var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") + if(prob(5)) + M << "[high_message]" + M.AdjustParalysis(-3) + M.AdjustStunned(-3) + M.AdjustWeakened(-3) + M.adjustStaminaLoss(-5) + M.adjustBrainLoss(0.5) + M.adjustToxLoss(0.1) + M.hallucination += 10 + if(M.canmove && !istype(M.loc, /atom/movable)) + step(M, pick(cardinal)) + step(M, pick(cardinal)) + ..() + return + +/datum/reagent/drug/bath_salts/overdose_process(var/mob/living/M as mob) + M.hallucination += 10 + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + if(prob(20)) + M.emote(pick("twitch","drool","moan")) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + ..() + return + +/datum/reagent/drug/bath_salts/addiction_act_stage1(var/mob/living/M as mob) + M.hallucination += 10 + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + M.Jitter(5) + M.adjustBrainLoss(10) + if(prob(20)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/drug/bath_salts/addiction_act_stage2(var/mob/living/M as mob) + M.hallucination += 20 + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + M.Jitter(10) + M.Dizzy(10) + M.adjustBrainLoss(10) + if(prob(30)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/drug/bath_salts/addiction_act_stage3(var/mob/living/M as mob) + M.hallucination += 30 + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 12, i++) + step(M, pick(cardinal)) + M.Jitter(15) + M.Dizzy(15) + M.adjustBrainLoss(10) + if(prob(40)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/drug/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) + M.hallucination += 40 + if(M.canmove && !istype(M.loc, /atom/movable)) + for(var/i = 0, i < 16, i++) + step(M, pick(cardinal)) + M.Jitter(50) + M.Dizzy(50) + M.adjustToxLoss(5) + M.adjustBrainLoss(10) + if(prob(50)) + M.emote(pick("twitch","drool","moan")) + ..() + return + +/datum/reagent/drug/aranesp + name = "Aranesp" + id = "aranesp" + 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 + +/datum/reagent/drug/aranesp/on_mob_life(var/mob/living/M as mob) + var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") + if(prob(5)) + M << "[high_message]" + M.adjustStaminaLoss(-18) + M.adjustToxLoss(0.5) + if(prob(50)) + M.losebreath++ + M.adjustOxyLoss(1) + ..() + return diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 1765a0929af..9c0bbff9395 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -1,6 +1,4 @@ -#define REM REAGENTS_EFFECT_MULTIPLIER - ////////////////////////////////////////////////////////////////////////////////////////// // MEDICINE REAGENTS ////////////////////////////////////////////////////////////////////////////////////// @@ -12,6 +10,7 @@ datum/reagent/medicine id = "medicine" datum/reagent/medicine/on_mob_life(var/mob/living/M as mob) + current_cycle++ holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism datum/reagent/medicine/leporazine @@ -34,7 +33,6 @@ datum/reagent/medicine/adminordrazine //An OP chemical for admins color = "#C8A5DC" // rgb: 200, 165, 220 datum/reagent/medicine/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob) - if(!M) M = holder.my_atom ///This can even heal dead people. M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) M.setCloneLoss(0) M.setOxyLoss(0) @@ -127,7 +125,6 @@ datum/reagent/medicine/rezadone color = "#669900" // rgb: 102, 153, 0 datum/reagent/medicine/rezadone/on_mob_life(var/mob/living/M as mob) - current_cycle++ switch(current_cycle) if(1 to 15) M.adjustCloneLoss(-1) @@ -152,5 +149,585 @@ datum/reagent/medicine/spaceacillin metabolization_rate = 0.5 * REAGENTS_METABOLISM -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM \ No newline at end of file + + +//------------------------------------------------------------------------------------------------------ + //GOON MEDICINE +//------------------------------------------------------------------------------------------------------ + + +datum/reagent/medicine/silver_sulfadiazine + name = "Silver Sulfadiazine" + id = "silver_sulfadiazine" + description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/medicine/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) + if(iscarbon(M)) + if(method == TOUCH) + M.adjustFireLoss(-volume) + if(show_message) + M << "You feel your burns healing!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + if(show_message) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + ..() + return + +datum/reagent/medicine/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) + M.adjustFireLoss(-2*REM) + ..() + return + +datum/reagent/medicine/styptic_powder + name = "Styptic Powder" + id = "styptic_powder" + description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/medicine/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) + if(iscarbon(M)) + if(method == TOUCH) + M.adjustBruteLoss(-volume) + if(show_message) + M << "You feel your wounds knitting back together!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + if(show_message) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + ..() + return + +datum/reagent/medicine/styptic_powder/on_mob_life(var/mob/living/M as mob) + M.adjustBruteLoss(-2*REM) + ..() + return + +datum/reagent/medicine/salglu_solution + name = "Saline-Glucose Solution" + id = "salglu_solution" + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/salglu_solution/on_mob_life(var/mob/living/M as mob) + if(prob(33)) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + ..() + return + +datum/reagent/medicine/synthflesh + name = "Synthflesh" + id = "synthflesh" + 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" + +datum/reagent/medicine/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) + if(iscarbon(M)) + if(method == TOUCH) + M.adjustBruteLoss(-1.5*volume) + M.adjustFireLoss(-1.5*volume) + if(show_message) + M << "You feel your burns healing and your flesh knitting together!" + ..() + return + +datum/reagent/medicine/charcoal + name = "Charcoal" + id = "charcoal" + description = "Heals toxin damage, and will also slowly remove any other chemicals." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/charcoal/on_mob_life(var/mob/living/M as mob) + M.adjustToxLoss(-2*REM) + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.id,1) + ..() + return + +datum/reagent/medicine/omnizine + name = "Omnizine" + id = "omnizine" + 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" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +datum/reagent/medicine/omnizine/on_mob_life(var/mob/living/M as mob) + M.adjustToxLoss(-0.5*REM) + M.adjustOxyLoss(-0.5*REM) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + ..() + return + +datum/reagent/medicine/omnizine/overdose_process(var/mob/living/M as mob) + M.adjustToxLoss(1.5*REM) + M.adjustOxyLoss(1.5*REM) + M.adjustBruteLoss(1.5*REM) + M.adjustFireLoss(1.5*REM) + ..() + return + +datum/reagent/medicine/calomel + name = "Calomel" + id = "calomel" + 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" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/calomel/on_mob_life(var/mob/living/M as mob) + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.id,2.5) + if(M.health > 20) + M.adjustToxLoss(2.5*REM) + ..() + return + +datum/reagent/medicine/potass_iodide + name = "Potassium Iodide" + id = "potass_iodide" + description = "Reduces low radiation damage very effectively." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 2 * REAGENTS_METABOLISM + +datum/reagent/medicine/potass_iodide/on_mob_life(var/mob/living/M as mob) + if(M.radiation > 0) + M.radiation-- + if(M.radiation < 0) + M.radiation = 0 + ..() + return + +datum/reagent/medicine/pen_acid + name = "Pentetic Acid" + id = "pen_acid" + 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" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/pen_acid/on_mob_life(var/mob/living/M as mob) + if(M.radiation > 0) + M.radiation -= 4 + M.adjustToxLoss(-2*REM) + if(prob(33)) + M.adjustBruteLoss(0.5*REM) + if(M.radiation < 0) + M.radiation = 0 + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.id,2) + ..() + return + +datum/reagent/medicine/sal_acid + name = "Salicyclic Acid" + id = "sal_acid" + description = "If you have less than 50 brute damage, it heals 0.25 unit. If overdosed it will deal 0.5 brute damage if the patient has less than 50 brute damage already." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 25 + +datum/reagent/medicine/sal_acid/on_mob_life(var/mob/living/M as mob) + if(M.getBruteLoss() < 50) + M.adjustBruteLoss(-0.25*REM) + ..() + return + +datum/reagent/medicine/sal_acid/overdose_process(var/mob/living/M as mob) + if(M.getBruteLoss() < 50) + M.adjustBruteLoss(0.5*REM) + ..() + return + +datum/reagent/medicine/salbutamol + name = "Salbutamol" + id = "salbutamol" + description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!" + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + +datum/reagent/medicine/salbutamol/on_mob_life(var/mob/living/M as mob) + M.adjustOxyLoss(-3*REM) + if(M.losebreath >= 4) + M.losebreath -= 2 + ..() + return + +datum/reagent/medicine/perfluorodecalin + name = "Perfluorodecalin" + id = "perfluorodecalin" + 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" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + +datum/reagent/medicine/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) + M.adjustOxyLoss(-12*REM) + M.silent = max(M.silent, 5) + if(prob(33)) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + ..() + return + +datum/reagent/medicine/ephedrine + name = "Ephedrine" + id = "ephedrine" + description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 45 + addiction_threshold = 30 + +datum/reagent/medicine/ephedrine/on_mob_life(var/mob/living/M as mob) + M.status_flags |= IGNORESLOWDOWN + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.adjustStaminaLoss(-1*REM) + ..() + return + +datum/reagent/medicine/ephedrine/overdose_process(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(0.5*REM) + M.losebreath++ + ..() + return + +datum/reagent/medicine/ephedrine/addiction_act_stage1(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(2*REM) + M.losebreath += 2 + ..() + return +datum/reagent/medicine/ephedrine/addiction_act_stage2(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(3*REM) + M.losebreath += 3 + ..() + return +datum/reagent/medicine/ephedrine/addiction_act_stage3(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(4*REM) + M.losebreath += 4 + ..() + return +datum/reagent/medicine/ephedrine/addiction_act_stage4(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(5*REM) + M.losebreath += 5 + ..() + return + +datum/reagent/medicine/diphenhydramine + name = "Diphenhydramine" + id = "diphenhydramine" + description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/diphenhydramine/on_mob_life(var/mob/living/M as mob) + if(prob(50)) + M.drowsyness += 1 + M.jitteriness -= 1 + M.reagents.remove_reagent("histamine",1.5) + ..() + return + +datum/reagent/medicine/morphine + name = "Morphine" + id = "morphine" + 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" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 30 + addiction_threshold = 25 + + +datum/reagent/medicine/morphine/on_mob_life(var/mob/living/M as mob) + M.status_flags |= IGNORESLOWDOWN + if(current_cycle >= 36) + M.sleeping += 3 + ..() + return + +datum/reagent/medicine/morphine/overdose_process(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.Dizzy(2) + M.Jitter(2) + ..() + return + +datum/reagent/medicine/morphine/addiction_act_stage1(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.Dizzy(2) + M.Jitter(2) + ..() + return +datum/reagent/medicine/morphine/addiction_act_stage2(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.adjustToxLoss(1*REM) + M.Dizzy(3) + M.Jitter(3) + ..() + return +datum/reagent/medicine/morphine/addiction_act_stage3(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.adjustToxLoss(2*REM) + M.Dizzy(4) + M.Jitter(4) + ..() + return +datum/reagent/medicine/morphine/addiction_act_stage4(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.adjustToxLoss(3*REM) + M.Dizzy(5) + M.Jitter(5) + ..() + return + +datum/reagent/medicine/oculine + name = "Oculine" + id = "oculine" + description = "Cures blindness and heals eye damage over time." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + +datum/reagent/medicine/oculine/on_mob_life(var/mob/living/M as mob) + if(M.eye_blind > 0 && current_cycle > 20) + if(prob(30)) + M.eye_blind = 0 + else if(prob(80)) + M.eye_blind = 0 + M.eye_blurry = 1 + if(M.eye_blurry > 0) + if(prob(80)) + M.eye_blurry = 0 + ..() + return + +datum/reagent/medicine/atropine + name = "Atropine" + id = "atropine" + description = "If patients health is below -25 it will heal 1.5 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 35 + +datum/reagent/medicine/atropine/on_mob_life(var/mob/living/M as mob) + if(M.health > -60) + M.adjustToxLoss(0.5*REM) + if(M.health < -25) + M.adjustBruteLoss(-1.5*REM) + M.adjustFireLoss(-1.5*REM) + if(M.oxyloss > 65) + M.setOxyLoss(65) + if(M.losebreath > 5) + M.losebreath = 5 + if(prob(20)) + M.Dizzy(5) + M.Jitter(5) + ..() + return + +datum/reagent/medicine/atropine/overdose_process(var/mob/living/M as mob) + M.adjustToxLoss(0.5*REM) + M.Dizzy(1) + M.Jitter(1) + ..() + return + +datum/reagent/medicine/epinephrine + name = "Epinephrine" + id = "epinephrine" + description = "Reduces 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" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +datum/reagent/medicine/epinephrine/on_mob_life(var/mob/living/M as mob) + if(M.health < -10 && M.health > -65) + M.adjustToxLoss(-0.5*REM) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + if(M.oxyloss > 35) + M.setOxyLoss(35) + if(M.losebreath >= 4) + M.losebreath -= 2 + if(M.losebreath < 0) + M.losebreath = 0 + M.adjustStaminaLoss(-0.5*REM) + if(prob(20)) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + ..() + return + +datum/reagent/medicine/epinephrine/overdose_process(var/mob/living/M as mob) + if(prob(33)) + M.adjustStaminaLoss(2.5*REM) + M.adjustToxLoss(1*REM) + M.losebreath++ + ..() + return + +datum/reagent/medicine/strange_reagent + name = "Strange Reagent" + id = "strange_reagent" + 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" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume) + if(M.stat == DEAD) + if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100) + M.visible_message("[M]'s body convulses a bit, and then falls still once more.") + return + var/mob/dead/observer/ghost = M.get_ghost() + M.visible_message("[M]'s body convulses a bit.") + if(!M.suiciding && !(NOCLONE in M.mutations)) + if(ghost) + ghost << "Someone is trying to revive you. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" + ghost << sound('sound/effects/genetics.ogg') + else + M.stat = 1 + M.adjustOxyLoss(-20) + M.adjustToxLoss(-20) + dead_mob_list -= M + living_mob_list |= list(M) + M.emote("gasp") + add_logs(M, M, "revived", object="strange reagent") + ..() + return + +datum/reagent/medicine/strange_reagent/on_mob_life(var/mob/living/M as mob) + M.adjustBruteLoss(0.5*REM) + M.adjustFireLoss(0.5*REM) + ..() + return + +/datum/reagent/medicine/mannitol + name = "Mannitol" + id = "mannitol" + description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone." + color = "#C8A5DC" + +/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M as mob) + M.adjustBrainLoss(-3*REM) + ..() + return + +/datum/reagent/medicine/mutadone + name = "Mutadone" + id = "mutadone" + description = "Heals your genetic defects." + color = "#C8A5DC" + +/datum/reagent/medicine/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob) + M.jitteriness = 0 + if(istype(M) && M.dna) + M.dna.remove_all_mutations() + ..() + return + +datum/reagent/medicine/antihol + name = "Antihol" + id = "antihol" + description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects." + color = "#C8A5DC" + +datum/reagent/medicine/antihol/on_mob_life(var/mob/living/M as mob) + M.dizziness = 0 + M.drowsyness = 0 + M.slurring = 0 + M.confused = 0 + M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1) + M.adjustToxLoss(-0.2*REM) + ..() + +/datum/reagent/medicine/stimulants + name = "Stimulants" + id = "stimulants" + 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.5 * REAGENTS_METABOLISM + overdose_threshold = 60 + +datum/reagent/medicine/stimulants/on_mob_life(var/mob/living/M as mob) + M.status_flags |= IGNORESLOWDOWN + if(M.health < 50 && M.health > 0) + M.adjustOxyLoss(-1*REM) + M.adjustToxLoss(-1*REM) + M.adjustBruteLoss(-1*REM) + M.adjustFireLoss(-1*REM) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.adjustStaminaLoss(-1.5*REM) + ..() + +datum/reagent/medicine/stimulants/overdose_process(var/mob/living/M as mob) + if(prob(33)) + M.adjustStaminaLoss(2.5*REM) + M.adjustToxLoss(1*REM) + M.losebreath++ + ..() + return + +datum/reagent/medicine/insulin + name = "Insulin" + id = "insulin" + description = "Increases sugar depletion rates." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/insulin/on_mob_life(var/mob/living/M as mob) + if(M.sleeping) + M.sleeping-- + M.reagents.remove_reagent("sugar", 3) + ..() + return diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm new file mode 100644 index 00000000000..43650c72067 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -0,0 +1,937 @@ + +datum/reagent/blood + data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Blood" + id = "blood" + color = "#C80000" // rgb: 200, 0, 0 + +datum/reagent/blood/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + var/datum/reagent/blood/self = src + src = null + if(self.data && self.data["viruses"]) + for(var/datum/disease/D in self.data["viruses"]) + + if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS) + continue + + if(method == TOUCH) + M.ContractDisease(D) + else //injected + M.ForceContractDisease(D) + +datum/reagent/blood/on_new(var/list/data) + if(istype(data)) + SetViruses(src, data) + +datum/reagent/blood/on_merge(var/list/data) + if(src.data && data) + src.data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning, or else we won't know who's even getting cloned, etc + if(src.data["viruses"] || data["viruses"]) + + var/list/mix1 = src.data["viruses"] + var/list/mix2 = data["viruses"] + + // Stop issues with the list changing during mixing. + var/list/to_mix = list() + + for(var/datum/disease/advance/AD in mix1) + to_mix += AD + for(var/datum/disease/advance/AD in mix2) + to_mix += AD + + var/datum/disease/advance/AD = Advance_Mix(to_mix) + if(AD) + var/list/preserve = list(AD) + for(var/D in src.data["viruses"]) + if(!istype(D, /datum/disease/advance)) + preserve += D + src.data["viruses"] = preserve + return 1 + +datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place + if(!istype(T)) return + var/datum/reagent/blood/self = src + src = null + if(!(volume >= 3)) return + //var/datum/disease/D = self.data["virus"] + if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human)) + var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here + if(!blood_prop) //first blood! + blood_prop = new(T) + blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"] + + for(var/datum/disease/D in self.data["viruses"]) + var/datum/disease/newVirus = D.Copy(1) + blood_prop.viruses += newVirus + newVirus.holder = blood_prop + + + else if(istype(self.data["donor"], /mob/living/carbon/monkey)) + var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T + if(!blood_prop) + blood_prop = new(T) + blood_prop.blood_DNA["Non-Human DNA"] = "A+" + for(var/datum/disease/D in self.data["viruses"]) + var/datum/disease/newVirus = D.Copy(1) + blood_prop.viruses += newVirus + newVirus.holder = blood_prop + + else if(istype(self.data["donor"], /mob/living/carbon/alien)) + var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T + if(!blood_prop) + blood_prop = new(T) + blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" + for(var/datum/disease/D in self.data["viruses"]) + var/datum/disease/newVirus = D.Copy(1) + blood_prop.viruses += newVirus + newVirus.holder = blood_prop + return + +datum/reagent/vaccine + //data must contain virus type + name = "Vaccine" + id = "vaccine" + color = "#C81040" // rgb: 200, 16, 64 + +datum/reagent/vaccine/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + var/datum/reagent/vaccine/self = src + src = null + if(islist(self.data) && method == INGEST) + for(var/datum/disease/D in M.viruses) + if(D.GetDiseaseID() in self.data) + D.cure() + M.resistances |= self.data + return + +datum/reagent/vaccine/on_merge(var/list/data) + if(istype(data)) + src.data |= data.Copy() + + +datum/reagent/water + name = "Water" + id = "water" + description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." + color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) + var/cooling_temperature = 2 + +/* + * Water reaction to turf + */ + +datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + var/CT = cooling_temperature + src = null + if(volume >= 10) + T.MakeSlippery() + + for(var/mob/living/simple_animal/slime/M in T) + M.apply_water() + + var/hotspot = (locate(/obj/effect/hotspot) in T) + if(hotspot && !istype(T, /turf/space)) + if(T.air) + var/datum/gas_mixture/G = T.air + G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0) + G.react() + qdel(hotspot) + return + +/* + * Water reaction to an object + */ + +datum/reagent/water/reaction_obj(var/obj/O, var/volume) + src = null + // Monkey cube + if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) + var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O + if(!cube.wrapped) + cube.Expand() + + // Dehydrated carp + if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) + var/obj/item/toy/carpplushie/dehy_carp/dehy = O + dehy.Swell() // Makes a carp + + return + +/* + * Water reaction to a mob + */ + +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 + if(method == TOUCH) + M.adjust_fire_stacks(-(volume / 10)) + if(M.fire_stacks <= 0) + M.ExtinguishMob() + return + +datum/reagent/water/holywater + name = "Holy Water" + id = "holywater" + description = "Water blessed by some deity." + color = "#E0E8EF" // rgb: 224, 232, 239 + +datum/reagent/water/holywater/on_mob_life(var/mob/living/M as mob) + if(!data) data = 1 + data++ + M.jitteriness = max(M.jitteriness-5,0) + if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec + if (!M.stuttering) M.stuttering = 1 + M.stuttering += 4 + M.Dizzy(5) + if(iscultist(M) && prob(5)) + M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu")) + if(data >= 75 && prob(33)) // 30 units, 135 seconds + if (!M.confused) M.confused = 1 + M.confused += 3 + if(iscultist(M)) + ticker.mode.remove_cultist(M.mind) + holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? + M.jitteriness = 0 + M.stuttering = 0 + M.confused = 0 + holder.remove_reagent(src.id, 0.4) //fixed consumption to prevent balancing going out of whack + return + +datum/reagent/water/holywater/reaction_turf(var/turf/simulated/T, var/volume) + ..() + if(!istype(T)) return + if(volume>=10) + for(var/obj/effect/rune/R in T) + qdel(R) + T.Bless() + +datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke + name = "Unholy Water" + id = "unholywater" + description = "Something that shouldn't exist on this plane of existance." + +datum/reagent/fuel/unholywater/on_mob_life(var/mob/living/M as mob) + M.adjustBrainLoss(3) + if(iscultist(M)) + M.status_flags |= GOTTAGOFAST + M.drowsyness = max(M.drowsyness-5, 0) + M.AdjustParalysis(-2) + M.AdjustStunned(-2) + M.AdjustWeakened(-2) + else + M.adjustToxLoss(2) + M.adjustFireLoss(2) + M.adjustOxyLoss(2) + M.adjustBruteLoss(2) + holder.remove_reagent(src.id, 1) + +datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god + name = "Hell Water" + id = "hell_water" + description = "YOUR FLESH! IT BURNS!" + +datum/reagent/hellwater/on_mob_life(var/mob/living/M as mob) + M.fire_stacks = min(5,M.fire_stacks + 3) + M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire + M.adjustToxLoss(1) + M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard? + M.adjustBrainLoss(5) + holder.remove_reagent(src.id, 1) + +datum/reagent/lube + name = "Space Lube" + id = "lube" + description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." + color = "#009CA8" // rgb: 0, 156, 168 + +datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume) + if (!istype(T)) return + src = null + if(volume >= 1) + T.MakeSlippery(2) + +datum/reagent/slimetoxin + name = "Mutation Toxin" + id = "mutationtoxin" + description = "A corruptive toxin produced by slimes." + color = "#13BC5E" // rgb: 19, 188, 94 + +datum/reagent/unstableslimetoxin + name = "Unstable Mutation Toxin" + id = "unstablemutationtoxin" + description = "An unstable and unpredictable corruptive toxin produced by slimes." + color = "#5EFF3B" //RGB: 94, 255, 59 + metabolization_rate = INFINITY //So it instantly removes all of itself + +datum/reagent/unstableslimetoxin/on_mob_life(var/mob/living/carbon/human/H as mob) + ..() + H << "You crumple in agony as your flesh wildly morphs into new forms!" + H.visible_message("[H] falls to the ground and screams as their skin bubbles and froths!") //'froths' sounds painful when used with SKIN. + H.Weaken(3) + sleep(30) + var/list/blacklisted_species = list(/datum/species/zombie, /datum/species/skeleton, /datum/species/human, /datum/species/golem, /datum/species/golem/adamantine, /datum/species/shadow) + var/list/possible_morphs = typesof(/datum/species/) - blacklisted_species + var/datum/species/mutation = pick(possible_morphs) + if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine) + H << "The pain subsides. You feel... different." + H.dna.species = new mutation() + H.regenerate_icons() + if(mutation == /datum/species/slime) + H.faction |= "slime" + else + H.faction -= "slime" + else + H << "The pain vanishes suddenly. You feel no different." + return 1 + +datum/reagent/aslimetoxin + name = "Advanced Mutation Toxin" + id = "amutationtoxin" + description = "An advanced corruptive toxin produced by slimes." + color = "#13BC5E" // rgb: 19, 188, 94 + +datum/reagent/aslimetoxin/reaction_mob(var/mob/M, var/volume) + src = null + M.ForceContractDisease(new /datum/disease/transformation/slime(0)) + +datum/reagent/serotrotium + name = "Serotrotium" + id = "serotrotium" + description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." + color = "#202040" // rgb: 20, 20, 40 + metabolization_rate = 0.25 * REAGENTS_METABOLISM + +datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob) + if(ishuman(M)) + if(prob(7)) M.emote(pick("twitch","drool","moan","gasp")) + ..() + return + +datum/reagent/oxygen + name = "Oxygen" + id = "oxygen" + description = "A colorless, odorless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/copper + name = "Copper" + id = "copper" + description = "A highly ductile metal." + reagent_state = SOLID + color = "#6E3B08" // rgb: 110, 59, 8 + +datum/reagent/nitrogen + name = "Nitrogen" + id = "nitrogen" + description = "A colorless, odorless, tasteless gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/hydrogen + name = "Hydrogen" + id = "hydrogen" + description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/potassium + name = "Potassium" + id = "potassium" + description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." + reagent_state = SOLID + color = "#A0A0A0" // rgb: 160, 160, 160 + +datum/reagent/mercury + name = "Mercury" + id = "mercury" + description = "A chemical element." + color = "#484848" // rgb: 72, 72, 72 + +datum/reagent/mercury/on_mob_life(var/mob/living/M as mob) + if(M.canmove && istype(M.loc, /turf/space)) + step(M, pick(cardinal)) + if(prob(5)) + M.emote(pick("twitch","drool","moan")) + M.adjustBrainLoss(2) + ..() + return + +datum/reagent/sulfur + name = "Sulfur" + id = "sulfur" + description = "A chemical element." + reagent_state = SOLID + color = "#BF8C00" // rgb: 191, 140, 0 + +datum/reagent/carbon + name = "Carbon" + id = "carbon" + description = "A chemical element." + reagent_state = SOLID + color = "#1C1300" // rgb: 30, 20, 0 + +datum/reagent/carbon/reaction_turf(var/turf/T, var/volume) + src = null + if(!istype(T, /turf/space)) + new /obj/effect/decal/cleanable/dirt(T) + +datum/reagent/chlorine + name = "Chlorine" + id = "chlorine" + description = "A chemical element." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/chlorine/on_mob_life(var/mob/living/M as mob) + M.take_organ_damage(1*REM, 0) + ..() + return + +datum/reagent/fluorine + name = "Fluorine" + id = "fluorine" + description = "A highly-reactive chemical element." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/fluorine/on_mob_life(var/mob/living/M as mob) + M.adjustToxLoss(1*REM) + ..() + return + +datum/reagent/sodium + name = "Sodium" + id = "sodium" + description = "A chemical element." + reagent_state = SOLID + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/phosphorus + name = "Phosphorus" + id = "phosphorus" + description = "A chemical element." + reagent_state = SOLID + color = "#832828" // rgb: 131, 40, 40 + +datum/reagent/lithium + name = "Lithium" + id = "lithium" + description = "A chemical element." + reagent_state = SOLID + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/lithium/on_mob_life(var/mob/living/M as mob) + if(M.canmove && istype(M.loc, /turf/space)) + step(M, pick(cardinal)) + if(prob(5)) + M.emote(pick("twitch","drool","moan")) + ..() + return + +datum/reagent/glycerol + name = "Glycerol" + id = "glycerol" + description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." + color = "#808080" // rgb: 128, 128, 128 + +datum/reagent/radium + name = "Radium" + id = "radium" + description = "Radium is an alkaline earth metal. It is extremely radioactive." + reagent_state = SOLID + color = "#C7C7C7" // rgb: 199,199,199 + +datum/reagent/radium/on_mob_life(var/mob/living/M as mob) + M.apply_effect(2*REM/M.metabolism_efficiency,IRRADIATE,0) + ..() + return + +datum/reagent/radium/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 3) + if(!istype(T, /turf/space)) + var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) + reagentdecal.reagents.add_reagent("uranium", volume) + +datum/reagent/sterilizine + name = "Sterilizine" + id = "sterilizine" + description = "Sterilizes wounds in preparation for surgery." + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/iron + name = "Iron" + id = "iron" + description = "Pure iron is a metal." + reagent_state = SOLID + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/gold + name = "Gold" + id = "gold" + description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." + reagent_state = SOLID + color = "#F7C430" // rgb: 247, 196, 48 + +datum/reagent/silver + name = "Silver" + id = "silver" + description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." + reagent_state = SOLID + color = "#D0D0D0" // rgb: 208, 208, 208 + +datum/reagent/uranium + name ="Uranium" + id = "uranium" + description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." + reagent_state = SOLID + color = "#B8B8C0" // rgb: 184, 184, 192 + +datum/reagent/uranium/on_mob_life(var/mob/living/M as mob) + M.apply_effect(1/M.metabolism_efficiency,IRRADIATE,0) + ..() + return + + +datum/reagent/uranium/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 3) + if(!istype(T, /turf/space)) + var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) + reagentdecal.reagents.add_reagent("uranium", volume) + +datum/reagent/aluminium + name = "Aluminium" + id = "aluminium" + description = "A silvery white and ductile member of the boron group of chemical elements." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + +datum/reagent/silicon + name = "Silicon" + id = "silicon" + description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + +datum/reagent/fuel + name = "Welding fuel" + id = "fuel" + description = "Required for welders. Flamable." + color = "#660000" // rgb: 102, 0, 0 + +datum/reagent/fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 10) + return + +datum/reagent/fuel/on_mob_life(var/mob/living/M as mob) + M.adjustToxLoss(1) + ..() + return + +datum/reagent/space_cleaner + name = "Space cleaner" + id = "cleaner" + description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" + color = "#A5F0EE" // rgb: 165, 240, 238 + +datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume) + if(istype(O,/obj/effect/decal/cleanable)) + qdel(O) + else + if(O) + O.clean_blood() + +datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume) + if(volume >= 1) + T.clean_blood() + for(var/obj/effect/decal/cleanable/C in T) + qdel(C) + + for(var/mob/living/simple_animal/slime/M in T) + M.adjustToxLoss(rand(5,10)) + if(istype(T, /turf/simulated/floor)) + var/turf/simulated/floor/F = T + if(volume >= 1) + F.dirt = 0 + +datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.lip_style) + H.lip_style = null + H.update_body() + if(C.r_hand) + C.r_hand.clean_blood() + if(C.l_hand) + C.l_hand.clean_blood() + if(C.wear_mask) + if(C.wear_mask.clean_blood()) + C.update_inv_wear_mask(0) + if(ishuman(M)) + var/mob/living/carbon/human/H = C + if(H.head) + if(H.head.clean_blood()) + H.update_inv_head(0) + if(H.wear_suit) + if(H.wear_suit.clean_blood()) + H.update_inv_wear_suit(0) + else if(H.w_uniform) + if(H.w_uniform.clean_blood()) + H.update_inv_w_uniform(0) + if(H.shoes) + if(H.shoes.clean_blood()) + H.update_inv_shoes(0) + M.clean_blood() + +datum/reagent/cryptobiolin + name = "Cryptobiolin" + id = "cryptobiolin" + description = "Cryptobiolin causes confusion and dizzyness." + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 1.5 * REAGENTS_METABOLISM + +datum/reagent/cryptobiolin/on_mob_life(var/mob/living/M as mob) + M.Dizzy(1) + if(!M.confused) + M.confused = 1 + M.confused = max(M.confused, 20) + ..() + return + +datum/reagent/impedrezene + name = "Impedrezene" + id = "impedrezene" + description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." + color = "#C8A5DC" // rgb: 200, 165, 220 + +datum/reagent/impedrezene/on_mob_life(var/mob/living/M as mob) + M.jitteriness = max(M.jitteriness-5,0) + if(prob(80)) M.adjustBrainLoss(1*REM) + if(prob(50)) M.drowsyness = max(M.drowsyness, 3) + if(prob(10)) M.emote("drool") + ..() + return + +datum/reagent/nanites + name = "Nanomachines" + id = "nanomachines" + description = "Microscopic construction robots." + color = "#535E66" // rgb: 83, 94, 102 + +datum/reagent/nanites/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + src = null + if( (prob(10) && method==TOUCH) || method==INGEST) + M.ForceContractDisease(new /datum/disease/transformation/robot(0)) + +datum/reagent/xenomicrobes + name = "Xenomicrobes" + id = "xenomicrobes" + description = "Microbes with an entirely alien cellular structure." + color = "#535E66" // rgb: 83, 94, 102 + +datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) + src = null + if( (prob(10) && method==TOUCH) || method==INGEST) + M.ContractDisease(new /datum/disease/transformation/xeno(0)) + +datum/reagent/fluorosurfactant//foam precursor + name = "Fluorosurfactant" + id = "fluorosurfactant" + description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." + color = "#9E6B38" // rgb: 158, 107, 56 + +datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. + name = "Foaming agent" + id = "foaming_agent" + description = "A agent that yields metallic foam when mixed with light metal and a strong acid." + reagent_state = SOLID + color = "#664B63" // rgb: 102, 75, 99 + +datum/reagent/ammonia + name = "Ammonia" + id = "ammonia" + description = "A caustic substance commonly used in fertilizer or household cleaners." + reagent_state = GAS + color = "#404030" // rgb: 64, 64, 48 + +datum/reagent/diethylamine + name = "Diethylamine" + id = "diethylamine" + description = "A secondary amine, mildly corrosive." + color = "#604030" // rgb: 96, 64, 48 + + + +/////////////////////////Coloured Crayon Powder//////////////////////////// +//For colouring in /proc/mix_color_from_reagents + + +datum/reagent/crayonpowder + name = "Crayon Powder" + id = "crayon powder" + var/colorname = "none" + description = "A powder made by grinding down crayons, good for colouring chemical reagents." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 207, 54, 0 + +datum/reagent/crayonpowder/New() + description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents." + + +datum/reagent/crayonpowder/red + name = "Red Crayon Powder" + id = "redcrayonpowder" + colorname = "red" + +datum/reagent/crayonpowder/orange + name = "Orange Crayon Powder" + id = "orangecrayonpowder" + colorname = "orange" + color = "#FF9300" // orange + +datum/reagent/crayonpowder/yellow + name = "Yellow Crayon Powder" + id = "yellowcrayonpowder" + colorname = "yellow" + color = "#FFF200" // yellow + +datum/reagent/crayonpowder/green + name = "Green Crayon Powder" + id = "greencrayonpowder" + colorname = "green" + color = "#A8E61D" // green + +datum/reagent/crayonpowder/blue + name = "Blue Crayon Powder" + id = "bluecrayonpowder" + colorname = "blue" + color = "#00B7EF" // blue + +datum/reagent/crayonpowder/purple + name = "Purple Crayon Powder" + id = "purplecrayonpowder" + colorname = "purple" + color = "#DA00FF" // purple + +datum/reagent/crayonpowder/invisible + name = "Invisible Crayon Powder" + id = "invisiblecrayonpowder" + colorname = "invisible" + color = "#FFFFFF00" // white + no alpha + + + + +//////////////////////////////////Hydroponics stuff/////////////////////////////// + +datum/reagent/plantnutriment + name = "Generic nutriment" + id = "plantnutriment" + description = "Some kind of nutriment. You can't really tell what it is. You should probably report it, along with how you obtained it." + color = "#000000" // RBG: 0, 0, 0 + var/tox_prob = 0 + +datum/reagent/plantnutriment/on_mob_life(var/mob/living/M as mob) + if(prob(tox_prob)) + M.adjustToxLoss(1*REM) + ..() + return + +datum/reagent/plantnutriment/eznutriment + name = "E-Z-Nutrient" + id = "eznutriment" + description = "Cheap and extremely common type of plant nutriment." + color = "#376400" // RBG: 50, 100, 0 + tox_prob = 10 + +datum/reagent/plantnutriment/left4zednutriment + name = "Left 4 Zed" + id = "left4zednutriment" + description = "Unstable nutriment that makes plants mutate more often than usual." + color = "#1A1E4D" // RBG: 26, 30, 77 + tox_prob = 25 + +datum/reagent/plantnutriment/robustharvestnutriment + name = "Robust Harvest" + id = "robustharvestnutriment" + description = "Very potent nutriment that prevents plants from mutating." + color = "#9D9D00" // RBG: 157, 157, 0 + tox_prob = 15 + + + + + + + +// GOON OTHERS + + + +datum/reagent/oil + name = "Oil" + id = "oil" + description = "Burns in a small smoky fire, mostly used to get Ash." + reagent_state = LIQUID + 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" + +datum/reagent/iodine + name = "Iodine" + id = "iodine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/fluorine + name = "Fluorine" + id = "fluorine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/carpet + name = "Carpet" + id = "carpet" + description = "A slippery solution." + reagent_state = LIQUID + 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.ChangeTurf(/turf/simulated/floor/fancy/carpet) + ..() + return + +datum/reagent/bromine + name = "Bromine" + id = "bromine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/phenol + name = "Phenol" + id = "phenol" + description = "Used for certain medical recipes." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/ash + name = "Ash" + id = "ash" + description = "Basic ingredient in a couple of recipes." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/acetone + name = "Acetone" + id = "acetone" + description = "Common ingredient in other recipes." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/colorful_reagent + name = "Colorful Reagent" + id = "colorful_reagent" + description = "A solution." + reagent_state = LIQUID + color = "#C8A5DC" + var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") + + +datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob) + if(M && isliving(M)) + M.color = pick(random_color_list) + ..() + return + +datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume) + if(M && isliving(M)) + M.color = pick(random_color_list) + ..() + return +datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume) + if(O) + O.color = pick(random_color_list) + ..() + return +datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume) + if(T) + T.color = pick(random_color_list) + ..() + return + +datum/reagent/hair_dye + name = "Quantum Hair Dye" + id = "hair_dye" + description = "A solution." + reagent_state = LIQUID + color = "#C8A5DC" + var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code + +datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + H.hair_color = pick(potential_colors) + H.facial_hair_color = pick(potential_colors) + H.update_hair() + ..() + return + +datum/reagent/barbers_aid + name = "Barber's Aid" + id = "barbers_aid" + description = "A solution to hair loss across the world." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list) + var/datum/sprite_accessory/facial_hair/picked_beard = pick(facial_hair_styles_list) + H.hair_style = picked_hair + H.facial_hair_style = picked_beard + H.update_hair() + ..() + return + +datum/reagent/concentrated_barbers_aid + name = "Concentrated Barber's Aid" + id = "concentrated_barbers_aid" + description = "A concentrated solution to hair loss across the world." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + H.hair_style = "Very Long Hair" + H.facial_hair_style = "Very Long Beard" + H.update_hair() + ..() + return + +/datum/reagent/saltpetre + name = "Saltpetre" + id = "saltpetre" + description = "Volatile." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + diff --git a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm new file mode 100644 index 00000000000..a5704d0b950 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm @@ -0,0 +1,197 @@ + +datum/reagent/thermite + name = "Thermite" + id = "thermite" + description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." + reagent_state = SOLID + color = "#673910" // rgb: 103, 57, 16 + +datum/reagent/thermite/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 1 && istype(T, /turf/simulated/wall)) + var/turf/simulated/wall/Wall = T + if(istype(Wall, /turf/simulated/wall/r_wall)) + Wall.thermite = Wall.thermite+(volume*2.5) + else + Wall.thermite = Wall.thermite+(volume*10) + Wall.overlays = list() + Wall.overlays += image('icons/effects/effects.dmi',"thermite") + +datum/reagent/thermite/on_mob_life(var/mob/living/M as mob) + M.adjustFireLoss(1) + ..() + +datum/reagent/nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." + color = "#808080" // rgb: 128, 128, 128 + +/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/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 = "#FF0000" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) + M.adjust_fire_stacks(2) + M.adjustFireLoss(0.3*M.fire_stacks) + ..() + +/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume) + if(istype(T, /turf/simulated/floor/plating)) + var/turf/simulated/floor/plating/F = T + if(prob(1 + F.burnt + 5*F.broken)) //broken or burnt plating is more susceptible to being destroyed + F.ChangeTurf(/turf/space) + if(istype(T, /turf/simulated/floor/)) + var/turf/simulated/floor/F = T + if(prob(volume/10)) + F.make_plating() + else if(prob(volume)) + F.burn_tile() + if(istype(F, /turf/simulated/floor/)) + new /obj/effect/hotspot(F) + if(istype(T, /turf/simulated/wall/)) + var/turf/simulated/wall/W = T + if(prob(volume/10)) + W.ChangeTurf(/turf/simulated/floor/plating) + +/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH && isliving(M)) + M.adjust_fire_stacks(5) + M.IgniteMob() + new /obj/effect/hotspot(M.loc) + +/datum/reagent/sorium + name = "Sorium" + id = "sorium" + description = "Sends everything flying from the detonation point." + reagent_state = LIQUID + color = "#FFA500" + +/datum/reagent/liquid_dark_matter + name = "Liquid Dark Matter" + id = "liquid_dark_matter" + description = "Sucks everything into the detonation point." + reagent_state = LIQUID + color = "#800080" + +/datum/reagent/blackpowder + name = "Black Powder" + id = "blackpowder" + description = "Explodes. Violently." + reagent_state = LIQUID + color = "#000000" + metabolization_rate = 0.05 + +/datum/reagent/blackpowder/on_ex_act() + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(1 + round(volume/6, 1), location, 0, 0, message = 0) + e.start() + holder.clear_reagents() + +/datum/reagent/flash_powder + name = "Flash Powder" + id = "flash_powder" + description = "Makes a very bright flash." + reagent_state = LIQUID + color = "#FFFF00" + +/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/reagent/sonic_powder + name = "Sonic Powder" + id = "sonic_powder" + description = "Makes a deafening noise." + reagent_state = LIQUID + color = "#0000FF" + +/datum/reagent/phlogiston + name = "Phlogiston" + id = "phlogiston" + description = "Catches you on fire and makes you ignite." + reagent_state = LIQUID + color = "#FF9999" + +/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob) + 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) + M.adjust_fire_stacks(1) + ..() + +/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH && isliving(M)) + M.adjust_fire_stacks(7) + +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 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + + +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", 0.5) + M.bodytemperature -= 15 + ..() + +datum/reagent/cryostylane/on_tick() + if(holder.has_reagent("oxygen")) + holder.remove_reagent("oxygen", 1) + holder.chem_temp -= 10 + holder.handle_reactions() + ..() + +datum/reagent/cryostylane/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)) + +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 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 0.5) + M.bodytemperature += 15 + ..() + +datum/reagent/pyrosium/on_tick() + if(holder.has_reagent("oxygen")) + holder.remove_reagent("oxygen", 1) + holder.chem_temp += 10 + holder.handle_reactions() + ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index 96a1095694e..d20c1e40d65 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -1,7 +1,4 @@ -#define REM REAGENTS_EFFECT_MULTIPLIER - - //////////////////////////Poison stuff (Toxins & Acids)/////////////////////// datum/reagent/toxin @@ -256,7 +253,6 @@ datum/reagent/toxin/chloralhydrate metabolization_rate = 1.5 * REAGENTS_METABOLISM datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob) - current_cycle++ switch(current_cycle) if(1 to 10) M.confused += 2 @@ -283,7 +279,6 @@ datum/reagent/toxin/beer2/on_mob_life(var/mob/living/M as mob) if(51 to INFINITY) M.sleeping += 1 M.adjustToxLoss((current_cycle - 50)*REM) - current_cycle++ ..() return @@ -327,6 +322,289 @@ datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M) data = max(data - 1, 3) ..() +datum/reagent/toxin/polonium + name = "Polonium" + id = "polonium" + description = "Cause significant Radiation damage over time." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.125 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/polonium/on_mob_life(var/mob/living/M as mob) + M.radiation += 4 + ..() + +datum/reagent/toxin/histamine + name = "Histamine" + id = "histamine" + description = "A dose-dependent toxin, ranges from annoying to incredibly lethal." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + toxpwr = 0 + +datum/reagent/toxin/histamine/on_mob_life(var/mob/living/M as mob) + if(prob(50)) + switch(pick(1, 2, 3, 4)) + if(1) + M << "You can barely see!" + M.eye_blurry = 3 + if(2) + M.emote("cough") + if(3) + M.emote("sneeze") + if(4) + if(prob(75)) + M << "You scratch at an itch." + M.adjustBruteLoss(2*REM) + ..() + +datum/reagent/toxin/histamine/overdose_process(var/mob/living/M as mob) + M.adjustOxyLoss(1*REM) + M.adjustBruteLoss(1*REM) + M.adjustToxLoss(1*REM) + ..() + +datum/reagent/toxin/formaldehyde + name = "Formaldehyde" + id = "formaldehyde" + description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/formaldehyde/on_mob_life(var/mob/living/M as mob) + if(prob(5)) + M.reagents.add_reagent("histamine",pick(5,15)) + M.reagents.remove_reagent("formaldehyde",1) + ..() + +datum/reagent/toxin/venom + name = "Venom" + id = "venom" + description = "Will deal scaling amounts of Toxin and Brute damage over time. 15% chance to decay into 5-10 histamine." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/venom/on_mob_life(var/mob/living/M as mob) + toxpwr = 0.05*volume + M.adjustBruteLoss((0.1*volume)*REM) + if(prob(15)) + M.reagents.add_reagent("histamine",pick(5,10)) + M.reagents.remove_reagent("venom",1) + ..() + +datum/reagent/toxin/neurotoxin2 + name = "Neurotoxin" + id = "neurotoxin2" + description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 54 elapsed cycles." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/neurotoxin2/on_mob_life(var/mob/living/M as mob) + if(M.brainloss + M.toxloss <= 60) + M.adjustBrainLoss(1*REM) + M.adjustToxLoss(1*REM) + if(current_cycle >= 54) + M.sleeping += 5 + ..() + +datum/reagent/toxin/cyanide + name = "Cyanide" + id = "cyanide" + description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.125 * REAGENTS_METABOLISM + toxpwr = 0.75 + +datum/reagent/toxin/cyanide/on_mob_life(var/mob/living/M as mob) + if(prob(5)) + M.losebreath += 1 + if(prob(4)) + M << "You feel horrendously weak!" + M.Stun(2) + M.adjustToxLoss(2*REM) + ..() + +/datum/reagent/toxin/questionmark // food poisoning + name = "Bad Food" + id = "????" + description = "????" + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/itching_powder + name = "Itching Powder" + id = "itching_powder" + 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" + metabolization_rate = 0.4 * REAGENTS_METABOLISM + toxpwr = 0 + +/datum/reagent/toxin/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.reagents.add_reagent("itching_powder", volume) + return + +datum/reagent/toxin/itching_powder/on_mob_life(var/mob/living/M as mob) + if(prob(15)) + M << "You scratch at your head." + M.adjustBruteLoss(0.2*REM) + if(prob(15)) + M << "You scratch at your leg." + M.adjustBruteLoss(0.2*REM) + if(prob(15)) + M << "You scratch at your arm." + M.adjustBruteLoss(0.2*REM) + if(prob(3)) + M.reagents.add_reagent("histamine",rand(1,3)) + M.reagents.remove_reagent("itching_powder",1) + ..() + +datum/reagent/toxin/initropidril + name = "Initropidril" + id = "initropidril" + description = "Causes some toxin damage, 5% chances to cause stunning, suffocation, or immediate heart failure." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 2.5 + +datum/reagent/toxin/initropidril/on_mob_life(var/mob/living/M as mob) + if(prob(5)) + 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)) + ..() + +datum/reagent/toxin/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.25 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/pancuronium/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 30) + M.SetParalysis(3) + if(prob(7)) + M.losebreath += 4 + ..() + +datum/reagent/toxin/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.75 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/sodium_thiopental/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 30) + M.sleeping += 1.5 + M.adjustStaminaLoss(5*REM) + ..() + +datum/reagent/toxin/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.125 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/sulfonal/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 66) + M.sleeping += 1.5 + ..() + +datum/reagent/toxin/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" + toxpwr = 0 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/toxin/amanitin/on_mob_delete(var/mob/living/M as mob) + M.adjustToxLoss(current_cycle*3*REM) + ..() + +datum/reagent/toxin/lipolicide + name = "Lipolicide" + id = "lipolicide" + description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/lipolicide/on_mob_life(var/mob/living/M as mob) + if(!holder.has_reagent("nutriment")) + M.adjustToxLoss(0.5*REM) + M.nutrition -= 5 * REAGENTS_METABOLISM + M.overeatduration = 0 + if(M.nutrition < 0)//Prevent from going into negatives. + M.nutrition = 0 + ..() + +datum/reagent/toxin/coniine + name = "Coniine" + id = "coniine" + description = "Does moderate toxin damage and oxygen loss." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.06 * REAGENTS_METABOLISM + toxpwr = 1 + +datum/reagent/toxin/coniine/on_mob_life(var/mob/living/M as mob) + M.losebreath += 3 + ..() + +datum/reagent/toxin/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.125 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/curare/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 33) + M.Weaken(3) + M.adjustOxyLoss(0.5*REM) + ..() + //ACID @@ -361,5 +639,3 @@ datum/reagent/toxin/acid/fluacid toxpwr = 2 acidpwr = 20 -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 0f99675d8e2..7cdb73ae78a 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -19,892 +19,74 @@ /datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume) return - //I recommend you set the result amount to the total volume of all components. -/datum/chemical_reaction/explosion_potassium - name = "Explosion" - id = "explosion_potassium" - result = null - required_reagents = list("water" = 1, "potassium" = 1) - result_amount = 2 -/datum/chemical_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), location, 0, 0) - e.start() - holder.clear_reagents() - return -/datum/chemical_reaction/emp_pulse - name = "EMP Pulse" - id = "emp_pulse" - result = null - required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense - result_amount = 2 - -/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. - // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(created_volume / 24), round(created_volume / 14), 1) - holder.clear_reagents() - return -/* -silicate - name = "Silicate" - id = "silicate" - result = "silicate" - required_reagents = list("aluminium" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 3 -*/ - -/datum/chemical_reaction/sterilizine - name = "Sterilizine" - id = "sterilizine" - result = "sterilizine" - required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) - result_amount = 3 - -/datum/chemical_reaction/mutagen - name = "Unstable mutagen" - id = "mutagen" - result = "mutagen" - required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) - result_amount = 3 - -//cyanide -// name = "Cyanide" -// id = "cyanide" -// result = "cyanide" -// required_reagents = list("hydrogen" = 1, "carbon" = 1, "nitrogen" = 1) -// result_amount = 1 - -/datum/chemical_reaction/thermite - name = "Thermite" - id = "thermite" - result = "thermite" - required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1) - result_amount = 3 - -/datum/chemical_reaction/lexorin - name = "Lexorin" - id = "lexorin" - result = "lexorin" - required_reagents = list("plasma" = 1, "hydrogen" = 1, "nitrogen" = 1) - result_amount = 3 - -/datum/chemical_reaction/space_drugs - name = "Space Drugs" - id = "space_drugs" - result = "space_drugs" - required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) - result_amount = 3 - -/datum/chemical_reaction/lube - name = "Space Lube" - id = "lube" - result = "lube" - required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 4 - -/datum/chemical_reaction/synaptizine - name = "Synaptizine" - id = "synaptizine" - result = "synaptizine" - required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) - result_amount = 3 - -/datum/chemical_reaction/impedrezene - name = "Impedrezene" - id = "impedrezene" - result = "impedrezene" - required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) - result_amount = 2 - -/datum/chemical_reaction/leporazine - name = "Leporazine" - id = "leporazine" - result = "leporazine" - required_reagents = list("silicon" = 1, "copper" = 1) - required_catalysts = list("plasma" = 5) - result_amount = 2 - -/datum/chemical_reaction/cryptobiolin - name = "Cryptobiolin" - id = "cryptobiolin" - result = "cryptobiolin" - required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1) - result_amount = 3 - -/datum/chemical_reaction/spaceacillin - name = "Spaceacillin" - id = "spaceacillin" - result = "spaceacillin" - required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1) - result_amount = 2 - -/datum/chemical_reaction/inacusiate - name = "inacusiate" - id = "inacusiate" - result = "inacusiate" - required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1) - result_amount = 2 - -/datum/chemical_reaction/glycerol - name = "Glycerol" - id = "glycerol" - result = "glycerol" - required_reagents = list("cornoil" = 3, "sacid" = 1) - result_amount = 1 - -/datum/chemical_reaction/nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - result = "nitroglycerin" - required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) - result_amount = 2 -/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/2, 1), location, 0, 0) - e.start() - - holder.clear_reagents() - return - -/datum/chemical_reaction/sodiumchloride - name = "Sodium Chloride" - id = "sodiumchloride" - result = "sodiumchloride" - required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) - result_amount = 3 - -/datum/chemical_reaction/chloralhydrate - name = "Chloral Hydrate" - id = "chloralhydrate" - result = "chloralhydrate" - required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) - result_amount = 1 - -/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v - name = "Mute toxin" - id = "mutetoxin" - result = "mutetoxin" - required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1) - result_amount = 2 - -/datum/chemical_reaction/zombiepowder - name = "Zombie Powder" - id = "zombiepowder" - result = "zombiepowder" - required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5) - result_amount = 2 - -/datum/chemical_reaction/rezadone - name = "Rezadone" - id = "rezadone" - result = "rezadone" - required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) - result_amount = 3 - -/datum/chemical_reaction/mindbreaker - name = "Mindbreaker Toxin" - id = "mindbreaker" - result = "mindbreaker" - required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1) - result_amount = 5 - -/datum/chemical_reaction/plasmasolidification - name = "Solid Plasma" - id = "solidplasma" - result = null - required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) - result_amount = 1 - mob_react = 1 - -/datum/chemical_reaction/plasmasolidification/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/mineral/plasma(location) - return - -/datum/chemical_reaction/capsaicincondensation - name = "Capsaicincondensation" - id = "capsaicincondensation" - result = "condensedcapsaicin" - required_reagents = list("capsaicin" = 1, "ethanol" = 5) - result_amount = 5 - -/datum/chemical_reaction/virus_food - name = "Virus Food" - id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 5, "milk" = 5) - result_amount = 15 - -/datum/chemical_reaction/mix_virus - name = "Mix Virus" - id = "mixvirus" - result = "blood" - required_reagents = list("virusfood" = 1) - required_catalysts = list("blood" = 1) - var/level_min = 0 - var/level_max = 2 - -/datum/chemical_reaction/mix_virus/on_reaction(var/datum/reagents/holder, var/created_volume) - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Evolve(level_min, level_max) - - -/datum/chemical_reaction/mix_virus/mix_virus_2 - - name = "Mix Virus 2" - id = "mixvirus2" - required_reagents = list("mutagen" = 1) - level_min = 2 - level_max = 4 - -/datum/chemical_reaction/mix_virus/mix_virus_3 - - name = "Mix Virus 3" - id = "mixvirus3" - required_reagents = list("plasma" = 1) - level_min = 4 - level_max = 6 - -/datum/chemical_reaction/mix_virus/rem_virus - - name = "Devolve Virus" - id = "remvirus" - required_reagents = list("synaptizine" = 1) - required_catalysts = list("blood" = 1) - -/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder, var/created_volume) - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Devolve() - - - -/////////////////////////////////////////////////////////////////////////////////// - -// foam and foam precursor - -/datum/chemical_reaction/surfactant - name = "Foam surfactant" - id = "foam surfactant" - result = "fluorosurfactant" - required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) - result_amount = 5 - - -/datum/chemical_reaction/foam - name = "Foam" - id = "foam" - result = null - required_reagents = list("fluorosurfactant" = 1, "water" = 1) - result_amount = 2 - mob_react = 1 - -/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "The solution spews out foam!" - - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder) - s.start() - holder.clear_reagents() - return - - -/datum/chemical_reaction/metalfoam - name = "Metal Foam" - id = "metalfoam" - result = null - required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) - result_amount = 5 - mob_react = 1 - -/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "The solution spews out a metallic foam!" - - var/datum/effect/effect/system/foam_spread/metal/s = new() - s.set_up(created_volume, location, holder, 1) - s.start() - holder.clear_reagents() - return - - -/datum/chemical_reaction/ironfoam - name = "Iron Foam" - id = "ironlfoam" - result = null - required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) - result_amount = 5 - mob_react = 1 - -/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "The solution spews out a metallic foam!" - - var/datum/effect/effect/system/foam_spread/metal/s = new() - s.set_up(created_volume, location, holder, 2) - s.start() - holder.clear_reagents() - return - - -/datum/chemical_reaction/foaming_agent - name = "Foaming Agent" - id = "foaming_agent" - result = "foaming_agent" - required_reagents = list("lithium" = 1, "hydrogen" = 1) - result_amount = 1 - -// Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game! -/datum/chemical_reaction/ammonia - name = "Ammonia" - id = "ammonia" - result = "ammonia" - required_reagents = list("hydrogen" = 3, "nitrogen" = 1) - result_amount = 3 - -/datum/chemical_reaction/diethylamine - name = "Diethylamine" - id = "diethylamine" - result = "diethylamine" - required_reagents = list ("ammonia" = 1, "ethanol" = 1) - result_amount = 2 - -/datum/chemical_reaction/space_cleaner - name = "Space cleaner" - id = "cleaner" - result = "cleaner" - required_reagents = list("ammonia" = 1, "water" = 1) - result_amount = 2 - -/datum/chemical_reaction/plantbgone - name = "Plant-B-Gone" - id = "plantbgone" - result = "plantbgone" - required_reagents = list("toxin" = 1, "water" = 4) - result_amount = 5 - -datum/chemical_reaction/weedkiller - name = "Weed Killer" - id = "weedkiller" - result = "weedkiller" - required_reagents = list("toxin" = 1, "ammonia" = 4) - result_amount = 5 - -datum/chemical_reaction/pestkiller - name = "Pest Killer" - id = "pestkiller" - result = "pestkiller" - required_reagents = list("toxin" = 1, "ethanol" = 4) - result_amount = 5 - -/////////////////////////////////////////////NEW SLIME CORE REACTIONS///////////////////////////////////////////// - -//Grey -/datum/chemical_reaction/slimespawn - name = "Slime Spawn" - id = "m_spawn" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 -/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) - var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime - S.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimeinaprov - name = "Slime epinephrine" - id = "m_inaprov" - result = "epinephrine" - required_reagents = list("water" = 5) - result_amount = 3 - required_other = 1 - required_container = /obj/item/slime_extract/grey -/datum/chemical_reaction/slimeinaprov/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -/datum/chemical_reaction/slimemonkey - name = "Slime Monkey" - id = "m_monkey" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 -/datum/chemical_reaction/slimemonkey/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/i = 1, i <= 3, i++) - var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube - M.loc = get_turf(holder.my_atom) - -//Green -/datum/chemical_reaction/slimemutate - name = "Mutation Toxin" - id = "mutationtoxin" - result = "mutationtoxin" - required_reagents = list("plasma" = 1) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/green -/datum/chemical_reaction/slimemutate/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -//Metal -/datum/chemical_reaction/slimemetal - name = "Slime Metal" - id = "m_metal" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/metal - required_other = 1 -/datum/chemical_reaction/slimemetal/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal - M.amount = 15 - M.loc = get_turf(holder.my_atom) - var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel - P.amount = 5 - P.loc = get_turf(holder.my_atom) - -//Gold -/datum/chemical_reaction/slimecrit - name = "Slime Crit" - id = "m_tele" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 -/datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - - chemical_mob_spawn(holder, 5, "Gold Slime") - -/datum/chemical_reaction/slimecritlesser - name = "Slime Crit Lesser" - id = "m_tele3" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 -/datum/chemical_reaction/slimecritlesser/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - - chemical_mob_spawn(holder, 1, "Lesser Gold Slime", "neutral") - -//Silver -/datum/chemical_reaction/slimebork - name = "Slime Bork" - id = "m_tele2" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 -/datum/chemical_reaction/slimebork/on_reaction(var/datum/reagents/holder) - - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks - // BORK BORK BORK - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - M.flash_eyes() - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon") + if(holder && holder.my_atom) + var/blocked = list(/mob/living/simple_animal/hostile, + /mob/living/simple_animal/hostile/pirate, + /mob/living/simple_animal/hostile/pirate/ranged, + /mob/living/simple_animal/hostile/russian, + /mob/living/simple_animal/hostile/russian/ranged, + /mob/living/simple_animal/hostile/syndicate, + /mob/living/simple_animal/hostile/syndicate/melee, + /mob/living/simple_animal/hostile/syndicate/melee/space, + /mob/living/simple_animal/hostile/syndicate/ranged, + /mob/living/simple_animal/hostile/syndicate/ranged/space, + /mob/living/simple_animal/hostile/alien/queen/large, + /mob/living/simple_animal/hostile/retaliate, + /mob/living/simple_animal/hostile/retaliate/clown, + /mob/living/simple_animal/hostile/mushroom, + /mob/living/simple_animal/hostile/asteroid, + /mob/living/simple_animal/hostile/asteroid/basilisk, + /mob/living/simple_animal/hostile/asteroid/goldgrub, + /mob/living/simple_animal/hostile/asteroid/goliath, + /mob/living/simple_animal/hostile/asteroid/hivelord, + /mob/living/simple_animal/hostile/asteroid/hivelordbrood, + /mob/living/simple_animal/hostile/carp/holocarp, + /mob/living/simple_animal/hostile/mining_drone, + /mob/living/simple_animal/hostile/poison, + /mob/living/simple_animal/hostile/blob, + /mob/living/simple_animal/ascendant_shadowling + )//exclusion list for things you don't want the reaction to create. + var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + var/atom/A = holder.my_atom + var/turf/T = get_turf(A) + var/area/my_area = get_area(T) + var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" + message += " (VV)" + + var/mob/M = get(A, /mob) + if(M) + message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)" + else + message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" + + message_admins(message, 0, 1) + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null)) + H.flash_eyes() + for(var/i = 1, i <= amount_to_spawn, i++) + var/chosen = pick(critters) + var/mob/living/simple_animal/hostile/C = new chosen + C.faction |= mob_faction + C.loc = get_turf(holder.my_atom) if(prob(50)) for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - - -/datum/chemical_reaction/slimebork2 - name = "Slime Bork 2" - id = "m_tele4" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 -/datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder) - - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks - // BORK BORK BORK - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - M.flash_eyes() - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - - -//Blue -/datum/chemical_reaction/slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("plasma" = 1) - result_amount = 10 - required_container = /obj/item/slime_extract/blue - required_other = 1 -/datum/chemical_reaction/slimefrost/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -//Dark Blue -/datum/chemical_reaction/slimefreeze - name = "Slime Freeze" - id = "m_freeze" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/darkblue - required_other = 1 -/datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 240 - M << "You feel a chill!" - -//Orange -/datum/chemical_reaction/slimecasp - name = "Slime Capsaicin Oil" - id = "m_capsaicinoil" - result = "capsaicin" - required_reagents = list("blood" = 1) - result_amount = 10 - required_container = /obj/item/slime_extract/orange - required_other = 1 -/datum/chemical_reaction/slimecasp/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -/datum/chemical_reaction/slimefire - name = "Slime fire" - id = "m_fire" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/orange - required_other = 1 -/datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) - -//Yellow - -/datum/chemical_reaction/slimeoverload - name = "Slime EMP" - id = "m_emp" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 -/datum/chemical_reaction/slimeoverload/on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - empulse(get_turf(holder.my_atom), 3, 7) - - -/datum/chemical_reaction/slimecell - name = "Slime Powercell" - id = "m_cell" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 -/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimeglow - name = "Slime Glow" - id = "m_glow" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 -/datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) - -//Purple - -/datum/chemical_reaction/slimepsteroid - name = "Slime Steroid" - id = "m_steroid" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/purple - required_other = 1 -/datum/chemical_reaction/slimepsteroid/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimejam - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("sugar" = 1) - result_amount = 10 - required_container = /obj/item/slime_extract/purple - required_other = 1 -/datum/chemical_reaction/slimejam/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - -//Dark Purple -/datum/chemical_reaction/slimeplasma - name = "Slime Plasma" - id = "m_plasma" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/darkpurple - required_other = 1 -/datum/chemical_reaction/slimeplasma/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma - P.amount = 10 - P.loc = get_turf(holder.my_atom) - -//Red -/datum/chemical_reaction/slimeglycerol - name = "Slime Glycerol" - id = "m_glycerol" - result = "glycerol" - required_reagents = list("plasma" = 1) - result_amount = 8 - required_container = /obj/item/slime_extract/red - required_other = 1 -/datum/chemical_reaction/slimeglycerol/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - -/datum/chemical_reaction/slimebloodlust - name = "Bloodlust" - id = "m_bloodlust" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/red - required_other = 1 -/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) - slime.rabid = 1 - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The [slime] is driven into a frenzy!"), 1) - -//Pink -/datum/chemical_reaction/slimeppotion - name = "Slime Potion" - id = "m_potion" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/pink - required_other = 1 -/datum/chemical_reaction/slimeppotion/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/slimepotion/P = new /obj/item/slimepotion - P.loc = get_turf(holder.my_atom) - - -//Black -/datum/chemical_reaction/slimemutate2 - name = "Advanced Mutation Toxin" - id = "mutationtoxin2" - result = "amutationtoxin" - required_reagents = list("plasma" = 1) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/black -/datum/chemical_reaction/slimemutate2/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -//Oil -/datum/chemical_reaction/slimeexplosion - name = "Slime Explosion" - id = "m_explosion" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/oil - required_other = 1 -/datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - explosion(get_turf(holder.my_atom), 1 ,3, 6) -//Light Pink -/datum/chemical_reaction/slimepotion2 - name = "Slime Potion 2" - id = "m_potion2" - result = null - result_amount = 1 - required_container = /obj/item/slime_extract/lightpink - required_reagents = list("plasma" = 1) - required_other = 1 -/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/slimepotion2/P = new /obj/item/slimepotion2 - P.loc = get_turf(holder.my_atom) -//Adamantine -/datum/chemical_reaction/slimegolem - name = "Slime Golem" - id = "m_golem" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/adamantine - required_other = 1 -/datum/chemical_reaction/slimegolem/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/effect/golemrune/Z = new /obj/effect/golemrune - Z.loc = get_turf(holder.my_atom) - notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg') - -//Bluespace - -/datum/chemical_reaction/slimecrystal - name = "Slime Crystal" - id = "m_crystal" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/bluespace - required_other = 1 -/datum/chemical_reaction/slimecrystal/on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - if(holder.my_atom) - var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom)) - BC.visible_message("The [BC.name] appears out of thin air!") - -//Cerulean - -/datum/chemical_reaction/slimepsteroid2 - name = "Slime Steroid 2" - id = "m_steroid2" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/cerulean - required_other = 1 -/datum/chemical_reaction/slimepsteroid2/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 - P.loc = get_turf(holder.my_atom) - -//Sepia -/datum/chemical_reaction/slimecamera - name = "Slime Camera" - id = "m_camera" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 -/datum/chemical_reaction/slimecamera/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera/P = new /obj/item/device/camera - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimefilm - name = "Slime Film" - id = "m_film" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 -/datum/chemical_reaction/slimefilm/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera_film/P = new /obj/item/device/camera_film - P.loc = get_turf(holder.my_atom) - - -//Pyrite - -/datum/chemical_reaction/slimepaint - name = "Slime Paint" - id = "s_paint" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/pyrite - required_other = 1 -/datum/chemical_reaction/slimepaint/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/list/paints = typesof(/obj/item/weapon/paint) - /obj/item/weapon/paint - var/chosen = pick(paints) - var/obj/P = new chosen - if(P) - P.loc = get_turf(holder.my_atom) + step(C, pick(NORTH,SOUTH,EAST,WEST)) +/datum/chemical_reaction/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times) + for(var/atom/movable/X in orange(range, T)) + if(istype(X, /obj/effect)) + continue //stop pulling smoke and hotspots please + if(istype(X, /atom/movable)) + if((X) && !X.anchored) + if(setting_type) + for(var/i = 0, i < pull_times, i++) + step_away(X,T) + else + for(var/i = 0, i < pull_times, i++) + step_towards(X,T) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes/Drugs.dm b/code/modules/reagents/Chemistry-Recipes/Drugs.dm new file mode 100644 index 00000000000..6916187a7eb --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Drugs.dm @@ -0,0 +1,48 @@ +/datum/chemical_reaction/space_drugs + name = "Space Drugs" + id = "space_drugs" + result = "space_drugs" + required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) + result_amount = 3 + +/datum/chemical_reaction/crank + name = "Crank" + id = "crank" + result = "crank" + required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1) + result_amount = 5 + mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." + required_temp = 390 + + +/datum/chemical_reaction/krokodil + name = "Krokodil" + id = "krokodil" + result = "krokodil" + required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1) + result_amount = 6 + mix_message = "The mixture dries into a pale blue powder." + required_temp = 380 + +/datum/chemical_reaction/methamphetamine + name = "methamphetamine" + id = "methamphetamine" + result = "methamphetamine" + required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) + result_amount = 4 + required_temp = 374 + +/datum/chemical_reaction/bath_salts + name = "bath_salts" + id = "bath_salts" + result = "bath_salts" + required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1) + result_amount = 7 + required_temp = 374 + +/datum/chemical_reaction/aranesp + name = "aranesp" + id = "aranesp" + result = "aranesp" + required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) + result_amount = 3 diff --git a/code/modules/reagents/Chemistry-Recipes/Medicine.dm b/code/modules/reagents/Chemistry-Recipes/Medicine.dm new file mode 100644 index 00000000000..a73477d8629 --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Medicine.dm @@ -0,0 +1,197 @@ + +/datum/chemical_reaction/leporazine + name = "Leporazine" + id = "leporazine" + result = "leporazine" + required_reagents = list("silicon" = 1, "copper" = 1) + required_catalysts = list("plasma" = 5) + result_amount = 2 + +/datum/chemical_reaction/rezadone + name = "Rezadone" + id = "rezadone" + result = "rezadone" + required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) + result_amount = 3 + +/datum/chemical_reaction/spaceacillin + name = "Spaceacillin" + id = "spaceacillin" + result = "spaceacillin" + required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1) + result_amount = 2 + +/datum/chemical_reaction/inacusiate + name = "inacusiate" + id = "inacusiate" + result = "inacusiate" + required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1) + result_amount = 2 + +/datum/chemical_reaction/synaptizine + name = "Synaptizine" + id = "synaptizine" + result = "synaptizine" + required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) + result_amount = 3 + +/datum/chemical_reaction/charcoal + name = "Charcoal" + id = "charcoal" + result = "charcoal" + required_reagents = list("ash" = 1, "sodiumchloride" = 1) + result_amount = 2 + mix_message = "The mixture yields a fine black powder." + required_temp = 380 + +/datum/chemical_reaction/silver_sulfadiazine + name = "Silver Sulfadiazine" + id = "silver_sulfadiazine" + result = "silver_sulfadiazine" + required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) + result_amount = 5 + +/datum/chemical_reaction/salglu_solution + name = "Saline-Glucose Solution" + id = "salglu_solution" + result = "salglu_solution" + required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/synthflesh + name = "Synthflesh" + id = "synthflesh" + result = "synthflesh" + required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) + result_amount = 3 + +/datum/chemical_reaction/styptic_powder + name = "Styptic Powder" + id = "styptic_powder" + result = "styptic_powder" + required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 4 + mix_message = "The solution yields an astringent powder." + +/datum/chemical_reaction/calomel + name = "Calomel" + id = "calomel" + result = "calomel" + required_reagents = list("mercury" = 1, "chlorine" = 1) + result_amount = 2 + required_temp = 374 + +/datum/chemical_reaction/potass_iodide + name = "Potassium Iodide" + id = "potass_iodide" + result = "potass_iodide" + required_reagents = list("potassium" = 1, "iodine" = 1) + result_amount = 2 + +/datum/chemical_reaction/pen_acid + name = "Pentetic Acid" + id = "pen_acid" + result = "pen_acid" + required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) + result_amount = 6 + +/datum/chemical_reaction/sal_acid + name = "Salicyclic Acid" + id = "sal_acid" + result = "sal_acid" + required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 5 + + +/datum/chemical_reaction/salbutamol + name = "Salbutamol" + id = "salbutamol" + result = "salbutamol" + required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1) + result_amount = 5 + +/datum/chemical_reaction/perfluorodecalin + name = "Perfluorodecalin" + id = "perfluorodecalin" + result = "perfluorodecalin" + required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) + result_amount = 3 + required_temp = 370 + mix_message = "The mixture rapidly turns into a dense pink liquid." + +/datum/chemical_reaction/ephedrine + name = "Ephedrine" + id = "ephedrine" + result = "ephedrine" + required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) + result_amount = 4 + mix_message = "The solution fizzes and gives off toxic fumes." + +/datum/chemical_reaction/diphenhydramine + name = "Diphenhydramine" + id = "diphenhydramine" + result = "diphenhydramine" + required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) + result_amount = 4 + mix_message = "The mixture dries into a pale blue powder." + +/datum/chemical_reaction/oculine + name = "Oculine" + id = "oculine" + result = "oculine" + required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1) + result_amount = 3 + mix_message = "The mixture sputters loudly and becomes a pale pink color." + +/datum/chemical_reaction/atropine + name = "Atropine" + id = "atropine" + result = "atropine" + required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) + result_amount = 5 + +/datum/chemical_reaction/epinephrine + name = "Epinephrine" + id = "epinephrine" + result = "epinephrine" + required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) + result_amount = 6 + +/datum/chemical_reaction/strange_reagent + name = "Strange Reagent" + id = "strange_reagent" + result = "strange_reagent" + required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) + result_amount = 3 + +/datum/chemical_reaction/mannitol + name = "Mannitol" + id = "mannitol" + result = "mannitol" + required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1) + result_amount = 3 + mix_message = "The solution slightly bubbles, becoming thicker." + +/datum/chemical_reaction/mutadone + name = "Mutadone" + id = "mutadone" + result = "mutadone" + required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) + result_amount = 3 + +/datum/chemical_reaction/antihol + name = "antihol" + id = "antihol" + result = "antihol" + required_reagents = list("ethanol" = 1, "charcoal" = 1, "copper" = 1) + result_amount = 3 + +/datum/chemical_reaction/cryoxadone + name = "Cryoxadone" + id = "cryoxadone" + result = "cryoxadone" + required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1) + result_amount = 3 + + + diff --git a/code/modules/reagents/Chemistry-Recipes/Others.dm b/code/modules/reagents/Chemistry-Recipes/Others.dm new file mode 100644 index 00000000000..8a44606fcbc --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Others.dm @@ -0,0 +1,342 @@ + +/datum/chemical_reaction/sterilizine + name = "Sterilizine" + id = "sterilizine" + result = "sterilizine" + required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/lube + name = "Space Lube" + id = "lube" + result = "lube" + required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 4 + +/datum/chemical_reaction/impedrezene + name = "Impedrezene" + id = "impedrezene" + result = "impedrezene" + required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) + result_amount = 2 + +/datum/chemical_reaction/cryptobiolin + name = "Cryptobiolin" + id = "cryptobiolin" + result = "cryptobiolin" + required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/glycerol + name = "Glycerol" + id = "glycerol" + result = "glycerol" + required_reagents = list("cornoil" = 3, "sacid" = 1) + result_amount = 1 + +/datum/chemical_reaction/sodiumchloride + name = "Sodium Chloride" + id = "sodiumchloride" + result = "sodiumchloride" + required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/plasmasolidification + name = "Solid Plasma" + id = "solidplasma" + result = null + required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) + result_amount = 1 + mob_react = 1 + +/datum/chemical_reaction/plasmasolidification/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/stack/sheet/mineral/plasma(location) + return + +/datum/chemical_reaction/capsaicincondensation + name = "Capsaicincondensation" + id = "capsaicincondensation" + result = "condensedcapsaicin" + required_reagents = list("capsaicin" = 1, "ethanol" = 5) + result_amount = 5 + + +////////////////////////////////// VIROLOGY ////////////////////////////////////////// + +/datum/chemical_reaction/virus_food + name = "Virus Food" + id = "virusfood" + result = "virusfood" + required_reagents = list("water" = 5, "milk" = 5) + result_amount = 15 + +/datum/chemical_reaction/mix_virus + name = "Mix Virus" + id = "mixvirus" + result = "blood" + required_reagents = list("virusfood" = 1) + required_catalysts = list("blood" = 1) + var/level_min = 0 + var/level_max = 2 + +/datum/chemical_reaction/mix_virus/on_reaction(var/datum/reagents/holder, var/created_volume) + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Evolve(level_min, level_max) + + +/datum/chemical_reaction/mix_virus/mix_virus_2 + + name = "Mix Virus 2" + id = "mixvirus2" + required_reagents = list("mutagen" = 1) + level_min = 2 + level_max = 4 + +/datum/chemical_reaction/mix_virus/mix_virus_3 + + name = "Mix Virus 3" + id = "mixvirus3" + required_reagents = list("plasma" = 1) + level_min = 4 + level_max = 6 + +/datum/chemical_reaction/mix_virus/rem_virus + + name = "Devolve Virus" + id = "remvirus" + required_reagents = list("synaptizine" = 1) + required_catalysts = list("blood" = 1) + +/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder, var/created_volume) + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Devolve() + + + +////////////////////////////////// foam and foam precursor /////////////////////////////////////////////////// + + +/datum/chemical_reaction/surfactant + name = "Foam surfactant" + id = "foam surfactant" + result = "fluorosurfactant" + required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) + result_amount = 5 + + +/datum/chemical_reaction/foam + name = "Foam" + id = "foam" + result = null + required_reagents = list("fluorosurfactant" = 1, "water" = 1) + result_amount = 2 + mob_react = 1 + +/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "The solution spews out foam!" + + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder) + s.start() + holder.clear_reagents() + return + + +/datum/chemical_reaction/metalfoam + name = "Metal Foam" + id = "metalfoam" + result = null + required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) + result_amount = 5 + mob_react = 1 + +/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "The solution spews out a metallic foam!" + + var/datum/effect/effect/system/foam_spread/metal/s = new() + s.set_up(created_volume, location, holder, 1) + s.start() + holder.clear_reagents() + +/datum/chemical_reaction/ironfoam + name = "Iron Foam" + id = "ironlfoam" + result = null + required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) + result_amount = 5 + mob_react = 1 + +/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + for(var/mob/M in viewers(5, location)) + M << "The solution spews out a metallic foam!" + var/datum/effect/effect/system/foam_spread/metal/s = new() + s.set_up(created_volume, location, holder, 2) + s.start() + holder.clear_reagents() + +/datum/chemical_reaction/foaming_agent + name = "Foaming Agent" + id = "foaming_agent" + result = "foaming_agent" + required_reagents = list("lithium" = 1, "hydrogen" = 1) + result_amount = 1 + + +/////////////////////////////// Cleaning and hydroponics ///////////////////////////////////////////////// + +/datum/chemical_reaction/ammonia + name = "Ammonia" + id = "ammonia" + result = "ammonia" + required_reagents = list("hydrogen" = 3, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/diethylamine + name = "Diethylamine" + id = "diethylamine" + result = "diethylamine" + required_reagents = list ("ammonia" = 1, "ethanol" = 1) + result_amount = 2 + +/datum/chemical_reaction/space_cleaner + name = "Space cleaner" + id = "cleaner" + result = "cleaner" + required_reagents = list("ammonia" = 1, "water" = 1) + result_amount = 2 + +/datum/chemical_reaction/plantbgone + name = "Plant-B-Gone" + id = "plantbgone" + result = "plantbgone" + required_reagents = list("toxin" = 1, "water" = 4) + result_amount = 5 + +datum/chemical_reaction/weedkiller + name = "Weed Killer" + id = "weedkiller" + result = "weedkiller" + required_reagents = list("toxin" = 1, "ammonia" = 4) + result_amount = 5 + +datum/chemical_reaction/pestkiller + name = "Pest Killer" + id = "pestkiller" + result = "pestkiller" + required_reagents = list("toxin" = 1, "ethanol" = 4) + result_amount = 5 + + +//////////////////////////////////// Other goon stuff /////////////////////////////////////////// + +/datum/chemical_reaction/acetone + name = "acetone" + id = "acetone" + result = "acetone" + required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/carpet + name = "carpet" + id = "carpet" + result = "carpet" + required_reagents = list("space_drugs" = 1, "blood" = 1) + result_amount = 2 + + +/datum/chemical_reaction/oil + name = "Oil" + id = "oil" + result = "oil" + required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/phenol + name = "phenol" + id = "phenol" + result = "phenol" + required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1) + result_amount = 3 + +/datum/chemical_reaction/ash + name = "Ash" + id = "ash" + result = "ash" + required_reagents = list("oil" = 1) + result_amount = 1 + required_temp = 480 + +/datum/chemical_reaction/colorful_reagent + name = "colorful_reagent" + id = "colorful_reagent" + result = "colorful_reagent" + required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1) + result_amount = 5 + +/datum/chemical_reaction/life + name = "Life" + id = "life" + result = null + required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) + result_amount = 1 + required_temp = 374 + +/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume) + chemical_mob_spawn(holder, 1, "Life") + +/datum/chemical_reaction/corgium + name = "corgium" + id = "corgium" + result = null + required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1) + result_amount = 1 + required_temp = 374 + +/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/pet/corgi(location) + ..() + +/datum/chemical_reaction/hair_dye + name = "hair_dye" + id = "hair_dye" + result = "hair_dye" + required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1) + result_amount = 5 + +/datum/chemical_reaction/barbers_aid + name = "barbers_aid" + id = "barbers_aid" + result = "barbers_aid" + required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1) + result_amount = 5 + +/datum/chemical_reaction/concentrated_barbers_aid + name = "concentrated_barbers_aid" + id = "concentrated_barbers_aid" + result = "concentrated_barbers_aid" + required_reagents = list("barbers_aid" = 1, "mutagen" = 1) + result_amount = 2 + +/datum/chemical_reaction/saltpetre + name = "saltpetre" + id = "saltpetre" + result = "saltpetre" + required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm new file mode 100644 index 00000000000..737f9bb5e92 --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm @@ -0,0 +1,353 @@ + +/datum/chemical_reaction/nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + result = "nitroglycerin" + required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) + result_amount = 2 + +/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("nitroglycerin", created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/2, 1), location, 0, 0) + e.start() + holder.clear_reagents() + +/datum/chemical_reaction/nitroglycerin_explosion + name = "Nitroglycerin explosion" + id = "nitroglycerin_explosion" + result = null + required_reagents = list("nitroglycerin" = 1) + result_amount = 1 + required_temp = 474 + +/datum/chemical_reaction/nitroglycerin_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round(created_volume/2, 1), location, 0, 0) + e.start() + holder.clear_reagents() + +/datum/chemical_reaction/potassium_explosion + name = "Explosion" + id = "potassium_explosion" + result = null + required_reagents = list("water" = 1, "potassium" = 1) + result_amount = 2 + +/datum/chemical_reaction/potassium_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/10, 1), location, 0, 0) + e.start() + holder.clear_reagents() + +/datum/chemical_reaction/blackpowder + name = "Black Powder" + id = "blackpowder" + result = "blackpowder" + required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1) + result_amount = 3 + +/datum/chemical_reaction/blackpowder_explosion + name = "Black Powder Kaboom" + id = "blackpowder_explosion" + result = null + required_reagents = list("blackpowder" = 1) + result_amount = 1 + required_temp = 474 + mix_message = "Sparks start flying around the black powder!" + +/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) + sleep(rand(50,100)) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(1 + round(created_volume/6, 1), location, 0, 0) + e.start() + holder.clear_reagents() + +/datum/chemical_reaction/thermite + name = "Thermite" + id = "thermite" + result = "thermite" + required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/emp_pulse + name = "EMP Pulse" + id = "emp_pulse" + result = null + required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense + result_amount = 2 + +/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. + // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. + empulse(location, round(created_volume / 24), round(created_volume / 14), 1) + holder.clear_reagents() + +/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/chemical_reaction/clf3 + name = "Chlorine Trifluoride" + id = "clf3" + result = "clf3" + required_reagents = list("chlorine" = 1, "fluorine" = 3) + result_amount = 4 + required_temp = 424 + +/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume) + 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 + +/datum/chemical_reaction/sorium + name = "Sorium" + id = "sorium" + result = "sorium" + required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) + result_amount = 4 + +/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) + +/datum/chemical_reaction/sorium_vortex + name = "sorium_vortex" + id = "sorium_vortex" + result = null + required_reagents = list("sorium" = 1) + required_temp = 474 + +/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/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 = 3 + +/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) + +/datum/chemical_reaction/ldm_vortex + name = "LDM Vortex" + id = "ldm_vortex" + result = null + required_reagents = list("liquid_dark_matter" = 1) + required_temp = 474 + +/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) + +/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/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.flash_eyes()) + if(get_dist(C, location) < 4) + C.Weaken(5) + else + C.Stun(5) + holder.remove_reagent("flash_powder", created_volume) + +/datum/chemical_reaction/flash_powder_flash + name = "Flash powder activation" + id = "flash_powder_flash" + result = null + required_reagents = list("flash_powder" = 1) + result_amount = 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.flash_eyes()) + if(get_dist(C, location) < 4) + C.Weaken(5) + else + C.Stun(5) + +/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/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/chemical_reaction/smoke_powder_smoke + name = "smoke_powder_smoke" + id = "smoke_powder_smoke" + result = null + required_reagents = list("smoke_powder" = 1) + required_temp = 374 + result_amount = 1 + 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/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/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(C.check_ear_prot()) + 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_deafen + name = "sonic_powder_deafen" + id = "sonic_powder_deafen" + result = null + required_reagents = list("sonic_powder" = 1) + required_temp = 374 + result_amount = 1 + +/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(C.check_ear_prot()) + 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/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/chemical_reaction/napalm + name = "Napalm" + id = "napalm" + result = "napalm" + required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 ) + result_amount = 3 + + +/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/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 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm new file mode 100644 index 00000000000..732d6c39b48 --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm @@ -0,0 +1,548 @@ + +//Grey +/datum/chemical_reaction/slimespawn + name = "Slime Spawn" + id = "m_spawn" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + +/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) + var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime + S.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimeinaprov + name = "Slime epinephrine" + id = "m_inaprov" + result = "epinephrine" + required_reagents = list("water" = 5) + result_amount = 3 + required_other = 1 + required_container = /obj/item/slime_extract/grey + +/datum/chemical_reaction/slimeinaprov/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +/datum/chemical_reaction/slimemonkey + name = "Slime Monkey" + id = "m_monkey" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + +/datum/chemical_reaction/slimemonkey/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/i = 1, i <= 3, i++) + var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube + M.loc = get_turf(holder.my_atom) + +//Green +/datum/chemical_reaction/slimemutate + name = "Mutation Toxin" + id = "mutationtoxin" + result = "mutationtoxin" + required_reagents = list("plasma" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/green + +/datum/chemical_reaction/slimemutate/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Mutated Green +/datum/chemical_reaction/slimemutate_unstable + name = "Unstable Mutation Toxin" + id = "unstablemutationtoxin" + result = "unstablemutationtoxin" + required_reagents = list("radium" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/green + mix_message = "The mixture rapidly expands and contracts, its appearance shifting into a sickening green." + +/datum/chemical_reaction/slimemutate_unstable/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Metal +/datum/chemical_reaction/slimemetal + name = "Slime Metal" + id = "m_metal" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/metal + required_other = 1 + +/datum/chemical_reaction/slimemetal/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal + M.amount = 15 + M.loc = get_turf(holder.my_atom) + var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel + P.amount = 5 + P.loc = get_turf(holder.my_atom) + +//Gold +/datum/chemical_reaction/slimecrit + name = "Slime Crit" + id = "m_tele" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + +/datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + + chemical_mob_spawn(holder, 5, "Gold Slime") + +/datum/chemical_reaction/slimecritlesser + name = "Slime Crit Lesser" + id = "m_tele3" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + +/datum/chemical_reaction/slimecritlesser/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + + chemical_mob_spawn(holder, 1, "Lesser Gold Slime", "neutral") + +//Silver +/datum/chemical_reaction/slimebork + name = "Slime Bork" + id = "m_tele2" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 + +/datum/chemical_reaction/slimebork/on_reaction(var/datum/reagents/holder) + + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks, + /obj/item/weapon/reagent_containers/food/snacks/store/bread, + /obj/item/weapon/reagent_containers/food/snacks/breadslice, + /obj/item/weapon/reagent_containers/food/snacks/store/cake, + /obj/item/weapon/reagent_containers/food/snacks/cakeslice, + /obj/item/weapon/reagent_containers/food/snacks/store, + /obj/item/weapon/reagent_containers/food/snacks/pie, + /obj/item/weapon/reagent_containers/food/snacks/kebab, + /obj/item/weapon/reagent_containers/food/snacks/pizza, + /obj/item/weapon/reagent_containers/food/snacks/pizzaslice, + /obj/item/weapon/reagent_containers/food/snacks/salad, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/soup, + /obj/item/weapon/reagent_containers/food/snacks/grown, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom + ) + blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable) + + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked + // BORK BORK BORK + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + M.flash_eyes() + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + + +/datum/chemical_reaction/slimebork2 + name = "Slime Bork 2" + id = "m_tele4" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 + +/datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder) + + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks + // BORK BORK BORK + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + M.flash_eyes() + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + + +//Blue +/datum/chemical_reaction/slimefrost + name = "Slime Frost Oil" + id = "m_frostoil" + result = "frostoil" + required_reagents = list("plasma" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/blue + required_other = 1 + +/datum/chemical_reaction/slimefrost/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Dark Blue +/datum/chemical_reaction/slimefreeze + name = "Slime Freeze" + id = "m_freeze" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkblue + required_other = 1 + +/datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + if(holder && holder.my_atom) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) + M.bodytemperature -= 240 + M << "You feel a chill!" + +//Orange +/datum/chemical_reaction/slimecasp + name = "Slime Capsaicin Oil" + id = "m_capsaicinoil" + result = "capsaicin" + required_reagents = list("blood" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/orange + required_other = 1 + +/datum/chemical_reaction/slimecasp/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +/datum/chemical_reaction/slimefire + name = "Slime fire" + id = "m_fire" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/orange + required_other = 1 + +/datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + if(holder && holder.my_atom) + var/turf/simulated/T = get_turf(holder.my_atom) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) + +//Yellow + +/datum/chemical_reaction/slimeoverload + name = "Slime EMP" + id = "m_emp" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeoverload/on_reaction(var/datum/reagents/holder, var/created_volume) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + empulse(get_turf(holder.my_atom), 3, 7) + + +/datum/chemical_reaction/slimecell + name = "Slime Powercell" + id = "m_cell" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime + P.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimeglow + name = "Slime Glow" + id = "m_glow" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) + var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime + F.loc = get_turf(holder.my_atom) + +//Purple + +/datum/chemical_reaction/slimepsteroid + name = "Slime Steroid" + id = "m_steroid" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/purple + required_other = 1 + +/datum/chemical_reaction/slimepsteroid/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid + P.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimejam + name = "Slime Jam" + id = "m_jam" + result = "slimejelly" + required_reagents = list("sugar" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/purple + required_other = 1 + +/datum/chemical_reaction/slimejam/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + +//Dark Purple +/datum/chemical_reaction/slimeplasma + name = "Slime Plasma" + id = "m_plasma" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkpurple + required_other = 1 + +/datum/chemical_reaction/slimeplasma/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma + P.amount = 10 + P.loc = get_turf(holder.my_atom) + +//Red +/datum/chemical_reaction/slimeglycerol + name = "Slime Glycerol" + id = "m_glycerol" + result = "glycerol" + required_reagents = list("plasma" = 1) + result_amount = 8 + required_container = /obj/item/slime_extract/red + required_other = 1 + +/datum/chemical_reaction/slimeglycerol/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + +/datum/chemical_reaction/slimebloodlust + name = "Bloodlust" + id = "m_bloodlust" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 + +/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) + slime.rabid = 1 + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The [slime] is driven into a frenzy!"), 1) + +//Pink +/datum/chemical_reaction/slimeppotion + name = "Slime Potion" + id = "m_potion" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/pink + required_other = 1 + +/datum/chemical_reaction/slimeppotion/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/slimepotion/P = new /obj/item/slimepotion + P.loc = get_turf(holder.my_atom) + + +//Black +/datum/chemical_reaction/slimemutate2 + name = "Advanced Mutation Toxin" + id = "mutationtoxin2" + result = "amutationtoxin" + required_reagents = list("plasma" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/black + +/datum/chemical_reaction/slimemutate2/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Oil +/datum/chemical_reaction/slimeexplosion + name = "Slime Explosion" + id = "m_explosion" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/oil + required_other = 1 + +/datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + if(holder && holder.my_atom) + explosion(get_turf(holder.my_atom), 1 ,3, 6) + +//Light Pink +/datum/chemical_reaction/slimepotion2 + name = "Slime Potion 2" + id = "m_potion2" + result = null + result_amount = 1 + required_container = /obj/item/slime_extract/lightpink + required_reagents = list("plasma" = 1) + required_other = 1 + +/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/slimepotion2/P = new /obj/item/slimepotion2 + P.loc = get_turf(holder.my_atom) + +//Adamantine +/datum/chemical_reaction/slimegolem + name = "Slime Golem" + id = "m_golem" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/adamantine + required_other = 1 + +/datum/chemical_reaction/slimegolem/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/effect/golemrune/Z = new /obj/effect/golemrune + Z.loc = get_turf(holder.my_atom) + notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg') + +//Bluespace +/datum/chemical_reaction/slimecrystal + name = "Slime Crystal" + id = "m_crystal" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/bluespace + required_other = 1 + +/datum/chemical_reaction/slimecrystal/on_reaction(var/datum/reagents/holder, var/created_volume) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + if(holder.my_atom) + var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom)) + BC.visible_message("The [BC.name] appears out of thin air!") + +//Cerulean +/datum/chemical_reaction/slimepsteroid2 + name = "Slime Steroid 2" + id = "m_steroid2" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/cerulean + required_other = 1 + +/datum/chemical_reaction/slimepsteroid2/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 + P.loc = get_turf(holder.my_atom) + +//Sepia +/datum/chemical_reaction/slimecamera + name = "Slime Camera" + id = "m_camera" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + +/datum/chemical_reaction/slimecamera/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/device/camera/P = new /obj/item/device/camera + P.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimefilm + name = "Slime Film" + id = "m_film" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + +/datum/chemical_reaction/slimefilm/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/device/camera_film/P = new /obj/item/device/camera_film + P.loc = get_turf(holder.my_atom) + +//Pyrite +/datum/chemical_reaction/slimepaint + name = "Slime Paint" + id = "s_paint" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/pyrite + required_other = 1 + +/datum/chemical_reaction/slimepaint/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/list/paints = typesof(/obj/item/weapon/paint) - /obj/item/weapon/paint + var/chosen = pick(paints) + var/obj/P = new chosen + if(P) + P.loc = get_turf(holder.my_atom) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes/Toxins.dm b/code/modules/reagents/Chemistry-Recipes/Toxins.dm new file mode 100644 index 00000000000..95f2a28507a --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Toxins.dm @@ -0,0 +1,95 @@ + +/datum/chemical_reaction/formaldehyde + name = "formaldehyde" + id = "Formaldehyde" + result = "formaldehyde" + required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) + result_amount = 3 + required_temp = 420 + +/datum/chemical_reaction/neurotoxin2 + name = "neurotoxin2" + id = "neurotoxin2" + result = "neurotoxin2" + required_reagents = list("space_drugs" = 1) + result_amount = 1 + required_temp = 674 + +/datum/chemical_reaction/cyanide + name = "Cyanide" + id = "cyanide" + result = "cyanide" + required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) + result_amount = 3 + required_temp = 380 + +/datum/chemical_reaction/itching_powder + name = "Itching Powder" + id = "itching_powder" + result = "itching_powder" + required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1) + result_amount = 3 + +/datum/chemical_reaction/facid + name = "Fluorosulfuric acid" + id = "facid" + result = "facid" + required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) + result_amount = 4 + required_temp = 380 + +/datum/chemical_reaction/sulfonal + name = "sulfonal" + id = "sulfonal" + result = "sulfonal" + required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) + result_amount = 3 + +/datum/chemical_reaction/lipolicide + name = "lipolicide" + id = "lipolicide" + result = "lipolicide" + required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) + result_amount = 3 + +/datum/chemical_reaction/mutagen + name = "Unstable mutagen" + id = "mutagen" + result = "mutagen" + required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/lexorin + name = "Lexorin" + id = "lexorin" + result = "lexorin" + required_reagents = list("plasma" = 1, "hydrogen" = 1, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/chloralhydrate + name = "Chloral Hydrate" + id = "chloralhydrate" + result = "chloralhydrate" + required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) + result_amount = 1 + +/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v + name = "Mute toxin" + id = "mutetoxin" + result = "mutetoxin" + required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1) + result_amount = 2 + +/datum/chemical_reaction/zombiepowder + name = "Zombie Powder" + id = "zombiepowder" + result = "zombiepowder" + required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5) + result_amount = 2 + +/datum/chemical_reaction/mindbreaker + name = "Mindbreaker Toxin" + id = "mindbreaker" + result = "mindbreaker" + required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1) + result_amount = 5 \ No newline at end of file diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index 0ae8523e6f8..f3bd6bbea87 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -1,61 +1,61 @@ -/obj/item/weapon/gun/grenadelauncher - name = "grenade launcher" - desc = "a terrible, terrible thing. it's really awful!" - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "riotgun" - item_state = "riotgun" - w_class = 4.0 - throw_speed = 2 - throw_range = 7 - force = 5.0 - var/list/grenades = new/list() - var/max_grenades = 3 - m_amt = 2000 - -/obj/item/weapon/gun/grenadelauncher/examine(mob/user) - ..() - user << "[grenades] / [max_grenades] grenades loaded." - -/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) - - if((istype(I, /obj/item/weapon/grenade))) - if(grenades.len < max_grenades) - user.drop_item() - I.loc = src - grenades += I - user << "You put the grenade in the grenade launcher." - user << "[grenades.len] / [max_grenades] Grenades." - else - usr << "The grenade launcher cannot hold more grenades." - -/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) - - if (istype(target, /obj/item/weapon/storage/backpack )) - return - - else if (locate (/obj/structure/table, src.loc)) - return - - else if(target == user) - return - - if(grenades.len) - spawn(0) fire_grenade(target,user) - else - usr << "The grenade launcher is empty." - -/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] fired a grenade!", user), 1) - user << "You fire the grenade launcher!" - var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! - grenades -= F - F.loc = user.loc - F.throw_at(target, 30, 2) - message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - F.active = 1 - F.icon_state = initial(icon_state) + "_active" - playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(15) - F.prime() +/obj/item/weapon/gun/grenadelauncher + name = "grenade launcher" + desc = "a terrible, terrible thing. it's really awful!" + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "riotgun" + item_state = "riotgun" + w_class = 4.0 + throw_speed = 2 + throw_range = 7 + force = 5.0 + var/list/grenades = new/list() + var/max_grenades = 3 + m_amt = 2000 + +/obj/item/weapon/gun/grenadelauncher/examine(mob/user) + ..() + user << "[grenades] / [max_grenades] grenades loaded." + +/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) + + if((istype(I, /obj/item/weapon/grenade))) + if(grenades.len < max_grenades) + user.drop_item() + I.loc = src + grenades += I + user << "You put the grenade in the grenade launcher." + user << "[grenades.len] / [max_grenades] Grenades." + else + usr << "The grenade launcher cannot hold more grenades!" + +/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) + + if (istype(target, /obj/item/weapon/storage/backpack )) + return + + else if (locate (/obj/structure/table, src.loc)) + return + + else if(target == user) + return + + if(grenades.len) + spawn(0) fire_grenade(target,user) + else + usr << "The grenade launcher is empty!" + +/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) + for(var/mob/O in viewers(world.view, user)) + O.show_message(text("[] fired a grenade!", user), 1) + user << "You fire the grenade launcher!" + var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! + grenades -= F + F.loc = user.loc + F.throw_at(target, 30, 2) + message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + F.active = 1 + F.icon_state = initial(icon_state) + "_active" + playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + spawn(15) + F.prime() diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index ab4fd76f5ac..a938b092061 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -54,28 +54,18 @@ else return "No reagents" /obj/item/weapon/reagent_containers/proc/canconsume(mob/eater, mob/user) - if(!eater.SpeciesCanConsume()) + if(!iscarbon(eater)) + return 0 + var/mob/living/carbon/C = eater + var/covered = "" + if(C.is_mouth_covered(head_only = 1)) + covered = "headgear" + else if(C.is_mouth_covered(mask_only = 1)) + covered = "mask" + if(covered) + var/who = (isnull(user) || eater == user) ? "your" : "their" + user << "You have to remove [who] [covered] first!" return 0 - //Check for covering mask - var/obj/item/clothing/cover = eater.get_item_by_slot(slot_wear_mask) - - if(isnull(cover)) // No mask, do we have any helmet? - cover = eater.get_item_by_slot(slot_head) - else - var/obj/item/clothing/mask/covermask = cover - if(covermask.alloweat) // Specific cases, clownmask for example. - return 1 - - if(!isnull(cover)) - if((cover.flags & HEADCOVERSMOUTH) || (cover.flags & MASKCOVERSMOUTH)) - var/who = (isnull(user) || eater == user) ? "your" : "their" - - if(istype(cover, /obj/item/clothing/mask/)) - user << "You have to remove [who] mask first!" - else - user << "You have to remove [who] helmet first!" - - return 0 return 1 /obj/item/weapon/reagent_containers/ex_act() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 7e2e63aba62..f4304ba596a 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -123,7 +123,7 @@ Borg Hypospray empty = 0 if(empty) - usr << "It is currently empty. Allow some time for the internal syntheszier to produce more." + usr << "It is currently empty! Allow some time for the internal syntheszier to produce more." /* Borg Shaker */ @@ -167,7 +167,7 @@ Borg Shaker else if(target.is_open_container() && target.reagents) var/datum/reagents/R = reagent_list[mode] if(!R.total_volume) - user << "[src] is currently out of this ingredient. Please allow some time for the synthesizer to produce more." + user << "[src] is currently out of this ingredient! Please allow some time for the synthesizer to produce more." return if(target.reagents.total_volume >= target.reagents.maximum_volume) @@ -187,7 +187,7 @@ Borg Shaker empty = 0 if(empty) - usr << "It is currently empty. Please allow some time for the synthesizer to produce more." + usr << "It is currently empty! Please allow some time for the synthesizer to produce more." /obj/item/weapon/reagent_containers/borghypo/borgshaker/hacked ..() diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index bba70ba32b1..8a8f5f1728b 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -17,7 +17,7 @@ return if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit. - user << "You cannot directly fill [target]." + user << "You cannot directly fill [target]!" return var/trans = 0 @@ -73,7 +73,7 @@ return if(!target.reagents.total_volume) - user << "[target] is empty." + user << "[target] is empty!" return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index aa31cb5e0a1..8cf1fb79d65 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -50,7 +50,7 @@ else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(target.reagents && !target.reagents.total_volume) - user << "[target] is empty and can't be refilled." + user << "[target] is empty and can't be refilled!" return if(reagents.total_volume >= reagents.maximum_volume) @@ -62,7 +62,7 @@ else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) - user << "[src] is empty." + user << "[src] is empty!" return if(target.reagents.total_volume >= target.reagents.maximum_volume) @@ -90,12 +90,7 @@ else if(reagents.total_volume) user << "You splash the solution onto [target]." reagents.reaction(target, TOUCH) - if(istype(target, /turf/simulated/floor)) - var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/chem_pile(target) - reagents.trans_to(reagentdecal, volume) - reagentdecal.color = mix_color_from_reagents(reagentdecal.reagents.reagent_list) - else - reagents.clear_reagents() + reagents.clear_reagents() /obj/item/weapon/reagent_containers/glass/attackby(var/obj/item/I, mob/user as mob, params) if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird @@ -109,7 +104,7 @@ user << "You heat [src] with [I]." reagents.handle_reactions() else - user << "[src] is already hotter than [I]." + user << "[src] is already hotter than [I]!" if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 16b8d2a05d2..b6da840f2cf 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -16,7 +16,7 @@ /obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user) if(!reagents.total_volume) - user << "[src] is empty." + user << "[src] is empty!" return if(!istype(M)) return @@ -93,7 +93,7 @@ /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack //goliath kiting name = "stimpack medipen" - desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor as well as a ." + desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor." icon_state = "stimpen" volume = 20 amount_per_transfer_from_this = 20 diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index e524f00a9b3..f87d3682a7c 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -17,7 +17,7 @@ return // thanks inheritance again /obj/item/weapon/reagent_containers/pill/patch/canconsume(mob/eater, mob/user) - if(!eater.SpeciesCanConsume()) + if(!iscarbon(eater)) return 0 return 1 // Masks were stopping people from "eating" patches. Thanks, inheritance. diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index e663258acc7..4520bb48afb 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -59,11 +59,11 @@ if(!proximity) return if(target.is_open_container() != 0 && target.reagents) if(!target.reagents.total_volume) - user << "[target] is empty. There's nothing to dissolve [src] in." + user << "[target] is empty! There's nothing to dissolve [src] in." return user << "You dissolve [src] in [target]." for(var/mob/O in viewers(2, user)) //viewers is necessary here because of the small radius - O << "[user] slips something into [target]." + O << "[user] slips something into [target]!" reagents.trans_to(target, reagents.total_volume) spawn(5) qdel(src) @@ -96,7 +96,7 @@ name = "stimulant pill" desc = "Often taken by overworked employees, athletes, and the inebriated. You'll snap to attention immediately!" icon_state = "pill19" - list_reagents = list("ephedrine" = 10, "ethylredoxrazine" = 10, "coffee" = 30) + list_reagents = list("ephedrine" = 10, "antihol" = 10, "coffee" = 30) roundstart = 1 /obj/item/weapon/reagent_containers/pill/salbutamol name = "salbutamol pill" @@ -140,4 +140,4 @@ desc = "Handles hyperglycaemic coma." icon_state = "pill5" list_reagents = list("insulin" = 50) - roundstart = 1 \ No newline at end of file + roundstart = 1 diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 43484c7cc4b..edfce7a4595 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -40,7 +40,7 @@ return if(reagents.total_volume < amount_per_transfer_from_this) - user << "\The [src] is empty!" + user << "\The [src] is empty!" return spray(A) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 8c14b5d5b77..9d7988c289e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -69,19 +69,19 @@ var/mob/living/carbon/human/H = target if(H.dna) if(NOBLOOD in H.dna.species.specflags && !H.dna.species.exotic_blood) - user << "You are unable to locate any blood." + user << "You are unable to locate any blood!" return if(reagents.has_reagent("blood")) - user << "There is already a blood sample in this syringe." + user << "There is already a blood sample in this syringe!" return if(istype(target, /mob/living/carbon)) //maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. var/amount = src.reagents.maximum_volume - src.reagents.total_volume var/mob/living/carbon/T = target if(!check_dna_integrity(T)) - user << "You are unable to locate any blood." + user << "You are unable to locate any blood!" return if(NOCLONE in T.mutations) //target done been eat, no more blood in him - user << "You are unable to locate any blood." + user << "You are unable to locate any blood!" return if(target != user) target.visible_message("[user] is trying to take a blood sample from [target]!", \ @@ -99,22 +99,22 @@ if(H.dna && H.dna.species.exotic_blood && H.reagents.total_volume) target.reagents.trans_to(src, amount) else - user << "You are unable to locate any blood." + user << "You are unable to locate any blood!" return if (B) src.reagents.reagent_list += B src.reagents.update_total() src.on_reagent_change() src.reagents.handle_reactions() - user.visible_message("[user] takes a blood sample from [target].") + user.visible_message("[user] takes a blood sample from [target].") else //if not mob if(!target.reagents.total_volume) - user << "[target] is empty." + user << "[target] is empty!" return if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) - user << "You cannot directly remove reagents from [target]." + user << "You cannot directly remove reagents from [target]!" return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? @@ -132,7 +132,7 @@ return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) - user << "You cannot directly fill [target]." + user << "You cannot directly fill [target]!" return if(target.reagents.total_volume >= target.reagents.maximum_volume) user << "[target] is full." diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 5c2928a6556..ab72b62f722 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -149,11 +149,11 @@ if((!istype(user)) || (user.stat)) return if(cups <= 0) - user << "What? No cups?" + user << "No cups left!" return cups-- user.put_in_hands(new /obj/item/weapon/reagent_containers/food/drinks/sillycup) - user.visible_message("[user] gets a cup from [src].","You get a cup from [src].") + user.visible_message("[user] gets a cup from [src].","You get a cup from [src].") /obj/structure/reagent_dispensers/water_cooler/attackby(var/obj/item/I, var/mob/user, params) if(istype(I, /obj/item/weapon/paper)) diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm index 3786555a0e8..5c6327abcfa 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -1,77 +1,77 @@ -/obj/item/weapon/gun/syringe - name = "syringe gun" - desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." - icon_state = "syringegun" - item_state = "syringegun" - w_class = 3 - throw_speed = 3 - throw_range = 7 - force = 4 - m_amt = 2000 - clumsy_check = 0 - fire_sound = 'sound/items/syringeproj.ogg' - var/list/syringes = list() - var/max_syringes = 1 - -/obj/item/weapon/gun/syringe/New() - ..() - chambered = new /obj/item/ammo_casing/syringegun(src) - -/obj/item/weapon/gun/syringe/proc/newshot() - if(!syringes.len) return - - var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] - - if(!S) return - - chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) - S.reagents.trans_to(chambered.BB, S.reagents.total_volume) - chambered.BB.name = S.name - syringes.Remove(S) - - qdel(S) - return - -/obj/item/weapon/gun/syringe/process_chamber() - return - -/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) - newshot() - ..() - -/obj/item/weapon/gun/syringe/examine(mob/user) - ..() - user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." - -/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) - if(!syringes.len) - user << "[src] is empty." - return 0 - - var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] - - if(!S) return 0 - S.loc = user.loc - - syringes.Remove(S) - user << "You unload [S] from \the [src]!" - - return 1 - -/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1) - if(istype(A, /obj/item/weapon/reagent_containers/syringe)) - if(syringes.len < max_syringes) - user.drop_item() - user << "You load [A] into \the [src]." - syringes.Add(A) - A.loc = src - return 1 - else - usr << "[src] cannot hold more syringes." - return 0 - -/obj/item/weapon/gun/syringe/rapidsyringe - name = "rapid syringe gun" - desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." - icon_state = "rapidsyringegun" - max_syringes = 6 +/obj/item/weapon/gun/syringe + name = "syringe gun" + desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." + icon_state = "syringegun" + item_state = "syringegun" + w_class = 3 + throw_speed = 3 + throw_range = 7 + force = 4 + m_amt = 2000 + clumsy_check = 0 + fire_sound = 'sound/items/syringeproj.ogg' + var/list/syringes = list() + var/max_syringes = 1 + +/obj/item/weapon/gun/syringe/New() + ..() + chambered = new /obj/item/ammo_casing/syringegun(src) + +/obj/item/weapon/gun/syringe/proc/newshot() + if(!syringes.len) return + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] + + if(!S) return + + chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) + S.reagents.trans_to(chambered.BB, S.reagents.total_volume) + chambered.BB.name = S.name + syringes.Remove(S) + + qdel(S) + return + +/obj/item/weapon/gun/syringe/process_chamber() + return + +/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) + newshot() + ..() + +/obj/item/weapon/gun/syringe/examine(mob/user) + ..() + user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." + +/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) + if(!syringes.len) + user << "[src] is empty." + return 0 + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] + + if(!S) return 0 + S.loc = user.loc + + syringes.Remove(S) + user << "You unload [S] from \the [src]." + + return 1 + +/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1) + if(istype(A, /obj/item/weapon/reagent_containers/syringe)) + if(syringes.len < max_syringes) + user.drop_item() + user << "You load [A] into \the [src]." + syringes.Add(A) + A.loc = src + return 1 + else + usr << "[src] cannot hold more syringes!" + return 0 + +/obj/item/weapon/gun/syringe/rapidsyringe + name = "rapid syringe gun" + desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." + icon_state = "rapidsyringegun" + max_syringes = 6 diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 3d725cafcfd..5e077f56ea3 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -126,7 +126,7 @@ return if(isrobot(user)) return //Carn: fix for borgs dropping their modules on conveyor belts if(!user.drop_item()) - user << "\The [I] is stuck to your hand, you cannot place it on the conveyor!" + user << "\The [I] is stuck to your hand, you cannot place it on the conveyor!" return if(I && I.loc) I.loc = src.loc return diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 33b1ae0df0f..69ffea18298 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -98,7 +98,7 @@ return if(anchored) - usr << "You must unfasten the pipe before rotating it." + usr << "You must unfasten the pipe before rotating it!" return dir = turn(dir, -90) @@ -112,7 +112,7 @@ return if(anchored) - usr << "You must unfasten the pipe before flipping it." + usr << "You must unfasten the pipe before flipping it!" return dir = turn(dir, 180) @@ -170,10 +170,14 @@ nicetype = "pipe" var/turf/T = loc - if(T.intact) - user << "You can only attach the [nicetype] if the floor plating is removed." + if(T.intact && istype(T, /turf/simulated/floor)) + user << "You can only attach the [nicetype] if the floor plating is removed!" return - + + if(!ispipe && istype(T, /turf/simulated/wall)) + user << "You can't build [nicetype]s on walls, only disposal pipes!" + return + var/obj/structure/disposalpipe/CP = locate() in T if(istype(I, /obj/item/weapon/wrench)) @@ -184,15 +188,15 @@ density = 0 else density = 1 - user << "You detach the [nicetype] from the underfloor." + user << "You detach the [nicetype] from the underfloor." else if(!is_pipe()) // Disposal or outlet if(CP) // There's something there if(!istype(CP,/obj/structure/disposalpipe/trunk)) - user << "The [nicetype] requires a trunk underneath it in order to work." + user << "The [nicetype] requires a trunk underneath it in order to work!" return else // Nothing under, fuck. - user << "The [nicetype] requires a trunk underneath it in order to work." + user << "The [nicetype] requires a trunk underneath it in order to work!" return else if(CP) @@ -201,7 +205,7 @@ if(istype(CP, /obj/structure/disposalpipe/broken)) pdir = CP.dir if(pdir & dpdir) - user << "There is already a [nicetype] at that location." + user << "There is already a [nicetype] at that location!" return anchored = 1 if(ispipe) @@ -209,7 +213,7 @@ density = 0 else density = 1 // We don't want disposal bins or outlets to go density 0 - user << "You attach the [nicetype] to the underfloor." + user << "You attach the [nicetype] to the underfloor." playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) update() @@ -218,11 +222,11 @@ var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(loc, 'sound/items/Welder2.ogg', 100, 1) - user << "Welding the [nicetype] in place." + user << "You start welding the [nicetype] in place..." if(do_after(user, 20)) if(!loc || !W.isOn()) return - user << "The [nicetype] has been welded in place!" + user << "The [nicetype] has been welded in place." update() // TODO: Make this neat if(ispipe) @@ -250,7 +254,7 @@ return else - user << "You need to attach it to the plating first!" + user << "You need to attach it to the plating first!" return /obj/structure/disposalconstruct/proc/is_pipe() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index b7815cfad11..0cbd54f514f 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -105,11 +105,11 @@ var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off \the [src]." + user << "You start slicing the floorweld off \the [src]..." if(do_after(user,20)) if(!src || !W.isOn()) return - user << "You've sliced the floorweld off \the [src]." + user << "You slice the floorweld off \the [src]." Deconstruct() return else @@ -134,7 +134,7 @@ user.drop_item() I.loc = src - user.visible_message("[user.name] places \the [I] into \the [src].", \ + user.visible_message("[user.name] places \the [I] into \the [src].", \ "You place \the [I] into \the [src].") update() @@ -149,23 +149,23 @@ if(!iscarbon(user) && !user.ventcrawler) //only carbon and ventcrawlers can climb into disposal by themselves. return if(target.mob_size > MOB_SIZE_HUMAN) - user << "[target] doesn't fit inside [src]." + user << "[target] doesn't fit inside [src]!" return src.add_fingerprint(user) if(user == target) - user.visible_message("[user] starts climbing into [src].", \ - "[user] starts climbing into [src].") + user.visible_message("[user] starts climbing into [src].", \ + "You start climbing into [src]...") else target.visible_message("[user] starts putting [target] into [src].", \ - "[user] starts putting [target] into [src]!") + "[user] starts putting you into [src]!") if(do_mob(user, target, 20)) if (target.client) target.client.perspective = EYE_PERSPECTIVE target.client.eye = src target.loc = src if(user == target) - user.visible_message("[user] climbs into [src].", \ - "[user] climbs into [src].") + user.visible_message("[user] climbs into [src].", \ + "You climb into [src].") else target.visible_message("[user] has placed [target] in [src].", \ "[user] has placed [target] in [src].") @@ -214,7 +214,7 @@ // human interact with machine /obj/machinery/disposal/attack_hand(mob/user as mob) if(user && user.loc == src) - usr << "You cannot reach the controls from inside." + usr << "You cannot reach the controls from inside!" return /* if(mode==-1) @@ -271,7 +271,7 @@ if(..()) return if(usr.loc == src) - usr << "You cannot reach the controls from inside." + usr << "You cannot reach the controls from inside!" return if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1 @@ -729,10 +729,11 @@ var/turf/target - if(istype(T, /turf/simulated/floor) && !istype(T, /turf/simulated/floor/plating)) //intact floor, pop the tile + if(istype(T, /turf/simulated/floor)) //intact floor, pop the tile var/turf/simulated/floor/myturf = T - if(myturf.floor_tile) - new myturf.floor_tile(T) + if(myturf.builtin_tile) + myturf.builtin_tile.loc = T + myturf.builtin_tile = null myturf.make_plating() if(direction) // direction is specified @@ -845,12 +846,12 @@ if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the disposal pipe." + user << "You start slicing the disposal pipe..." // check if anything changed over 2 seconds if(do_after(user,30)) if(!src || !W.isOn()) return Deconstruct() - user << "You've sliced the disposal pipe." + user << "You slice the disposal pipe." else return @@ -1145,16 +1146,16 @@ var/obj/item/weapon/weldingtool/W = I if(linked) - user << "You need to deconstruct disposal machinery above this pipe." + user << "You need to deconstruct disposal machinery above this pipe!" return if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the disposal pipe." + user << "You start slicing the disposal pipe..." if(do_after(user,30)) if(!src || !W.isOn()) return Deconstruct() - user << "You've sliced the disposal pipe." + user << "You slice the disposal pipe." else return @@ -1284,10 +1285,10 @@ var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off \the [src]." + user << "You start slicing the floorweld off \the [src]..." if(do_after(user,20)) if(!src || !W.isOn()) return - user << "You've sliced the floorweld off \the [src]." + user << "You slice the floorweld off \the [src]." stored.loc = loc src.transfer_fingerprints_to(stored) stored.update() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index de964360207..19d4496b315 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -38,15 +38,15 @@ else if(istype(W, /obj/item/weapon/pen)) var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) - user << "Invalid text." + user << "Invalid text!" return - user.visible_message("[user] labels [src] as [str].") + user.visible_message("[user] labels [src] as [str].") name = "[name] ([str])" else if(istype(W, /obj/item/stack/wrapping_paper) && !giftwrapped) var/obj/item/stack/wrapping_paper/WP = W if(WP.use(3)) - user.visible_message("[user] wraps the package in festive paper!") + user.visible_message("[user] wraps the package in festive paper!") giftwrapped = 1 if(istype(wrapped, /obj/structure/closet/crate)) icon_state = "giftcrate" @@ -55,7 +55,7 @@ if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube new /obj/item/weapon/c_tube( get_turf(user) ) else - user << "You need more paper." + user << "You need more paper!" /obj/item/smallDelivery @@ -92,9 +92,9 @@ else if(istype(W, /obj/item/weapon/pen)) var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) - user << "Invalid text." + user << "Invalid text!" return - user.visible_message("[user] labels [src] as [str].") + user.visible_message("[user] labels [src] as [str].") name = "[name] ([str])" else if(istype(W, /obj/item/stack/wrapping_paper) && !giftwrapped) @@ -102,11 +102,11 @@ if(WP.use(1)) icon_state = "giftcrate[wrapped.w_class]" giftwrapped = 1 - user.visible_message("[user] wraps the package in festive paper!") + user.visible_message("[user] wraps the package in festive paper!") if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube new /obj/item/weapon/c_tube( get_turf(user) ) else - user << "You need more paper." + user << "You need more paper!" @@ -161,7 +161,7 @@ P.wrapped = O O.loc = P else - user << "You need more paper." + user << "You need more paper!" return else if(istype (target, /obj/structure/closet)) var/obj/structure/closet/O = target @@ -173,13 +173,13 @@ O.welded = 1 O.loc = P else - user << "You need more paper." + user << "You need more paper!" return else - user << "The object you are trying to wrap is unsuitable for the sorting machinery." + user << "The object you are trying to wrap is unsuitable for the sorting machinery!" return - user.visible_message("[user] wraps [target].") + user.visible_message("[user] wraps [target].") user.attack_log += text("\[[time_stamp()]\] Has used [name] on [target]") if(amount <= 0 && !src.loc) //if we used our last wrapping paper, drop a cardboard tube @@ -342,11 +342,11 @@ if(W.remove_fuel(0,user)) playsound(loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off the delivery chute." + user << "You start slicing the floorweld off the delivery chute..." if(do_after(user,20)) if(!src || !W.isOn()) return Deconstruct() - user << "You sliced the floorweld off the delivery chute." + user << "You slice the floorweld off the delivery chute." return else return diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 1e9bcb8c6a0..3663a339382 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -101,7 +101,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). default_deconstruction_crowbar(O) return else - user << "You can't load the [src.name] while it's opened." + user << "You can't load the [src.name] while it's opened!" return if (disabled) return @@ -116,11 +116,11 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). if (stat) return if (busy) - user << "The [name] is busy. Please wait for completion of previous operation." + user << "The [name] is busy! Please wait for completion of previous operation." return var/obj/item/stack/sheet/stack = O if ((TotalMaterials() + stack.perunit) > max_material_amount) - user << "The [name] is full. Please remove glass from the protolathe in order to insert more." + user << "The [name] is full! Please remove glass from the protolathe in order to insert more." return var/amount = round(input("How many sheets do you want to add?") as num) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 520c48354e8..5b5533a9c28 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -153,7 +153,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) id = "plasmacutter" req_tech = list("materials" = 2, "plasmatech" = 2, "engineering" = 2, "combat" = 1, "magnets" = 2) build_type = PROTOLATHE - materials = list("$metal" = 1500, "$glass" = 500, "$plasma" = 200) + materials = list("$metal" = 1500, "$glass" = 500, "$plasma" = 400) reliability = 79 build_path = /obj/item/weapon/gun/energy/plasmacutter category = list("Mining Designs") @@ -164,7 +164,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) id = "plasmacutter_adv" req_tech = list("materials" = 4, "plasmatech" = 3, "engineering" = 3, "combat" = 3, "magnets" = 3) build_type = PROTOLATHE - materials = list("$metal" = 3000, "$glass" = 1000, "$plasma" = 1000, "$silver" = 500, "$gold" = 100) + materials = list("$metal" = 3000, "$glass" = 1000, "$plasma" = 2000, "$gold" = 500) reliability = 79 build_path = /obj/item/weapon/gun/energy/plasmacutter/adv category = list("Mining Designs") @@ -249,7 +249,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = /obj/item/clothing/glasses/hud/health - category = list("Equipement") + category = list("Equipment") /datum/design/health_hud_night name = "Night Vision Health Scanner HUD" @@ -259,7 +259,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$silver" = 250) build_path = /obj/item/clothing/glasses/hud/health/night - category = list("Equipement") + category = list("Equipment") /datum/design/security_hud name = "Security HUD" @@ -269,7 +269,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = /obj/item/clothing/glasses/hud/security - category = list("Equipement") + category = list("Equipment") /datum/design/security_hud_night name = "Night Vision Security HUD" @@ -279,7 +279,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$gold" = 350) build_path = /obj/item/clothing/glasses/hud/security/night - category = list("Equipement") + category = list("Equipment") ///////////////////////////////////////// //////////////////Test/////////////////// @@ -307,7 +307,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 4000, "$glass" = 1000) build_path = /obj/item/clothing/mask/gas/welding - category = list("Equipement") + category = list("Equipment") /datum/design/air_horn name = "Air Horn" @@ -317,7 +317,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 4000, "$bananium" = 1000) build_path = /obj/item/weapon/bikehorn/airhorn - category = list("Equipement") + category = list("Equipment") /datum/design/mesons name = "Optical Meson Scanners" @@ -327,7 +327,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 200, "$glass" = 300) build_path = /obj/item/clothing/glasses/meson - category = list("Equipement") + category = list("Equipment") /datum/design/engine_goggles name = "Engineering Scanner Goggles" @@ -337,7 +337,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 200, "$glass" = 300, "$plasma" = 100) build_path = /obj/item/clothing/glasses/meson/engine - category = list("Equipement") + category = list("Equipment") /datum/design/nvgmesons name = "Night Vision Optical Meson Scanners" @@ -347,7 +347,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 300, "$glass" = 400, "$plasma" = 250, "$uranium" = 1000) build_path = /obj/item/clothing/glasses/meson/night - category = list("Equipement") + category = list("Equipment") /datum/design/night_vision_goggles name = "Night Vision Goggles" @@ -357,7 +357,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 100, "$glass" = 100, "$uranium" = 1000) build_path = /obj/item/clothing/glasses/night - category = list("Equipement") + category = list("Equipment") /datum/design/magboots name = "Magnetic Boots" @@ -367,7 +367,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 4500, "$silver" = 1500, "$gold" = 2500) build_path = /obj/item/clothing/shoes/magboots - category = list("Equipement") + category = list("Equipment") ///////////////////////////////////////// ////////////Janitor Designs////////////// @@ -381,7 +381,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 3000, "$glass" = 200) build_path = /obj/item/janiupgrade - category = list("Equipement") + category = list("Equipment") /datum/design/holosign name = "Holographic Sign Projector" @@ -391,4 +391,4 @@ datum/design/proc/CalcReliability(var/list/temp_techs) build_type = PROTOLATHE materials = list("$metal" = 2000, "$glass" = 1000) build_path = /obj/item/weapon/holosign_creator - category = list("Equipement") + category = list("Equipment") diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 72e30978b11..b8e4560a26a 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -106,6 +106,14 @@ build_path = /obj/item/weapon/stock_parts/console_screen category = list("initial", "Electronics") +/datum/design/apc_board + name = "APC Power Control Module" + id = "power control" + build_type = AUTOLATHE + materials = list("$metal" = 100, "$glass" = 100) + build_path = /obj/item/weapon/module/power_control + category = list("initial", "Electronics") + /datum/design/airlock_board name = "Airlock electronics" id = "airlock_board" diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 73eab21ea2e..26e29741279 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -487,7 +487,7 @@ //Exosuit Equipment /datum/design/mech_hydraulic_clamp - name = "Exosuit Engineering Equipement (Hydraulic Clamp)" + name = "Exosuit Engineering Equipment (Hydraulic Clamp)" id = "mech_hydraulic_clamp" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp @@ -496,7 +496,7 @@ category = list("Exosuit Equipment") /datum/design/mech_drill - name = "Exosuit Engineering Equipement (Drill)" + name = "Exosuit Engineering Equipment (Drill)" id = "mech_drill" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill @@ -504,8 +504,17 @@ construction_time = 100 category = list("Exosuit Equipment") +/datum/design/mech_mining_scanner + name = "Exosuit Engineering Equipement (Mining Scanner)" + id = "mech_mscanner" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/tool/mining_scanner + materials = list("$metal"=5000,"$glass"=2500) + construction_time = 50 + category = list("Exosuit Equipment") + /datum/design/mech_extinguisher - name = "Exosuit Engineering Equipement (Extinguisher)" + name = "Exosuit Engineering Equipment (Extinguisher)" id = "mech_extinguisher" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/tool/extinguisher @@ -514,7 +523,7 @@ category = list("Exosuit Equipment") /datum/design/mech_cable_layer - name = "Exosuit Engineering Equipement (Cable Layer)" + name = "Exosuit Engineering Equipment (Cable Layer)" id = "mech_cable_layer" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer @@ -523,7 +532,7 @@ category = list("Exosuit Equipment") /datum/design/mech_sleeper - name = "Exosuit Medical Equipement (Mounted Sleeper)" + name = "Exosuit Medical Equipment (Mounted Sleeper)" id = "mech_sleeper" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/tool/sleeper @@ -532,7 +541,7 @@ category = list("Exosuit Equipment") /datum/design/mech_syringe_gun - name = "Exosuit Medical Equipement (Syringe Gun)" + name = "Exosuit Medical Equipment (Syringe Gun)" id = "mech_syringe_gun" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun @@ -541,7 +550,7 @@ category = list("Exosuit Equipment") /datum/design/mech_generator - name = "Exosuit Equipement (Plasma Generator)" + name = "Exosuit Equipment (Plasma Generator)" id = "mech_generator" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/generator diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index ff9be3891c2..14f20655f4b 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -158,7 +158,7 @@ datum/design/bluespacebodybag build_path = /obj/item/cybernetic_implant/brain/anti_stun category = list("Medical Designs") -/datum/design/cyberimp_nutriment +/*/datum/design/cyberimp_nutriment name = "Nutriment pump implant" desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving." id = "ci-nutriment" @@ -174,13 +174,4 @@ datum/design/bluespacebodybag req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6) build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$gold" = 500, "$uranium" = 750) - category = list("Medical Designs") - -/datum/design/cyberimp_reviver - name = "Reviver implant" - desc = "This implant will automatically deliver a therapeutic dose of electrical energy to your heart if it ever stops beating, and inject you with nanites. A second chance!" - id = "ci-reviver" - req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6) - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 500, "$gold" = 1000, "$uranium" = 1000, "$diamond" = 2000) - category = list("Medical Designs") \ No newline at end of file + category = list("Medical Designs")*/ \ No newline at end of file diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index bcf7bd9a33f..be722fe8fb0 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -156,7 +156,7 @@ loaded_item = O user.drop_item() O.loc = src - user << "You add the [O.name] to the machine!" + user << "You add the [O.name] to the machine." flick("h_lathe_load", src) return @@ -254,21 +254,21 @@ var/criticalReaction = locate(exp_on) in critical_items ? TRUE : FALSE //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_POKE) - visible_message("[src] prods at [exp_on] with mechanical arms.") + visible_message("[src] prods at [exp_on] with mechanical arms.") if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message("[exp_on] is gripped in just the right way, enhancing it's focus.") + visible_message("[exp_on] is gripped in just the right way, enhancing its focus.") badThingCoeff++ if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - visible_message("[src] malfunctions and destroys [exp_on], lashing it's arms out at nearby people!.") + visible_message("[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!") for(var/mob/living/m in oview(1, src)) m.apply_damage(15,"brute",pick("head","chest","groin")) investigate_log("Experimentor dealt minor brute to [m].", "experimentor") ejectItem(TRUE) if(prob(EFFECT_PROB_LOW-badThingCoeff)) - visible_message("[src] malfunctions!.") + visible_message("[src] malfunctions!") exp = SCANTYPE_OBLITERATE if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) - visible_message("[src] malfunctions, throwing the [exp_on]!.") + visible_message("[src] malfunctions, throwing the [exp_on]!") var/mob/living/target = locate(/mob/living) in oview(7,src) if(target) var/obj/item/throwing = loaded_item @@ -278,21 +278,21 @@ throwing.throw_at(target, 10, 1) //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_IRRADIATE) - visible_message("[src] reflects radioactive rays at [exp_on]!") + visible_message("[src] reflects radioactive rays at [exp_on]!") if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message("[exp_on] has activated an unknown subroutine!") + visible_message("[exp_on] has activated an unknown subroutine!") cloneMode = TRUE cloneCount = badThingCoeff investigate_log("Experimentor has made a clone of [exp_on]", "experimentor") ejectItem() if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - visible_message("[src] malfunctions, melting [exp_on] and leaking radiation!.") + visible_message("[src] malfunctions, melting [exp_on] and leaking radiation!") for(var/mob/living/m in oview(1, src)) - m.apply_effect(25,IRRADIATE) + m.irradiate(25) investigate_log("Experimentor has irradiated [m]", "experimentor") //One entry per person so we know what was irradiated. ejectItem(TRUE) if(prob(EFFECT_PROB_LOW-badThingCoeff)) - visible_message("[src] malfunctions, spewing toxic waste!.") + visible_message("[src] malfunctions, spewing toxic waste!") for(var/turf/T in oview(1, src)) if(!T.density) if(prob(EFFECT_PROB_VERYHIGH)) @@ -303,7 +303,7 @@ ejectItem(TRUE) var/newPath = pickWeighted(valid_items) loaded_item = new newPath(src) - visible_message("[src] malfunctions, transforming [savedName] into [loaded_item]!.") + visible_message("[src] malfunctions, transforming [savedName] into [loaded_item]!") investigate_log("Experimentor has transformed [savedName] into [loaded_item]", "experimentor") if(istype(loaded_item,/obj/item/weapon/grenade/chem_grenade)) var/obj/item/weapon/grenade/chem_grenade/CG = loaded_item @@ -311,12 +311,12 @@ ejectItem() //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_GAS) - visible_message("[src] fills it's chamber with gas, [exp_on] included.") + visible_message("[src] fills its chamber with gas, [exp_on] included.") if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message("[exp_on] achieves the perfect mix!") + visible_message("[exp_on] achieves the perfect mix!") new /obj/item/stack/sheet/mineral/plasma(get_turf(pick(oview(1,src)))) if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - visible_message("[src] destroys [exp_on], leaking dangerous gas!.") + visible_message("[src] destroys [exp_on], leaking dangerous gas!") chosenchem = pick("carbon","radium","toxin","condensedcapsaicin","mushroomhallucinogen","space_drugs","ethanol","beepskysmash") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src @@ -343,18 +343,18 @@ warn_admins(usr, "[chosenchem] smoke") investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor") if(prob(EFFECT_PROB_LOW-badThingCoeff)) - visible_message("[src] malfunctions, spewing harmless gas!.") + visible_message("[src] malfunctions, spewing harmless gas.>") throwSmoke(src.loc) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) - visible_message("[src] melts [exp_on], ionizing the air around it!.") + visible_message("[src] melts [exp_on], ionizing the air around it!") empulse(src.loc, 4, 6) investigate_log("Experimentor has generated an Electromagnetic Pulse.", "experimentor") ejectItem(TRUE) //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_HEAT) - visible_message("[src] raises [exp_on]'s temperature.") + visible_message("[src] raises [exp_on]'s temperature.") if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message("[src]'s emergency coolant system gives off a small ding!") + visible_message("[src]'s emergency coolant system gives off a small ding!") playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) var/obj/item/weapon/reagent_containers/food/drinks/coffee/C = new /obj/item/weapon/reagent_containers/food/drinks/coffee(get_turf(pick(oview(1,src)))) chosenchem = pick("plasma","capsaicin","ethanol") @@ -377,12 +377,12 @@ FB.xo = MT.x - start.x FB.fire() if(prob(EFFECT_PROB_LOW-badThingCoeff)) - visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!.") + visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!") explosion(src.loc, -1, 0, 0, 0, 0, flame_range = 2) investigate_log("Experimentor started a fire.", "experimentor") ejectItem(TRUE) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) - visible_message("[src] malfunctions, melting [exp_on] and leaking hot air!.") + visible_message("[src] malfunctions, melting [exp_on] and leaking hot air!") var/datum/gas_mixture/env = src.loc.return_air() var/transfer_moles = 0.25 * env.total_moles() var/datum/gas_mixture/removed = env.remove(transfer_moles) @@ -396,7 +396,7 @@ investigate_log("Experimentor has released hot air.", "experimentor") ejectItem(TRUE) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) - visible_message("[src] malfunctions, activating it's emergency coolant systems!.") + visible_message("[src] malfunctions, activating its emergency coolant systems!") throwSmoke(src.loc) for(var/mob/living/m in oview(1, src)) m.apply_damage(5,"burn",pick("head","chest","groin")) @@ -404,9 +404,9 @@ ejectItem() //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_COLD) - visible_message("[src] lowers [exp_on]'s temperature.") + visible_message("[src] lowers [exp_on]'s temperature.") if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message("[src]'s emergency coolant system gives off a small ding!") + visible_message("[src]'s emergency coolant system gives off a small ding!") var/obj/machinery/vending/coffee/C = new /obj/machinery/vending/coffee(get_turf(pick(oview(1,src)))) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //Ding! Your death coffee is ready! chosenchem = pick("uranium","frostoil","ephedrine") @@ -416,7 +416,7 @@ C.desc = "It has a large hazard symbol printed on the side in fading ink." investigate_log("Experimentor has made a cup of [chosenchem] coffee.", "experimentor") if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - visible_message("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!") + visible_message("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src R.add_reagent("frostoil" , 50) @@ -428,7 +428,7 @@ qdel(R) ejectItem(TRUE) if(prob(EFFECT_PROB_LOW-badThingCoeff)) - visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!.") + visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!") var/datum/gas_mixture/env = src.loc.return_air() var/transfer_moles = 0.25 * env.total_moles() var/datum/gas_mixture/removed = env.remove(transfer_moles) @@ -442,22 +442,22 @@ investigate_log("Experimentor has released cold air.", "experimentor") ejectItem(TRUE) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) - visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!.") + visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!") var/datum/effect/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() ejectItem() //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_OBLITERATE) - visible_message("[exp_on] activates the crushing mechanism, [exp_on] is destroyed!") + visible_message("[exp_on] activates the crushing mechanism, [exp_on] is destroyed!") if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message("[src]'s crushing mechanism slowly and smoothly descends, flattening the [exp_on]!") + visible_message("[src]'s crushing mechanism slowly and smoothly descends, flattening the [exp_on]!") new /obj/item/stack/sheet/plasteel(get_turf(pick(oview(1,src)))) if(linked_console.linked_lathe) linked_console.linked_lathe.m_amount += min((linked_console.linked_lathe.max_material_storage - linked_console.linked_lathe.TotalMaterials()), (exp_on.m_amt)) linked_console.linked_lathe.g_amount += min((linked_console.linked_lathe.max_material_storage - linked_console.linked_lathe.TotalMaterials()), (exp_on.g_amt)) if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - visible_message("[src]'s crusher goes way too many levels too high, crushing right through space-time!") + visible_message("[src]'s crusher goes way too many levels too high, crushing right through space-time!") playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3) investigate_log("Experimentor has triggered the 'throw things' reaction.", "experimentor") var/list/throwAt = list() @@ -469,7 +469,7 @@ var/cast = throwAt[counter] cast:throw_at(src,10,1) if(prob(EFFECT_PROB_LOW-badThingCoeff)) - visible_message("[src]'s crusher goes one level too high, crushing right into space-time!.") + visible_message("[src]'s crusher goes one level too high, crushing right into space-time!") playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3) investigate_log("Experimentor has triggered the 'minor throw things' reaction.", "experimentor") var/list/oViewStuff = oview(7,src) @@ -486,10 +486,10 @@ if(exp == FAIL) var/a = pick("rumbles","shakes","vibrates","shudders") var/b = pick("crushes","spins","viscerates","smashes","insults") - visible_message("[exp_on] [a], and [b], the experiment was a failiure!") + visible_message("[exp_on] [a], and [b], the experiment was a failure.") if(exp == SCANTYPE_DISCOVER) - visible_message("[src] scans the [exp_on], revealing it's true nature!.") + visible_message("[src] scans the [exp_on], revealing its true nature!") playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 3, -1) var/obj/item/weapon/relic/R = loaded_item R.reveal() @@ -500,11 +500,11 @@ if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) var/globalMalf = rand(1,100) if(globalMalf < 15) - visible_message("[src]'s onboard detection system has malfunctioned!.") + visible_message("[src]'s onboard detection system has malfunctioned!") item_reactions["[exp_on.type]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE) ejectItem() if(globalMalf > 16 && globalMalf < 35) - visible_message("[src] melts [exp_on], ian-izing the air around it!.") + visible_message("[src] melts [exp_on], ian-izing the air around it!") throwSmoke(src.loc) if(trackedIan) throwSmoke(trackedIan.loc) @@ -515,7 +515,7 @@ investigate_log("Experimentor has spawned a new corgi.", "experimentor") ejectItem(TRUE) if(globalMalf > 36 && globalMalf < 50) - visible_message("[src] improves [exp_on], drawing the life essence of those nearby!") + visible_message("[src] improves [exp_on], drawing the life essence of those nearby!") for(var/mob/living/m in view(4,src)) m << "You feel your flesh being torn from you, mists of blood drifting to [src]!" m.apply_damage(50,"brute","chest") @@ -526,7 +526,7 @@ exp_on.origin_tech = list2params(reqs) investigate_log("Experimentor has set the origin tech of [exp_on] to [exp_on.origin_tech]", "experimentor") if(globalMalf > 51 && globalMalf < 75) - visible_message("[src] encounters a run-time error!") + visible_message("[src] encounters a run-time error!") throwSmoke(src.loc) if(trackedRuntime) throwSmoke(trackedRuntime.loc) @@ -537,7 +537,7 @@ investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", "experimentor") ejectItem(TRUE) if(globalMalf > 76) - visible_message("[src] begins to smoke and hiss, shaking violently!") + visible_message("[src] begins to smoke and hiss, shaking violently!") use_power(500000) investigate_log("Experimentor has drained power from its APC", "experimentor") @@ -567,7 +567,7 @@ src.updateUsrDialog() else if(recentlyExperimented) - usr << "[src] has been used too recently!" + usr << "[src] has been used too recently!" return var/dotype if(text2num(scantype) == SCANTYPE_DISCOVER) @@ -638,7 +638,7 @@ /obj/item/weapon/relic/attack_self(mob/user as mob) if(revealed) if(cooldown) - user << "[src] does not react." + user << "[src] does not react!" return else if(src.loc == user) cooldown = TRUE @@ -690,7 +690,7 @@ qdel(src) /obj/item/weapon/relic/proc/rapidDupe(var/mob/user) - audible_message("[src] emits a loud pop!") + audible_message("[src] emits a loud pop!") var/list/dupes = list() var/counter var/max = rand(5,10) @@ -737,4 +737,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") + investigate_log(log_msg, "experimentor") diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index ed202ccb9f5..9322e7c9286 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -30,7 +30,7 @@ Note: Must be placed west/left of and R&D console to function. "Medical Designs", "Bluespace Designs", "Stock Parts", - "Equipement", + "Equipment", "Mining Designs", "Electronics", "Weapons", @@ -140,7 +140,7 @@ Note: Must be placed west/left of and R&D console to function. default_deconstruction_crowbar(O) return 1 else - user << "You can't load the [src.name] while it's opened." + user << "You can't load the [src.name] while it's opened!" return 1 if (disabled) return @@ -148,7 +148,7 @@ Note: Must be placed west/left of and R&D console to function. user << " The [src.name] must be linked to an R&D console first!" return 1 if (busy) - user << "The [src.name] is busy. Please wait for completion of previous operation." + user << "The [src.name] is busy! Please wait for completion of previous operation." return 1 if (O.is_open_container()) return @@ -160,7 +160,7 @@ Note: Must be placed west/left of and R&D console to function. if(istype(O,/obj/item/stack/sheet)) var/obj/item/stack/sheet/S = O if (TotalMaterials() + S.perunit > max_material_storage) - user << "The [src.name]'s material bin is full. Please remove material before adding more." + user << "The [src.name]'s material bin is full! Please remove material before adding more." return 1 var/obj/item/stack/sheet/stack = O diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index ee922a055a6..e4ed832817e 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -73,10 +73,10 @@ if(href_list["pulse"]) var/temp_wire = href_list["wire"] if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" + usr << "You need a multitool!" else if(src.wires[temp_wire]) - usr << "You can't pulse a cut wire." + usr << "You can't pulse a cut wire!" else if(src.hack_wire == href_list["wire"]) src.hacked = !src.hacked @@ -91,7 +91,7 @@ spawn(100) src.shocked = !src.shocked if(href_list["cut"]) if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) - usr << "You need wirecutters!" + usr << "You need wirecutters!" else var/temp_wire = href_list["wire"] wires[temp_wire] = !wires[temp_wire] diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 12b76321f27..f054bbb6867 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -23,7 +23,7 @@ if(Uses == 0) user << " You can't enhance a used extract!" return ..() - user <<"You apply the enhancer. It now has triple the amount of uses." + user <<"You apply the enhancer. It now has triple the amount of uses." Uses = 3 enhanced = 1 qdel(O) @@ -204,8 +204,8 @@ M.languages |= HUMAN M.faction -= "neutral" M << "All at once it makes sense, you know what you are and who you are! Self awareness is yours!" - M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." - user << "[M] is suddenly attentive and aware. It worked!" + M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." + user << "[M] is suddenly attentive and aware. It worked!" qdel(src) else user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later..." @@ -232,7 +232,7 @@ user <<" The slime already has the maximum amount of extract!" return..() - user <<"You feed the slime the steroid. It now has triple the amount of extract." + user <<"You feed the slime the steroid. It now has triple the amount of extract." M.cores = 3 qdel(src) @@ -350,7 +350,7 @@ ghost = O break if(!ghost) - user << "The rune fizzles uselessly. There is no spirit nearby." + user << "The rune fizzles uselessly! There is no spirit nearby." return var/mob/living/carbon/human/G = new /mob/living/carbon/human if(prob(50)) G.gender = "female" diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 3d75e5a227a..2a1909a15dd 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -25,7 +25,7 @@ return /obj/machinery/keycard_auth/attack_paw(mob/user as mob) - user << "You are too primitive to use this device." + user << "You are too primitive to use this device!" return /obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params) @@ -53,10 +53,10 @@ /obj/machinery/keycard_auth/attack_hand(mob/user as mob) if(user.stat || stat & (NOPOWER|BROKEN)) - user << "This device is not powered." + user << "This device is not powered!" return if(busy) - user << "This device is busy." + user << "This device is busy!" return user.set_machine(src) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 846f7e28c14..204b94477e7 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -321,6 +321,8 @@ for(var/obj/O in T0) if(O.invisibility >= 101) continue + if(O == T0.lighting_object) + continue O.loc = T1 //close open doors @@ -350,13 +352,13 @@ //air system updates for(var/turf/T1 in L1) - T1.shift_to_subarea() + T1.redraw_lighting() SSair.remove_from_active(T1) T1.CalculateAdjacentTurfs() SSair.add_to_active(T1,1) for(var/turf/T0 in L0) - T0.shift_to_subarea() + T0.redraw_lighting() SSair.remove_from_active(T0) T0.CalculateAdjacentTurfs() SSair.add_to_active(T0,1) diff --git a/code/modules/surgery/appendectomy.dm b/code/modules/surgery/appendectomy.dm index 7ba9ad03ba0..0ba1db2da7c 100644 --- a/code/modules/surgery/appendectomy.dm +++ b/code/modules/surgery/appendectomy.dm @@ -15,17 +15,17 @@ /datum/surgery_step/extract_appendix/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) A = locate() in target.internal_organs if(A) - user.visible_message("[user] begins to extract [target]'s appendix.") + user.visible_message("[user] begins to extract [target]'s appendix.", "You begin to extract [target]'s appendix...") else - user.visible_message("[user] looks for an appendix in [target].") + user.visible_message("[user] looks for an appendix in [target].", "You look for an appendix in [target]...") /datum/surgery_step/extract_appendix/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(A) - user.visible_message("[user] successfully removes [target]'s appendix!") + user.visible_message("[user] successfully removes [target]'s appendix!", "You successfully removes [target]'s appendix.") A.loc = get_turf(target) target.internal_organs -= A for(var/datum/disease/appendicitis in target.viruses) appendicitis.cure() else - user.visible_message("[user] can't find an appendix in [target]!") + user << "You can't find an appendix in [target]!" return 1 \ No newline at end of file diff --git a/code/modules/surgery/brain_removal.dm b/code/modules/surgery/brain_removal.dm index 41c3b4ee68c..0d57fb6f9a2 100644 --- a/code/modules/surgery/brain_removal.dm +++ b/code/modules/surgery/brain_removal.dm @@ -14,13 +14,13 @@ /datum/surgery_step/extract_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) B = target.getorgan(/obj/item/organ/brain) if(B) - user.visible_message("[user] begins to extract [target]'s brain.") + user.visible_message("[user] begins to extract [target]'s brain.", "You begin to extract [target]'s brain...") else - user.visible_message("[user] looks for a brain in [target].") + user.visible_message("[user] looks for a brain in [target].", "You look for a brain in [target]...") /datum/surgery_step/extract_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(B) - user.visible_message("[user] successfully removes [target]'s brain!") + user.visible_message("[user] successfully removes [target]'s brain!", "You successfully remove [target]'s brain.") B.loc = get_turf(target) B.transfer_identity(target) target.internal_organs -= B @@ -30,7 +30,7 @@ H.apply_damage(25,"brute","head") add_logs(user, target, "debrained", addition="INTENT: [uppertext(user.a_intent)]") else - user.visible_message("[user] can't find a brain in [target]!") + user << "You can't find a brain in [target]!" return 1 diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 289dadeec2d..4373e3c2a8b 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -19,27 +19,27 @@ IC = I break if(tool) - user.visible_message("[user] begins to insert [tool] into [target]'s [target_zone].") + user.visible_message("[user] begins to insert [tool] into [target]'s [target_zone].", "You begin to insert [tool] into [target]'s [target_zone]...") else - user.visible_message("[user] checks for items in [target]'s [target_zone].") + user.visible_message("[user] checks for items in [target]'s [target_zone].", "You check for items in [target]'s [target_zone]...") /datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(tool) if(IC || tool.w_class > 3 || NODROP in tool.flags || tool.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/organ)) - user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") + user << "You can't seem to fit [tool] in [target]'s [target_zone]!" return 0 else - user.visible_message("[user] stuffs [tool] into [target]'s [target_zone]!") + user.visible_message("[user] stuffs [tool] into [target]'s [target_zone]!", "You stuff [tool] into [target]'s [target_zone].") user.drop_item() target.internal_organs += tool tool.loc = target return 1 else if(IC) - user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!") + user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") user.put_in_hands(IC) target.internal_organs -= IC return 1 else - user.visible_message("[user] doesn't find anything in [target]'s [target_zone].") + user << "You don't find anything in [target]'s [target_zone]." return 0 \ No newline at end of file diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index 2f8dff6988f..6a38e160560 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -11,14 +11,13 @@ time = 16 /datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to extract a core from [target].") + user.visible_message("[user] begins to extract a core from [target].", "You begin to extract a core from [target]...") /datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/mob/living/simple_animal/slime/slime = target if(slime.cores > 0) slime.cores-- - user.visible_message("[user] successfully extracts a core from [target]!") - user << "[slime.cores] core\s remaining." + user.visible_message("[user] successfully extracts a core from [target]!", "You successfully extract a core from [target]. [slime.cores] core\s remaining.") new slime.coretype(slime.loc) @@ -28,5 +27,5 @@ else return 0 else - user.visible_message("There aren't any cores left in [target].") + user << "There aren't any cores left in [target]!" return 1 \ No newline at end of file diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm index 66792e9c61b..3f4dcb5210c 100644 --- a/code/modules/surgery/cybernetic_implants.dm +++ b/code/modules/surgery/cybernetic_implants.dm @@ -2,7 +2,7 @@ #define MAX_CHEST_IMPLANT 3 /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].") + user.visible_message("[user] begins to implant [target] with [implant].", "You begin to implant [target] with [implant]...") //[[[[EYES]]]] /datum/surgery/eye_cybernetic_implant/eyes @@ -63,18 +63,14 @@ if(full < MAX_CHEST_IMPLANT) full = 0 - if(istype(implant,/obj/item/cybernetic_implant/chest/heart)) - if(locate(/obj/item/cybernetic_implant/chest/heart) in target.internal_organs) - full = 1 - 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].") + user << "You 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]!") + user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!", "You insert [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone].") implant.owner = target implant.function() user.drop_item() diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 0fb7f2413cb..71e136efa72 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -11,10 +11,10 @@ time = 64 /datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to fix [target]'s eyes.") + user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...") /datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] successfully fixes [target]'s eyes!") + user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.") target.disabilities &= ~BLIND target.disabilities &= ~NEARSIGHT target.eye_blurry = 35 //this will fix itself slowly. @@ -23,8 +23,8 @@ /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorgan(/obj/item/organ/brain)) - user.visible_message("[user] accidentally stabs [target] right in the brain!") + user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!") target.adjustBrainLoss(100) else - user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.") + user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.") return 0 \ No newline at end of file diff --git a/code/modules/surgery/gender_reassignment.dm b/code/modules/surgery/gender_reassignment.dm index 0ef01d56d7c..4cc6be2d953 100644 --- a/code/modules/surgery/gender_reassignment.dm +++ b/code/modules/surgery/gender_reassignment.dm @@ -13,18 +13,18 @@ /datum/surgery_step/reshape_genitals/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.gender == FEMALE) - user.visible_message("[user] begins to reshape [target]'s genitals to look more masculine.") + user.visible_message("[user] begins to reshape [target]'s genitals to look more masculine.", "You begin to reshape [target]'s genitals to look more masculine...") else - user.visible_message("[user] begins to reshape [target]'s genitals to look more feminine.") + user.visible_message("[user] begins to reshape [target]'s genitals to look more feminine.", "You begin to reshape [target]'s genitals to look more feminine...") /datum/surgery_step/reshape_genitals/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/mob/living/carbon/human/H = target //no type check, as that should be handled by the surgery H.gender_ambiguous = 0 if(target.gender == FEMALE) - user.visible_message("[user] has made a man of [target]!") + user.visible_message("[user] has made a man of [target]!", "You made [target] a man.") target.gender = MALE else - user.visible_message("[user] has made a woman of [target]!") + user.visible_message("[user] has made a woman of [target]!", "You made [target] a woman.") target.gender = FEMALE target.regenerate_icons() return 1 @@ -32,7 +32,7 @@ /datum/surgery_step/reshape_genitals/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/mob/living/carbon/human/H = target H.gender_ambiguous = 1 - user.visible_message("[user] mutilates [target]'s genitals beyond the point of recognition!") + user.visible_message("[user] accidentally mutilates [target]'s genitals beyond the point of recognition!", "You accidentally mutilate [target]'s genitals beyond the point of recognition!") target.gender = pick(MALE, FEMALE) target.regenerate_icons() return 1 diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm index 7683c9444ff..b31ec1afe24 100644 --- a/code/modules/surgery/generic_steps.dm +++ b/code/modules/surgery/generic_steps.dm @@ -5,7 +5,7 @@ time = 24 /datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].") + user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].", "You begin to make an incision in [target]'s [parse_zone(target_zone)]...") @@ -15,7 +15,7 @@ time = 48 /datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].") + user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].", "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...") //retract skin @@ -24,7 +24,7 @@ time = 32 /datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].") + user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].", "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...") @@ -34,7 +34,7 @@ time = 32 /datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].") + user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].", "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...") /datum/surgery_step/close/tool_check(mob/user, obj/item/tool) @@ -62,7 +62,7 @@ time = 64 /datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].") + user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].", "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...") diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 8d23d98378d..a25e97df091 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -8,6 +8,12 @@ if(locate(S.type) in M.surgeries) continue + if(S.user_species_restricted) + if(!istype(user, /mob/living/carbon/human)) + continue + var/mob/living/carbon/human/doc = user + if(!(doc.dna.species.id in S.user_species_ids)) + continue if(S.target_must_be_dead && M.stat != DEAD) continue if(S.target_must_be_fat && !(M.disabilities & FAT)) @@ -35,16 +41,16 @@ var/datum/surgery/S = available_surgeries[P] var/datum/surgery/procedure = new S.type if(procedure) - if(get_location_accessible(M, procedure.location)) + if(get_location_accessible(M, procedure.location) || procedure.ignore_clothes) if(procedure.location == "anywhere") // if location == "anywhere" change location to the surgeon's target, otherwise leave location as is. procedure.location = user.zone_sel.selecting M.surgeries += procedure - user.visible_message("[user] drapes [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].") + user.visible_message("[user] drapes [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].", "You drape [I] over [M]'s [parse_zone(procedure.location)] to prepare for \an [procedure.name].") add_logs(user, M, "operated", addition="Operation type: [procedure.name]") return 1 else - user << "You need to expose [M]'s [procedure.location] first." + user << "You need to expose [M]'s [procedure.location] first!" return 1 //return 1 so we don't slap the guy in the dick with the drapes. else return 1 //once the input menu comes up, cancelling it shouldn't hit the guy with the drapes either. @@ -70,13 +76,13 @@ proc/get_location_modifier(mob/M) var/eyesmouth_covered = 0 //based on flags if(iscarbon(M)) var/mob/living/carbon/C = M - for(var/obj/item/clothing/I in list(C.back, C.wear_mask)) + for(var/obj/item/clothing/I in list(C.back, C.wear_mask, C.head)) covered_locations |= I.body_parts_covered face_covered |= I.flags_inv eyesmouth_covered |= I.flags if(ishuman(C)) var/mob/living/carbon/human/H = C - for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.ears)) + for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears)) covered_locations |= I.body_parts_covered face_covered |= I.flags_inv eyesmouth_covered |= I.flags @@ -89,7 +95,7 @@ proc/get_location_modifier(mob/M) if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES) return 0 if("mouth") - if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH) + if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH || eyesmouth_covered & HEADCOVERSMOUTH) return 0 if("chest") if(covered_locations & CHEST) diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 97277220159..8e21fae2ff2 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -19,19 +19,19 @@ I = W break if(I) - user.visible_message("[user] begins to extract [I] from [target]'s [target_zone].") + user.visible_message("[user] begins to extract [I] from [target]'s [target_zone].", "You begin to extract [I] from [target]'s [target_zone]...") else - user.visible_message("[user] looks for an implant in [target]'s [target_zone].") + user.visible_message("[user] looks for an implant in [target]'s [target_zone].", "You look for an implant in [target]'s [target_zone]...") /datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(I) - user.visible_message("[user] successfully removes [I] from [target]'s [target_zone]!") + user.visible_message("[user] successfully removes [I] from [target]'s [target_zone]!", "You successfully remove [I] from [target]'s [target_zone].") if(istype(I, /obj/item/weapon/implant/loyalty)) - target << "You feel a sense of liberation as Nanotrasen's grip on your mind fades away." + target << "You feel a sense of liberation as Nanotrasen's grip on your mind fades away." qdel(I) if(istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target H.sec_hud_set_implants() else - user.visible_message("[user] can't find anything in [target]'s [target_zone].") + user << "You can't find anything in [target]'s [target_zone]!" return 1 diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb augmentation.dm index f9a26f9f49a..b520fb5a4e8 100644 --- a/code/modules/surgery/limb augmentation.dm +++ b/code/modules/surgery/limb augmentation.dm @@ -10,7 +10,7 @@ /datum/surgery_step/replace/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_sel.selecting)]!") + user.visible_message("[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_sel.selecting)].", "You begin to sever the muscles on [target]'s [parse_zone(user.zone_sel.selecting)]...") /datum/surgery_step/add_limb @@ -24,9 +24,9 @@ /datum/surgery_step/add_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) L = new_organ if(L) - user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_sel.selecting)].") + user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_sel.selecting)].", "You begin to augment [target]'s [parse_zone(user.zone_sel.selecting)]...") else - user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].") + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for [target]'s [parse_zone(user.zone_sel.selecting)]...") @@ -46,7 +46,7 @@ if(L) if(ishuman(target)) var/mob/living/carbon/human/H = target - user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!") + user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "You successfully augment [target]'s [parse_zone(target_zone)].") L.loc = get_turf(target) H.organs -= L switch(target_zone) @@ -72,5 +72,5 @@ H.update_augments() //Gives them the Cyber limb overlay add_logs(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]") else - user.visible_message("[user] [target] has no organic [parse_zone(target_zone)] there!") + user << "[target] has no organic [parse_zone(target_zone)] there!" return 1 diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index ae8b5147e91..88f2cd2f4d1 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -13,10 +13,10 @@ time = 64 /datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to cut away [target]'s excess fat!") + user.visible_message("[user] begins to cut away [target]'s excess fat.", "You begin to cut away [target]'s excess fat...") /datum/surgery_step/cut_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] cuts [target]'s excess fat loose!") + user.visible_message("[user] cuts [target]'s excess fat loose!", "You cut [target]'s excess fat loose.") return 1 //remove fat @@ -25,15 +25,15 @@ time = 32 /datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to extract [target]'s loose fat!") + user.visible_message("[user] begins to extract [target]'s loose fat!", "You begin to extract [target]'s loose fat...") /datum/surgery_step/remove_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] extracts [target]'s fat!") + user.visible_message("[user] extracts [target]'s fat!", "You extract [target]'s fat.") target.overeatduration = 0 //patient is unfatted var/removednutriment = target.nutrition target.nutrition = NUTRITION_LEVEL_WELL_FED removednutriment -= 450 //whatever was removed goes into the meat - var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new + var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/newmeat = new newmeat.name = "fatty meat" newmeat.desc = "Extremely fatty tissue taken from a patient." newmeat.reagents.add_reagent ("nutriment", (removednutriment / 15)) //To balance with nutriment_factor of nutriment diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 7a37f071333..5a6d84c3019 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -308,66 +308,3 @@ return owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning owner << "You feel like your insides are burning." - -/obj/item/cybernetic_implant/chest/heart/reviver - name = "Reviver implant" - desc = "This implant will automatically deliver a therapeutic dose of electrical energy to your heart if it ever stops beating, and inject nanites into your bloodstream. A second chance!" - icon_state = "chest_implant" - implant_color = "#AD0000" - var/defibrillating = 0 - var/recharge_time = 0 - origin_tech = "materials=7;programming=3;biotech=4" - -/obj/item/cybernetic_implant/chest/heart/reviver/function() - if(istype(owner,/mob/living/carbon/human)) - recharge_time = world.time + 2000 - SSobj.processing |= src - -/obj/item/cybernetic_implant/chest/heart/reviver/process() - if(defibrillating) - return - if(!owner) - SSobj.processing.Remove(src) - qdel(src) - return - if(world.time < recharge_time) - return - if(owner.stat != DEAD) - return - - defibrillating = 1 - spawn(600) - if(owner.stat == DEAD) - owner.visible_message("[owner]'s body convulses by itself.") - playsound(owner, "bodyfall", 50, 1) - playsound(owner, 'sound/machines/defib_zap.ogg', 50, 1, -1) - dead_mob_list -= owner - living_mob_list |= list(owner) - owner.stat = UNCONSCIOUS - owner.reagents.add_reagent("nanites",10) - var/mob/living/carbon/human/H = owner - var/amount = BLOOD_VOLUME_OKAY - H.vessel.total_volume - H.vessel.add_reagent("blood", amount) - H.vessel.update_total() - owner.heart_attack = 0 - owner.emote("gasp") - add_logs(owner, owner, "revived", object="defibrillator implant") - recharge_time = world.time + 20000 - defibrillating = 0 - -/obj/item/cybernetic_implant/chest/heart/reviver/emp_act(severity) - if(!owner) - return - if(recharge_time < world.time) - recharge_time = world.time + (2000 / severity) - else - recharge_time += 2000 / severity - - if(prob(60/severity)) - playsound(owner, 'sound/machines/defib_saftyOff.ogg', 50, 1, -1) - spawn(30) - playsound(owner, 'sound/machines/defib_zap.ogg', 50, 1, -1) - owner.heart_attack = 1 - if(owner.stat == CONSCIOUS) - owner.Weaken(5) - owner.visible_message("[owner] clutches at their chest as if their heart stopped!") \ No newline at end of file diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index aa744928a95..e0a4dc96c76 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -10,15 +10,15 @@ time = 64 /datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to alter [target]'s appearance.") + user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...") /datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.status_flags & DISFIGURED) target.status_flags &= ~DISFIGURED - user.visible_message("[user] successfully restores [target]'s appearance!") + user.visible_message("[user] successfully restores [target]'s appearance!", "You successfully restore [target]'s appearance.") else var/oldname = target.real_name target.real_name = random_name(target.gender) var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name - user.visible_message("[user] alters [oldname]'s appearance completely, they are now [newname]!") + user.visible_message("[user] alters [oldname]'s appearance completely, they are now [newname]!", "You alter [oldname]'s appearance completely, they are now [newname].") return 1 \ No newline at end of file diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 749faa22698..33968dd8968 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -18,9 +18,9 @@ /datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) L = new_organ if(L) - user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)].") + user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)]...") else - user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].") + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for [target]'s [parse_zone(user.zone_sel.selecting)]...") /datum/surgery_step/remove_object/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -34,11 +34,11 @@ L.embedded_objects -= I if(objects > 0) - user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.getDisplayName()]!") + user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.getDisplayName()]!", "You sucessfully remove [objects] objects from [H]'s [L.getDisplayName()].") else - user.visible_message("[user] finds no objects embedded in [H]'s [L.getDisplayName()].") + user << "You find no objects embedded in [H]'s [L.getDisplayName()]!" else - user.visible_message("[user] can't find [target]'s [parse_zone(user.zone_sel.selecting)], let alone any objects embedded in it!") + user << "You can't find [target]'s [parse_zone(user.zone_sel.selecting)], let alone any objects embedded in it!" return 1 \ No newline at end of file diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 0ade9193386..fff1661c6bd 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -9,7 +9,9 @@ var/target_must_be_fat = 0 //Needs to be fat var/requires_organic_chest = 0 //Prevents you from performing an operation on Robotic chests*** var/has_multi_loc = 0 //Multiple locations - RR - + var/user_species_restricted = 0 //Surgery only performable BY species + var/list/user_species_ids + var/ignore_clothes = 0 //This surgery ignores clothes /datum/surgery/proc/next_step(mob/user, mob/living/carbon/target) if(step_in_progress) return diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 19d5eca182c..f139e46f55d 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -29,7 +29,7 @@ initiate(user, target, target_zone, tool, surgery) return 1 else - user << "You need to expose [target]'s [parse_zone(target_zone)] to perform surgery on it!" + user << "You need to expose [target]'s [parse_zone(target_zone)] to perform surgery on it!" return 1 //returns 1 so we don't stab the guy in the dick or wherever. if(isrobot(user) && user.a_intent != "harm") //to save asimov borgs a LOT of heartache return 1 @@ -68,22 +68,22 @@ /datum/surgery_step/proc/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to perform surgery on [target].") + user.visible_message("[user] begins to perform surgery on [target].", "You begin to perform surgery on [target]...") /datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] succeeds!") + user.visible_message("[user] succeeds!", "You succeed.") return 1 /datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(ishuman(target)) var/mob/living/carbon/human/H = target H.apply_damage(75,"brute","[target_zone]") - user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!") + user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "You saw [target]'s [parse_zone(target_zone)] open.") return 1 /datum/surgery_step/proc/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] screws up!") + user.visible_message("[user] screws up!", "You screw up!") return 0 /datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/xenomorph_removal.dm b/code/modules/surgery/xenomorph_removal.dm index 98b81efcf5e..15f83e82622 100644 --- a/code/modules/surgery/xenomorph_removal.dm +++ b/code/modules/surgery/xenomorph_removal.dm @@ -13,13 +13,13 @@ time = 64 /datum/surgery_step/xenomorph_removal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to search in [target]'s chest for a xenomorph.") + user.visible_message("[user] begins to search in [target]'s chest for a xenomorph embryo.", "You begin to search in [target]'s chest for a xenomorph embryo...") /datum/surgery_step/xenomorph_removal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(remove_xeno(user, target)) - user.visible_message("[user] successfully extracts the xenomorph from [target]!") + user.visible_message("[user] successfully extracts the xenomorph embryo from [target]!", "You successfully extract the xenomorph embryo from [target].") else - user.visible_message("[user] can't find anything in [target]'s chest!") + user.visible_message("[user] can't seem to find anything in [target]'s chest!", "You can't find anything in [target]'s chest!") return 1 /datum/surgery_step/xenomorph_removal/proc/remove_xeno(mob/user, mob/living/carbon/target) @@ -42,8 +42,8 @@ if(A) if(prob(50)) A.AttemptGrow(0) - user.visible_message("[user] accidentally pokes the xenomorph in [target]!") + user.visible_message("[user] accidentally pokes the xenomorph in [target]!", "You accidentally poke the xenomorph in [target]!") else target.adjustOxyLoss(30) - user.visible_message("[user] accidentally pokes [target] in the lungs!") + user.visible_message("[user] accidentally pokes [target] in the lungs!", "You accidentally poke [target] in the lungs!") return 0 \ No newline at end of file diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 7c64352ca8f..c006939d876 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -17,7 +17,7 @@ /obj/item/bluespace_crystal/attack_self(var/mob/user) - user.visible_message("[user] crushes [src]!") + user.visible_message("[user] crushes [src]!", "You crush [src]!") PoolOrNew(/obj/effect/effect/sparks, loc) playsound(src.loc, "sparks", 50, 1) blink_mob(user) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index ea9d253b54f..6d602467fa1 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -50,7 +50,7 @@ crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals /obj/machinery/computer/telescience/attack_paw(mob/user) - user << "You are too primitive to use this computer." + user << "You are too primitive to use this computer!" return /obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) @@ -61,14 +61,14 @@ user.drop_item() crystals += W W.loc = null - user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.") + user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.", "You insert [W] into \the [src]'s crystal slot.") updateDialog() else if(istype(W, /obj/item/device/gps)) if(!inserted_gps) inserted_gps = W user.unEquip(W) W.loc = src - user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.") + user.visible_message("[user] inserts [W] into \the [src]'s GPS device slot.", "You insert [W] into \the [src]'s GPS device slot.") else if(istype(W, /obj/item/device/multitool)) var/obj/item/device/multitool/M = W if(M.buffer && istype(M.buffer, /obj/machinery/telepad)) diff --git a/code/world.dm b/code/world.dm index 182130a4ce2..de98ae35678 100644 --- a/code/world.dm +++ b/code/world.dm @@ -146,7 +146,10 @@ log << "#[count]\t[index]" #endif spawn(0) - world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','sound/misc/leavingtg.ogg')) // random end sounds!! - LastyBatsy + if(ticker && ticker.round_end_sound) + world << sound(ticker.round_end_sound) + else + world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','sound/misc/leavingtg.ogg')) // random end sounds!! - LastyBatsy for(var/client/C in clients) if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite diff --git a/config/admins.txt b/config/admins.txt index e420f765d0e..7ee8062dcb0 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -81,3 +81,4 @@ lo6a4evskiy = Game Master vekter = Game Master Ahammer18 = Game Master ACCount12 = Game Master +fayrik = Game Master diff --git a/config/game_options.txt b/config/game_options.txt index 683ec17b46b..ae06f1b3675 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -82,28 +82,38 @@ PROBABILITY TRAITORCHAN 4 PROBABILITY DOUBLE_AGENTS 3 PROBABILITY NUCLEAR 2 PROBABILITY REVOLUTION 2 -PROBABILITY GANG 0 +PROBABILITY SHADOWLING 2 +PROBABILITY GANG 2 PROBABILITY CULT 2 PROBABILITY CHANGELING 2 PROBABILITY WIZARD 4 PROBABILITY MALFUNCTION 1 PROBABILITY BLOB 2 PROBABILITY RAGINMAGES 2 -PROBABILITY MONKEY 1 +PROBABILITY MONKEY 0 PROBABILITY METEOR 0 PROBABILITY EXTENDED 0 ## You probably want to keep sandbox off by default for secret and random. PROBABILITY SANDBOX 0 -## Uncomment to make rounds which end instantly (Rev, Wizard, Malf) continue until -## the shuttle is called or the station is nuked. -## Malf and Rev will let the shuttle be called when the antags/protags are dead. -#CONTINUOUS_ROUND_REV -#CONTINUOUS_ROUND_GANG -#CONTINUOUS_ROUND_WIZ -#CONTINUOUS_ROUND_MALF -#CONTINUOUS_ROUND_BLOB + +## Toggles for continuous modes. +## Modes that aren't continuous will end the instant all antagonists are dead. +## Unlisted modes are not currently supported for noncontinous play + +#CONTINUOUS REVOLUTION +CONTINUOUS WIZARD +CONTINUOUS MALFUNCTION +CONTINUOUS BLOB + +## Toggles for allowing midround antagonists (aka mulligan antagonists). +## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. +## Only the listed modes are currently supported for this system + +MIDROUND_ANTAG WIZARD +MIDROUND_ANTAG MALFUNCTION +MIDROUND_ANTAG BLOB ## The amount of time it takes for the emergency shuttle to be called, from round start. SHUTTLE_REFUEL_DELAY 12000 @@ -216,9 +226,6 @@ SILICON_MAX_LAW_AMOUNT 12 ## Uncoment to give players the choice of their species before they join the game #JOIN_WITH_MUTANT_RACE -## Uncomment to allow certain species to have custom colors -#MUTANT_COLORS - ## Assistant slot cap. Set to -1 for unlimited. ASSISTANT_CAP -1 diff --git a/config/tips.txt b/config/tips.txt index 4738b3c6780..c779fb3c653 100644 --- a/config/tips.txt +++ b/config/tips.txt @@ -76,4 +76,12 @@ Alt-click on an adjacent tile to see its contents in the top right pane. While observing or as a ghost, double click on people, bots, or the singularity to follow them. Ghosts can click on active teleporters, portals, wormholes, or the gateway to jump to its destination! Ghosts can double-click their corpse, or the object containing their corpse (such as the cloning scanner), to re-enter it. -Ghosts can see inside storage items that have been left on the ground. \ No newline at end of file +Ghosts can see inside storage items that have been left on the ground. +If you click on the command/chat bar to give it full focus you can use control + arrow keys to move the cursor around or scroll through the history of commands. (Control + home/end work too) +Locked down rogue borgs can be dismantled to return the mmi for placement in a new borg. +Fore = north, aft = south, starboard = east and port = west. +Many things that bind you can be resisted out of with the resist button. This includes locked or welded lockers, chairs, handcuffs. When ever stuck, just give it a try! +You can use . or # instead of : for radio channels. Building this habit reduces the chance of accidentally saying things on common. +Clicking on a tile with an empty hand while pulling something moves it to that tile. No more getting stuck in maint while dragging something! +Things that override clicks like decks of cards or paper bins can still be picked up by dragging them to your character. Equipped things that override click can be unequipped by dragging it to an empty hand. +In the job selection menu, from the lobby, you can use right click on the "Low/Medium/High" priority button to make it cycle backwards. diff --git a/html/changelog.html b/html/changelog.html index ae4ca94a7e4..1b28e0f192c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,267 @@ -->
      +

      25 April 2015

      +

      Boggart updated:

      +
        +
      • Ports Nienhaus's guitar, generalizes handheld instrument code.
      • +
      • Fixes being unable to build disposal pipes on walls, makes changing the RPD's settings not affect pipes that are currently building, makes the RPD use the datum/browser ui, makes it use categories and makes it show the selected mode.
      • +
      +

      Gun Hog updated:

      +
        +
      • Nanotrasen has provided designs for fabrication of APC power control modules. You may print them at any autolathe.
      • +
      +

      Ikarrus updated:

      +
        +
      • Gangs can now purchase switchblades, a relatively cheap and decently robust melee weapon.
      • +
      • Gangs now require at least 66% control of the station to win.
      • +
      • Gang spraycan uses reduced to 15.
      • +
      • Pistol cost increased to 30 Influence
      • +
      • Promotions now start off cheap at 20 influence but get more expensive the more people you promote.
      • +
      +

      Xhuis updated:

      +
        +
      • Added a Create Antagonist button for revenants.
      • +
      • Removed Mind Blast.
      • +
      • Revenants no longer get killed by explosions.
      • +
      • Mind spike cooldown increased to 4 seconds.
      • +
      • Harvest now takes 8 seconds and requires you to be adjacent to the target.
      • +
      • Hypnotise sleeps targets for longer.
      • +
      • Revenant now starts with 3 strikes.
      • +
      +

      phil235 updated:

      +
        +
      • Telecom machines are now deconstructed the same way as all other constructable machines.
      • +
      • You can no longer overdose on nicotine but you can get addicted (very mild effects).
      • +
      + +

      22 April 2015

      +

      Incoming5643 updated:

      +
        +
      • Adds a new fun button for admins: 'Set Round End Sound'. You can use the set round end sound button to set the round end sound. Glad we cleared that up!
      • +
      +

      Miauw62 updated:

      +
        +
      • Very slightly expanded atmos and added an external airlock.
      • +
      +

      Xhuis updated:

      +
        +
      • A few issues have been fixed for revenants. In addition, the Mind Blast/Mind Spike sound effect has been removed.
      • +
      • Adds the Hypnotize ability to revenants. It will cause a target to fall asleep after a short time.
      • +
      +

      xxalpha updated:

      +
        +
      • Added an Exosuit Mining Scanner to the robotics fabricator.
      • +
      • Buffed Ripley's movement and drilling speed in low pressure environments.
      • +
      + +

      21 April 2015

      +

      Ikarrus updated:

      +
        +
      • Gang mode has had some considerable work done on it, including a new objective and currency dynamic.
      • +
      • New objective: Claim half the station as territory by tagging it with spray cans supplied to gang bosses, but usable by any member.
      • +
      • An area can only be tagged by one gang at a time, remove your opponent's tag or spray over it.
      • +
      • New recruitment: Recruiment pens replace flashes, stab people to recruit them.
      • +
      • Recruitment is silent, but causes brief seizures and has a cooldown that scales upwards with a gang's size.
      • +
      • New tool: The Gangtool is used by bosses and lieutenants to recall the shuttle and purchase supplies.
      • +
      • Pistols, ammo, spraycans, recruitment pens and additional gangtools can all be bought.
      • +
      • Gangtools also alert the user of promotions, purchases and territory changes within the gang.
      • +
      • Lieutenants are promoted from gang members when given their own gangtool; they're immune to deconversion and able to do anything a boss can except promotion.
      • +
      • New currency: Influence is used to purchase with the gangtool and is generated every 5 minutes by each territory owned by the gang.
      • +
      • Thermite can be cleaned off walls now.
      • +
      + +

      20 April 2015

      +

      Fayrik updated:

      +
        +
      • Abductors now get advanced camera consoles.
      • +
      • Redesigned Centcom again. There's a bar at the thunderdome now.
      • +
      • Headsets can now be locked to a spesific frequency, this only occurs for nuke ops and deathsquads.
      • +
      • The Centcom channel is now available over all z-levels, regardless of telecomms status.
      • +
      • The Deathsquad space suits have been upgraded to hardsuits.
      • +
      • The Deathsquad now have thermal imaging huds, which can swap which hud they display on the fly.
      • +
      +

      phil235 updated:

      +
        +
      • Reagents are now back to being metabolized every tick. Fixes frost oil and capsaicin not working.
      • +
      • Fixes not being able to make sterilizine.
      • +
      • Adding overdose to space drug, causing mild hallucination and toxin and brain damage.
      • +
      • Nerfed healing power of stimulant reagent. Buffed ephedrine a bit.
      • +
      • Nitroglycerin can now be stabilized with stabilizing agent, and explodes when heated.
      • +
      + +

      19 April 2015

      +

      AnturK updated:

      +
        +
      • Observers can now see abductor hivemind messages.
      • +
      • Adds advanced baton for abductors: Stun, Sleep and Cuff in one tool.
      • +
      • Abductor agents now have vest cameras.
      • +
      • New sprites for abductors and their gear made by Ausops.
      • +
      +

      Fayrik updated:

      +
        +
      • Added jobban options for Abductors and Deathsquads.
      • +
      • Made admin antag spawning buttons more efficient and less prone to failure.
      • +
      +

      Xhuis updated:

      +
        +
      • Recent sightings aboard space stations shows that spirits seem to be manifesting as malevolent revenants and draining the life of crew. The chaplain may be helpful in stopping this new threat.
      • +
      +

      kingofkosmos updated:

      +
        +
      • Girder and machine frame construction protocols has been changed. They can now be secured/unsecured with a wrench and disassembled with a welder.
      • +
      + +

      16 April 2015

      +

      AnturK updated:

      +
        +
      • Nanotrasen authorities are reporting sightings of unidentified space craft near space station 13. Report any strange sightings or mental breakdowns to central command.
      • +
      • PS : Abductions are not covered by health insurance.
      • +
      • Shadowlings and their thralls now have HUD icons.
      • +
      • Thralls learn their master's objectives when enthralled.
      • +
      • Regenerate Chitin ability lets shadowlings re-equip their armor if lost.
      • +
      • Loyalty implanted people take 25% longer to enthrall, but lose their implant and become immune to re-implanting.
      • +
      • Shadowlings now have a message in their spawning text which specifies that cooperation is mandatory.
      • +
      • Veil now works on equipped lights.
      • +
      • Shadowlings now take correct amount of burn damage and in light and heal clone and brain damage in darkness.
      • +
      • Fixes 'Round end code broke' displaying every round.
      • +
      • Shadowlings who ascend will nore greentext properly.
      • +
      +

      Gun Hog updated:

      +
        +
      • Thinktronic Systems, LTD. has increased the Value of the Value-PAK PDA cartridge! Standard issue for Captain PDAs, it can now access security bots, medibots, cleanbots, and floorbots ALL AT ONCE! In addition, it can also connect to your station's Newscaster network at NO EXTRA CHARGE! As a Thank you for our contract with them, they have thrown in Newscaster access for the HumanResources9001 cartridge, Heads of Personnel rejoice!
      • +
      • The Newscaster app has also gotten a free upgrade which allows it to display images and comments inside of posts!
      • +
      • Nanotrasen has concurrently released a patch for bots which will allow off-station bots to properly patrol.
      • +
      +

      Incoming5643 updated:

      +
        +
      • Changeling head slugs have been given player control, ventcrawling, and a short escape period after egg laying.
      • +
      +

      MrStonedOne updated:

      +
        +
      • Admin ghosts can now drag ghosts to mobs to put that ghost in control of that mob.
      • +
      +

      Xhuis updated:

      +
        +
      • Nanotrasen scientists have recently observed a strange genome shift in green slimes. Experiments have shown that injection of radium into an active green slime extract will create a very unstable mutation toxin. Use with caution.
      • +
      + +

      13 April 2015

      +

      AnturK updated:

      +
        +
      • Spacemen have learned the basics of martial arts: Boxing, unleash it's power by wearing Boxing Gloves.
      • +
      • While boxing you can't grab or disarm, but you hit harder with a knockout chance that scales off stamina damage above 50.
      • +
      • Rumors have been heard of powerful martial styles avaliable only to the gods themselves.
      • +
      +

      CosmicScientist updated:

      +
        +
      • Added a dehydrated space carp to traitor items, bought with telecrystals. Use dehydrated space carp in hand to school them on loyalty. Add water to create a vicious murder machine just for the halibut.
      • +
      • The toy carp plushie now has attack verbs for fun, hit your friend with one today. I put my sole into this mod.
      • +
      • If you can think of a better fish pun let minnow but I shouldn't leave it to salmon else.
      • +
      +

      Ikarrus updated:

      +
        +
      • Gang bosses can no longer purchase certain potent traitor items but instead have access to some of a nuke op's arsenal of weapons.
      • +
      +

      Incoming5643 updated:

      +
        +
      • Three new chemical types of blob can occur: Omnizine, Morphine and Space Drugs.
      • +
      +

      MrPerson updated:

      +
        +
      • New lighting system! Lighting now smoothly transfers from one lighting level to the next.
      • +
      +

      Xhuis updated:

      +
        +
      • There have been... odd sighting in Space Station 13's sector. Alien organisms have appeared on stations 57, 23, and outlying.
      • +
      • Nanotrasen personnel have reason to believe that Space Station 13 is under attack by shadowlings. We have little intel on these creatures, but be on the lookout for odd behavior and dark areas. Use plenty of lights.
      • +
      +

      Zelacks updated:

      +
        +
      • Defibs no longer have a minimum damage requirement for a successful revive. Patients will have 150 total damage on a successful revive.
      • +
      • Additional feedback is given for several failure states of the defib.
      • +
      +

      xxalpha updated:

      +
        +
      • Airlock crushing damage increased.
      • +
      + +

      11 April 2015

      +

      Gun Hog updated:

      +
        +
      • Nanotrasen has approved an access upgrade for Cargo Technicians! They are now authorized to release minerals from the ore redemption machine, to allow proper inventory management and shipping.
      • +
      +

      Iamgoofball updated:

      +
        +
      • Blobbernauts no longer deal chemical damage, brute damage increased however.
      • +
      +

      Ikarrus updated:

      +
        +
      • Getting converted by a rev or cultist will stun you for a few seconds.
      • +
      +

      Incoming5643 updated:

      +
        +
      • Fixes some AI malf powers being usable when dead.
      • +
      +

      MrPerson updated:

      +
        +
      • Reduces movement speed penalty from being cold.
      • +
      +

      Xhuis updated:

      +
        +
      • Adds a pizza bomb traitor item for 4 telecrystals. It's a bomb, diguised as a pizza box. You can also attempt to defuse it by using wirecutters.
      • +
      +

      kingofkosmos updated:

      +
        +
      • Activating internals with an adjusted breath mask will automatically push it up to normal state.
      • +
      • Masks can now be adjusted when buckled to a chair.
      • +
      +

      optimumtact updated:

      +
        +
      • Stun batons no longer lose charge over time when on.
      • +
      +

      phil235 updated:

      +
        +
      • The AI holopads now use a popup window just like computers and other machines.
      • +
      • Nerfs kinetic accelerator and plasma cutters. Plasma cutter is no longer in the mining vendor. Reduces the drilling cost of all drills.
      • +
      • Adding 40+ new food and drink recipes, mostly using the newest plants. Notably rice recipes, burritos, nachos, salads, pizzas.
      • +
      • Opening the tablecrafting window can now also be done by dragging the mouse from any food (that's on a table) onto you.
      • +
      • The kitchen cabinet starts with one rice pack.
      • +
      • Glasses with unknown reagent will no longer be always brown but will take the color of their reagents.
      • +
      + +

      09 April 2015

      +

      Iamgoofball updated:

      +
        +
      • Quite a lot of cleanables can now be scooped up with a beaker in order to acquire the contents.
      • +
      • Light a piece of paper on fire with a lighter, and scoop up the ashes!
      • +
      • Scoop up the flour the clown sprayed everywhere as a 'joke'!
      • +
      • Scoop up the oil left behind by exploding robots for re-usage in chemistry!
      • +
      • You can splash the contents of a beaker onto the floor to create a Chemical Pile! This pile can be heated or blown up and have the reagents take the effects. Make a string of black powder around a department in maint. and then heat it with a welder today!
      • +
      • Reagents now can have processing effects when just sitting in a beaker.
      • +
      • Pyrosium and Cryostylane now feed off of oxygen and heat/cool the beaker without having to be inside of a person!
      • +
      • Reagents can now respond to explosions!
      • +
      • Black Powder now instantly detonates if there is an explosion that effects it.
      • +
      • Fire now heats up beakers and their contents!
      • +
      • Activate some smoke powder in style by lighting the beaker on fire with a burning hot plasma fire!
      • +
      +

      RemieRichards updated:

      +
        +
      • Ninja stars are summoned to your hand to be thrown rather than automatically targetting nearby mobs.
      • +
      • Added Sword Recall: pulls your katana towards you, hitting mobs in the way. Free if within sight, cost scales with distance otherwise.
      • +
      • Enemies can be electrocuted by a ninja as the cost of his energy, stunning and injuring them.
      • +
      • Removed SpiderOS, functions moved to status panel.
      • +
      • Fixed energy nets not anchoring target, katana emag spam and sound delay.
      • +
      +

      optimumtact updated:

      +
        +
      • Mimes can't use megaphone without breaking their vow anymore.
      • +
      +

      phil235 updated:

      +
        +
      • Flying animals no longer triggers mouse traps, bear traps or mines.
      • +
      +

      04 April 2015

      ACCount updated:

        diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 032ce58f6b0..a14052090dd 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2078,3 +2078,250 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Cauterizing a surgery wound will now heal some of the damage done by the bonesaw if it was used as part of the same surgery. - tweak: Added ability for Medical HUDs to detect cybernetic implants in humans. +2015-04-09: + Iamgoofball: + - rscadd: Quite a lot of cleanables can now be scooped up with a beaker in order + to acquire the contents. + - rscadd: Light a piece of paper on fire with a lighter, and scoop up the ashes! + - rscadd: Scoop up the flour the clown sprayed everywhere as a 'joke'! + - rscadd: Scoop up the oil left behind by exploding robots for re-usage in chemistry! + - rscadd: You can splash the contents of a beaker onto the floor to create a Chemical + Pile! This pile can be heated or blown up and have the reagents take the effects. + Make a string of black powder around a department in maint. and then heat it + with a welder today! + - rscadd: Reagents now can have processing effects when just sitting in a beaker. + - rscadd: Pyrosium and Cryostylane now feed off of oxygen and heat/cool the beaker + without having to be inside of a person! + - rscadd: Reagents can now respond to explosions! + - rscadd: Black Powder now instantly detonates if there is an explosion that effects + it. + - rscadd: Fire now heats up beakers and their contents! + - rscadd: Activate some smoke powder in style by lighting the beaker on fire with + a burning hot plasma fire! + RemieRichards: + - tweak: Ninja stars are summoned to your hand to be thrown rather than automatically + targetting nearby mobs. + - rscadd: 'Added Sword Recall: pulls your katana towards you, hitting mobs in the + way. Free if within sight, cost scales with distance otherwise.' + - rscadd: Enemies can be electrocuted by a ninja as the cost of his energy, stunning + and injuring them. + - rscdel: Removed SpiderOS, functions moved to status panel. + - bugfix: Fixed energy nets not anchoring target, katana emag spam and sound delay. + optimumtact: + - bugfix: Mimes can't use megaphone without breaking their vow anymore. + phil235: + - tweak: Flying animals no longer triggers mouse traps, bear traps or mines. +2015-04-11: + Gun Hog: + - tweak: Nanotrasen has approved an access upgrade for Cargo Technicians! They are + now authorized to release minerals from the ore redemption machine, to allow + proper inventory management and shipping. + Iamgoofball: + - tweak: Blobbernauts no longer deal chemical damage, brute damage increased however. + Ikarrus: + - experiment: Getting converted by a rev or cultist will stun you for a few seconds. + Incoming5643: + - bugfix: Fixes some AI malf powers being usable when dead. + MrPerson: + - tweak: Reduces movement speed penalty from being cold. + Xhuis: + - rscadd: Adds a pizza bomb traitor item for 4 telecrystals. It's a bomb, diguised + as a pizza box. You can also attempt to defuse it by using wirecutters. + kingofkosmos: + - rscadd: Activating internals with an adjusted breath mask will automatically push + it up to normal state. + - tweak: Masks can now be adjusted when buckled to a chair. + optimumtact: + - tweak: Stun batons no longer lose charge over time when on. + phil235: + - tweak: The AI holopads now use a popup window just like computers and other machines. + - rscdel: Nerfs kinetic accelerator and plasma cutters. Plasma cutter is no longer + in the mining vendor. Reduces the drilling cost of all drills. + - rscadd: Adding 40+ new food and drink recipes, mostly using the newest plants. + Notably rice recipes, burritos, nachos, salads, pizzas. + - tweak: Opening the tablecrafting window can now also be done by dragging the mouse + from any food (that's on a table) onto you. + - rscadd: The kitchen cabinet starts with one rice pack. + - tweak: Glasses with unknown reagent will no longer be always brown but will take + the color of their reagents. +2015-04-13: + AnturK: + - rscadd: 'Spacemen have learned the basics of martial arts: Boxing, unleash it''s + power by wearing Boxing Gloves.' + - rscadd: While boxing you can't grab or disarm, but you hit harder with a knockout + chance that scales off stamina damage above 50. + - rscadd: Rumors have been heard of powerful martial styles avaliable only to the + gods themselves. + CosmicScientist: + - rscadd: Added a dehydrated space carp to traitor items, bought with telecrystals. + Use dehydrated space carp in hand to school them on loyalty. Add water to create + a vicious murder machine just for the halibut. + - tweak: The toy carp plushie now has attack verbs for fun, hit your friend with + one today. I put my sole into this mod. + - wip: If you can think of a better fish pun let minnow but I shouldn't leave it + to salmon else. + Ikarrus: + - tweak: Gang bosses can no longer purchase certain potent traitor items but instead + have access to some of a nuke op's arsenal of weapons. + Incoming5643: + - rscadd: 'Three new chemical types of blob can occur: Omnizine, Morphine and Space + Drugs.' + MrPerson: + - experiment: New lighting system! Lighting now smoothly transfers from one lighting + level to the next. + Xhuis: + - rscadd: There have been... odd sighting in Space Station 13's sector. Alien organisms + have appeared on stations 57, 23, and outlying. + - rscadd: Nanotrasen personnel have reason to believe that Space Station 13 is under + attack by shadowlings. We have little intel on these creatures, but be on the + lookout for odd behavior and dark areas. Use plenty of lights. + Zelacks: + - tweak: Defibs no longer have a minimum damage requirement for a successful revive. + Patients will have 150 total damage on a successful revive. + - tweak: Additional feedback is given for several failure states of the defib. + xxalpha: + - wip: Airlock crushing damage increased. +2015-04-16: + AnturK: + - rscadd: Nanotrasen authorities are reporting sightings of unidentified space craft + near space station 13. Report any strange sightings or mental breakdowns to + central command. + - rscadd: 'PS : Abductions are not covered by health insurance.' + - rscadd: Shadowlings and their thralls now have HUD icons. + - rscadd: Thralls learn their master's objectives when enthralled. + - rscadd: Regenerate Chitin ability lets shadowlings re-equip their armor if lost. + - tweak: Loyalty implanted people take 25% longer to enthrall, but lose their implant + and become immune to re-implanting. + - experiment: Shadowlings now have a message in their spawning text which specifies + that cooperation is mandatory. + - bugfix: Veil now works on equipped lights. + - bugfix: Shadowlings now take correct amount of burn damage and in light and heal + clone and brain damage in darkness. + - bugfix: Fixes 'Round end code broke' displaying every round. + - bugfix: Shadowlings who ascend will nore greentext properly. + Gun Hog: + - rscadd: Thinktronic Systems, LTD. has increased the Value of the Value-PAK PDA + cartridge! Standard issue for Captain PDAs, it can now access security bots, + medibots, cleanbots, and floorbots ALL AT ONCE! In addition, it can also connect + to your station's Newscaster network at NO EXTRA CHARGE! As a Thank you for + our contract with them, they have thrown in Newscaster access for the HumanResources9001 + cartridge, Heads of Personnel rejoice! + - tweak: The Newscaster app has also gotten a free upgrade which allows it to display + images and comments inside of posts! + - bugfix: Nanotrasen has concurrently released a patch for bots which will allow + off-station bots to properly patrol. + Incoming5643: + - rscadd: Changeling head slugs have been given player control, ventcrawling, and + a short escape period after egg laying. + MrStonedOne: + - rscadd: Admin ghosts can now drag ghosts to mobs to put that ghost in control + of that mob. + Xhuis: + - rscadd: Nanotrasen scientists have recently observed a strange genome shift in + green slimes. Experiments have shown that injection of radium into an active + green slime extract will create a very unstable mutation toxin. Use with caution. +2015-04-19: + AnturK: + - bugfix: Observers can now see abductor hivemind messages. + - rscadd: 'Adds advanced baton for abductors: Stun, Sleep and Cuff in one tool.' + - rscadd: Abductor agents now have vest cameras. + - imageadd: New sprites for abductors and their gear made by Ausops. + Fayrik: + - rscadd: Added jobban options for Abductors and Deathsquads. + - tweak: Made admin antag spawning buttons more efficient and less prone to failure. + Xhuis: + - rscadd: Recent sightings aboard space stations shows that spirits seem to be manifesting + as malevolent revenants and draining the life of crew. The chaplain may be helpful + in stopping this new threat. + kingofkosmos: + - wip: Girder and machine frame construction protocols has been changed. They can + now be secured/unsecured with a wrench and disassembled with a welder. +2015-04-20: + Fayrik: + - rscadd: Abductors now get advanced camera consoles. + - tweak: Redesigned Centcom again. There's a bar at the thunderdome now. + - rscadd: Headsets can now be locked to a spesific frequency, this only occurs for + nuke ops and deathsquads. + - rscadd: The Centcom channel is now available over all z-levels, regardless of + telecomms status. + - tweak: The Deathsquad space suits have been upgraded to hardsuits. + - rscadd: The Deathsquad now have thermal imaging huds, which can swap which hud + they display on the fly. + phil235: + - tweak: Reagents are now back to being metabolized every tick. Fixes frost oil + and capsaicin not working. + - tweak: Fixes not being able to make sterilizine. + - rscadd: Adding overdose to space drug, causing mild hallucination and toxin and + brain damage. + - tweak: Nerfed healing power of stimulant reagent. Buffed ephedrine a bit. + - rscadd: Nitroglycerin can now be stabilized with stabilizing agent, and explodes + when heated. +2015-04-21: + Ikarrus: + - wip: Gang mode has had some considerable work done on it, including a new objective + and currency dynamic. + - rscadd: New objective: Claim half the station as territory by tagging it + with spray cans supplied to gang bosses, but usable by any member. + - wip: An area can only be tagged by one gang at a time, remove your opponent's + tag or spray over it. + - rscadd: New recruitment: Recruiment pens replace flashes, stab people to + recruit them. + - experiment: Recruitment is silent, but causes brief seizures and has a cooldown + that scales upwards with a gang's size. + - rscadd: New tool: The Gangtool is used by bosses and lieutenants to recall + the shuttle and purchase supplies. + - rscadd: Pistols, ammo, spraycans, recruitment pens and additional gangtools can + all be bought. + - tweak: Gangtools also alert the user of promotions, purchases and territory changes + within the gang. + - rscadd: Lieutenants are promoted from gang members when given their own gangtool; + they're immune to deconversion and able to do anything a boss can except promotion. + - rscadd: New currency: Influence is used to purchase with the gangtool and + is generated every 5 minutes by each territory owned by the gang. + - tweak: Thermite can be cleaned off walls now. +2015-04-22: + Incoming5643: + - rscadd: 'Adds a new fun button for admins: ''Set Round End Sound''. You can use + the set round end sound button to set the round end sound. Glad we cleared that + up!' + Miauw62: + - wip: Very slightly expanded atmos and added an external airlock. + Xhuis: + - bugfix: A few issues have been fixed for revenants. In addition, the Mind Blast/Mind + Spike sound effect has been removed. + - rscadd: Adds the Hypnotize ability to revenants. It will cause a target to fall + asleep after a short time. + xxalpha: + - rscadd: Added an Exosuit Mining Scanner to the robotics fabricator. + - tweak: Buffed Ripley's movement and drilling speed in low pressure environments. +2015-04-25: + Boggart: + - rscadd: Ports Nienhaus's guitar, generalizes handheld instrument code. + - rscadd: Fixes being unable to build disposal pipes on walls, makes changing the + RPD's settings not affect pipes that are currently building, makes the RPD use + the datum/browser ui, makes it use categories and makes it show the selected + mode. + Gun Hog: + - rscadd: Nanotrasen has provided designs for fabrication of APC power control modules. + You may print them at any autolathe. + Ikarrus: + - rscadd: Gangs can now purchase switchblades, a relatively cheap and decently robust + melee weapon. + - tweak: Gangs now require at least 66% control of the station to win. + - tweak: Gang spraycan uses reduced to 15. + - tweak: Pistol cost increased to 30 Influence + - tweak: Promotions now start off cheap at 20 influence but get more expensive the + more people you promote. + Xhuis: + - rscadd: Added a Create Antagonist button for revenants. + - rscdel: Removed Mind Blast. + - bugfix: Revenants no longer get killed by explosions. + - tweak: Mind spike cooldown increased to 4 seconds. + - tweak: Harvest now takes 8 seconds and requires you to be adjacent to the target. + - tweak: Hypnotise sleeps targets for longer. + - tweak: Revenant now starts with 3 strikes. + phil235: + - tweak: Telecom machines are now deconstructed the same way as all other constructable + machines. + - tweak: You can no longer overdose on nicotine but you can get addicted (very mild + effects). diff --git a/html/changelogs/Iamgoofball-ReagentDecals.yml b/html/changelogs/Iamgoofball-ReagentDecals.yml deleted file mode 100644 index 10d4c764d9a..00000000000 --- a/html/changelogs/Iamgoofball-ReagentDecals.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Your name. -author: Iamgoofball - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Quite a lot of cleanables can now be scooped up with a beaker in order to acquire the contents." - - rscadd: "Light a piece of paper on fire with a lighter, and scoop up the ashes!" - - rscadd: "Scoop up the flour the clown sprayed everywhere as a "joke"!" - - rscadd: "Scoop up the oil left behind by exploding robots for re-usage in chemistry!" - - rscadd: "You can splash the contents of a beaker onto the floor to create a Chemical Pile! This pile can be heated or blown up and have the reagents take the effects. Make a string of black powder around a department in maint. and then heat it with a welder today!" - - rscadd: "Reagents now can have processing effects when just sitting in a beaker." - - rscadd: "Pyrosium and Cryostylane now feed off of oxygen and heat/cool the beaker without having to be inside of a person!" - - rscadd: "Reagents can now respond to explosions!" - - rscadd: "Black Powder now instantly detonates if there is an explosion that effects it." - - rscadd: "Fire now heats up beakers and their contents!" - - rscadd: "Activate some smoke powder in style by lighting the beaker on fire with a burning hot plasma fire!" \ No newline at end of file diff --git a/html/changelogs/Ikarrus-gang5.yml b/html/changelogs/Ikarrus-gang5.yml new file mode 100644 index 00000000000..9716bc9d8a5 --- /dev/null +++ b/html/changelogs/Ikarrus-gang5.yml @@ -0,0 +1,10 @@ +author: Ikarrus + +delete-after: True + +changes: + - rscadd: "Spraycans and crayons can now draw Poseur Tags, aka Fake Gang Tags, as grafiti." + - tweak: "Gangs Capture goal reduced to 60%" + - tweak: "Influence income changed to provide weaker gangs a bigger boost, while slowing down stronger gangs to promote opportunity for comebacks." + - tweak: "Gangs only earn influence on territories they have held on to since the previous Status Report (the income calculation every 5 minutes). This places more significance on defending your existing territory." + - bugfix: "You must be in the territory physically to tag it now. So no more tagging everything from maint." \ No newline at end of file diff --git a/html/changelogs/RemieRichards-PR-9090.yml b/html/changelogs/RemieRichards-PR-9090.yml new file mode 100644 index 00000000000..7fc9dbe8c21 --- /dev/null +++ b/html/changelogs/RemieRichards-PR-9090.yml @@ -0,0 +1,6 @@ +author: RemieRichards +delete-after: True +changes: + - rscadd: "Ports VG's Ventcrawling overhaul!" + - tweak: "Crawling through vents is no longer instant, you now have to move and navigate manually" + - rscadd: "While inside pipes and other atmos machinery, you now see pipe vision" diff --git a/html/changelogs/phil235-BeartrapFix.yml b/html/changelogs/phil235-BeartrapFix.yml deleted file mode 100644 index 6b8ba68298e..00000000000 --- a/html/changelogs/phil235-BeartrapFix.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: phil235 - -delete-after: True - -changes: - - tweak: "flying animals no longer triggers mouse traps, bear traps or mines." - diff --git a/icons/effects/alphacolors.dmi b/icons/effects/alphacolors.dmi index 02316fbf64d..74452b58dcf 100644 Binary files a/icons/effects/alphacolors.dmi and b/icons/effects/alphacolors.dmi differ diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index e22bf5c64b9..5525d3b1cbf 100644 Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 0b9074d181b..1fe7f1c5713 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/water.dmi b/icons/effects/water.dmi index e6387973bf8..b980915653d 100644 Binary files a/icons/effects/water.dmi and b/icons/effects/water.dmi differ diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 96687396a37..930d0685de4 100644 Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi new file mode 100644 index 00000000000..bc98f542874 Binary files /dev/null and b/icons/mob/actions.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 672d83db4da..0997a3676f5 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index de23909c72f..04b6d65e00c 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index a9746f5b5c3..84ed7d9fc07 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 39b58a18272..1f29999f1a7 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index a80ad0382f8..f7a5528eda3 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index 7f449152507..25337a3ae20 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index 569aa7a2ded..470c1756985 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index c23c2b987dc..9a75e1666b5 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 51534f8225e..17fdcfdd538 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 9a1d08d0dbe..ee03734f007 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index af783f10da5..1dce6fa6429 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index d28501b353c..15919bf8ae7 100644 Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 6b1fab51883..1ffa26810ac 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi new file mode 100644 index 00000000000..dbb322992eb Binary files /dev/null and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/atmospherics/unary_devices.dmi b/icons/obj/atmospherics/unary_devices.dmi index 60dec4db9a3..bc43f452e17 100644 Binary files a/icons/obj/atmospherics/unary_devices.dmi and b/icons/obj/atmospherics/unary_devices.dmi differ diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index ae720ac6cd2..89cf1610f74 100644 Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 5ad94298551..3e50217bb16 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 83dc8c5874e..b222152c602 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 79e23dafd65..e6157b2bbb4 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/crayons.dmi b/icons/obj/crayons.dmi index 7d3489285c3..a3966103053 100644 Binary files a/icons/obj/crayons.dmi and b/icons/obj/crayons.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 36224612d34..f2e01a166fa 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi index f096851d1e8..4b65337dbee 100644 Binary files a/icons/obj/economy.dmi and b/icons/obj/economy.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi deleted file mode 100644 index 89112e632d9..00000000000 Binary files a/icons/obj/food.dmi and /dev/null differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi new file mode 100644 index 00000000000..b7e1165b674 Binary files /dev/null and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi new file mode 100644 index 00000000000..89af09b0d20 Binary files /dev/null and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi new file mode 100644 index 00000000000..7bab43843a2 Binary files /dev/null and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/food_ingredients.dmi b/icons/obj/food/food_ingredients.dmi new file mode 100644 index 00000000000..b761943de00 Binary files /dev/null and b/icons/obj/food/food_ingredients.dmi differ diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi new file mode 100644 index 00000000000..58cc44e5688 Binary files /dev/null and b/icons/obj/food/piecake.dmi differ diff --git a/icons/obj/food/pizzaspaghetti.dmi b/icons/obj/food/pizzaspaghetti.dmi new file mode 100644 index 00000000000..8fb643c03ca Binary files /dev/null and b/icons/obj/food/pizzaspaghetti.dmi differ diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi new file mode 100644 index 00000000000..fe4c07362af Binary files /dev/null and b/icons/obj/food/soupsalad.dmi differ diff --git a/icons/obj/food_ingredients.dmi b/icons/obj/food_ingredients.dmi deleted file mode 100644 index b5504ea1546..00000000000 Binary files a/icons/obj/food_ingredients.dmi and /dev/null differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 76f629b26f2..ff23c626c9f 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 4234dc72af5..b91bec2571b 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi new file mode 100644 index 00000000000..f47fcc63f87 Binary files /dev/null and b/icons/obj/machines/telecomms.dmi differ diff --git a/icons/obj/musician.dmi b/icons/obj/musician.dmi index b0a0efe03af..f191f97fca6 100644 Binary files a/icons/obj/musician.dmi and b/icons/obj/musician.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index edb1b1fe792..a30ab24fcbe 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index adaa8481569..ccdac8d866d 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index e2d406a6c91..9b5be0100e8 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 9894e89c626..15ec64bf77e 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index d129a462dff..c9ab9f06a05 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 824d72b31a1..411af48189e 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -63,6 +63,7 @@ h1.alert, h2.alert {color: #000000;} .unconscious {color: #0000ff; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #03ff39;} +.shadowling {color: #311648;} .newscaster {color: #800000;} .ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} @@ -76,6 +77,10 @@ h1.alert, h2.alert {color: #000000;} .sans {font-family: "Comic Sans MS", cursive, sans-serif;} .robot {font-family: "Courier New", cursive, sans-serif;} +.big {font-size: 3;} +.greentext {color: #00FF00; font-size: 3;} +.redtext {color: #FF0000; font-size: 3;} + BIG IMG.icon {width: 32px; height: 32px;} "} diff --git a/sound/guitar/Ab3.ogg b/sound/guitar/Ab3.ogg new file mode 100644 index 00000000000..6e242786c40 Binary files /dev/null and b/sound/guitar/Ab3.ogg differ diff --git a/sound/guitar/Ab4.ogg b/sound/guitar/Ab4.ogg new file mode 100644 index 00000000000..6f854ea5d3f Binary files /dev/null and b/sound/guitar/Ab4.ogg differ diff --git a/sound/guitar/Ab5.ogg b/sound/guitar/Ab5.ogg new file mode 100644 index 00000000000..53ba1c01520 Binary files /dev/null and b/sound/guitar/Ab5.ogg differ diff --git a/sound/guitar/Ab6.ogg b/sound/guitar/Ab6.ogg new file mode 100644 index 00000000000..d0a238ba607 Binary files /dev/null and b/sound/guitar/Ab6.ogg differ diff --git a/sound/guitar/An3.ogg b/sound/guitar/An3.ogg new file mode 100644 index 00000000000..1f06e6d4f28 Binary files /dev/null and b/sound/guitar/An3.ogg differ diff --git a/sound/guitar/An4.ogg b/sound/guitar/An4.ogg new file mode 100644 index 00000000000..f3354df46b9 Binary files /dev/null and b/sound/guitar/An4.ogg differ diff --git a/sound/guitar/An5.ogg b/sound/guitar/An5.ogg new file mode 100644 index 00000000000..fc3b1b345c9 Binary files /dev/null and b/sound/guitar/An5.ogg differ diff --git a/sound/guitar/An6.ogg b/sound/guitar/An6.ogg new file mode 100644 index 00000000000..f58a50d2a65 Binary files /dev/null and b/sound/guitar/An6.ogg differ diff --git a/sound/guitar/Bb3.ogg b/sound/guitar/Bb3.ogg new file mode 100644 index 00000000000..e88343d88fb Binary files /dev/null and b/sound/guitar/Bb3.ogg differ diff --git a/sound/guitar/Bb4.ogg b/sound/guitar/Bb4.ogg new file mode 100644 index 00000000000..11b883285da Binary files /dev/null and b/sound/guitar/Bb4.ogg differ diff --git a/sound/guitar/Bb5.ogg b/sound/guitar/Bb5.ogg new file mode 100644 index 00000000000..5d9b10f87a6 Binary files /dev/null and b/sound/guitar/Bb5.ogg differ diff --git a/sound/guitar/Bb6.ogg b/sound/guitar/Bb6.ogg new file mode 100644 index 00000000000..c7f11ef59a6 Binary files /dev/null and b/sound/guitar/Bb6.ogg differ diff --git a/sound/guitar/Bn3.ogg b/sound/guitar/Bn3.ogg new file mode 100644 index 00000000000..0d6022369fa Binary files /dev/null and b/sound/guitar/Bn3.ogg differ diff --git a/sound/guitar/Bn4.ogg b/sound/guitar/Bn4.ogg new file mode 100644 index 00000000000..7e8682d5ff0 Binary files /dev/null and b/sound/guitar/Bn4.ogg differ diff --git a/sound/guitar/Bn5.ogg b/sound/guitar/Bn5.ogg new file mode 100644 index 00000000000..1912da7f66c Binary files /dev/null and b/sound/guitar/Bn5.ogg differ diff --git a/sound/guitar/Bn6.ogg b/sound/guitar/Bn6.ogg new file mode 100644 index 00000000000..985ec744dfb Binary files /dev/null and b/sound/guitar/Bn6.ogg differ diff --git a/sound/guitar/Cb4.ogg b/sound/guitar/Cb4.ogg new file mode 100644 index 00000000000..0d6022369fa Binary files /dev/null and b/sound/guitar/Cb4.ogg differ diff --git a/sound/guitar/Cb5.ogg b/sound/guitar/Cb5.ogg new file mode 100644 index 00000000000..7e8682d5ff0 Binary files /dev/null and b/sound/guitar/Cb5.ogg differ diff --git a/sound/guitar/Cb6.ogg b/sound/guitar/Cb6.ogg new file mode 100644 index 00000000000..1912da7f66c Binary files /dev/null and b/sound/guitar/Cb6.ogg differ diff --git a/sound/guitar/Cb7.ogg b/sound/guitar/Cb7.ogg new file mode 100644 index 00000000000..985ec744dfb Binary files /dev/null and b/sound/guitar/Cb7.ogg differ diff --git a/sound/guitar/Cn4.ogg b/sound/guitar/Cn4.ogg new file mode 100644 index 00000000000..0279b73f8bd Binary files /dev/null and b/sound/guitar/Cn4.ogg differ diff --git a/sound/guitar/Cn5.ogg b/sound/guitar/Cn5.ogg new file mode 100644 index 00000000000..ece600a6c1a Binary files /dev/null and b/sound/guitar/Cn5.ogg differ diff --git a/sound/guitar/Cn6.ogg b/sound/guitar/Cn6.ogg new file mode 100644 index 00000000000..8c2fecc62aa Binary files /dev/null and b/sound/guitar/Cn6.ogg differ diff --git a/sound/guitar/Db4.ogg b/sound/guitar/Db4.ogg new file mode 100644 index 00000000000..8a14f1f8365 Binary files /dev/null and b/sound/guitar/Db4.ogg differ diff --git a/sound/guitar/Db5.ogg b/sound/guitar/Db5.ogg new file mode 100644 index 00000000000..46a67f20ce0 Binary files /dev/null and b/sound/guitar/Db5.ogg differ diff --git a/sound/guitar/Db6.ogg b/sound/guitar/Db6.ogg new file mode 100644 index 00000000000..a07095c6033 Binary files /dev/null and b/sound/guitar/Db6.ogg differ diff --git a/sound/guitar/Dn4.ogg b/sound/guitar/Dn4.ogg new file mode 100644 index 00000000000..587099a0ddc Binary files /dev/null and b/sound/guitar/Dn4.ogg differ diff --git a/sound/guitar/Dn5.ogg b/sound/guitar/Dn5.ogg new file mode 100644 index 00000000000..d6a9c38415a Binary files /dev/null and b/sound/guitar/Dn5.ogg differ diff --git a/sound/guitar/Dn6.ogg b/sound/guitar/Dn6.ogg new file mode 100644 index 00000000000..4e44d5e72fe Binary files /dev/null and b/sound/guitar/Dn6.ogg differ diff --git a/sound/guitar/Eb4.ogg b/sound/guitar/Eb4.ogg new file mode 100644 index 00000000000..1f93c8273d1 Binary files /dev/null and b/sound/guitar/Eb4.ogg differ diff --git a/sound/guitar/Eb5.ogg b/sound/guitar/Eb5.ogg new file mode 100644 index 00000000000..5b795377f38 Binary files /dev/null and b/sound/guitar/Eb5.ogg differ diff --git a/sound/guitar/Eb6.ogg b/sound/guitar/Eb6.ogg new file mode 100644 index 00000000000..5febf7a37b3 Binary files /dev/null and b/sound/guitar/Eb6.ogg differ diff --git a/sound/guitar/En3.ogg b/sound/guitar/En3.ogg new file mode 100644 index 00000000000..d9679bd78ea Binary files /dev/null and b/sound/guitar/En3.ogg differ diff --git a/sound/guitar/En4.ogg b/sound/guitar/En4.ogg new file mode 100644 index 00000000000..50dad80f506 Binary files /dev/null and b/sound/guitar/En4.ogg differ diff --git a/sound/guitar/En5.ogg b/sound/guitar/En5.ogg new file mode 100644 index 00000000000..8617c069201 Binary files /dev/null and b/sound/guitar/En5.ogg differ diff --git a/sound/guitar/En6.ogg b/sound/guitar/En6.ogg new file mode 100644 index 00000000000..a487ce33e4b Binary files /dev/null and b/sound/guitar/En6.ogg differ diff --git a/sound/guitar/Fb3.ogg b/sound/guitar/Fb3.ogg new file mode 100644 index 00000000000..d9679bd78ea Binary files /dev/null and b/sound/guitar/Fb3.ogg differ diff --git a/sound/guitar/Fb4.ogg b/sound/guitar/Fb4.ogg new file mode 100644 index 00000000000..50dad80f506 Binary files /dev/null and b/sound/guitar/Fb4.ogg differ diff --git a/sound/guitar/Fb5.ogg b/sound/guitar/Fb5.ogg new file mode 100644 index 00000000000..8617c069201 Binary files /dev/null and b/sound/guitar/Fb5.ogg differ diff --git a/sound/guitar/Fb6.ogg b/sound/guitar/Fb6.ogg new file mode 100644 index 00000000000..a487ce33e4b Binary files /dev/null and b/sound/guitar/Fb6.ogg differ diff --git a/sound/guitar/Fn3.ogg b/sound/guitar/Fn3.ogg new file mode 100644 index 00000000000..4e37dc58126 Binary files /dev/null and b/sound/guitar/Fn3.ogg differ diff --git a/sound/guitar/Fn4.ogg b/sound/guitar/Fn4.ogg new file mode 100644 index 00000000000..3bf9957d48a Binary files /dev/null and b/sound/guitar/Fn4.ogg differ diff --git a/sound/guitar/Fn5.ogg b/sound/guitar/Fn5.ogg new file mode 100644 index 00000000000..ad0a0ecec79 Binary files /dev/null and b/sound/guitar/Fn5.ogg differ diff --git a/sound/guitar/Fn6.ogg b/sound/guitar/Fn6.ogg new file mode 100644 index 00000000000..50457e7bf4c Binary files /dev/null and b/sound/guitar/Fn6.ogg differ diff --git a/sound/guitar/Gb3.ogg b/sound/guitar/Gb3.ogg new file mode 100644 index 00000000000..1b2e6c503de Binary files /dev/null and b/sound/guitar/Gb3.ogg differ diff --git a/sound/guitar/Gb4.ogg b/sound/guitar/Gb4.ogg new file mode 100644 index 00000000000..122a0c5c17d Binary files /dev/null and b/sound/guitar/Gb4.ogg differ diff --git a/sound/guitar/Gb5.ogg b/sound/guitar/Gb5.ogg new file mode 100644 index 00000000000..b0346e2f365 Binary files /dev/null and b/sound/guitar/Gb5.ogg differ diff --git a/sound/guitar/Gb6.ogg b/sound/guitar/Gb6.ogg new file mode 100644 index 00000000000..4f873de27cf Binary files /dev/null and b/sound/guitar/Gb6.ogg differ diff --git a/sound/guitar/Gn3.ogg b/sound/guitar/Gn3.ogg new file mode 100644 index 00000000000..783cded9fe5 Binary files /dev/null and b/sound/guitar/Gn3.ogg differ diff --git a/sound/guitar/Gn4.ogg b/sound/guitar/Gn4.ogg new file mode 100644 index 00000000000..92f9cd2fd9d Binary files /dev/null and b/sound/guitar/Gn4.ogg differ diff --git a/sound/guitar/Gn5.ogg b/sound/guitar/Gn5.ogg new file mode 100644 index 00000000000..42fdebc209b Binary files /dev/null and b/sound/guitar/Gn5.ogg differ diff --git a/sound/guitar/Gn6.ogg b/sound/guitar/Gn6.ogg new file mode 100644 index 00000000000..a36bf38f001 Binary files /dev/null and b/sound/guitar/Gn6.ogg differ diff --git a/sound/machines/ventcrawl.ogg b/sound/machines/ventcrawl.ogg new file mode 100644 index 00000000000..2df8b5c8981 Binary files /dev/null and b/sound/machines/ventcrawl.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 1843f02fe78..5ff1207a086 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -76,6 +76,7 @@ #include "code\_onclick\overmind.dm" #include "code\_onclick\telekinesis.dm" #include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alert.dm" #include "code\_onclick\hud\alien.dm" @@ -118,7 +119,6 @@ #include "code\ATMOSPHERICS\pipes\simple.dm" #include "code\ATMOSPHERICS\pipes\tank.dm" #include "code\ATMOSPHERICS\pipes\vent.dm" -#include "code\controllers\_DynamicAreaLighting_TG.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" #include "code\controllers\master_controller.dm" @@ -154,6 +154,7 @@ #include "code\datums\datumvars.dm" #include "code\datums\gas_mixture.dm" #include "code\datums\hud.dm" +#include "code\datums\martial.dm" #include "code\datums\mind.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" @@ -214,6 +215,7 @@ #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\global_iterator.dm" +#include "code\datums\helper_datums\icon_snapshot.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" #include "code\datums\spells\area_teleport.dm" @@ -280,6 +282,15 @@ #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\objective_items.dm" #include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\abduction\abduction.dm" +#include "code\game\gamemodes\abduction\abduction_gear.dm" +#include "code\game\gamemodes\abduction\abduction_surgery.dm" +#include "code\game\gamemodes\abduction\gland.dm" +#include "code\game\gamemodes\abduction\machinery\camera.dm" +#include "code\game\gamemodes\abduction\machinery\console.dm" +#include "code\game\gamemodes\abduction\machinery\dispenser.dm" +#include "code\game\gamemodes\abduction\machinery\experiment.dm" +#include "code\game\gamemodes\abduction\machinery\pad.dm" #include "code\game\gamemodes\blob\blob.dm" #include "code\game\gamemodes\blob\blob_finish.dm" #include "code\game\gamemodes\blob\blob_report.dm" @@ -337,6 +348,10 @@ #include "code\game\gamemodes\sandbox\airlock_maker.dm" #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\gamemodes\sandbox\sandbox.dm" +#include "code\game\gamemodes\shadowling\shadowling.dm" +#include "code\game\gamemodes\shadowling\shadowling_abilities.dm" +#include "code\game\gamemodes\shadowling\shadowling_items.dm" +#include "code\game\gamemodes\shadowling\special_shadowling_abilities.dm" #include "code\game\gamemodes\traitor\double_agents.dm" #include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\wizard\artefact.dm" @@ -431,6 +446,7 @@ #include "code\game\machinery\computer\atmos_alert.dm" #include "code\game\machinery\computer\buildandrepair.dm" #include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_advanced.dm" #include "code\game\machinery\computer\card.dm" #include "code\game\machinery\computer\cloning.dm" #include "code\game\machinery\computer\communications.dm" @@ -467,13 +483,20 @@ #include "code\game\machinery\embedded_controller\simple_vent_controller.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\telecomms\broadcaster.dm" -#include "code\game\machinery\telecomms\logbrowser.dm" +#include "code\game\machinery\telecomms\broadcasting.dm" #include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\presets.dm" #include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" +#include "code\game\machinery\telecomms\computers\logbrowser.dm" +#include "code\game\machinery\telecomms\computers\telemonitor.dm" +#include "code\game\machinery\telecomms\computers\traffic_control.dm" +#include "code\game\machinery\telecomms\machines\allinone.dm" +#include "code\game\machinery\telecomms\machines\broadcaster.dm" +#include "code\game\machinery\telecomms\machines\bus.dm" +#include "code\game\machinery\telecomms\machines\hub.dm" +#include "code\game\machinery\telecomms\machines\processor.dm" +#include "code\game\machinery\telecomms\machines\receiver.dm" +#include "code\game\machinery\telecomms\machines\relay.dm" +#include "code\game\machinery\telecomms\machines\server.dm" #include "code\game\mecha\mech_bay.dm" #include "code\game\mecha\mech_fabricator.dm" #include "code\game\mecha\mecha.dm" @@ -544,6 +567,7 @@ #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\candle.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\dehy_carp.dm" #include "code\game\objects\items\documents.dm" #include "code\game\objects\items\holotape.dm" #include "code\game\objects\items\latexballoon.dm" @@ -555,12 +579,14 @@ #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\instruments.dm" #include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\multitool.dm" #include "code\game\objects\items\devices\paicard.dm" #include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\pizza_bomb.dm" #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\recaller.dm" #include "code\game\objects\items\devices\scanners.dm" @@ -569,7 +595,6 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" -#include "code\game\objects\items\devices\violin.dm" #include "code\game\objects\items\devices\PDA\cart.dm" #include "code\game\objects\items\devices\PDA\chatroom.dm" #include "code\game\objects\items\devices\PDA\PDA.dm" @@ -1009,6 +1034,7 @@ #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" +#include "code\modules\lighting\lighting_system.dm" #include "code\modules\mining\equipment_locker.dm" #include "code\modules\mining\machine_input_output_plates.dm" #include "code\modules\mining\machine_processing.dm" @@ -1055,6 +1081,7 @@ #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\ventcrawling.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" @@ -1166,6 +1193,7 @@ #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\say.dm" +#include "code\modules\mob\living\simple_animal\ascendant_shadowling.dm" #include "code\modules\mob\living\simple_animal\constructs.dm" #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" @@ -1211,6 +1239,9 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\revenant\revenant.dm" +#include "code\modules\mob\living\simple_animal\revenant\revenant_abilities.dm" +#include "code\modules\mob\living\simple_animal\revenant\revenant_spawn_event.dm" #include "code\modules\mob\living\simple_animal\slime\death.dm" #include "code\modules\mob\living\simple_animal\slime\emote.dm" #include "code\modules\mob\living\simple_animal\slime\life.dm" @@ -1315,8 +1346,10 @@ #include "code\modules\projectiles\ammunition\magazines.dm" #include "code\modules\projectiles\ammunition\special.dm" #include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\grenade_launcher.dm" #include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\syringe_gun.dm" #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\nuclear.dm" #include "code\modules\projectiles\guns\energy\pulse.dm" @@ -1338,27 +1371,28 @@ #include "code\modules\projectiles\projectile\reusable.dm" #include "code\modules\projectiles\projectile\special.dm" #include "code\modules\reagents\Chemistry-Colours.dm" -#include "code\modules\reagents\Chemistry-Goon-420BlazeIt.dm" -#include "code\modules\reagents\Chemistry-Goon-Medicine.dm" -#include "code\modules\reagents\Chemistry-Goon-Other.dm" -#include "code\modules\reagents\Chemistry-Goon-Pyrotechnics.dm" -#include "code\modules\reagents\Chemistry-Goon-Readme.dm" -#include "code\modules\reagents\Chemistry-Goon-Toxins.dm" #include "code\modules\reagents\Chemistry-Holder.dm" #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Readme.dm" +#include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" -#include "code\modules\reagents\grenade_launcher.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\syringe_gun.dm" #include "code\modules\reagents\Chemistry-Reagents\Blob-Reagents.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents.dm" +#include "code\modules\reagents\Chemistry-Reagents\Drug-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Medicine-Reagents.dm" +#include "code\modules\reagents\Chemistry-Reagents\Other-Reagents.dm" +#include "code\modules\reagents\Chemistry-Reagents\Pyrotechnic-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Toxin-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Food-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Drink-Reagents\Alcohols.dm" #include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Drink-Reagents\Drinks.dm" +#include "code\modules\reagents\Chemistry-Recipes\Drugs.dm" +#include "code\modules\reagents\Chemistry-Recipes\Medicine.dm" +#include "code\modules\reagents\Chemistry-Recipes\Others.dm" +#include "code\modules\reagents\Chemistry-Recipes\Pyrotechnics.dm" +#include "code\modules\reagents\Chemistry-Recipes\Slime_extracts.dm" +#include "code\modules\reagents\Chemistry-Recipes\Toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm" diff --git a/tools/Spriting Resources/previewing_color_in_photoshop.psd b/tools/Spriting Resources/previewing_color_in_photoshop.psd new file mode 100644 index 00000000000..47a5473c7b8 Binary files /dev/null and b/tools/Spriting Resources/previewing_color_in_photoshop.psd differ
      Blob
      [replacetext("Wizard", " ", " ")][replacetext("Abductor", " ", " ")][replacetext("Abductor", " ", " ")][replacetext("Deathsquad", " ", " ")][replacetext("Deathsquad", " ", " ")][replacetext("Malf AI", " ", " ")]