diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index c9070d72a64..2a6675536bd 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -104,7 +104,7 @@
"abZ" = (/obj/machinery/newscaster/security_unit{pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Head of Security's Office"; dir = 4; network = list("SS13")},/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"aca" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"acb" = (/turf/simulated/floor/fancy/carpet,/area/security/hos)
-"acc" = (/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 10},/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/security/hos)
+"acc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/fancy/carpet,/area/security/hos)
"acd" = (/obj/structure/sign/securearea{pixel_y = -32},/obj/structure/lattice/catwalk,/turf/space,/area/space)
"ace" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxstarboard)
"acf" = (/obj/structure/lattice,/obj/item/stack/cable_coil/random,/turf/space,/area/space)
@@ -403,6 +403,8 @@
"ahM" = (/obj/structure/grille,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/security/warden)
"ahN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
"ahO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
+"ahP" = (/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 10},/obj/machinery/computer/card/minor/hos,/turf/simulated/floor/fancy/carpet,/area/security/hos)
+"ahQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
"ahR" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"ahS" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
"ahT" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-y"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/main)
@@ -3901,7 +3903,7 @@
"bxc" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/effect/landmark/start{name = "Research Director"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxd" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxe" = (/obj/structure/rack,/obj/item/device/aicard,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/crew_quarters/hor)
-"bxf" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
+"bxf" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/machinery/computer/card/minor/rd,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bxg" = (/obj/structure/lamarr,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/hor)
"bxh" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
"bxi" = (/turf/simulated/wall,/area/toxins/explab)
@@ -4094,7 +4096,7 @@
"bAN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bAO" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bAP" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/structure/flora/kirbyplants/dead,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
-"bAQ" = (/obj/machinery/hologram/holopad,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
+"bAQ" = (/obj/machinery/computer/card/minor/cmo,/turf/simulated/floor/plasteel{icon_state = "barber"},/area/medical/cmo)
"bAR" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("SS13","RD")},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bAS" = (/obj/structure/closet/secure_closet/RD,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
"bAT" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor)
@@ -5651,7 +5653,7 @@
"ceK" = (/turf/simulated/wall/r_wall,/area/engine/engineering)
"ceL" = (/obj/machinery/computer/atmos_alert,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 3; name = "Chief Engineer RC"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceM" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
-"ceN" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"ceN" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/stamp/ce,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ceQ" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/chiefs_office)
@@ -5770,7 +5772,7 @@
"cgZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cha" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/camera{c_tag = "Engineering Power Storage"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"chb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"chc" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"chc" = (/obj/machinery/camera{c_tag = "Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/computer/card/minor/ce,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"chd" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"che" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"chf" = (/turf/simulated/floor/engine,/area/toxins/explab)
@@ -6426,7 +6428,7 @@
"ctF" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"ctG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners (WEST)"; icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior)
"ctH" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
-"ctI" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"ctI" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/filingcabinet/chestdrawer,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office)
"ctJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-darkbluecorners"; icon_state = "darkbluecorners"; temperature = 273.15},/area/turret_protected/aisat_interior)
"ctK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior)
"ctL" = (/obj/machinery/door/airlock/shuttle{name = "Mining Shuttle Airlock"; req_access_txt = "48"},/obj/docking_port/mobile{dir = 8; dwidth = 3; height = 5; id = "mining"; name = "mining shuttle"; travelDir = 90; width = 7},/obj/docking_port/stationary{dir = 8; dwidth = 3; height = 5; id = "mining_home"; name = "mining shuttle bay"; width = 7},/turf/simulated/floor/plating,/area/shuttle/labor)
@@ -6576,7 +6578,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaZaasaasaasaaKabaabbaasaasabcabdaaiaaiaaiaafaaaaaaaaaaaaaaaaafaaaaaVaaaaaaaaaaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabeabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaOaaWaaNaaXabiaasabjaasaasaasaasaasaasaauaasabkablaaiaafaafaafaafaafaafaafaafabmabmabmabnabmabmaboaboabpabpabpaboaboaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaYabraaPabsabuaasaasabvabwabxaasabyabzabAaasabBabCaaiaafaaaaafaafaafaafaaaaafabnabDabEaeIabFabGaboabHabIabJabKabLaboaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafabMaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOabsabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboabZacaacbacbaccaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaabfabfabeabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabNabPabOabsabSabTabSabSabSabUabSabSabSabVabSabSabWaaiactactactactactactactactabmabXabEaeIabYabDaboabZacaacbaccahPaboaaaaafacdaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfaafaafaaaaceaaaacfaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgabQacgabRabsackaasaclabSacmacnacoabSacpacqacrabSacsaaiacMacNacOacOacPacQacRacSactacuabEaeIaecabDabpacwacxacyacbaczaboaaaaafacAacBacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaafaaaaafaaaaaaaceaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacCaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaciacDacjacEacHaasacIabSacJacnacIabSacKacqacIabSacLaaiacMadkadladladladladmadnactacTabEaeIaecabDabpacUacVacWacbacXaboaafaafacAacYacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafacZacZacZacZacZaaaadaaaaacZacZacZacZacZaafabfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadbadbadbadbaafaafaaaadcaaaaafaafabfabfabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhaaHaaHaaHacFaddacGabsadfadgadhabSadfadiadhabSadfadjadhabSabSaaiafnaRFaNFadVaNFadWbhdbiGactadoabEaeIaecabDaboadpadqadradsadtaboabnabmadvacBacAacAachaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6645,15 +6647,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbsfbjxbjxbjxbiibjxbjxcuWbjxbjxbqAbsgaYpbshbsibjEbsjbskbslbeabaHbaHaZhbmzbsnbqHaHYbpibpjblibsobspbsqbsrbssbliaaaaaaaafbfCbstbsubstbgZaafaaaaaabqVbsvbswbsxbsybszbszbsAbsBbsCaHYaHYbmVbsDbfXbsEbsFbsGbsHbsGbsIbsJbsKbsLbsKbsKbsKbsMbsNbfXbhkbsObsPbsPbsQbsRbosbosbsSbsTbsUbpRboybncbeHbeIbsVbsVbsVbsVbsVbeKbnkbnkbnkbnkbsWbsXbsYbnkbsZbtabtbbtcbtcbtcbtcbtdbtebtfbrYbuAbuzbuCbuBbuBbuDbwabrVbsbbgxbsdbsebseabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpcuWbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbsbbgxbwgbqvbwhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabuFbuGbuFbuHbuIbuHbuHbuHbuHbuHcuXbuKbjxbqAbuLaYpbuMbaHbuNbuObuPbuQbuRbuRbuRbuQbuQbuSbqHaJkbuTbpjblibuUbuVbuWbuXbuYbliaaaaaaaafbuZbvabqRbvbbvcaafaaaaaabqVbvdbvebvfbvgbtLbtMbtNbpubvhaHYaHYbvibvjbvkbvlbvmbvnbtXbvobvpbvqbvrbvsbDibvubvvbvubFzbtXbhkbjZbsPbvxbvybvzbvAbvBbvCbvDbvEbvEbvFbvGbvHbvIbvJbvKbvLbvMbvNbvMbvMbvObvMbvMbvPbvQbvRbvRbvSbvTbqibuxbvUbvVbvWbvXbvYbambuybxjbxibzCbyAbzDbxibAVbrVbsbbgxcjgbsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwicuYbwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxebxfbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbwgbqvcvhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwicuYbwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxeahQbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbsbbgxbwgbqvcvhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwicuZbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbsbbgxbsdbsebseabtaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbsbbgxbsdbsebsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIcvbcvacvccvcbAZbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbAQbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIcvbcvacvccvcbAZbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbxfbARbASbATbAUbxhchfchfchfbscchfchfchfbrVbsbbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbsbbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtcuDbCubCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobsmbtnbtnbvwbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaelctjaekctjaejaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobvZbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNcuCctMcuCafNbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbDpbGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbAQbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZctzctAafNbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/bot/NanoTrasenBot.py b/bot/NanoTrasenBot.py
index 40ea8325772..2e0678bbd96 100644
--- a/bot/NanoTrasenBot.py
+++ b/bot/NanoTrasenBot.py
@@ -1300,17 +1300,7 @@ while True:
print sender+" Has now joined"
users.append(sender)
#####
- if ".fi" in data[0] and sender.lower() == "skibiliano":
- operators.append(sender)
if sender.lower() not in peopleheknows[0]:
- if data[0].split("!")[1] in peopleheknows[1]:
- appendion = "...you do seem familiar however"
- else:
- appendion = ""
- if data[1][1].lower() == channel or data[1][1].lower() == channel[1:]:
- conn.privmsg(data[1][1],CORE_DATA.greeting.replace("USER",sender)+" "+appendion)
- else:
- conn.privmsg(data[1][1],"Hello! Haven't seen you here before! Happy to meet you! %s" %(appendion))
peopleheknows[0].append(sender.lower())
peopleheknows[1].append(data[0].split("!")[1])
with open("peopleheknows.cache","w") as peoplehecache:
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index bbb172cfe83..6a90495198c 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -108,6 +108,7 @@
#define STAGE_THREE 5
#define STAGE_FOUR 7
#define STAGE_FIVE 9
+#define STAGE_SIX 11 //From supermatter shard
//zlevel defines, can be overridden for different maps in the appropriate _maps file.
#define ZLEVEL_SPACEMAX 7
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index e442f74d14f..4a0b0f4abb4 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -489,6 +489,20 @@
config.no_summon_events = 1
if("reactionary_explosions")
config.reactionary_explosions = 1
+ if("bombcap")
+ var/BombCap = text2num(value)
+ if (!BombCap)
+ continue
+ if (BombCap < 4)
+ BombCap = 4
+ if (BombCap > 128)
+ BombCap = 128
+
+ MAX_EX_DEVESTATION_RANGE = round(BombCap/4)
+ MAX_EX_HEAVY_RANGE = round(BombCap/2)
+ MAX_EX_LIGHT_RANGE = BombCap
+ MAX_EX_FLASH_RANGE = BombCap
+ MAX_EX_FLAME_RANGE = BombCap
else
diary << "Unknown setting in configuration: '[name]'"
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index e483513c40a..89b57e6a16e 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -134,7 +134,8 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
if(istype(I, /obj/item/device/assembly))
var/obj/item/device/assembly/A = I;
if(A.attachable)
- L.drop_item()
+ if(!L.drop_item())
+ return
Attach(colour, A)
else
L << "You need a attachable assembly!"
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 60fa4a6ca9d..614e4698f55 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -519,7 +519,8 @@
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob, params)
if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
if (!src.diskette)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
src.diskette = I
user << "You insert [I]."
diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm
index 502d4300932..5a3d85f957a 100644
--- a/code/game/gamemodes/abduction/abduction.dm
+++ b/code/game/gamemodes/abduction/abduction.dm
@@ -263,7 +263,7 @@
for(var/team_number=1,team_number<=teams,team_number++)
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)
+ if (con.experiment.points >= objective.target_amount)
SSshuttle.emergency.request(null, 0.5)
finished = 1
return ..()
@@ -279,7 +279,7 @@
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)
+ 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
diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm
index a13b347907c..dfb27d32870 100644
--- a/code/game/gamemodes/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/abduction/abduction_gear.dm
@@ -22,15 +22,6 @@
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)
diff --git a/code/game/gamemodes/abduction/machinery/dispenser.dm b/code/game/gamemodes/abduction/machinery/dispenser.dm
index d346e0366a5..33b4944785b 100644
--- a/code/game/gamemodes/abduction/machinery/dispenser.dm
+++ b/code/game/gamemodes/abduction/machinery/dispenser.dm
@@ -60,7 +60,8 @@
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/gland))
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
for(var/i=1,i<=gland_colors.len,i++)
if(gland_types[i] == W.type)
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 70f29cab8ef..3a6ef5e1d26 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -83,8 +83,7 @@
H.hair_style = null
H.update_hair()
human_overlays = H.overlays
- if(overmind && overmind.blob_reagent_datum)
- adjustcolors(overmind.blob_reagent_datum.color)
+ update_icons()
H.loc = src
loc.visible_message("The corpse of [H.name] suddenly rises!")
@@ -120,8 +119,18 @@
..()
+/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
+ ..()
+
+ if(overmind && overmind.blob_reagent_datum)
+ adjustcolors(overmind.blob_reagent_datum.color)
+ else
+ adjustcolors(color) //to ensure zombie/other overlays update
+
+
/mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color)
color = a_color
+
if(is_zombie)
overlays.Cut()
overlays = human_overlays
@@ -130,7 +139,6 @@
color = initial(color)//looks better.
overlays += I
-
/////////////////
// BLOBBERNAUT //
/////////////////
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
index 0bb8c7b21de..eb92b465a43 100644
--- a/code/game/gamemodes/gang/dominator.dm
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -77,7 +77,7 @@
mode.A_timer = "OFFLINE"
if(gang == "B")
mode.B_timer = "OFFLINE"
- if(!isnum(mode.A_timer) && !isnum(mode.B_timer))
+ if(gang && !isnum(mode.A_timer) && !isnum(mode.B_timer))
SSshuttle.emergencyNoEscape = 0
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
@@ -85,7 +85,6 @@
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
else
priority_announce("All hostile activity within station systems have ceased.","Network Alert")
- if(gang)
ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover cancelled: Dominator is no longer operational.",1,1)
SetLuminosity(0)
icon_state = "dominator-broken"
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 2b448e0b833..77bc23d5e46 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -258,7 +258,7 @@
if(check && isloyal(gangster_mind.current)) //Check to see if the potential gangster is implanted
return 0
if(gangster_mind in (A_bosses | A_gang | B_bosses | B_gang))
- return 0
+ return 1
if(gang == "A")
A_gang += gangster_mind
else
@@ -275,7 +275,7 @@
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
+ return 2
////////////////////////////////////////////////////////////////////
//Deals with players reverting to neutral (Not a gangster anymore)//
////////////////////////////////////////////////////////////////////
diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm
index b081a80686e..15ef02f0c58 100644
--- a/code/game/gamemodes/gang/recaller.dm
+++ b/code/game/gamemodes/gang/recaller.dm
@@ -78,18 +78,24 @@
dat += "(10 Influence) "
if(points >= 10)
- dat += "10mm Ammo
"
+ dat += "10mm Ammo
"
else
dat += "10mm Ammo
"
- dat += "(50 Influence) "
- if(points >= 50)
- dat += "Thompson SMG
"
+ dat += "(40 Influence) "
+ if(points >= 40)
+ dat += "Mini Uzi
"
else
- dat += "Thompson SMG
"
+ dat += "Mini Uzi
"
+
+ dat += "(25 Influence) "
+ if(points >= 25)
+ dat += "Uzi Ammo
"
+ else
+ dat += "Uzi Magazine
"
dat += "
"
- dat += "Purchase Utilities:
"
+ dat += "Purchase Equipment:
"
dat += "(5 Influence) "
if(points >= 5)
@@ -163,14 +169,18 @@
if(points >= 20)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
points = 20
- if("ammo")
+ if("10mmammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
- if("SMG")
- if(points >= 50)
- item_type = /obj/item/weapon/gun/projectile/automatic/tommygun
- points = 50
+ if("uzi")
+ if(points >= 40)
+ item_type = /obj/item/weapon/gun/projectile/automatic/mini_uzi
+ points = 40
+ if("9mmammo")
+ if(points >= 25)
+ item_type = /obj/item/ammo_box/magazine/uzim9mm
+ points = 25
if("vest")
if(points >= 10)
item_type = /obj/item/clothing/suit/armor/bulletproof
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 7bd0a665f3f..b9f170b2a92 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -85,7 +85,8 @@ Made by Xhuis
if(config.protect_assistant_from_antagonist)
restricted_jobs += "Assistant"
- var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2
+ var/shadowlings = max(2, round(num_players()/10))
+
while(shadowlings)
var/datum/mind/shadow = pick(antag_candidates)
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 603c2ff0d88..1a0cbefdc95 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -1,7 +1,7 @@
//In this file: Summon Magic/Summon Guns/Summon Events
/proc/rightandwrong(var/summon_type, var/mob/user, var/survivor_probability) //0 = Summon Guns, 1 = Summon Magic
- var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg")
+ var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic")
@@ -63,6 +63,8 @@
new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
if("speargun")
new /obj/item/weapon/gun/projectile/automatic/speargun(get_turf(H))
+ if("uzi")
+ new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
if("cannon")
var/obj/item/weapon/gun/energy/lasercannon/gat = new(get_turf(H))
gat.pin = new /obj/item/device/firing_pin //no authentication pins for spawned guns. fun allowed.
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index c563482d147..ab226c94879 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -48,7 +48,8 @@
else
var/obj/item/device/pda/P = usr.get_active_hand()
if(istype(P))
- user.drop_item()
+ if(!user.drop_item())
+ return
storedpda = P
P.loc = src
P.add_fingerprint(usr)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 57819a2d177..7be7a95a65b 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -735,11 +735,11 @@
return
if(0)
if(istype(W, /obj/item/weapon/airalarm_electronics))
- user << "You insert the circuit."
- buildstage = 1
- update_icon()
- user.drop_item()
- qdel(W)
+ if(user.unEquip(W))
+ user << "You insert the circuit."
+ buildstage = 1
+ update_icon()
+ qdel(W)
return
if(istype(W, /obj/item/weapon/wrench))
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 25a2aa88a2d..85b57fb7413 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -67,8 +67,10 @@
if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed )))
if (src.holding)
return
+ if(!user.drop_item())
+ return
+
var/obj/item/weapon/tank/T = W
- user.drop_item()
T.loc = src
src.holding = T
update_icon()
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index f1dd0e405c3..f73276842c3 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -243,7 +243,8 @@ text("[on ? "On" : "Off"]"))
/obj/item/weapon/bucket_sensor/attackby(var/obj/item/W, mob/user as mob, params)
..()
if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
var/turf/T = get_turf(loc)
var/obj/machinery/bot/cleanbot/A = new /obj/machinery/bot/cleanbot(T)
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index b4ecddd72c7..ddfb3dcbcb2 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -554,7 +554,8 @@ Auto Patrol[]"},
switch(build_step)
if(0,1)
if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the robot leg to [src]."
@@ -567,12 +568,15 @@ Auto Patrol[]"},
icon_state = "ed209_legs"
if(2)
+ var/newcolor = ""
if(istype(W, /obj/item/clothing/suit/redtag))
- lasercolor = "r"
+ newcolor = "r"
else if(istype(W, /obj/item/clothing/suit/bluetag))
- lasercolor = "b"
- if(lasercolor || istype(W, /obj/item/clothing/suit/armor/vest))
- user.drop_item()
+ newcolor = "b"
+ if(newcolor || istype(W, /obj/item/clothing/suit/armor/vest))
+ if(!user.unEquip(W))
+ return
+ lasercolor = newcolor
qdel(W)
build_step++
user << "You add the armor to [src]."
@@ -601,7 +605,8 @@ Auto Patrol[]"},
if(!istype(W, /obj/item/clothing/head/helmet))
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the helmet to [src]."
@@ -611,7 +616,8 @@ Auto Patrol[]"},
if(5)
if(isprox(W))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the prox sensor to [src]."
@@ -634,26 +640,29 @@ Auto Patrol[]"},
name = "wired ED-209 assembly"
if(7)
+ var/newname = ""
switch(lasercolor)
if("b")
if(!istype(W, /obj/item/weapon/gun/energy/laser/bluetag))
return
- name = "bluetag ED-209 assembly"
+ newname = "bluetag ED-209 assembly"
if("r")
if(!istype(W, /obj/item/weapon/gun/energy/laser/redtag))
return
- name = "redtag ED-209 assembly"
+ newname = "redtag ED-209 assembly"
if("")
if(!istype(W, /obj/item/weapon/gun/energy/gun/advtaser))
return
- name = "taser ED-209 assembly"
+ newname = "taser ED-209 assembly"
else
return
+ if(!user.unEquip(W))
+ return
+ name = newname
build_step++
user << "You add [W] to [src]."
item_state = "[lasercolor]ed209_taser"
icon_state = "[lasercolor]ed209_taser"
- user.drop_item()
qdel(W)
if(8)
@@ -669,11 +678,12 @@ Auto Patrol[]"},
if(9)
if(istype(W, /obj/item/weapon/stock_parts/cell))
+ if(!user.unEquip(W))
+ return
build_step++
user << "You complete the ED-209."
var/turf/T = get_turf(src)
new /obj/machinery/bot/ed209(T,created_name,lasercolor)
- user.drop_item()
qdel(W)
user.unEquip(src, 1)
qdel(src)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 3040c71c68f..e56043b2953 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -244,8 +244,9 @@
if(!isnull(reagent_glass))
user << "There is already a beaker loaded!"
return
+ if(!user.drop_item())
+ return
- user.drop_item()
W.loc = src
reagent_glass = W
user << "You insert [W]."
@@ -585,7 +586,8 @@
switch(build_step)
if(0)
if(istype(W, /obj/item/device/healthanalyzer))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You add the health sensor to [src]."
@@ -594,7 +596,8 @@
if(1)
if(isprox(W))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
build_step++
user << "You complete the Medibot. Beep boop!"
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 8bbce5dd7ec..f8845ab32b4 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -89,8 +89,9 @@ obj/machinery/bot/mulebot/bot_reset()
user << "Controls [(locked ? "locked" : "unlocked")]."
else if(istype(I,/obj/item/weapon/stock_parts/cell) && open && !cell)
+ if(!user.drop_item())
+ return
var/obj/item/weapon/stock_parts/cell/C = I
- user.drop_item()
C.loc = src
cell = C
updateDialog()
@@ -288,7 +289,8 @@ obj/machinery/bot/mulebot/bot_reset()
if(open && !cell)
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
cell = C
C.loc = src
C.add_fingerprint(usr)
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index 9deace99ddd..44de918ce78 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -445,7 +445,8 @@ Auto Patrol: []"},
user << "You weld the hole in [src] shut!"
else if(isprox(I) && (build_step == 1))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
build_step++
user << "You add the prox sensor to [src]!"
overlays += "hs_eye"
@@ -453,7 +454,8 @@ Auto Patrol: []"},
qdel(I)
else if(((istype(I, /obj/item/robot_parts/l_arm)) || (istype(I, /obj/item/robot_parts/r_arm))) && (build_step == 2))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
build_step++
user << "You add the robot arm to [src]!"
name = "helmet/signaler/prox sensor/robot arm assembly"
@@ -461,7 +463,8 @@ Auto Patrol: []"},
qdel(I)
else if((istype(I, /obj/item/weapon/melee/baton)) && (build_step >= 3))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
build_step++
user << "You complete the Securitron! Beep boop."
var/obj/machinery/bot/secbot/S = new /obj/machinery/bot/secbot
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index ae2204f9da3..c6748849914 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -73,6 +73,7 @@
var/thisemp = emped //Take note of which EMP this proc is for
spawn(900)
if(loc) //qdel limbo
+ triggerCameraAlarm() //camera alarm triggers even if multiple EMPs are in effect.
if(emped == thisemp) //Only fix it if the camera hasn't been EMP'd again
network = previous_network
icon_state = initial(icon_state)
@@ -80,7 +81,6 @@
if(can_use())
cameranet.addCamera(src)
emped = 0 //Resets the consecutive EMP count
- triggerCameraAlarm()
spawn(100)
cancelCameraAlarm()
for(var/mob/O in mob_list)
@@ -226,11 +226,13 @@
L.laser_act(src, user)
else
- if(W.force > 10) //fairly simplistic, but will do for now.
+ if(W.force >= 10) //fairly simplistic, but will do for now.
user.changeNext_move(CLICK_CD_MELEE)
visible_message("[user] hits [src] with [W]!", "You hit [src] with [W]!")
health = max(0, health - W.force)
+ user.do_attack_animation(src)
if(!health && status)
+ triggerCameraAlarm()
deactivate(user, 1)
return
@@ -244,7 +246,6 @@
else
visible_message("\The [src] deactivates!")
icon_state = "[initial(icon_state)]1"
-
else
if(user)
visible_message("[user] reactivates [src]!")
@@ -256,6 +257,7 @@
spawn(100)
cancelCameraAlarm()
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ cameranet.updateChunk(x, y, z)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -271,7 +273,6 @@
for(var/mob/living/silicon/S in mob_list)
S.triggerAlarm("Camera", get_area(src), list(src), src)
-
/obj/machinery/camera/proc/cancelCameraAlarm()
alarm_on = 0
for(var/mob/living/silicon/S in mob_list)
@@ -345,6 +346,12 @@
busy = 0
return 0
+/obj/machinery/camera/bullet_act(var/obj/item/projectile/proj)
+ if(proj.damage_type == BRUTE)
+ health = max(0, health - proj.damage)
+ if(!health && status)
+ triggerCameraAlarm()
+ deactivate(null, 1)
/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
var/turf/prev_turf
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index e5544d1d410..3710f3877a5 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -121,9 +121,10 @@
// 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.
+ if(!user.unEquip(W))
+ return
user << "You attach \the [W] into the assembly inner circuits."
upgrades += W
- user.drop_item()
W.loc = src
return
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 759082e598b..0dfc5d045d0 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -105,19 +105,22 @@
var/cameraticks = 0
spawn(0)
- while (U.cameraFollow == target)
- if (U.cameraFollow == null)
+ while(U.cameraFollow == target)
+ if(U.cameraFollow == null)
return
- if (!target.can_track(usr))
+ if(!target.can_track(usr))
U.tracking = 1
- U << "Target is not near any active cameras."
+ if(!cameraticks)
+ U << "Target is not near any active cameras. Attempting to reacquire..."
cameraticks++
if(cameraticks > 9)
U.cameraFollow = null
+ U << "Unable to reacquire, cancelling track..."
tracking = 0
return
else
+ sleep(10)
continue
else
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index e1b05f5c6c8..13ed9276e25 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -47,8 +47,9 @@
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!"
return
+ if(!user.drop_item())
+ 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.")
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index be509355564..76dca06f55e 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -83,6 +83,10 @@
/obj/item/weapon/circuitboard/card/centcom
name = "circuit board (Centcom ID Console)"
build_path = /obj/machinery/computer/card/centcom
+/obj/item/weapon/circuitboard/card/minor
+ name = "circuit board (Department Management Console)"
+ build_path = /obj/machinery/computer/card/minor
+ var/target_dept = 1
//obj/item/weapon/circuitboard/shield
// name = "Circuit board (Shield Control)"
// build_path = /obj/machinery/computer/stationshield
@@ -244,6 +248,13 @@
build_path = /obj/machinery/computer/libraryconsole
origin_tech = "programming=1"
+/obj/item/weapon/circuitboard/card/minor/attackby(obj/item/I as obj, mob/user as mob, params)
+ if(istype(I,/obj/item/device/multitool))
+ var/list/dept_list = list("general","security","medical","science","engineering")
+ var/choice = input("Currently set to [dept_list[target_dept]] personnel database. Changing to:","Multitool-Circuitboard interface") as null|anything in dept_list
+ if(choice)
+ target_dept = dept_list.Find(choice)
+ return
/obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/device/multitool))
@@ -336,11 +347,12 @@
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
+ if(!user.drop_item())
+ return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "You place the circuit board inside the frame."
icon_state = "1"
circuit = P
- user.drop_item()
circuit.add_fingerprint(user)
P.loc = null
else
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 7c682ce9607..4fc88ee1d18 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -6,7 +6,7 @@ var/time_last_changed_position = 0
/obj/machinery/computer/card
name = "identification console"
- desc = "You can use this to change ID's."
+ desc = "You can use this to manage jobs and ID access."
icon_screen = "id"
icon_keyboard = "id_key"
req_one_access = list(access_heads, access_change_ids)
@@ -18,6 +18,7 @@ var/time_last_changed_position = 0
var/printing = null
var/list/region_access = null
var/list/head_subordinates = null
+ var/target_dept = 0 //Which department this computer has access to. 0=all departments
//Cooldown for closing positions in seconds
//if set to -1: No cooldown... probably a bad idea
@@ -48,16 +49,19 @@ var/time_last_changed_position = 0
var/obj/item/weapon/card/id/idcard = O
if(check_access(idcard))
if(!scan)
- usr.drop_item()
+ if(!usr.drop_item())
+ return
idcard.loc = src
scan = idcard
else if(!modify)
- usr.drop_item()
+ if(!usr.drop_item())
+ return
idcard.loc = src
modify = idcard
else
if(!modify)
- usr.drop_item()
+ if(!usr.drop_item())
+ return
idcard.loc = src
modify = idcard
else
@@ -118,7 +122,7 @@ var/time_last_changed_position = 0
dat += "
"
dat += "| Job | Slots | Open job | Close job |
"
var/ID
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
ID = 1
else
ID = 0
@@ -280,14 +284,15 @@ var/time_last_changed_position = 0
else
body = "{Log in}
"
body += "Access Crew Manifest"
- body += "
Job Management"
+ if(!target_dept)
+ body += "
Job Management"
dat = "[header][body]
"
//user << browse(dat, "window=id_com;size=900x520")
//onclose(user, "id_com")
- var/datum/browser/popup = new(user, "id_com", "Identification Card Modifier Console", 900, 620)
+ var/datum/browser/popup = new(user, "id_com", src.name, 900, 620)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
@@ -311,7 +316,8 @@ var/time_last_changed_position = 0
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
modify = I
authenticated = 0
@@ -324,34 +330,41 @@ var/time_last_changed_position = 0
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
scan = I
authenticated = 0
if ("auth")
if ((!( authenticated ) && (scan || (istype(usr, /mob/living/silicon))) && (modify || mode)))
if (check_access(scan))
+ region_access = list()
+ head_subordinates = list()
if(access_change_ids in scan.access)
- authenticated = 2
+ if(target_dept)
+ head_subordinates = get_all_jobs()
+ region_access |= target_dept
+ authenticated = 1
+ else
+ authenticated = 2
+
else
- region_access = list()
- head_subordinates = list()
- if(access_hop in scan.access)
- region_access += 1
- region_access += 6
+ if((access_hop in scan.access) && ((target_dept==1) || !target_dept))
+ region_access |= 1
+ region_access |= 6
get_subordinates("Head of Personnel")
- if(access_rd in scan.access)
- region_access += 4
- get_subordinates("Research Director")
- if(access_ce in scan.access)
- region_access += 5
- get_subordinates("Chief Engineer")
- if(access_cmo in scan.access)
- region_access += 3
- get_subordinates("Chief Medical Officer")
- if(access_hos in scan.access)
- region_access += 2
+ if((access_hos in scan.access) && ((target_dept==2) || !target_dept))
+ region_access |= 2
get_subordinates("Head of Security")
+ if((access_cmo in scan.access) && ((target_dept==3) || !target_dept))
+ region_access |= 3
+ get_subordinates("Chief Medical Officer")
+ if((access_rd in scan.access) && ((target_dept==4) || !target_dept))
+ region_access |= 4
+ get_subordinates("Research Director")
+ if((access_ce in scan.access) && ((target_dept==5) || !target_dept))
+ region_access |= 5
+ get_subordinates("Chief Engineer")
if(region_access)
authenticated = 1
else if ((!( authenticated ) && (istype(usr, /mob/living/silicon))) && (!modify))
@@ -419,7 +432,7 @@ var/time_last_changed_position = 0
if("make_job_available")
// MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -433,7 +446,7 @@ var/time_last_changed_position = 0
if("make_job_unavailable")
// MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS
- if(scan && (access_change_ids in scan.access))
+ if(scan && (access_change_ids in scan.access) && !target_dept)
var/edit_job_target = href_list["job"]
var/datum/job/j = SSjob.GetJob(edit_job_target)
if(!j)
@@ -472,3 +485,30 @@ var/time_last_changed_position = 0
circuit = /obj/item/weapon/circuitboard/card/centcom
req_access = list(access_cent_captain)
+/obj/machinery/computer/card/minor
+ name = "department management console"
+ desc = "You can use this to change ID's for specific departments."
+ icon_screen = "idminor"
+ circuit = /obj/item/weapon/circuitboard/card/minor
+
+/obj/machinery/computer/card/minor/New()
+ ..()
+ var/obj/item/weapon/circuitboard/card/minor/typed_circuit = circuit
+ if(target_dept)
+ typed_circuit.target_dept = target_dept
+ else
+ target_dept = typed_circuit.target_dept
+ var/list/dept_list = list("general","security","medical","science","engineering")
+ name = "[dept_list[target_dept]] department console"
+
+/obj/machinery/computer/card/minor/hos
+ target_dept = 2
+
+/obj/machinery/computer/card/minor/cmo
+ target_dept = 3
+
+/obj/machinery/computer/card/minor/rd
+ target_dept = 4
+
+/obj/machinery/computer/card/minor/ce
+ target_dept = 5
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index ff893a987a0..e2078720d8c 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -76,7 +76,8 @@
/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
if (!src.diskette)
- user.drop_item()
+ if(!user.drop_item())
+ return ..()
W.loc = src
src.diskette = W
user << "You insert [W]."
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 6e94c641b33..21dfa6b0585 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -50,7 +50,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications/Topic(href, href_list)
if(..())
return
- if (src.z > ZLEVEL_STATION)
+ if (src.z > ZLEVEL_CENTCOM) //Can only use on centcom and SS13
usr << "Unable to establish a connection: \black You're too far away from the station!"
return
usr.set_machine(src)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index ef0345be0e5..4c27c1b1552 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -20,9 +20,10 @@
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/med_data/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
scan = O
user << "You insert [O]."
@@ -215,7 +216,8 @@
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
src.scan = I
else if(href_list["logout"])
@@ -509,7 +511,7 @@
else
//Foreach continue //goto(3229)
if(!( src.active2 ))
- src.temp = text("Could not locate record [].", t1)
+ src.temp = text("Could not locate record [].", sanitize(t1))
else
for(var/datum/data/record/E in data_core.general)
if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 5a0cab959e6..7d31061f0ba 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -128,7 +128,7 @@
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
- dat += "| X | [pda.sender] | [pda.recipient] | [pda.message] |
"
+ dat += "| X | [pda.sender] | [pda.recipient] | [pda.message][pda.photo ? "(Photo)":""] |
"
dat += "
"
//Hacking screen.
if(2)
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 48e12d07b80..faba05e021f 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -92,7 +92,8 @@
if(href_list["id"] =="insert" && !istype(inserted_id))
var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "No valid ID."
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index ef936af78b5..4a0aad15867 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -24,9 +24,10 @@
var/order = 1 // -1 = Descending - 1 = Ascending
-/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob, params)
+/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/card/id) && !scan)
- usr.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
scan = O
user << "You insert [O]."
@@ -299,7 +300,8 @@ What a mess.*/
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
scan = I
@@ -519,7 +521,7 @@ What a mess.*/
switch(href_list["field"])
if("name")
if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record))
- var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], null)
+ var/t1 = copytext(sanitize(input("Please input name:", "Secure. records", active1.fields["name"], null) as text),1,MAX_MESSAGE_LEN)
if(!canUseSecurityRecordsConsole(usr, t1, a1))
return
if(istype(active1, /datum/data/record))
diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm
index d20776f350c..29b07601e4f 100644
--- a/code/game/machinery/computer/telecrystalconsoles.dm
+++ b/code/game/machinery/computer/telecrystalconsoles.dm
@@ -39,7 +39,8 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
if(O.hidden_uplink)
var/obj/item/P = user.get_active_hand()
- user.drop_item()
+ if(!user.drop_item())
+ return
uplinkholder = P
P.loc = src
P.add_fingerprint(user)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 5530c7cc5a1..51f432db631 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -108,10 +108,11 @@
return
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "machine")
+ if(!user.drop_item())
+ return
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "You add the circuit board to the frame."
circuit = P
- user.drop_item()
P.loc = src
icon_state = "box_2"
state = 3
@@ -199,6 +200,8 @@
var/success
for(var/I in req_components)
if(istype(P, I) && (req_components[I] > 0))
+ if(!user.drop_item())
+ return
success=1
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CP = P
@@ -211,7 +214,6 @@
req_components[I]--
update_req_desc()
break
- user.drop_item()
P.loc = src
components += P
req_components[I]--
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index f84c488f930..26eb0c3cce5 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -237,9 +237,10 @@
if(beaker)
user << "A beaker is already loaded into [src]!"
return
+ if(!user.drop_item())
+ return
beaker = I
- user.drop_item()
I.loc = src
user.visible_message("[user] places [I] in [src].", \
"You place [I] in [src].")
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 760ac692061..649282f95f1 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -94,6 +94,7 @@
icon = 'icons/obj/doors/vault.dmi'
opacity = 1
doortype = /obj/structure/door_assembly/door_assembly_vault
+ explosion_block = 2
/obj/machinery/door/airlock/glass_large
name = "glass airlock"
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index fdea6d8469f..1b6be79b004 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -50,8 +50,9 @@
else if (istype(W, /obj/item/device/flash/handheld))
if (!bulb)
+ if(!user.drop_item())
+ return
user.visible_message("[user] installs [W] into [src].", "You install [W] into [src].")
- user.drop_item()
W.loc = src
bulb = W
power_change()
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index e5961c09fc9..0c600860d7c 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -77,8 +77,9 @@
if(!isnull(beaker))
user << "There is already a reagent container loaded!"
return
+ if(!user.drop_item())
+ return
- user.drop_item()
W.loc = src
beaker = W
user << "You attach \the [W] to \the [src]."
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 0fd4a100fba..a11ed0d4a47 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -788,7 +788,8 @@ var/list/obj/machinery/newscaster/allCasters = list()
photo = null
if(istype(user.get_active_hand(), /obj/item/weapon/photo))
photo = user.get_active_hand()
- user.drop_item()
+ if(!user.drop_item())
+ return
photo.loc = src
if(istype(user,/mob/living/silicon))
var/list/nametemp = list()
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 9d1be6f4519..96fb5716814 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -72,7 +72,8 @@
add_fingerprint(user)
if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter))
usr << "You put [W] back into [src]."
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(W)
return
else if (istype(W, /obj/item/weapon/wrench))
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 34c13a8bb88..aaef91bc811 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -27,8 +27,9 @@
if(!gun.can_charge)
user << "Your gun has no external power connector."
return
+ if(!user.drop_item())
+ return
- user.drop_item()
G.loc = src
charging = G
use_power = 2
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 5af17c44572..4d88f443d05 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -77,7 +77,8 @@
if(istype(I, /obj/item/weapon/coin))
var/obj/item/weapon/coin/C = I
if(prob(2))
- user.drop_item()
+ if(!user.drop_item())
+ return
C.loc = loc
C.throw_at(user, 3, 10)
if(prob(10))
@@ -85,7 +86,8 @@
user << "[src] spits your coin back out!"
else
- user.drop_item()
+ if(!user.drop_item())
+ return
user << "You insert a [C.cmineral] coin into [src]'s slot!"
balance += C.value
qdel(C)
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index da7f6a82c53..b1891f80539 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -54,7 +54,8 @@
// insert cell
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
- user.drop_item()
+ if(!user.drop_item())
+ return
cell = C
C.loc = src
C.add_fingerprint(usr)
@@ -134,7 +135,8 @@
if(open && !cell)
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
cell = C
C.loc = src
C.add_fingerprint(usr)
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 35a1b38e85c..059b36f6200 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -90,9 +90,10 @@
user << "The cover is screwed on, it won't pry off!"
else if(istype(I, /obj/item/weapon/bombcore))
if(!payload)
+ if(!user.drop_item())
+ return
payload = I
user << "You place [payload] into [src]."
- user.drop_item()
payload.loc = src
else
user << "[payload] is already loaded into [src]! You'll have to remove it first."
diff --git a/code/game/machinery/telecomms/computers/traffic_control.dm b/code/game/machinery/telecomms/computers/traffic_control.dm
index 7dc9517abfc..9d520a5a7d8 100644
--- a/code/game/machinery/telecomms/computers/traffic_control.dm
+++ b/code/game/machinery/telecomms/computers/traffic_control.dm
@@ -168,7 +168,8 @@
var/obj/item/weapon/card/id/I = C.get_active_hand()
if(istype(I))
if(check_access(I))
- C.drop_item()
+ if(!C.drop_item())
+ return
I.loc = src
auth = I
create_log("has logged in.", usr)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index a2d76e96a5a..43820a99b5e 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -170,7 +170,8 @@
return
if(junk_check(W))
if(!iscompartmentfull(user))
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
food_load(W)
user << "You insert [W] into [src]'s chef compartment."
@@ -250,7 +251,8 @@
attack_hand(user)
return
else if(istype(W, /obj/item/weapon/coin) && premium.len > 0)
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
coin = W
user << "You insert [W] into [src]."
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 76508f008ce..05c3b10c069 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -188,7 +188,8 @@
if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp))
if( state in list( 1, 3, 6 ) )
if(!crayon)
- user.drop_item()
+ if(!user.drop_item())
+ return
crayon = W
crayon.loc = src
else
@@ -256,7 +257,8 @@
if(contents.len < 5)
if ( state in list(1, 3) )
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
state = 3
else
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index ec69ca4c4a3..682f81e557f 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -675,7 +675,8 @@
var/obj/item/mecha_parts/mecha_equipment/E = W
spawn()
if(E.can_attach(src))
- user.drop_item()
+ if(!user.drop_item())
+ return
E.attach(src)
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].")
else
@@ -739,9 +740,10 @@
else if(istype(W, /obj/item/weapon/stock_parts/cell))
if(state==4)
if(!src.cell)
+ if(!user.drop_item())
+ return
var/obj/item/weapon/stock_parts/cell/C = W
user << "You install the powercell."
- user.drop_item()
C.forceMove(src)
C.use(C.charge * 0.8)
src.cell = C
diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm
new file mode 100644
index 00000000000..774b9ca799d
--- /dev/null
+++ b/code/game/objects/effects/spawners/structure.dm
@@ -0,0 +1,33 @@
+/*
+Because mapping is already tedious enough this spawner let you spawn generic
+"sets" of objects rather than having to make the same object stack again and
+again.
+*/
+
+/obj/effect/spawner/structure
+ name = "map structure spawner"
+ var/list/spawn_list
+
+/obj/effect/spawner/structure/New()
+ if(spawn_list && spawn_list.len)
+ for(var/i = 1, i <= spawn_list.len, i++)
+ var/to_spawn = spawn_list[i]
+ new to_spawn(get_turf(src))
+ qdel(src)
+
+/obj/effect/spawner/structure/window
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "window_spawner"
+ name = "window spawner"
+ spawn_list = list(
+ /obj/structure/grille,
+ /obj/structure/window/fulltile
+ )
+
+/obj/effect/spawner/structure/window/reinforced
+ name = "reenforced window spawner"
+ icon_state = "rwindow_spawner"
+ spawn_list = list(
+ /obj/structure/grille,
+ /obj/structure/window/reinforced/fulltile
+ )
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index cdedfe0733f..f0f85603f5c 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -379,8 +379,8 @@
M << "Your eyes start to bleed profusely!"
if(prob(50))
if(M.stat != 2)
- M << "You drop what you're holding and clutch at your eyes!"
- M.drop_item()
+ if(M.drop_item())
+ M << "You drop what you're holding and clutch at your eyes!"
M.eye_blurry += 10
M.Paralyse(1)
M.Weaken(2)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 16f19760d7d..6ef0a3fa4f8 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -50,6 +50,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/list/ntrclog = list() //NTRC message log
var/new_ntrc_msg = 0
+ var/image/photo = null //Scanned photo
+
var/noreturn = 0 //whether the PDA can use the Return button, used for the aiPDA chatroom
/obj/item/device/pda/medical
@@ -815,13 +817,15 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(useTC != 2) // Does our recipient have a broadcaster on their level?
U << "ERROR: Cannot reach recipient."
return
- useMS.send_pda_message("[P.owner]","[owner]","[t]")
-
- tnote += "→ To [P.owner]:
[t]
"
- P.tnote += "← From [owner] ([ownjob]):
[t]
"
+ var/msg_ref = useMS.send_pda_message("[P.owner]","[owner]","[t]",photo)
+ var/photo_ref = ""
+ if(photo)
+ photo_ref = "(Photo)"
+ tnote += "→ To [P.owner]:
[t][photo_ref]
"
+ P.tnote += "← From [owner] ([ownjob]):
[t][photo_ref]
"
for(var/mob/M in player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA))
- M.show_message("PDA Message - [owner] -> [P.owner]: [t]")
+ M.show_message("PDA Message - [owner] -> [P.owner]: [t][photo_ref]")
if (!P.silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
@@ -835,9 +839,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
L = get(P, /mob/living/silicon)
if(L)
- L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\" (Reply)"
+ L << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\"[photo_ref] (Reply)"
log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
+ photo = null
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
else
@@ -967,6 +972,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
C.loc = src
user << "You slide \the [C] into \the [src]."
+ else if(istype(C, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = C
+ photo = P.img
+ user << "You scan \the [C]."
return
/obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user as mob)
@@ -1104,6 +1113,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
var/selected = plist[c]
+
+ if(aicamera.aipictures.len>0)
+ var/add_photo = input(user,"Do you want to attach a photo?","Photo","No") as null|anything in list("Yes","No")
+ if(add_photo=="Yes")
+ var/datum/picture/Pic = aicamera.selectpicture(aicamera)
+ src.aiPDA.photo = Pic.fields["img"]
src.aiPDA.create_message(src, selected)
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index f4953c98812..b91db4b5e30 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -349,8 +349,9 @@
for(var/entry in expandables)
if(istype(W,entry))
+ if(!user.unEquip(W))
+ return
bugtype = expandables[entry]
- user.drop_item()
W.loc = src
expansion = W
user << "You add [W] to [src]."
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index c66a93aa4ad..ff6d78c41ef 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -47,7 +47,8 @@
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
if(!diode)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
diode = W
user << "You install a [diode.name] in [src]."
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 4580e823eba..a440715d7a7 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -88,9 +88,10 @@
var/obj/item/weapon/light/L = W
if(L.status == 0) // LIGHT OKAY
if(uses < max_uses)
+ if(!user.unEquip(W))
+ return
AddUses(1)
user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining."
- user.drop_item()
qdel(L)
return
else
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 92ad5697dc7..31f12619e03 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -253,12 +253,14 @@
return
if(!keyslot)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
keyslot = W
else
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
keyslot2 = W
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 8bed318c4ad..c9cf83c17e9 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -608,7 +608,8 @@
return
if(!keyslot)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
keyslot = W
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index fd5cb821462..826853d049e 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -33,7 +33,8 @@
/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
if(!mytape && istype(I, /obj/item/device/tape))
- user.drop_item()
+ if(!user.unEquip(I))
+ return
I.loc = src
mytape = I
user << "You insert [I] into [src]."
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 97ffc5e6307..18e69466fa5 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -20,15 +20,17 @@
return
if(!tank_one)
+ if(!user.unEquip(item))
+ return
tank_one = item
- user.drop_item()
item.loc = src
user << "You attach the tank to the transfer valve."
if(item.w_class > w_class)
w_class = item.w_class
else if(!tank_two)
+ if(!user.unEquip(item))
+ return
tank_two = item
- user.drop_item()
item.loc = src
user << "You attach the tank to the transfer valve."
if(item.w_class > w_class)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 3b9868babac..ed337577622 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -102,28 +102,32 @@
return
if(istype(W, /obj/item/robot_parts/l_leg))
if(src.l_leg) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.l_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_leg))
if(src.r_leg) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.r_leg = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/l_arm))
if(src.l_arm) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.l_arm = W
src.updateicon()
if(istype(W, /obj/item/robot_parts/r_arm))
if(src.r_arm) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.r_arm = W
src.updateicon()
@@ -131,7 +135,8 @@
if(istype(W, /obj/item/robot_parts/chest))
if(src.chest) return
if(W:wires && W:cell)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.chest = W
src.updateicon()
@@ -143,7 +148,8 @@
if(istype(W, /obj/item/robot_parts/head))
if(src.head) return
if(W:flash2 && W:flash1)
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.head = W
src.updateicon()
@@ -190,7 +196,8 @@
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
if(!O) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
O.invisibility = 0
//Transfer debug settings to new mob
@@ -297,7 +304,8 @@
user << "You have already inserted a cell!"
return
else
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
src.cell = W
user << "You insert the cell."
@@ -324,7 +332,8 @@
user << "You can't use a broken flash!"
return
else
- user.drop_item()
+ if(!user.unEquip(W))
+ return
F.loc = src
if(src.flash1)
src.flash2 = F
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 07ea6047cde..5e2e050242a 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -112,7 +112,8 @@ RCD
if((matter + R.ammoamt) > max_matter)
user << "The RCD can't hold any more matter-units!"
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
qdel(W)
matter += R.ammoamt
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
@@ -210,7 +211,7 @@ RCD
if(3)
if(istype(A, /turf/simulated/wall))
- var/turf/simulated/wall/W
+ var/turf/simulated/wall/W = A
if(istype(W, /turf/simulated/wall/r_wall) && !canRwall)
return 0
if(checkResource(5, user))
diff --git a/code/game/objects/items/weapons/airlock_painter.dm b/code/game/objects/items/weapons/airlock_painter.dm
index 2f595b5cba0..9ebce21ee0a 100644
--- a/code/game/objects/items/weapons/airlock_painter.dm
+++ b/code/game/objects/items/weapons/airlock_painter.dm
@@ -63,7 +63,8 @@
if(ink)
user << "\the [name] already contains \a [ink]."
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
user << "You install \the [W] into \the [name]."
ink = W
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index f3dcfbc4b6b..02114500111 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -112,7 +112,8 @@
if(C.maxcharge < paddles.revivecost)
user << "[src] requires a higher capacity cell."
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
bcell = W
user << "You install a cell in [src]."
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index f1d7d6c19c4..9d5f2f0c552 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -69,7 +69,8 @@
user << "You start planting the bomb..."
if(do_after(user, 50) && in_range(user, target))
- user.drop_item()
+ if(!user.unEquip(target))
+ return
src.target = target
loc = null
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 2f89a0d979e..9d1bf16dda2 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -94,7 +94,8 @@
var/obj/item/device/assembly/igniter/I = W
if(I.secured) return
if(igniter) return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
I.loc = src
igniter = I
update_icon()
@@ -104,7 +105,8 @@
if(ptank)
user << "There appears to already be a plasma tank loaded in [src]!"
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
ptank = W
W.loc = src
update_icon()
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index ff1812883aa..e902d388211 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -68,8 +68,9 @@
return
else
if(I.reagents.total_volume)
+ if(!user.unEquip(I))
+ return
user << "You add [I] to the [initial(name)] assembly."
- user.drop_item()
I.loc = src
beakers += I
else
@@ -79,8 +80,9 @@
var/obj/item/device/assembly_holder/A = I
if(isigniter(A.a_left) == isigniter(A.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
return
+ if(!user.unEquip(I))
+ return
- user.drop_item()
nadeassembly = A
A.master = src
A.loc = src
@@ -263,8 +265,9 @@
//make a special case you might as well do it explicitly. -Sayu
/obj/item/weapon/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/slime_extract) && stage == WIRED)
+ if(!user.unEquip(I))
+ return
user << "You add [I] to the [initial(name)] assembly."
- user.drop_item()
I.loc = src
beakers += I
else
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index d43251a2e48..d5e3e66703b 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -49,7 +49,8 @@
/obj/item/weapon/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user)
if(!target.handcuffed)
- user.drop_item()
+ if(!user.drop_item())
+ return
//target.throw_alert("handcuffed", src) // Can't do this because escaping cuffs isn't standardized. Also zipties.
if(trashtype)
target.handcuffed = new trashtype(target)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 97b0a8304ad..b22b7439eae 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -174,15 +174,15 @@
/obj/item/weapon/implant/loyalty/implanted(mob/target)
..()
- if((target.mind in (ticker.mode.head_revolutionaries | ticker.mode.A_bosses | ticker.mode.B_bosses)) || is_shadow_or_thrall(target))
+ if((target.mind in ticker.mode.head_revolutionaries) || 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.A_gang | ticker.mode.B_gang))
- ticker.mode.remove_gangster(target.mind, exclude_bosses=0)
- return 0
if(target.mind in ticker.mode.revolutionaries)
ticker.mode.remove_revolutionary(target.mind)
- target << "You feel a surge of loyalty towards Nanotrasen."
+ if(target.mind in (ticker.mode.cult| ticker.mode.A_bosses | ticker.mode.B_bosses | ticker.mode.A_gang | ticker.mode.B_gang))
+ target << "You feel the corporate tendrils of Nanotrasen try to invade your mind!"
+ else
+ target << "You feel a surge of loyalty towards Nanotrasen."
return 1
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm
index 1720cb073e0..615d719fef3 100644
--- a/code/game/objects/items/weapons/implants/implantpad.dm
+++ b/code/game/objects/items/weapons/implants/implantpad.dm
@@ -36,7 +36,8 @@
..()
if(istype(C, /obj/item/weapon/implantcase))
if(!case)
- user.drop_item()
+ if(!user.unEquip(C))
+ return
C.loc = src
case = C
else
diff --git a/code/game/objects/items/weapons/paiwire.dm b/code/game/objects/items/weapons/paiwire.dm
index 83933cbf4c3..33de9fcba06 100644
--- a/code/game/objects/items/weapons/paiwire.dm
+++ b/code/game/objects/items/weapons/paiwire.dm
@@ -8,8 +8,9 @@
/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))
+ if(!user.drop_item())
+ return
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
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 7ccd3432491..f4af87c3f10 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -61,8 +61,9 @@
if(IW.w_class > src.w_class)
user << "\The [IW] is too large to fit into \the [src]!"
return
+ if(!user.unEquip(W))
+ return
user << "You load \the [IW] into \the [src]."
- user.drop_item()
loadedItems.Add(IW)
loadedWeightClass += IW.w_class
IW.loc = src
@@ -127,9 +128,10 @@
if(src.tank)
user << "\The [src] already has a tank."
return
+ if(!user.unEquip(thetank))
+ return
user << "You hook \the [thetank] up to \the [src]."
src.tank = thetank
- user.drop_item()
thetank.loc = src
src.update_icons()
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 8fc6d771551..40b1ab14670 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -71,7 +71,8 @@
if(C.maxcharge < hitcost)
user << "[src] requires a higher capacity cell."
return
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
bcell = W
user << "You install a cell in [src]."
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 58c98b443d8..71ab242d878 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -128,8 +128,10 @@
/obj/item/weapon/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
var/obj/item/weapon/twohanded/required/H = user.get_inactive_hand()
+ if(get_dist(src,user) > 1)
+ return 0
if(H != null)
- user.visible_message("[src.name] is too cumbersome to carry in one hand!")
+ user << "[src.name] is too cumbersome to carry in one hand!"
return
var/obj/item/weapon/twohanded/offhand/O = new(user)
user.put_in_inactive_hand(O)
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 907b4db38e1..1d24b6485a6 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -41,11 +41,12 @@
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit)
+ if(!user.drop_item())
+ return
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "You place the circuit board inside the frame."
icon_state = "1"
circuit = P
- user.drop_item()
P.loc = src
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -152,11 +153,13 @@
user << "This MMI is mindless!"
return
+ if(!user.drop_item())
+ return
+
ticker.mode.remove_cultist(M.brainmob.mind, 1)
ticker.mode.remove_revolutionary(M.brainmob.mind, 1)
ticker.mode.remove_gangster(M.brainmob.mind, 1)
- user.drop_item()
M.loc = src
brain = M
usr << "Added a brain."
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 37428c37333..073ae4e2e53 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -194,7 +194,8 @@ LINEN BINS
/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/bedsheet))
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
sheets.Add(I)
amount++
diff --git a/code/game/objects/structures/crates_lockers/bins.dm b/code/game/objects/structures/crates_lockers/bins.dm
index edabca55fb7..bbcec247b70 100644
--- a/code/game/objects/structures/crates_lockers/bins.dm
+++ b/code/game/objects/structures/crates_lockers/bins.dm
@@ -84,8 +84,7 @@
/obj/structure/closet/crate/bin/place(var/mob/user, var/obj/item/I)
if(contents.len >= storage_capacity)
return 1
- if(!opened)
- user.drop_item()
+ if(!opened && user.drop_item())
insert(I, 0, 1)
return 1
return 0
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index bf94d93a874..81e2b46d4ca 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -58,8 +58,9 @@
if(O:wielded)
user << "Unwield the axe first."
return
+ if(!user.drop_item())
+ return
fireaxe = O
- user.drop_item()
src.contents += O
user << "You place the fire axe back in the [src.name]."
update_icon()
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index abbf7e51461..14a4fe411bd 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -286,8 +286,9 @@
return
else if(istype(W, /obj/item/device/electropack))
if(rigged)
+ if(!user.drop_item())
+ return
user << "You attach [W] to [src]."
- user.drop_item()
W.loc = src
return
else if(istype(W, /obj/item/weapon/wirecutters))
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index a0fa16da823..4b53bb0e629 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -532,8 +532,9 @@
if(do_after(user, 40))
if( src.state != 1 )
return
+ if(!user.drop_item())
+ return
- user.drop_item()
W.loc = src
user << "You install the airlock electronics."
src.state = 2
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 06c763ffca7..e56bcd0a4ee 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -29,7 +29,8 @@
return
if(istype(O, /obj/item/weapon/extinguisher))
if(!has_extinguisher && opened)
- user.drop_item()
+ if(!user.drop_item())
+ return
contents += O
has_extinguisher = O
user << "You place [O] in [src]."
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index fd324892490..23df00bef19 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -201,7 +201,8 @@
else if(istype(W, /obj/item/pipe))
var/obj/item/pipe/P = W
if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
- user.drop_item()
+ if(!user.drop_item())
+ return
P.loc = src.loc
user << "You fit the pipe into \the [src]."
else
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
index 5793006ba6f..ae8c5b4e861 100644
--- a/code/game/objects/structures/guncase.dm
+++ b/code/game/objects/structures/guncase.dm
@@ -39,7 +39,8 @@
return
if(istype(I, gun_category))
if(contents.len < capacity && open)
- user.drop_item()
+ if(!user.drop_item())
+ return
contents += I
user << "You place [I] in [src]."
update_icon()
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index b5a265e2c76..58aebf4ca25 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -29,7 +29,8 @@
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
/obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
updateUsrDialog()
user << "You put [I] into [src]."
@@ -199,8 +200,9 @@
user << "Hold [I] in one of your hands while you drive this [callme]."
else if(istype(I, /obj/item/weapon/storage/bag/trash))
if(keytype == /obj/item/key/janitor)
+ if(!user.drop_item())
+ return
user << "You hook the trashbag onto the [callme]."
- user.drop_item()
I.loc = src
mybag = I
else if(istype(I, /obj/item/janiupgrade))
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index a5414196e9d..50597091b3b 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -111,14 +111,16 @@
/obj/structure/mirror/magic/New()
if(!choosable_races.len)
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!(S.id in races_blacklist))
- choosable_races += S
+ choosable_races += S.id
..()
/obj/structure/mirror/magic/badmin/New()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
- choosable_races += S
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
+ choosable_races += S.id
..()
/obj/structure/mirror/magic/attack_hand(mob/user as mob)
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index d5997adfda9..7d8591217f6 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -19,9 +19,10 @@
/obj/structure/noticeboard/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/paper))
if(notices < 5)
+ if(!user.drop_item())
+ return
O.add_fingerprint(user)
add_fingerprint(user)
- user.drop_item()
O.loc = src
notices++
icon_state = "nboard0[notices]" //update sprite
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 829d6a6dd44..915f56b9ac0 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -17,8 +17,9 @@
/obj/structure/stool/bed/chair/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/assembly/shock_kit))
+ if(!user.drop_item())
+ return
var/obj/item/assembly/shock_kit/SK = W
- user.drop_item()
var/obj/structure/stool/bed/chair/e_chair/E = new /obj/structure/stool/bed/chair/e_chair(src.loc)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
E.dir = dir
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index f776ab56d7e..b25fa12dd81 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -625,8 +625,9 @@
/obj/item/weapon/rack_parts/attack_self(mob/user as mob)
user << "You start constructing rack..."
if (do_after(user, 50))
+ if(!user.drop_item())
+ return
var/obj/structure/rack/R = new /obj/structure/rack( user.loc )
R.add_fingerprint(user)
- user.drop_item()
qdel(src)
return
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index da9c57601e3..3cc45f3ac5e 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -50,7 +50,8 @@
/obj/structure/dispenser/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/tank/internals/oxygen) || istype(I, /obj/item/weapon/tank/internals/air) || istype(I, /obj/item/weapon/tank/internals/anesthetic))
if(oxygentanks < 10)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
oxytanks.Add(I)
oxygentanks++
@@ -59,7 +60,8 @@
user << "[src] is full."
if(istype(I, /obj/item/weapon/tank/internals/plasma))
if(plasmatanks < 10)
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
platanks.Add(I)
plasmatanks++
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 0048a1cdb28..5e23a7f994f 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -23,11 +23,10 @@
/obj/structure/target_stake/attackby(obj/item/target/T, mob/user)
if(pinned_target)
return
- if(istype(T))
+ if(istype(T) && user.drop_item())
pinned_target = T
T.pinnedLoc = src
T.density = 1
- user.drop_item()
T.layer = OBJ_LAYER + 0.1
T.loc = loc
user << "You slide the target into the stake."
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 8262201bf28..1f41f887adb 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -190,9 +190,10 @@
//Adding airlock electronics for access. Step 6 complete.
else if(istype(W, /obj/item/weapon/airlock_electronics))
+ if(!user.drop_item())
+ return
playsound(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
if(do_after(user, 40))
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index 85755fc867d..abb5c5c4fab 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -63,8 +63,7 @@
if(..())
return
if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles
- if(state)
- user.drop_item()
+ if(state && user.drop_item())
qdel(C)
state = 0 //fixing it by bashing it with a light bulb, fun eh?
update_icon()
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 203d4b7e9a9..f068de3737a 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -399,91 +399,6 @@ var/global/floorIsLava = 0
usr << browse(dat, "window=admin2;size=210x180")
return
-/datum/admins/proc/Secrets()
- if(!check_rights(0)) return
-
- var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse.
"
-
- dat +={"
- General Secrets
-
- Show Job Debug
- Admin Log
- Show Admin List
-
- "}
-
- if(check_rights(R_ADMIN,0))
- dat += {"
- Admin Secrets
-
- Cure all diseases currently in existence
- Bombing List
- Show current traitors and objectives
- Show last [length(lastsignalers)] signalers
- Show last [length(lawchanges)] law changes
- Show AI Laws
- Show Game Mode
- Show Crew Manifest
- List DNA (Blood)
- List Fingerprints
-
- Shuttles
-
- Move Ferry
- Move Mining Shuttle
- Move Labor Shuttle
-
- "}
-
- if(check_rights(R_FUN,0))
- dat += {"
- Fun Secrets
-
- Reset Thunderdome to default state
- Trigger a Virus Outbreak
- Turn all humans into monkeys
- Change the species of all humans
- Make all areas powered
- Make all areas unpowered
- Power all SMES
- Triple AI mode (needs to be used in the lobby)
- Everyone is the traitor
- Summon Guns
- Summon Magic
- Summon Events (Toggle)
- There can only be one!
- Make all players retarded
- Egalitarian Station Mode
- Break all lights
- Fix all lights
- The floor is lava! (DANGEROUS: extremely lame)
-
- "}
-
-/* DEATH SQUADS
-Send in a strike team
-*/
- if(check_rights(R_SERVER,0))
- dat += "Toggle bomb cap
"
-
- dat += "
"
-
- if(check_rights(R_DEBUG,0))
- dat += {"
- Security Level Elevated
-
- Change all maintenance doors to engie/brig access only
- Change all maintenance doors to brig access only
- Remove cap on security officers
-
- "}
-
- usr << browse(dat, "window=secrets")
- return
-
-
-
/////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge
//i.e. buttons/verbs
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
new file mode 100644
index 00000000000..4390f383d8b
--- /dev/null
+++ b/code/modules/admin/secrets.dm
@@ -0,0 +1,612 @@
+/datum/admins/proc/Secrets()
+ if(!check_rights(0)) return
+
+ var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse.
"
+
+ dat +={"
+ General Secrets
+
+ Show Job Debug
+ Admin Log
+ Show Admin List
+
+ "}
+
+ if(check_rights(R_ADMIN,0))
+ dat += {"
+ Admin Secrets
+
+ Cure all diseases currently in existence
+ Bombing List
+ Show current traitors and objectives
+ Show last [length(lastsignalers)] signalers
+ Show last [length(lawchanges)] law changes
+ Show AI Laws
+ Show Game Mode
+ Show Crew Manifest
+ List DNA (Blood)
+ List Fingerprints
+ Reset Thunderdome to default state
+
+ Shuttles
+
+ Move Ferry
+ Move Mining Shuttle
+ Move Labor Shuttle
+
+ "}
+
+ if(check_rights(R_FUN,0))
+ dat += {"
+ Fun Secrets
+
+
+ Trigger a Virus Outbreak
+ Turn all humans into monkeys
+ Change the species of all humans
+ Make all areas powered
+ Make all areas unpowered
+ Power all SMES
+ Triple AI mode (needs to be used in the lobby)
+ Everyone is the traitor
+ Summon Guns
+ Summon Magic
+ Summon Events (Toggle)
+ There can only be one!
+ Make all players retarded
+ Egalitarian Station Mode
+ Break all lights
+ Fix all lights
+ The floor is lava! (DANGEROUS: extremely lame)
+
+ Change bomb cap
+ "}
+
+ dat += "
"
+
+ if(check_rights(R_DEBUG,0))
+ dat += {"
+ Security Level Elevated
+
+ Change all maintenance doors to engie/brig access only
+ Change all maintenance doors to brig access only
+ Remove cap on security officers
+
+ "}
+
+ usr << browse(dat, "window=secrets")
+ return
+
+
+
+
+
+/datum/admins/proc/Secrets_topic(var/item,var/href_list)
+ var/datum/round_event/E
+ var/ok = 0
+ switch(item)
+ if("admin_log")
+ var/dat = "Admin Log
"
+ for(var/l in admin_log)
+ dat += "[l]"
+ if(!admin_log.len)
+ dat += "No-one has done anything this round!"
+ usr << browse(dat, "window=admin_log")
+
+ if("list_job_debug")
+ var/dat = "Job Debug info.
"
+ if(SSjob)
+ for(var/line in SSjob.job_debug)
+ dat += "[line]
"
+ dat+= "*******
"
+ for(var/datum/job/job in SSjob.occupations)
+ if(!job) continue
+ dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
"
+ usr << browse(dat, "window=jobdebug;size=600x500")
+
+ if("show_admins")
+ var/dat = "Current admins:
"
+ if(admin_datums)
+ for(var/ckey in admin_datums)
+ var/datum/admins/D = admin_datums[ckey]
+ dat += "[ckey] - [D.rank.name]
"
+ usr << browse(dat, "window=showadmins;size=600x500")
+
+ if("tdomereset")
+ if(!check_rights(R_ADMIN))
+ return
+ var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
+ if(delete_mobs == "Cancel")
+ return
+
+ log_admin("[key_name(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].", 1)
+ message_admins("[key_name_admin(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].")
+
+ var/area/thunderdome = locate(/area/tdome/arena)
+ if(delete_mobs == "Yes")
+ for(var/mob/living/mob in thunderdome)
+ qdel(mob) //Clear mobs
+ for(var/obj/obj in thunderdome)
+ if(!istype(obj,/obj/machinery/camera))
+ qdel(obj) //Clear objects
+
+ var/area/template = locate(/area/tdome/arena_source)
+ template.copy_contents_to(thunderdome)
+
+ if("clear_virus")
+
+ var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
+ if(choice == "Yes")
+ message_admins("[key_name_admin(usr)] has cured all diseases.")
+ for(var/datum/disease/D in SSdisease.processing)
+ D.cure(D)
+
+ if("list_bombers")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Bombing List
"
+ for(var/l in bombers)
+ dat += text("[l]
")
+ usr << browse(dat, "window=bombers")
+
+ if("list_signalers")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing last [length(lastsignalers)] signalers.
"
+ for(var/sig in lastsignalers)
+ dat += "[sig]
"
+ usr << browse(dat, "window=lastsignalers;size=800x500")
+
+ if("list_lawchanges")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing last [length(lawchanges)] law changes.
"
+ for(var/sig in lawchanges)
+ dat += "[sig]
"
+ usr << browse(dat, "window=lawchanges;size=800x500")
+
+ if("check_antagonist")
+ if(!check_rights(R_ADMIN))
+ return
+ check_antagonists()
+
+ if("moveminingshuttle")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShM")
+ if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
+ message_admins("[key_name_admin(usr)] moved mining shuttle")
+ log_admin("[key_name(usr)] moved the mining shuttle")
+
+ if("movelaborshuttle")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShL")
+ if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
+ message_admins("[key_name_admin(usr)] moved labor shuttle")
+ log_admin("[key_name(usr)] moved the labor shuttle")
+
+ if("moveferry")
+ if(!check_rights(R_ADMIN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","ShF")
+ if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
+ message_admins("[key_name_admin(usr)] moved the centcom ferry")
+ log_admin("[key_name(usr)] moved the centcom ferry")
+
+ if("kick_all_from_lobby")
+ if(!check_rights(R_ADMIN))
+ return
+ if(ticker && ticker.current_state == GAME_STATE_PLAYING)
+ var/afkonly = text2num(href_list["afkonly"])
+ if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
+ usr << "Kick clients from lobby aborted"
+ return
+ var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command.", afkonly)
+ var/strkicked = ""
+ for(var/name in listkicked)
+ strkicked += "[name], "
+ message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
+ log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
+ else
+ usr << "You may only use this when the game is running"
+
+ if("showailaws")
+ if(!check_rights(R_ADMIN))
+ return
+ output_ai_laws()
+ if("showgm")
+ if(!check_rights(R_ADMIN))
+ return
+ if(!ticker)
+ alert("The game hasn't started yet!")
+ else if (ticker.mode)
+ alert("The game mode is [ticker.mode.name]")
+ else alert("For some reason there's a ticker, but not a game mode")
+ if("manifest")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing Crew Manifest.
"
+ dat += "| Name | Position |
"
+ for(var/datum/data/record/t in data_core.general)
+ dat += "| [t.fields["name"]] | [t.fields["rank"]] |
"
+ dat += "
"
+ usr << browse(dat, "window=manifest;size=440x410")
+ if("DNA")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing DNA from blood.
"
+ dat += "| Name | DNA | Blood Type |
"
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(H.dna && H.ckey)
+ dat += "| [H] | [H.dna.unique_enzymes] | [H.blood_type] |
"
+ dat += "
"
+ usr << browse(dat, "window=DNA;size=440x410")
+ if("fingerprints")
+ if(!check_rights(R_ADMIN))
+ return
+ var/dat = "Showing Fingerprints.
"
+ dat += "| Name | Fingerprints |
"
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(H.ckey)
+ if(H.dna && H.dna.uni_identity)
+ dat += "| [H] | [md5(H.dna.uni_identity)] |
"
+ else if(H.dna && !H.dna.uni_identity)
+ dat += "| [H] | H.dna.uni_identity = null |
"
+ else if(!H.dna)
+ dat += "| [H] | H.dna = null |
"
+ dat += "
"
+ usr << browse(dat, "window=fingerprints;size=440x410")
+
+ if("monkey")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","M")
+ for(var/mob/living/carbon/human/H in mob_list)
+ spawn(0)
+ H.monkeyize()
+ ok = 1
+
+ if("allspecies")
+ if(!check_rights(R_FUN))
+ return
+ var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list
+ if(result)
+ log_admin("[key_name(usr)] turned all humans into [result]", 1)
+ message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
+ var/newtype = species_list[result]
+ for(var/mob/living/carbon/human/H in mob_list)
+ hardset_dna(H, null, null, null, null, newtype)
+ H.regenerate_icons()
+
+ if("corgi")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","M")
+ for(var/mob/living/carbon/human/H in mob_list)
+ spawn(0)
+ H.corgize()
+ ok = 1
+
+ if("tripleAI")
+ if(!check_rights(R_FUN))
+ return
+ usr.client.triple_ai()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","TriAI")
+
+ if("power")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","P")
+ log_admin("[key_name(usr)] made all areas powered", 1)
+ message_admins("[key_name_admin(usr)] made all areas powered")
+ power_restore()
+
+ if("unpower")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","UP")
+ log_admin("[key_name(usr)] made all areas unpowered", 1)
+ message_admins("[key_name_admin(usr)] made all areas unpowered")
+ power_failure()
+
+ if("quickpower")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","QP")
+ log_admin("[key_name(usr)] made all SMESs powered", 1)
+ message_admins("[key_name_admin(usr)] made all SMESs powered")
+ power_restore_quick()
+
+ if("traitor_all")
+ if(!check_rights(R_FUN))
+ return
+ if(!ticker)
+ alert("The game hasn't started yet!")
+ return
+ var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
+ if(!objective)
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","TA([objective])")
+ for(var/mob/living/carbon/human/H in player_list)
+ if(H.stat == 2 || !H.client || !H.mind) continue
+ if(is_special_character(H)) continue
+ //traitorize(H, objective, 0)
+ ticker.mode.traitors += H.mind
+ H.mind.special_role = "traitor"
+ var/datum/objective/new_objective = new
+ new_objective.owner = H
+ new_objective.explanation_text = objective
+ H.mind.objectives += new_objective
+ ticker.mode.greet_traitor(H.mind)
+ //ticker.mode.forge_traitor_objectives(H.mind)
+ ticker.mode.finalize_traitor(H.mind)
+ for(var/mob/living/silicon/A in player_list)
+ if(A.stat == 2 || !A.client || !A.mind) continue
+ if(ispAI(A)) continue
+ else if(is_special_character(A)) continue
+ ticker.mode.traitors += A.mind
+ A.mind.special_role = "traitor"
+ var/datum/objective/new_objective = new
+ new_objective.owner = A
+ new_objective.explanation_text = objective
+ A.mind.objectives += new_objective
+ ticker.mode.greet_traitor(A.mind)
+ ticker.mode.finalize_traitor(A.mind)
+ message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]")
+ log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
+
+ if("changebombcap")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","BC")
+
+ var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be between 4 and 128)", "New Bomb Cap", MAX_EX_LIGHT_RANGE) as num|null
+ if (newBombCap < 4)
+ return
+ if (newBombCap > 128)
+ newBombCap = 128
+
+ MAX_EX_DEVESTATION_RANGE = round(newBombCap/4)
+ MAX_EX_HEAVY_RANGE = round(newBombCap/2)
+ MAX_EX_LIGHT_RANGE = newBombCap
+ //I don't know why these are their own variables, but fuck it, they are.
+ MAX_EX_FLASH_RANGE = newBombCap
+ MAX_EX_FLAME_RANGE = newBombCap
+
+ message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
+ log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
+
+
+ if("lightsout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","LO")
+ message_admins("[key_name_admin(usr)] has broke a lot of lights")
+ E = new /datum/round_event/electrical_storm{lightsoutAmount = 2}()
+
+ if("blackout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","BO")
+ message_admins("[key_name_admin(usr)] broke all lights")
+ for(var/obj/machinery/light/L in world)
+ L.broken()
+
+ if("whiteout")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","WO")
+ message_admins("[key_name_admin(usr)] fixed all lights")
+ for(var/obj/machinery/light/L in world)
+ L.fix()
+
+ if("floorlava")
+ if(!check_rights(R_FUN))
+ return
+ if(floorIsLava)
+ usr << "The floor is lava already."
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","LF")
+
+ //Options
+ var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
+ length = min(abs(length), 1200)
+
+ var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
+ damage = min(abs(damage), 100)
+
+ var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
+ if(sure == "Nah")
+ return
+ floorIsLava = 1
+
+ message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.")
+
+ for(var/turf/simulated/floor/F in world)
+ if(F.z == ZLEVEL_STATION)
+ F.name = "lava"
+ F.desc = "The floor is LAVA!"
+ F.overlays += "lava"
+ F.lava = 1
+
+ spawn(0)
+ for(var/i = i, i < length, i++) // 180 = 3 minutes
+ if(damage)
+ for(var/mob/living/carbon/L in living_mob_list)
+ if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
+ var/turf/simulated/floor/F = L.loc
+ if(F.lava)
+ var/safe = 0
+ for(var/obj/structure/O in F.contents)
+ if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
+ safe = 1
+ break
+ if(!safe)
+ L.adjustFireLoss(damage)
+
+
+ sleep(10)
+
+ for(var/turf/simulated/floor/F in world) // Reset everything.
+ if(F.z == ZLEVEL_STATION)
+ F.name = initial(F.name)
+ F.desc = initial(F.desc)
+ F.overlays.Cut()
+ F.lava = 0
+ F.update_icon()
+ floorIsLava = 0
+ return
+
+ if("virus")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","V")
+ switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose"))
+ if("Make Your Own")
+ AdminCreateVirus(usr.client)
+ if("Random")
+ E = new /datum/round_event/disease_outbreak()
+ if("Choose")
+ var/virus = input("Choose the virus to spread", "BIOHAZARD") as null|anything in typesof(/datum/disease)
+ E = new /datum/round_event/disease_outbreak{}()
+ var/datum/round_event/disease_outbreak/DO = E
+ DO.virus_type = virus
+
+ if("retardify")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","RET")
+ for(var/mob/living/carbon/human/H in player_list)
+ H << "You suddenly feel stupid."
+ H.setBrainLoss(60)
+ message_admins("[key_name_admin(usr)] made everybody retarded")
+
+ if("eagles")//SCRAW
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","EgL")
+ for(var/obj/machinery/door/airlock/W in world)
+ if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
+ W.req_access = list()
+ message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
+ priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
+
+ if("guns")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SG")
+ var/survivor_probability = 0
+ switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
+ if("Some Antags")
+ survivor_probability = 25
+ if("All Antags!")
+ survivor_probability = 100
+
+ rightandwrong(0, usr, survivor_probability)
+
+ if("magic")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SM")
+ var/survivor_probability = 0
+ switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
+ if("Some Antags")
+ survivor_probability = 25
+ if("All Antags!")
+ survivor_probability = 100
+
+ rightandwrong(1, usr, survivor_probability)
+
+ if("events")
+ if(!check_rights(R_FUN))
+ return
+ if(!SSevent.wizardmode)
+ if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes")
+ summonevents()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SE")
+
+ else
+ switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing"))
+ if("Intensify Summon Events")
+ summonevents()
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","SE")
+ if("Turn Off Summon Events")
+ SSevent.toggleWizardmode()
+ SSevent.resetFrequency()
+
+ if("dorf")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","DF")
+ for(var/mob/living/carbon/human/B in mob_list)
+ B.facial_hair_style = "Dward Beard"
+ B.update_hair()
+ message_admins("[key_name_admin(usr)] activated dorf mode")
+
+ if("onlyone")
+ if(!check_rights(R_FUN))
+ return
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","OO")
+ usr.client.only_one()
+// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
+
+ if("maint_access_brig")
+ if(!check_rights(R_DEBUG))
+ return
+ for(var/obj/machinery/door/airlock/maintenance/M in world)
+ M.check_access()
+ if (access_maint_tunnels in M.req_access)
+ M.req_access = list(access_brig)
+ message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
+ if("maint_access_engiebrig")
+ if(!check_rights(R_DEBUG))
+ return
+ for(var/obj/machinery/door/airlock/maintenance/M in world)
+ M.check_access()
+ if (access_maint_tunnels in M.req_access)
+ M.req_access = list()
+ M.req_one_access = list(access_brig,access_engine)
+ message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
+ if("infinite_sec")
+ if(!check_rights(R_DEBUG))
+ return
+ var/datum/job/J = SSjob.GetJob("Security Officer")
+ if(!J) return
+ J.total_positions = -1
+ J.spawn_positions = -1
+ message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
+ if(E)
+ E.processing = 0
+ if(E.announceWhen>0)
+ if(alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No") == "No")
+ E.announceWhen = -1
+ E.processing = 1
+ if (usr)
+ log_admin("[key_name(usr)] used secret [item]")
+ if (ok)
+ world << text("A secret has been activated by []!", usr.key)
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index ccf4be2b6b6..d73dce75058 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1812,465 +1812,8 @@
break
return
- else if(href_list["secretsfun"])
- if(!check_rights(R_FUN)) return
- var/datum/round_event/E
- var/ok = 0
- switch(href_list["secretsfun"])
- if("tdomereset")
- var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
- if(delete_mobs == "Cancel")
- return
-
- log_admin("[key_name(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].", 1)
- message_admins("[key_name_admin(usr)] reset the thunderdome to default with delete_mobs==[delete_mobs].")
-
- var/area/thunderdome = locate(/area/tdome/arena)
- if(delete_mobs == "Yes")
- for(var/mob/living/mob in thunderdome)
- qdel(mob) //Clear mobs
- for(var/obj/obj in thunderdome)
- if(!istype(obj,/obj/machinery/camera))
- qdel(obj) //Clear objects
-
- var/area/template = locate(/area/tdome/arena_source)
- template.copy_contents_to(thunderdome)
-
- if("monkey")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","M")
- for(var/mob/living/carbon/human/H in mob_list)
- spawn(0)
- H.monkeyize()
- ok = 1
- if("allspecies")
- var/result = input(usr, "Please choose a new species","Species") as null|anything in species_list
- if(result)
- log_admin("[key_name(usr)] turned all humans into [result]", 1)
- message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
- var/newtype = species_list[result]
- for(var/mob/living/carbon/human/H in mob_list)
- hardset_dna(H, null, null, null, null, newtype)
- H.regenerate_icons()
- if("corgi")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","M")
- for(var/mob/living/carbon/human/H in mob_list)
- spawn(0)
- H.corgize()
- ok = 1
-/* DEATH SQUADS
- if("striketeam")
- if(usr.client.strike_team())
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","Strike")
-*/
- if("tripleAI")
- usr.client.triple_ai()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","TriAI")
- if("power")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","P")
- log_admin("[key_name(usr)] made all areas powered", 1)
- message_admins("[key_name_admin(usr)] made all areas powered")
- power_restore()
- if("unpower")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","UP")
- log_admin("[key_name(usr)] made all areas unpowered", 1)
- message_admins("[key_name_admin(usr)] made all areas unpowered")
- power_failure()
- if("quickpower")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","QP")
- log_admin("[key_name(usr)] made all SMESs powered", 1)
- message_admins("[key_name_admin(usr)] made all SMESs powered")
- power_restore_quick()
- if("traitor_all")
- if(!ticker)
- alert("The game hasn't started yet!")
- return
- var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
- if(!objective)
- return
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","TA([objective])")
- for(var/mob/living/carbon/human/H in player_list)
- if(H.stat == 2 || !H.client || !H.mind) continue
- if(is_special_character(H)) continue
- //traitorize(H, objective, 0)
- ticker.mode.traitors += H.mind
- H.mind.special_role = "traitor"
- var/datum/objective/new_objective = new
- new_objective.owner = H
- new_objective.explanation_text = objective
- H.mind.objectives += new_objective
- ticker.mode.greet_traitor(H.mind)
- //ticker.mode.forge_traitor_objectives(H.mind)
- ticker.mode.finalize_traitor(H.mind)
- for(var/mob/living/silicon/A in player_list)
- if(A.stat == 2 || !A.client || !A.mind) continue
- if(ispAI(A)) continue
- else if(is_special_character(A)) continue
- ticker.mode.traitors += A.mind
- A.mind.special_role = "traitor"
- var/datum/objective/new_objective = new
- new_objective.owner = A
- new_objective.explanation_text = objective
- A.mind.objectives += new_objective
- ticker.mode.greet_traitor(A.mind)
- ticker.mode.finalize_traitor(A.mind)
- message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]")
- log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
- if("togglebombcap")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","BC")
- switch(MAX_EX_LIGHT_RANGE)
- if(14)
- MAX_EX_LIGHT_RANGE = 16
- MAX_EX_HEAVY_RANGE = 8
- MAX_EX_DEVESTATION_RANGE = 4
- if(16)
- MAX_EX_LIGHT_RANGE = 20
- MAX_EX_HEAVY_RANGE = 10
- MAX_EX_DEVESTATION_RANGE = 5
- if(20)
- MAX_EX_LIGHT_RANGE = 28
- MAX_EX_HEAVY_RANGE = 14
- MAX_EX_DEVESTATION_RANGE = 7
- if(28)
- MAX_EX_LIGHT_RANGE = 56
- MAX_EX_HEAVY_RANGE = 28
- MAX_EX_DEVESTATION_RANGE = 14
- if(56)
- MAX_EX_LIGHT_RANGE = 128
- MAX_EX_HEAVY_RANGE = 64
- MAX_EX_DEVESTATION_RANGE = 32
- if(128)
- MAX_EX_LIGHT_RANGE = 14
- MAX_EX_HEAVY_RANGE = 7
- MAX_EX_DEVESTATION_RANGE = 3
- message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
- log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
-
- if("lightsout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","LO")
- message_admins("[key_name_admin(usr)] has broke a lot of lights")
- E = new /datum/round_event/electrical_storm{lightsoutAmount = 2}()
- if("blackout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","BO")
- message_admins("[key_name_admin(usr)] broke all lights")
- for(var/obj/machinery/light/L in world)
- L.broken()
- if("whiteout")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","WO")
- message_admins("[key_name_admin(usr)] fixed all lights")
- for(var/obj/machinery/light/L in world)
- L.fix()
- if("floorlava")
- if(floorIsLava)
- usr << "The floor is lava already."
- return
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","LF")
-
- //Options
- var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num
- length = min(abs(length), 1200)
-
- var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num
- damage = min(abs(damage), 100)
-
- var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah")
- if(sure == "Nah")
- return
- floorIsLava = 1
-
- message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.")
-
- for(var/turf/simulated/floor/F in world)
- if(F.z == ZLEVEL_STATION)
- F.name = "lava"
- F.desc = "The floor is LAVA!"
- F.overlays += "lava"
- F.lava = 1
-
- spawn(0)
- for(var/i = i, i < length, i++) // 180 = 3 minutes
- if(damage)
- for(var/mob/living/carbon/L in living_mob_list)
- if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?!
- var/turf/simulated/floor/F = L.loc
- if(F.lava)
- var/safe = 0
- for(var/obj/structure/O in F.contents)
- if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor!
- safe = 1
- break
- if(!safe)
- L.adjustFireLoss(damage)
-
-
- sleep(10)
-
- for(var/turf/simulated/floor/F in world) // Reset everything.
- if(F.z == ZLEVEL_STATION)
- F.name = initial(F.name)
- F.desc = initial(F.desc)
- F.overlays.Cut()
- F.lava = 0
- F.update_icon()
- floorIsLava = 0
- return
- if("virus")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","V")
- switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose"))
- if("Make Your Own")
- AdminCreateVirus(usr.client)
- if("Random")
- E = new /datum/round_event/disease_outbreak()
- if("Choose")
- var/virus = input("Choose the virus to spread", "BIOHAZARD") as null|anything in typesof(/datum/disease)
- E = new /datum/round_event/disease_outbreak{}()
- var/datum/round_event/disease_outbreak/DO = E
- DO.virus_type = virus
- if("retardify")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","RET")
- for(var/mob/living/carbon/human/H in player_list)
- H << "You suddenly feel stupid."
- H.setBrainLoss(60)
- message_admins("[key_name_admin(usr)] made everybody retarded")
- if("eagles")//SCRAW
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","EgL")
- for(var/obj/machinery/door/airlock/W in world)
- if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
- W.req_access = list()
- message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
- priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
- if("guns")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SG")
- var/survivor_probability = 0
- switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
- if("Some Antags")
- survivor_probability = 25
- if("All Antags!")
- survivor_probability = 100
-
- rightandwrong(0, usr, survivor_probability)
- if("magic")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SM")
- var/survivor_probability = 0
- switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
- if("Some Antags")
- survivor_probability = 25
- if("All Antags!")
- survivor_probability = 100
-
- rightandwrong(1, usr, survivor_probability)
- if("events")
- if(!SSevent.wizardmode)
- if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes")
- summonevents()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SE")
-
- else
- switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing"))
- if("Intensify Summon Events")
- summonevents()
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","SE")
- if("Turn Off Summon Events")
- SSevent.toggleWizardmode()
- SSevent.resetFrequency()
- if("dorf")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","DF")
- for(var/mob/living/carbon/human/B in mob_list)
- B.facial_hair_style = "Dward Beard"
- B.update_hair()
- message_admins("[key_name_admin(usr)] activated dorf mode")
- if("onlyone")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","OO")
- usr.client.only_one()
-// message_admins("[key_name_admin(usr)] has triggered a battle to the death (only one)")
- if(E)
- E.processing = 0
- if(E.announceWhen>0)
- if(alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No") == "No")
- E.announceWhen = -1
- E.processing = 1
- if(usr)
- log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]")
- if (ok)
- world << text("A secret has been activated by []!", usr.key)
-
- else if(href_list["secretsadmin"])
- if(!check_rights(R_ADMIN)) return
-
- var/ok = 0
- switch(href_list["secretsadmin"])
- if("clear_virus")
- var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel")
- if(choice == "Yes")
- message_admins("[key_name_admin(usr)] has cured all diseases.")
- for(var/datum/disease/D in SSdisease.processing)
- D.cure(D)
- if("list_bombers")
- var/dat = "Bombing List
"
- for(var/l in bombers)
- dat += text("[l]
")
- usr << browse(dat, "window=bombers")
- if("list_signalers")
- var/dat = "Showing last [length(lastsignalers)] signalers.
"
- for(var/sig in lastsignalers)
- dat += "[sig]
"
- usr << browse(dat, "window=lastsignalers;size=800x500")
- if("list_lawchanges")
- var/dat = "Showing last [length(lawchanges)] law changes.
"
- for(var/sig in lawchanges)
- dat += "[sig]
"
- usr << browse(dat, "window=lawchanges;size=800x500")
- if("check_antagonist")
- check_antagonists()
-
- if("moveminingshuttle")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShM")
- if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
- message_admins("[key_name_admin(usr)] moved mining shuttle")
- log_admin("[key_name(usr)] moved the mining shuttle")
-
- if("movelaborshuttle")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShL")
- if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
- message_admins("[key_name_admin(usr)] moved labor shuttle")
- log_admin("[key_name(usr)] moved the labor shuttle")
-
- if("moveferry")
- feedback_inc("admin_secrets_fun_used",1)
- feedback_add_details("admin_secrets_fun_used","ShF")
- if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
- message_admins("[key_name_admin(usr)] moved the centcom ferry")
- log_admin("[key_name(usr)] moved the centcom ferry")
-
- if("kick_all_from_lobby")
- if(ticker && ticker.current_state == GAME_STATE_PLAYING)
- var/afkonly = text2num(href_list["afkonly"])
- if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
- usr << "Kick clients from lobby aborted"
- return
- var/list/listkicked = kick_clients_in_lobby("The admin [usr.ckey] issued a 'kick all clients from lobby' command.", afkonly)
- var/strkicked = ""
- for(var/name in listkicked)
- strkicked += "[name], "
- message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
- log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
- else
- usr << "You may only use this when the game is running"
- if("showailaws")
- output_ai_laws()
- if("showgm")
- if(!ticker)
- alert("The game hasn't started yet!")
- else if (ticker.mode)
- alert("The game mode is [ticker.mode.name]")
- else alert("For some reason there's a ticker, but not a game mode")
- if("manifest")
- var/dat = "Showing Crew Manifest.
"
- dat += "| Name | Position |
"
- for(var/datum/data/record/t in data_core.general)
- dat += "| [t.fields["name"]] | [t.fields["rank"]] |
"
- dat += "
"
- usr << browse(dat, "window=manifest;size=440x410")
- if("DNA")
- var/dat = "Showing DNA from blood.
"
- dat += "| Name | DNA | Blood Type |
"
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.dna && H.ckey)
- dat += "| [H] | [H.dna.unique_enzymes] | [H.blood_type] |
"
- dat += "
"
- usr << browse(dat, "window=DNA;size=440x410")
- if("fingerprints")
- var/dat = "Showing Fingerprints.
"
- dat += "| Name | Fingerprints |
"
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.ckey)
- if(H.dna && H.dna.uni_identity)
- dat += "| [H] | [md5(H.dna.uni_identity)] |
"
- else if(H.dna && !H.dna.uni_identity)
- dat += "| [H] | H.dna.uni_identity = null |
"
- else if(!H.dna)
- dat += "| [H] | H.dna = null |
"
- dat += "
"
- usr << browse(dat, "window=fingerprints;size=440x410")
- else
- if (usr)
- log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]")
- if (ok)
- world << text("A secret has been activated by []!", usr.key)
-
- else if(href_list["secretsgeneral"])
- switch(href_list["secretsgeneral"])
- if("spawn_objects")
- var/dat = "Admin Log
"
- for(var/l in admin_log)
- dat += "[l]"
- if(!admin_log.len)
- dat += "No-one has done anything this round!"
- usr << browse(dat, "window=admin_log")
- if("list_job_debug")
- var/dat = "Job Debug info.
"
- if(SSjob)
- for(var/line in SSjob.job_debug)
- dat += "[line]
"
- dat+= "*******
"
- for(var/datum/job/job in SSjob.occupations)
- if(!job) continue
- dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
"
- usr << browse(dat, "window=jobdebug;size=600x500")
- if("show_admins")
- var/dat = "Current admins:
"
- if(admin_datums)
- for(var/ckey in admin_datums)
- var/datum/admins/D = admin_datums[ckey]
- dat += "[ckey] - [D.rank.name]
"
- usr << browse(dat, "window=showadmins;size=600x500")
-
- else if(href_list["secretscoder"])
- if(!check_rights(R_DEBUG)) return
-
- switch(href_list["secretscoder"])
- if("maint_access_brig")
- for(var/obj/machinery/door/airlock/maintenance/M in world)
- M.check_access()
- if (access_maint_tunnels in M.req_access)
- M.req_access = list(access_brig)
- message_admins("[key_name_admin(usr)] made all maint doors brig access-only.")
- if("maint_access_engiebrig")
- for(var/obj/machinery/door/airlock/maintenance/M in world)
- M.check_access()
- if (access_maint_tunnels in M.req_access)
- M.req_access = list()
- M.req_one_access = list(access_brig,access_engine)
- message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.")
- if("infinite_sec")
- var/datum/job/J = SSjob.GetJob("Security Officer")
- if(!J) return
- J.total_positions = -1
- J.spawn_positions = -1
- message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
+ else if(href_list["secrets"])
+ Secrets_topic(href_list["secrets"],href_list)
else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here
src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster.
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index b63a0feefe7..f92ef7dcf84 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -89,10 +89,11 @@
var/mob/M = user
if(isigniter(S.a_left) == isigniter(S.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
return
+ if(!M.drop_item()) //Remove the assembly from your hands
+ return
var/obj/item/device/onetankbomb/R = new /obj/item/device/onetankbomb(loc)
- M.drop_item() //Remove the assembly from your hands
M.remove_from_mob(src) //Remove the tank from your character,in case you were holding it
M.put_in_hands(R) //Equips the bomb if possible, or puts it on the floor.
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index ae08ac4b5ce..b509c744000 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -234,7 +234,8 @@ BLIND // can't see anything
return 0
else
if(user)
- user.drop_item()
+ if(!user.drop_item())
+ return
hastie = I
I.loc = src
if(user && notifyAttach)
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 39658cc78e5..ef549cf4acb 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -196,7 +196,8 @@
var/obj/item/device/flashlight/seclite/S = A
if(can_flashlight)
if(!F)
- user.drop_item()
+ if(!user.unEquip(A))
+ return
user << "You click [S] into place on [src]."
if(S.on)
SetLuminosity(0)
@@ -228,7 +229,8 @@
if(helmetCam)
user << "[src] already has a mounted camera."
return
- user.drop_item()
+ if(!user.unEquip(A))
+ return
helmetCam = new /obj/machinery/camera/portable(src)
helmetCam.assembly = A
A.loc = helmetCam
diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm
index 4eb0c5bf1a7..bed5d08b5f4 100644
--- a/code/modules/events/wizard/race.dm
+++ b/code/modules/events/wizard/race.dm
@@ -10,9 +10,10 @@
var/all_the_same = 0
var/all_species = list()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!S.dangerous_existence)
- all_species += S
+ all_species += speciestype
var/new_species = pick(all_species)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index e3aa865a141..388da344db4 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -22,184 +22,346 @@ Gunshots/explosions/opening doors/less rare audio (done)
/mob/living/carbon/proc/handle_hallucinations()
if(handling_hal)
return
+
+ //Least obvious
+ var/list/minor = list("sounds"=20,"bolts_minor"=10,"whispers"=15,"message"=5)
+ //Something's wrong here
+ var/list/medium = list("hudscrew"=15,"items"=15,"dangerflash"=15,"bolts"=10,"flood"=10,"husks"=10,"battle"=10)
+ //AAAAH
+ var/list/major = list("fake"=10,"death"=5,"xeno"=10,"singulo"=10,"delusion"=10)
+
+ var/grade = 0
+ var/current = list()
+ var/trip_length = 0
+
handling_hal = 1
while(hallucination > 20)
sleep(rand(200,500)/(hallucination/25))
- var/halpick = rand(1,100)
- switch(halpick)
- if(0 to 15)
- //Screwy HUD
- //src << "Screwy HUD"
- hal_screwyhud = pick(1,2,3,3,4,4)
- spawn(rand(100,250))
- hal_screwyhud = 0
- if(16 to 25)
- //Strange items
- //src << "Traitor Items"
- if(!halitem)
- halitem = new
- var/list/slots_free = list(ui_lhand,ui_rhand)
- if(l_hand) slots_free -= ui_lhand
- if(r_hand) slots_free -= ui_rhand
- if(istype(src,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = src
- if(!H.belt) slots_free += ui_belt
- if(!H.l_store) slots_free += ui_storage1
- if(!H.r_store) slots_free += ui_storage2
- if(slots_free.len)
- halitem.screen_loc = pick(slots_free)
- halitem.layer = 50
- switch(rand(1,6))
- if(1) //revolver
- halitem.icon = 'icons/obj/guns/projectile.dmi'
- halitem.icon_state = "revolver"
- halitem.name = "Revolver"
- if(2) //c4
- halitem.icon = 'icons/obj/assemblies.dmi'
- halitem.icon_state = "plastic-explosive0"
- halitem.name = "Mysterious Package"
- if(prob(25))
- halitem.icon_state = "c4small_1"
- if(3) //sword
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "sword1"
- halitem.name = "Sword"
- if(4) //stun baton
- halitem.icon = 'icons/obj/weapons.dmi'
- halitem.icon_state = "stunbaton"
- halitem.name = "Stun Baton"
- if(5) //emag
- halitem.icon = 'icons/obj/card.dmi'
- halitem.icon_state = "emag"
- halitem.name = "Cryptographic Sequencer"
- if(6) //flashbang
- halitem.icon = 'icons/obj/grenade.dmi'
- halitem.icon_state = "flashbang1"
- halitem.name = "Flashbang"
- if(client) client.screen += halitem
- spawn(rand(100,250))
- qdel(halitem)
- if(26 to 40)
- //Flashes of danger
- //src << "Danger Flash"
- if(!halimage)
- var/list/possible_points = list()
- for(var/turf/simulated/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/simulated/floor/target = pick(possible_points)
+ trip_length += 1
+ if(prob(min(20,trip_length*2)))
+ grade = min(3,grade+1)
+ if(prob(20))
+ continue
+ current = list()
+ for(var/a in minor)
+ current[a] = minor[a] * (grade==0?2:1)
+ for(var/b in medium)
+ current[b] = medium[b] * (grade==1?2:1)
+ for(var/c in major)
+ current[c] = major[c] * (grade==2?2:1)
- switch(rand(1,3))
- if(1)
- //src << "Space"
- halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
- if(2)
- //src << "Fire"
- halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
- if(3)
- //src << "C4"
- halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
+ var/halpick = pickweight(current)
-
- if(client) client.images += halimage
- spawn(rand(10,50)) //Only seen for a brief moment.
- if(client) client.images -= halimage
- halimage = null
-
-
- if(41 to 65)
- //Strange audio
- //src << "Strange Audio"
- switch(rand(1,14))
- if(1) src << 'sound/machines/airlock.ogg'
- if(2)
- if(prob(50))src << 'sound/effects/Explosion1.ogg'
- else src << 'sound/effects/Explosion2.ogg'
- if(3) src << 'sound/effects/explosionfar.ogg'
- if(4) src << 'sound/effects/Glassbr1.ogg'
- if(5) src << 'sound/effects/Glassbr2.ogg'
- if(6) src << 'sound/effects/Glassbr3.ogg'
- if(7) src << 'sound/machines/twobeep.ogg'
- if(8) src << 'sound/machines/windowdoor.ogg'
- if(9)
- //To make it more realistic, I added two gunshots (enough to kill)
- src << 'sound/weapons/Gunshot.ogg'
- spawn(rand(10,30))
- src << 'sound/weapons/Gunshot.ogg'
- if(10) src << 'sound/weapons/smash.ogg'
- if(11)
- //Same as above, but with tasers.
- src << 'sound/weapons/Taser.ogg'
- spawn(rand(10,30))
- src << 'sound/weapons/Taser.ogg'
- //Rare audio
- if(12)
-//These sounds are (mostly) taken from Hidden: Source
- var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
- 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
- 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
- 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
- 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
- src << pick(creepyasssounds)
- if(13)
- src << "You feel a tiny prick!"
- if(14)
- src << "Priority Announcement
"
- src << "
The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.
"
- src << sound('sound/AI/shuttledock.ogg')
- if(66 to 70)
- //Flashes of danger
- if(!halbody)
- var/list/possible_points = list()
- for(var/turf/simulated/floor/F in view(src,world.view))
- possible_points += F
- if(possible_points.len)
- var/turf/simulated/floor/target = pick(possible_points)
- switch(rand(1,4))
- if(1)
- halbody = image('icons/mob/human.dmi',target,"husk_l",TURF_LAYER)
- if(2,3)
- halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
- if(4)
- halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
-
- if(client) client.images += halbody
- spawn(rand(50,80)) //Only seen for a brief moment.
- if(client) client.images -= halbody
- halbody = null
- if(71 to 72)
- //Fake death
- src.sleeping = 20
- hal_crit = 1
- hal_screwyhud = 1
- spawn(rand(50,100))
- src.sleeping = 0
- hal_crit = 0
- hal_screwyhud = 0
- if(73 to 75)
- fake_attack()
+ hallucinate(halpick)
handling_hal = 0
+/obj/effect/hallucination
+ invisibility = INVISIBILITY_OBSERVER
+ var/mob/living/carbon/target = null
-/mob/living/carbon/proc/fake_attack()
-// var/list/possible_clones = new/list()
+/obj/effect/hallucination/simple
+ var/image_icon = 'icons/mob/alien.dmi'
+ var/image_state = "alienh_pounce"
+ var/px = 0
+ var/py = 0
+ var/col_mod = null
+ var/image/current_image = null
+ var/image_layer = MOB_LAYER
+ var/active = 1 //qdelery
+
+/obj/effect/hallucination/simple/New(loc,var/mob/living/carbon/T)
+ target = T
+ current_image = GetImage()
+ if(target.client) target.client.images |= current_image
+ return
+
+/obj/effect/hallucination/simple/proc/GetImage()
+ var/image/I = image(image_icon,loc,image_state,image_layer,dir=src.dir)
+ I.pixel_x = px
+ I.pixel_y = py
+ if(col_mod)
+ I.color = col_mod
+ return I
+
+/obj/effect/hallucination/simple/proc/Show(var/update=1)
+ if(active)
+ if(target.client) target.client.images.Remove(current_image)
+ if(update)
+ current_image = GetImage()
+ if(target.client) target.client.images |= current_image
+
+/obj/effect/hallucination/simple/update_icon(var/new_state,var/new_icon,var/new_px=0,var/new_py=0)
+ image_state = new_state
+ if(new_icon)
+ image_icon = new_icon
+ else
+ image_icon = initial(image_icon)
+ px = new_px
+ py = new_py
+ Show()
+
+/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir)
+ Show()
+ return
+
+/obj/effect/hallucination/simple/Destroy()
+ if(target.client) target.client.images.Remove(current_image)
+ active = 0
+
+#define FAKE_FLOOD_EXPAND_TIME 30
+#define FAKE_FLOOD_MAX_RADIUS 7
+
+/obj/effect/hallucination/fake_flood
+ //Plasma/N2O starts flooding from the nearby vent
+ var/list/flood_images = list()
+ var/list/turf/flood_turfs = list()
+ var/image_icon = 'icons/effects/tile_effects.dmi'
+ var/image_state = "plasma"
+ var/radius = 0
+ var/next_expand = 0
+
+/obj/effect/hallucination/fake_flood/New(loc,var/mob/living/carbon/T)
+ ..()
+ target = T
+ for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
+ if(!U.welded)
+ src.loc = U.loc
+ break
+ image_state = pick("plasma","sleeping_agent")
+ flood_images += image(image_icon,src,image_state,MOB_LAYER)
+ flood_turfs += get_turf(src.loc)
+ if(target.client) target.client.images |= flood_images
+ next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
+ SSobj.processing |= src
+
+/obj/effect/hallucination/fake_flood/process()
+ if(next_expand <= world.time)
+ radius++
+ if(radius > FAKE_FLOOD_MAX_RADIUS)
+ qdel(src)
+ Expand()
+ next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
+ return
+
+/obj/effect/hallucination/fake_flood/proc/Expand()
+ if(!flood_turfs) //for qdel
+ return
+ for(var/turf/T in circlerangeturfs(loc,radius))
+ if((T in flood_turfs)|| T.blocks_air)
+ continue
+ flood_images += image(image_icon,T,image_state,MOB_LAYER)
+ flood_turfs += T
+ if(target.client) target.client.images |= flood_images
+ return
+
+/obj/effect/hallucination/fake_flood/Destroy()
+ SSobj.processing.Remove(src)
+ del(flood_turfs)
+ if(target.client) target.client.images.Remove(flood_images)
+ target = null
+ del(flood_images)
+ return
+
+/obj/effect/hallucination/simple/xeno
+ image_icon = 'icons/mob/alien.dmi'
+ image_state = "alienh_pounce"
+
+/obj/effect/hallucination/simple/xeno/New(loc,var/mob/living/carbon/T)
+ ..()
+ name = "alien hunter ([rand(1, 1000)])"
+ return
+
+/obj/effect/hallucination/simple/xeno/throw_at(atom/target, range, speed) // TODO : Make diagonal trhow into proc/property
+ if(!target || !src || (flags & NODROP)) return 0
+
+ src.throwing = 1
+
+ var/dist_x = abs(target.x - src.x)
+ var/dist_y = abs(target.y - src.y)
+ var/dist_travelled = 0
+ var/dist_since_sleep = 0
+
+ var/tdist_x = dist_x;
+ var/tdist_y = dist_y;
+
+ if(dist_x <= dist_y)
+ tdist_x = dist_y;
+ tdist_y = dist_x;
+
+ var/error = tdist_x/2 - tdist_y
+ while(target && (((((dist_x > dist_y) && ((src.x < target.x) || (src.x > target.x))) || ((dist_x <= dist_y) && ((src.y < target.y) || (src.y > target.y))) || (src.x > target.x)) && dist_travelled < range) || !has_gravity(src)))
+
+ if(!src.throwing) break
+ if(!istype(src.loc, /turf)) break
+
+ var/atom/step = get_step(src, get_dir(src,target))
+ if(!step)
+ break
+ src.Move(step, get_dir(src, step))
+ hit_check()
+ error += (error < 0) ? tdist_x : -tdist_y;
+ dist_travelled++
+ dist_since_sleep++
+ if(dist_since_sleep >= speed)
+ dist_since_sleep = 0
+ sleep(1)
+
+
+ src.throwing = 0
+ src.throw_impact(get_turf(src))
+
+ return 1
+
+/obj/effect/hallucination/simple/xeno/throw_impact(A)
+ update_icon("alienh_pounce")
+ if(A == target)
+ target.Weaken(5)
+ target.visible_message("[target] flails around wildly.","[name] pounces on you!")
+
+/obj/effect/hallucination/xeno_attack
+ //Xeno crawls from nearby vent,jumps at you, and goes back in
+ var/obj/machinery/atmospherics/unary/vent_pump/pump = null
+ var/obj/effect/hallucination/simple/xeno/xeno = null
+
+/obj/effect/hallucination/xeno_attack/New(loc,var/mob/living/carbon/T)
+ target = T
+ for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target))
+ if(!U.welded)
+ pump = U
+ break
+ xeno = new(pump.loc,target)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(target,7,1)
+ sleep(10)
+ xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32)
+ xeno.throw_at(pump,7,1)
+ sleep(10)
+ var/xeno_name = xeno.name
+ target << "[xeno_name] begins climbing into the ventilation system..."
+ sleep(10)
+ qdel(xeno)
+ target << "[xeno_name] scrambles into the ventilation ducts!"
+ qdel(src)
+
+/obj/effect/hallucination/singularity_scare
+ //Singularity moving towards you.
+ //todo Hide where it moved with fake space images
+ var/obj/effect/hallucination/simple/singularity/s = null
+
+/obj/effect/hallucination/singularity_scare/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/turf/start = T.loc
+ var/screen_border = pick(SOUTH,EAST,WEST,NORTH)
+ for(var/i = 0,i<11,i++)
+ start = get_step(start,screen_border)
+ s = new(start,target)
+ for(var/i = 0,i<11,i++)
+ sleep(5)
+ s.loc = get_step(get_turf(s),get_dir(s,target))
+ s.Show()
+ s.Eat()
+ qdel(s)
+
+/obj/effect/hallucination/simple/singularity
+ image_icon = 'icons/effects/224x224.dmi'
+ image_state = "singularity_s7"
+ image_layer = 6
+ px = -96
+ py = -96
+
+/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir)
+ var/target_dist = get_dist(src,target)
+ if(target_dist<=3) //"Eaten"
+ target.sleeping = 20
+ target.hal_crit = 1
+ target.hal_screwyhud = 1
+ spawn(rand(50,100))
+ target.sleeping = 0
+ target.hal_crit = 0
+ target.hal_screwyhud = 0
+
+/obj/effect/hallucination/battle
+
+/obj/effect/hallucination/battle/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/hits = rand(3,6)
+ switch(rand(1,5))
+ if(1) //Laser fight
+ for(var/i=0,i[my_target] has attacked [src]!")
src.health -= P.force
-
-
return
/obj/effect/fake_attacker/Crossed(var/mob/M, somenumber)
@@ -266,20 +425,18 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/mob/O in oviewers(world.view , my_target))
O << "[my_target] stumbles around."
-/obj/effect/fake_attacker/New()
+/obj/effect/fake_attacker/New(loc,var/mob/living/carbon/T)
..()
+ my_target = T
spawn(300)
- if(my_target)
- my_target.hallucinations -= src
qdel(src)
step_away(src,my_target,2)
- spawn attack_loop()
+ spawn(0)
+ attack_loop()
/obj/effect/fake_attacker/proc/updateimage()
// del src.currentimage
-
-
if(src.dir == NORTH)
del src.currentimage
src.currentimage = new /image(up,src)
@@ -356,3 +513,251 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank)
+
+/obj/effect/hallucination/bolts
+ var/list/doors = list()
+
+/obj/effect/hallucination/bolts/New(loc,var/mob/living/carbon/T,var/door_number=-1) //-1 for sever 1-2 for subtle
+ target = T
+ var/image/I = null
+ var/count = 0
+ for(var/obj/machinery/door/airlock/A in range(target,7))
+ if(count>door_number && door_number>0)
+ break
+ count++
+ I = image(A.icon,A,"door_locked",layer=A.layer+0.1)
+ doors += I
+ if(target.client)
+ target.client.images |= I
+ sleep(2)
+ sleep(100)
+ for(var/image/B in doors)
+ if(target.client)
+ target.client.images.Remove(B)
+ qdel(src)
+
+/obj/effect/hallucination/whispers
+
+/obj/effect/hallucination/whispers/New(loc,var/mob/living/carbon/T)
+ target = T
+ var/speak_messages = list("I'm watching you...","[target.name]!","Go away!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","Honk!","HELP!!")
+ var/radio_messages = list("Xenos!","Singularity loose!","They are arming the nuke!","They butchered Ian!","H-help!","[pick(teleportlocs)]!!","Where's [target.name]?","Call the shuttle!")
+
+ var/list/mob/living/carbon/people = list()
+ var/list/mob/living/carbon/person = null
+ for(var/mob/living/carbon/H in view(target))
+ if(H == target)
+ continue
+ if(!person)
+ person = H
+ else
+ if(get_dist(target,H)The light burns you!", \
+ "You don't feel like yourself.", \
+ "Unknown has punched [target]!", \
+ "You hear something squeezing through the ducts...", \
+ "You hear a distant scream.", \
+ "You feel invincible, nothing can hurt you!", \
+ "[target] sneezes.", \
+ "You feel faint.", \
+ "You hear a strange, alien voice in your head...[pick("Hiss","Ssss")]", \
+ "You can see...everything!")
+ target << chosen
+ qdel(src)
+
+/mob/living/carbon/proc/hallucinate(var/hal_type) // Todo -> proc / defines
+ switch(hal_type)
+ if("xeno")
+ new /obj/effect/hallucination/xeno_attack(src.loc,src)
+ if("singulo")
+ new /obj/effect/hallucination/singularity_scare(src.loc,src)
+ if("battle")
+ new /obj/effect/hallucination/battle(src.loc,src)
+ if("flood")
+ new /obj/effect/hallucination/fake_flood(src.loc,src)
+ if("delusion")
+ new /obj/effect/hallucination/delusion(src.loc,src)
+ if("fake")
+ new /obj/effect/hallucination/fakeattacker(src.loc,src)
+ if("bolts")
+ new /obj/effect/hallucination/bolts(src.loc,src)
+ if("bolts_minor")
+ new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2))
+ if("whispers")
+ new /obj/effect/hallucination/whispers(src.loc,src)
+ if("message")
+ new /obj/effect/hallucination/message(src.loc,src)
+ if("sounds")
+ //Strange audio
+ //src << "Strange Audio"
+ switch(rand(1,18))
+ if(1) src << 'sound/machines/airlock.ogg'
+ if(2)
+ if(prob(50))src << 'sound/effects/Explosion1.ogg'
+ else src << 'sound/effects/Explosion2.ogg'
+ if(3) src << 'sound/effects/explosionfar.ogg'
+ if(4) src << 'sound/effects/Glassbr1.ogg'
+ if(5) src << 'sound/effects/Glassbr2.ogg'
+ if(6) src << 'sound/effects/Glassbr3.ogg'
+ if(7) src << 'sound/machines/twobeep.ogg'
+ if(8) src << 'sound/machines/windowdoor.ogg'
+ if(9)
+ //To make it more realistic, I added two gunshots (enough to kill)
+ src << 'sound/weapons/Gunshot.ogg'
+ spawn(rand(10,30))
+ src << 'sound/weapons/Gunshot.ogg'
+ if(10) src << 'sound/weapons/smash.ogg'
+ if(11)
+ //Same as above, but with tasers.
+ src << 'sound/weapons/Taser.ogg'
+ spawn(rand(10,30))
+ src << 'sound/weapons/Taser.ogg'
+ //Rare audio
+ if(12)
+ //These sounds are (mostly) taken from Hidden: Source
+ var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
+ 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
+ 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
+ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
+ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
+ src << pick(creepyasssounds)
+ if(13)
+ src << "You feel a tiny prick!"
+ if(14)
+ src << "Priority Announcement
"
+ src << "
The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.
"
+ src << sound('sound/AI/shuttledock.ogg')
+ if(15)
+ src << 'sound/items/Welder.ogg'
+ if(16)
+ src << 'sound/items/Screwdriver.ogg'
+ if(17)
+ src << 'sound/weapons/saberon.ogg'
+ if(18)
+ src << 'sound/weapons/saberoff.ogg'
+ if("hudscrew")
+ //Screwy HUD
+ //src << "Screwy HUD"
+ hal_screwyhud = pick(1,2,3,3,4,4)
+ spawn(rand(100,250))
+ hal_screwyhud = 0
+ if("items")
+ //Strange items
+ //src << "Traitor Items"
+ if(!halitem)
+ halitem = new
+ var/list/slots_free = list(ui_lhand,ui_rhand)
+ if(l_hand) slots_free -= ui_lhand
+ if(r_hand) slots_free -= ui_rhand
+ if(istype(src,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = src
+ if(!H.belt) slots_free += ui_belt
+ if(!H.l_store) slots_free += ui_storage1
+ if(!H.r_store) slots_free += ui_storage2
+ if(slots_free.len)
+ halitem.screen_loc = pick(slots_free)
+ halitem.layer = 50
+ switch(rand(1,6))
+ if(1) //revolver
+ halitem.icon = 'icons/obj/guns/projectile.dmi'
+ halitem.icon_state = "revolver"
+ halitem.name = "Revolver"
+ if(2) //c4
+ halitem.icon = 'icons/obj/assemblies.dmi'
+ halitem.icon_state = "plastic-explosive0"
+ halitem.name = "Mysterious Package"
+ if(prob(25))
+ halitem.icon_state = "c4small_1"
+ if(3) //sword
+ halitem.icon = 'icons/obj/weapons.dmi'
+ halitem.icon_state = "sword1"
+ halitem.name = "Sword"
+ if(4) //stun baton
+ halitem.icon = 'icons/obj/weapons.dmi'
+ halitem.icon_state = "stunbaton"
+ halitem.name = "Stun Baton"
+ if(5) //emag
+ halitem.icon = 'icons/obj/card.dmi'
+ halitem.icon_state = "emag"
+ halitem.name = "Cryptographic Sequencer"
+ if(6) //flashbang
+ halitem.icon = 'icons/obj/grenade.dmi'
+ halitem.icon_state = "flashbang1"
+ halitem.name = "Flashbang"
+ if(client) client.screen += halitem
+ spawn(rand(100,250))
+ qdel(halitem)
+ if("dangerflash")
+ //Flashes of danger
+ //src << "Danger Flash"
+ if(!halimage)
+ var/list/possible_points = list()
+ for(var/turf/simulated/floor/F in view(src,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/simulated/floor/target = pick(possible_points)
+
+ switch(rand(1,3))
+ if(1)
+ //src << "Space"
+ halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
+ if(2)
+ //src << "Fire"
+ halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
+ if(3)
+ //src << "C4"
+ halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
+
+
+ if(client) client.images += halimage
+ spawn(rand(10,50)) //Only seen for a brief moment.
+ if(client) client.images -= halimage
+ halimage = null
+ if("death")
+ //Fake death
+ src.sleeping = 20
+ hal_crit = 1
+ hal_screwyhud = 1
+ spawn(rand(50,100))
+ src.sleeping = 0
+ hal_crit = 0
+ hal_screwyhud = 0
+ if("husks")
+ if(!halbody)
+ var/list/possible_points = list()
+ for(var/turf/simulated/floor/F in view(src,world.view))
+ possible_points += F
+ if(possible_points.len)
+ var/turf/simulated/floor/target = pick(possible_points)
+ switch(rand(1,4))
+ if(1)
+ var/image/body = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ var/matrix/M = matrix()
+ M.Turn(90)
+ body.transform = M
+ halbody = body
+ if(2,3)
+ halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
+ if(4)
+ halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
+
+ if(client) client.images += halbody
+ spawn(rand(50,80)) //Only seen for a brief moment.
+ if(client) client.images -= halbody
+ halbody = null
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food&drinks/food/customizables.dm
index 7f9387b9865..c2aa2849c0a 100644
--- a/code/modules/food&drinks/food/customizables.dm
+++ b/code/modules/food&drinks/food/customizables.dm
@@ -44,7 +44,8 @@
else if((ingredients.len >= ingMax) || (reagents.total_volume >= volume))
user << "You can't add more ingredients to [src]!"
else
- user.drop_item()
+ if(!user.unEquip(I))
+ return
if(S.trash)
new S.trash(get_turf(user))
S.trash = null //we remove the plate before adding the ingredient
diff --git a/code/modules/food&drinks/kitchen machinery/food_cart.dm b/code/modules/food&drinks/kitchen machinery/food_cart.dm
index fdae544a1b9..1cff6be4b82 100644
--- a/code/modules/food&drinks/kitchen machinery/food_cart.dm
+++ b/code/modules/food&drinks/kitchen machinery/food_cart.dm
@@ -63,7 +63,8 @@
if(istype(O, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
var/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/DG = O
if(!DG.reagents.total_volume) //glass is empty
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(DG)
glasses++
user << "The [src] accepts the drinking glass, sterilizing it."
@@ -72,7 +73,8 @@
user << "The [src] is at full capacity."
else
var/obj/item/weapon/reagent_containers/food/snacks/S = O
- user.drop_item()
+ if(!user.drop_item())
+ return
S.loc = src
if(stored_food[sanitize(S.name)])
stored_food[sanitize(S.name)]++
diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
index bb88e5ec867..fc6a899f5b0 100644
--- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
+++ b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
@@ -60,7 +60,8 @@
if(target.stat == 0)
user << "The monkey is struggling far too much to put it in the recycler."
else
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(target)
user << "You stuff the monkey in the machine."
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 3722cdda67f..38c9be4e471 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -897,7 +897,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()
+ user.unEquip(src)
src.visible_message("[user] squashes the [src.name].","You hear a smack.")
qdel(src)
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index b22c6d40087..298ebdcf61c 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -63,7 +63,8 @@
if(2)
if(is_type_in_list(I, allowed_books))
- user.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
update_icon()
else if(istype(I, /obj/item/weapon/storage/bag/books))
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index c9d885d8f29..f5dc638ee49 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -447,7 +447,8 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
/obj/machinery/libraryscanner/attackby(var/obj/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/book))
- user.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
/obj/machinery/libraryscanner/attack_hand(var/mob/user as mob)
@@ -505,7 +506,8 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
if(busy)
user << "The book binder is busy. Please wait for completion of previous operation."
return
- user.drop_item()
+ if(!user.drop_item())
+ return
O.loc = src
user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].")
src.visible_message("[src] begins to hum as it warms up its printing drums.")
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 1dd002229be..265238f483c 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -89,7 +89,8 @@
if(istype(W,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I) && !istype(inserted_id))
- usr.drop_item()
+ if(!user.drop_item())
+ return
I.loc = src
inserted_id = I
interact(user)
@@ -184,7 +185,8 @@
else if(href_list["choice"] == "insert")
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "No valid ID."
@@ -333,7 +335,8 @@
else if(href_list["choice"] == "insert")
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "No valid ID."
@@ -356,7 +359,8 @@
if(istype(I,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = usr.get_active_hand()
if(istype(C) && !istype(inserted_id))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
C.loc = src
inserted_id = C
interact(user)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index e9dc6f7d14f..366ade4a6de 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -86,7 +86,8 @@
else if(href_list["choice"] == "insert")
var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand()
if(istype(I))
- usr.drop_item()
+ if(!usr.drop_item())
+ return
I.loc = src
inserted_id = I
else usr << "Invalid ID."
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index 4f0e74aff4c..e9befa30d43 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -60,8 +60,9 @@
..()
if (istype(W, /obj/item/weapon/coin))
var/obj/item/weapon/coin/C = W
+ if(!user.drop_item())
+ return
user << "You add the [C.name] into the bag."
- usr.drop_item()
contents += C
if (istype(W, /obj/item/weapon/moneybag))
var/obj/item/weapon/moneybag/C = W
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index 211cadcdf97..edb420703b4 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -11,7 +11,8 @@
/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/ore))
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
if (istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 95838e1b90d..ffb73ef359f 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -41,6 +41,8 @@
user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain!"
return
+ if(!user.unEquip(src))
+ return
var/mob/living/carbon/brain/B = newbrain.brainmob
if(!B.key)
var/mob/dead/observer/ghost = B.get_ghost()
@@ -58,7 +60,6 @@
dead_mob_list -= brainmob //Update dem lists
living_mob_list += brainmob
- user.drop_item()
newbrain.loc = src //P-put your brain in it
brain = newbrain
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 357bc610e14..c99b39e3995 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -79,7 +79,7 @@
if(2)
say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!", "port ba[pick("y", "i", "e")] med!!!!", "REVIRT GON CHEM!!!!!!!!", "youed call her a toeugh bithc", "closd for merbegging", "pray can u [pick("spawn", "MAke me", "creat")] [pick("zenomorfs", "ayleins", "treaitors", "sheadow linkgs", "ubdoocters")]???"))
if(3)
- say(pick("GEY AWAY FROM ME U GREIFING PRICK!!!!", "ur a fuckeing autist!", ";HELP SHITECIRTY MURDERIN MEE!!!", "hwat dose tha [pick("g", "squid", "r")] mean?????", "CAL; TEH SHUTTLE!!!!!", "wearnig siNGUARLTY IS .... FIne xDDDDDDDDD", "AI laW 22 Open door", "this SI mY stATIon......", "who the HELL do u thenk u r?!!!!", "geT THE FUCK OUTTTT", "H U G B O X", ";;CRAGING THIS STTAYTION WITH NIO SURVIVROS", "[pick("bager", "syebl")] is down11!!!!!!!!!!!!!!!!!"))
+ say(pick("GEY AWAY FROM ME U GREIFING PRICK!!!!", "ur a fuckeing autist!", ";HELP SHITECIRTY MURDERIN MEE!!!", "hwat dose tha [pick("g", "squid", "r")] mean?????", "CAL; TEH SHUTTLE!!!!!", "wearnig siNGUARLTY IS .... FIne xDDDDDDDDD", "AI laW 22 Open door", "this SI mY stATIon......", "who the HELL do u thenk u r?!!!!", "geT THE FUCK OUTTTT", "H U G B O X", ";;CRAGING THIS STTAYTION WITH NIO SURVIVROS", "[pick("bager", "syebl")] is down11!!!!!!!!!!!!!!!!!", "PSHOOOM"))
if(4)
emote("drool")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index a59914466bf..9ac7837148a 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -375,10 +375,6 @@
else
hallucination -= 2
- else
- for(var/atom/a in hallucinations)
- qdel(a)
-
//this handles hud updates. Calls update_vision() and handle_hud_icons()
/mob/living/carbon/handle_regular_hud_updates()
if(!client) return 0
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 59436c1028b..6509db4ac67 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -17,8 +17,6 @@
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
- var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
-
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index a35b0988bca..e37ac76c526 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -450,7 +450,8 @@
else if(cell)
user << "There is a power cell already installed!"
else
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
cell = W
user << "You insert the power cell."
@@ -525,27 +526,29 @@
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
if(!opened)
- usr << "You must access the borgs internals!"
+ user << "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!"
+ user << "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!"
+ user << "The upgrade is locked and cannot be used yet!"
else
+ if(!user.drop_item())
+ return
if(U.action(src))
- usr << "You apply the upgrade to [src]."
- usr.drop_item()
+ user << "You apply the upgrade to [src]."
U.loc = src
else
- usr << "Upgrade error."
+ user << "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!"
+ user << "The toner level of [src] is at it's highest level possible!"
else
+ if(!user.drop_item())
+ return
toner = 40
- usr.drop_item()
qdel(W)
- usr << "You fill the toner level of [src] to its max capacity."
+ user << "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.
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index ac8e32ecf63..8ae11c8f83c 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -28,7 +28,8 @@
/obj/item/weapon/clipboard/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/paper))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
toppaper = W
user << "You clip the paper onto \the [src]."
@@ -76,7 +77,8 @@
if(!haspen)
if(istype(usr.get_active_hand(), /obj/item/weapon/pen))
var/obj/item/weapon/pen/W = usr.get_active_hand()
- usr.drop_item()
+ if(!usr.unEquip(W))
+ return
W.loc = src
haspen = W
usr << "You slot [W] into [src]."
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 351443ec5bb..4d071708fb3 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -43,8 +43,9 @@
/obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/documents))
+ if(!user.drop_item())
+ return
user << "You put [P] in [src]."
- user.drop_item()
P.loc = src
icon_state = "[initial(icon_state)]-open"
sleep(5)
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index b75140b9c43..6f725e04187 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -31,7 +31,8 @@
/obj/item/weapon/folder/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo) || istype(W, /obj/item/documents))
- user.drop_item()
+ if(!user.unEquip(W))
+ return
W.loc = src
user << "You put [W] into [src]."
update_icon()
diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm
index 96c8f83e2b0..bd947c4b7a3 100644
--- a/code/modules/paperwork/handlabeler.dm
+++ b/code/modules/paperwork/handlabeler.dm
@@ -55,8 +55,9 @@
/obj/item/weapon/hand_labeler/attackby(obj/item/I as obj, mob/user as mob, params)
..()
if(istype(I, /obj/item/hand_labeler_refill))
+ if(!user.unEquip(I))
+ return
user << "You insert [I] into [src]."
- user.drop_item()
qdel(I)
labels_left = initial(labels_left)
return
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index fbad5ce1f85..dd672a6d11c 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -71,7 +71,8 @@
if(!istype(i))
return ..()
- user.drop_item()
+ if(!user.unEquip(i))
+ return
i.loc = src
user << "You put [i] in [src]."
papers.Add(i)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 9159c1a6e6a..d5efcbe8dd4 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -24,6 +24,9 @@
pressure_resistance = 2
var/colour = "black" //what colour the ink is!
+/obj/item/weapon/pen/suicide_act(mob/user)
+ user.visible_message("[user] is scribbling numbers all over themself with [src]! It looks like they're trying to commit sudoku!")
+ return(BRUTELOSS)
/obj/item/weapon/pen/blue
desc = "It's a normal blue ink pen."
@@ -93,19 +96,25 @@
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(max(0,ticker.mode.B_gang.len - ticker.mode.A_gang.len))
- else
- user << "This mind is resistant to recruitment!"
+ var/recruitable = ticker.mode.add_gangster(M.mind,"A")
+ switch(recruitable)
+ if(2)
+ M.Paralyse(5)
+ cooldown(max(0,ticker.mode.B_gang.len - ticker.mode.A_gang.len))
+ if(1)
+ user << "This mind has already been recruited by another gang!"
+ 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(max(0,ticker.mode.A_gang.len - 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!"
+ var/recruitable = ticker.mode.add_gangster(M.mind,"B")
+ switch(recruitable)
+ if(2)
+ M.Paralyse(5)
+ cooldown(max(0,ticker.mode.A_gang.len - ticker.mode.B_gang.len))
+ if(1)
+ user << "This mind has already been recruited by another gang!"
+ else
+ user << "This mind is resistant to recruitment!"
/obj/item/weapon/pen/gang/proc/cooldown(modifier)
cooldown = 1
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 92f82705db9..35e87edada7 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -223,7 +223,8 @@
/obj/machinery/photocopier/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/paper))
if(copier_empty())
- user.drop_item()
+ if(!user.drop_item())
+ return
copy = O
O.loc = src
user << "You insert [O] into [src]."
@@ -234,7 +235,8 @@
else if(istype(O, /obj/item/weapon/photo))
if(copier_empty())
- user.drop_item()
+ if(!user.drop_item())
+ return
photocopy = O
O.loc = src
user << "You insert [O] into [src]."
@@ -245,7 +247,8 @@
else if(istype(O, /obj/item/device/toner))
if(toner <= 0)
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(O)
toner = 40
user << "You insert [O] into [src]."
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 378ec945f85..0832ab226f3 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -140,8 +140,9 @@
if(pictures_left)
user << "[src] still has some film in it!"
return
+ if(!user.unEquip(I))
+ return
user << "You insert [I] into [src]."
- user.drop_item()
qdel(I)
pictures_left = pictures_max
return
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 7ddb67eefeb..c57cd9b9875 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -413,7 +413,8 @@
if (stat & MAINT)
user << "There is no connector for your power cell!"
return
- user.drop_item()
+ if(!user.drop_item())
+ return
W.loc = src
cell = W
user.visible_message(\
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 00eb9f8c827..3608dde2b80 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -347,6 +347,8 @@
src.add_fingerprint(user)
var/obj/item/weapon/light/L = W
if(istype(L, light_type))
+ if(!user.drop_item())
+ return
status = L.status
user << "You insert the [L.name]."
switchcount = L.switchcount
@@ -355,7 +357,6 @@
on = has_power()
update()
- user.drop_item() //drop the item to update overlays and such
qdel(L)
if(on && rigged)
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 3202414ffb7..82c2955ad09 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -64,7 +64,8 @@ var/global/list/rad_collectors = list()
if(src.P)
user << "There's already a plasma tank loaded!"
return 1
- user.drop_item()
+ if(!user.drop_item())
+ return 1
src.P = W
W.loc = src
update_icons()
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 85d8089d926..9a30df83891 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -25,6 +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
+ var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
allow_spin = 0
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
@@ -129,6 +130,8 @@
var/temp_allowed_size = src.allowed_size
if(force_size)
temp_allowed_size = force_size
+ if(temp_allowed_size >= STAGE_SIX && !consumedSupermatter)
+ temp_allowed_size = STAGE_FIVE
switch(temp_allowed_size)
if(STAGE_ONE)
current_size = STAGE_ONE
@@ -185,6 +188,15 @@
grav_pull = 10
consume_range = 4
dissipate = 0 //It cant go smaller due to e loss
+ if(STAGE_SIX) //This only happens if a stage 5 singulo consumes a supermatter shard.
+ current_size = STAGE_SIX
+ icon = 'icons/effects/352x352.dmi'
+ icon_state = "singularity_s11"
+ pixel_x = -160
+ pixel_y = -160
+ grav_pull = 15
+ consume_range = 5
+ dissipate = 0
if(current_size == allowed_size)
investigate_log("grew to size [current_size]","singulo")
return 1
@@ -199,6 +211,8 @@
investigate_log("collapsed.","singulo")
qdel(src)
return 0
+ if(energy > 2999 && !consumedSupermatter)
+ energy = 2000
switch(energy)//Some of these numbers might need to be changed up later -Mport
if(1 to 199)
allowed_size = STAGE_ONE
@@ -208,8 +222,10 @@
allowed_size = STAGE_THREE
if(1000 to 1999)
allowed_size = STAGE_FOUR
- if(2000 to INFINITY)
+ if(2000 to 2999)
allowed_size = STAGE_FIVE
+ if(3000 to INFINITY)
+ allowed_size = STAGE_SIX
if(current_size != allowed_size)
expand()
return 1
@@ -230,6 +246,11 @@
/obj/singularity/proc/consume(var/atom/A)
var/gain = A.singularity_act(current_size)
src.energy += gain
+ if(istype(A, /obj/machinery/power/supermatter_shard) && !consumedSupermatter)
+ desc = "[initial(desc)] It glows fiercely with inner fire."
+ name = "supermatter-charged [initial(name)]"
+ consumedSupermatter = 1
+ luminosity = 10
return
@@ -326,6 +347,10 @@
toxmob()
if(4)//Stun mobs who lack optic scanners
mezzer()
+ if(5,6) //Sets all nearby mobs on fire
+ if(current_size < STAGE_SIX)
+ return 0
+ combust_mobs()
else
return 0
return 1
@@ -347,6 +372,15 @@
return
+/obj/singularity/proc/combust_mobs()
+ for(var/mob/living/carbon/C in orange(20, src))
+ C.visible_message("[C]'s skin bursts into flame!", \
+ "You feel an inner fire as your skin is suddenly covered in fire!")
+ C.adjust_fire_stacks(5)
+ C.IgniteMob()
+ return
+
+
/obj/singularity/proc/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(istype(M, /mob/living/carbon/brain)) //Ignore brains
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 1c8838e4311..38bf1d6c869 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -253,8 +253,9 @@
if(!tracker)
if(istype(W, /obj/item/weapon/tracker_electronics))
+ if(!user.drop_item())
+ return
tracker = 1
- user.drop_item()
qdel(W)
user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.")
return 1
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index a48cff67f93..dfab6aa6c08 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -187,6 +187,7 @@
return 1
+/obj/machinery/power/supermatter_shard
/obj/machinery/power/supermatter_shard/bullet_act(var/obj/item/projectile/Proj)
var/turf/L = loc
@@ -205,6 +206,16 @@
damage += Proj.damage * config_bullet_energy
return 0
+/obj/machinery/power/supermatter_shard/singularity_act()
+ var/gain = 100
+ investigate_log("Supermatter shard consumed by singularity.","singulo")
+ message_admins("Singularity has consumed a supermatter shard and can now become stage six.")
+ visible_message("[src] is consumed by the singularity!")
+ for(var/mob/M in mob_list)
+ M << 'sound/effects/supermatter.ogg' //everyone goan know bout this
+ M << "A horrible screeching fills your ears, and a wave of dread washes over you..."
+ qdel(src)
+ return(gain)
/obj/machinery/power/supermatter_shard/attack_paw(mob/user as mob)
return attack_hand(user)
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 2f41a03fb5b..5afe311cb22 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -244,7 +244,8 @@
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
user << "You pop the safety cap off of [src]."
else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
- user.drop_item()
+ if(!user.unEquip(A))
+ return
A.loc = BB
BB.damage = 5
BB.nodamage = 0
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 218091d4206..f07d767f967 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -134,6 +134,17 @@
..()
icon_state = "45-[ammo_count() ? "8" : "0"]"
+/obj/item/ammo_box/magazine/uzim9mm
+ name = "uzi magazine (9mm)"
+ icon_state = "uzi9mm-32"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 32
+
+/obj/item/ammo_box/magazine/uzim9mm/update_icon()
+ ..()
+ icon_state = "uzi9mm-[round(ammo_count(),4)]"
+
/obj/item/ammo_box/magazine/smgm9mm
name = "SMG magazine (9mm)"
icon_state = "smg9mm-20"
@@ -157,11 +168,11 @@
..()
icon_state = "c20r45-[round(ammo_count(),2)]"
-obj/item/ammo_box/magazine/tommygunm9mm
- name = "drum magazine (9mm)"
+obj/item/ammo_box/magazine/tommygunm45
+ name = "drum magazine (.45)"
icon_state = "drum45"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
max_ammo = 50
/obj/item/ammo_box/magazine/m50
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 9b1666fd2f0..dd9c381e2d6 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -98,8 +98,8 @@
if(heavy_weapon)
if(user.get_inactive_hand())
if(prob(15))
- user.visible_message("[src] flies out of [user]'s hands!", "[src] kicks out of your grip!")
- user.drop_item()
+ if(user.drop_item())
+ user.visible_message("[src] flies out of [user]'s hands!", "[src] kicks out of your grip!")
/obj/item/weapon/gun/emp_act(severity)
for(var/obj/O in contents)
@@ -235,7 +235,8 @@
if(user.l_hand != src && user.r_hand != src)
user << "You'll need [src] in your hands to do that!"
return
- user.drop_item()
+ if(!user.unEquip(A))
+ return
user << "You click [S] into place on [src]."
if(S.on)
SetLuminosity(0)
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm
index 9ae8b1e8c6f..2075ebeaa60 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/grenade_launcher.dm
@@ -20,7 +20,8 @@
if((istype(I, /obj/item/weapon/grenade)))
if(grenades.len < max_grenades)
- user.drop_item()
+ if(!user.unEquip(I))
+ return
I.loc = src
grenades += I
user << "You put the grenade in the grenade launcher."
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 66184119b45..7bea46b2f96 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -68,7 +68,8 @@
if(user.l_hand != src && user.r_hand != src)
user << "You'll need [src] in your hands to do that."
return
- user.drop_item()
+ if(!user.unEquip(A))
+ return
user << "You screw [S] onto [src]."
suppressed = A
S.oldsound = fire_sound
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index badf178b878..19545232181 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -106,7 +106,13 @@
icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
return
-
+/obj/item/weapon/gun/projectile/automatic/mini_uzi
+ name = "uzi"
+ desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds."
+ icon_state = "mini-uzi"
+ origin_tech = "combat=5;materials=2;syndicate=8"
+ mag_type = /obj/item/ammo_box/magazine/uzim9mm
+ burst_size = 2
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "syndicate LMG"
@@ -237,7 +243,7 @@
w_class = 5
slot_flags = 0
origin_tech = "combat=5;materials=1;syndicate=2"
- mag_type = /obj/item/ammo_box/magazine/tommygunm9mm
+ mag_type = /obj/item/ammo_box/magazine/tommygunm45
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
burst_size = 4
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 7178c36469f..9e1dc22e592 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -79,7 +79,7 @@
playsound(user, fire_sound, 50, 1)
user << "[src] blows up in your face!"
user.take_organ_damage(0,20)
- user.drop_item()
+ user.unEquip(src)
qdel(src)
return 0
..()
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index f0a17314848..6ed12b01b64 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -63,7 +63,8 @@
/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()
+ if(!user.unEquip(A))
+ return
user << "You load [A] into \the [src]."
syringes.Add(A)
A.loc = src
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index acc5f311420..123e35a2fd8 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -30,7 +30,8 @@
user << "You remove [G]'s old pin."
if(!G.pin)
- user.drop_item()
+ if(!user.unEquip(src))
+ return
gun_insert(user, G)
user << "You insert [src] into [G]."
else
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 93579b5f0d8..8fc1a4622f9 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -108,7 +108,6 @@
loc = target_turf
if(A)
permutated.Add(A)
- Range()
return 0
else
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.
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index e87808254e6..00cd2fc1a42 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -30,6 +30,7 @@
icon_state = "xray"
damage = 15
irradiate = 30
+ range = 15
forcedodge = 1
/obj/item/projectile/beam/disabler
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 75ba81b7dc1..efc20cedfd7 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -227,9 +227,10 @@
ready_dna(H)
if(H.dna && prob(50))
var/list/all_species = list()
- for(var/datum/species/S in typesof(/datum/species) - /datum/species)
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
if(!S.dangerous_existence)
- all_species += S
+ all_species += speciestype
hardset_dna(H, null, null, null, null, pick(all_species))
H.update_icons()
else
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 3dab9a3442a..0fbb8ee12b3 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -155,9 +155,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine!"
return
+ if(!user.drop_item())
+ return
src.beaker = B
- user.drop_item()
B.loc = src
user << "You add the beaker to the machine."
SSnano.update_uis(src) // update all UIs attached to src
@@ -290,8 +291,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine!"
return
+ if(!user.drop_item())
+ return
+
src.beaker = B
- user.drop_item()
B.loc = src
user << "You add the beaker to the machine."
src.updateUsrDialog()
@@ -301,8 +304,10 @@
if(src.loaded_pill_bottle)
user << "A pill bottle is already loaded into the machine!"
return
+ if(!user.drop_item())
+ return
+
src.loaded_pill_bottle = B
- user.drop_item()
B.loc = src
user << "You add the pill bottle into the dispenser slot."
src.updateUsrDialog()
@@ -619,8 +624,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine!"
return
+ if(!user.drop_item())
+ return
+
src.beaker = B
- user.drop_item()
B.loc = src
user << "You add the beaker to the machine."
src.updateUsrDialog()
@@ -630,8 +637,10 @@
if(src.loaded_pill_bottle)
user << "A pill bottle is already loaded into the machine!"
return
+ if(!user.drop_item())
+ return
+
src.loaded_pill_bottle = B
- user.drop_item()
B.loc = src
user << "You add the pill bottle into the dispenser slot."
src.updateUsrDialog()
@@ -919,9 +928,10 @@
if(src.beaker)
user << "A beaker is already loaded into the machine!"
return
+ if(!user.drop_item())
+ return
src.beaker = I
- user.drop_item()
I.loc = src
user << "You add the beaker to the machine."
src.updateUsrDialog()
@@ -1053,8 +1063,9 @@
if (beaker)
return 1
else
+ if(!user.drop_item())
+ return 1
src.beaker = O
- user.drop_item()
O.loc = src
update_icon()
src.updateUsrDialog()
@@ -1548,8 +1559,9 @@
if (beaker)
return 1
else
+ if(!user.drop_item())
+ return 1
src.beaker = O
- user.drop_item()
O.loc = src
update_icon()
src.updateUsrDialog()
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 4ef5f0d72ed..553f6c9cfbc 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -157,7 +157,8 @@
/obj/structure/reagent_dispensers/water_cooler/attackby(var/obj/item/I, var/mob/user, params)
if(istype(I, /obj/item/weapon/paper))
- user.drop_item()
+ if(!user.drop_item())
+ return
qdel(I)
cups++
return
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index d3fa4a658a6..74f51bf24e2 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -123,9 +123,9 @@
stuff_mob_in(G.affecting, user)
return
- if(!I || I.flags & NODROP) return
+ if(!user.drop_item())
+ return
- user.drop_item()
I.loc = src
user.visible_message("[user.name] places \the [I] into \the [src].", \
"You place \the [I] into \the [src].")
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index be722fe8fb0..9663bf9b2cd 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -152,9 +152,10 @@
if(O.reliability < 90 && O.crit_fail == 0)
usr << "Item is neither reliable enough or broken enough to learn from."
return
+ if(!user.drop_item())
+ return
busy = 1
loaded_item = O
- user.drop_item()
O.loc = src
user << "You add the [O.name] to the machine."
flick("h_lathe_load", src)
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 2df53886ab3..6c584bc1a15 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -17,8 +17,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
var/recipient = "Unspecified" //name of the person
var/sender = "Unspecified" //name of the sender
var/message = "Blank" //transferred message
+ var/image/photo = null //Attached photo
-/datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "")
+/datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "",var/param_photo=null)
if(param_rec)
recipient = param_rec
@@ -26,6 +27,19 @@ var/global/list/obj/machinery/message_server/message_servers = list()
sender = param_sender
if(param_message)
message = param_message
+ if(param_photo)
+ photo = param_photo
+
+/datum/data_pda_msg/Topic(href,href_list)
+ ..()
+ if(href_list["photo"])
+ var/mob/M = usr
+ M << browse_rsc(photo, "pda_photo.png")
+ M << browse("PDA Photo" \
+ + "" \
+ + "
" \
+ + "", "window=book;size=192x192")
+ onclose(M, "PDA Photo")
/datum/data_rc_msg
var/rec_dpt = "Unspecified" //name of the person
@@ -105,8 +119,9 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/proc/send_chat_message(var/sender = "", var/channel = "", var/message = "")
chat_msgs += new/datum/data_chat_msg(sender,channel,message)
-/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
- pda_msgs += new/datum/data_pda_msg(recipient,sender,message)
+/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "",var/photo=null)
+ . = new/datum/data_pda_msg(recipient,sender,message,photo)
+ pda_msgs += .
/obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1)
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 3182c0156d0..a194ed5327f 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -157,7 +157,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else
user << "Machine cannot accept disks in that format."
return
- user.drop_item()
+ if(!user.drop_item())
+ return
D.loc = src
user << "You add the disk to the machine!"
else
diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm
index 3f4dcb5210c..ced4776f535 100644
--- a/code/modules/surgery/cybernetic_implants.dm
+++ b/code/modules/surgery/cybernetic_implants.dm
@@ -70,9 +70,10 @@
if(full)
user << "You can't seem to implant anything else into the [target]'s [target_zone]!"
else
+ if(!user.drop_item())
+ return
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()
target.internal_organs |= implant
implant.loc = target
\ No newline at end of file
diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb augmentation.dm
index 950c4a536b0..22d168044c0 100644
--- a/code/modules/surgery/limb augmentation.dm
+++ b/code/modules/surgery/limb augmentation.dm
@@ -71,6 +71,8 @@
user << "That is the wrong robotic limb for this body part."
return 0
+ if(!user.drop_item())
+ return 0
var/mob/living/carbon/human/H = target
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)
@@ -92,7 +94,6 @@
H.organs += new /obj/item/organ/limb/robot/chest(src)
for(var/datum/disease/appendicitis/A in H.viruses) //If they already have Appendicitis, Remove it
A.cure(1)
- user.drop_item()
qdel(tool)
H.update_damage_overlays(0)
H.update_augments() //Gives them the Cyber limb overlay
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index c006939d876..74b9807dade 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -21,7 +21,7 @@
PoolOrNew(/obj/effect/effect/sparks, loc)
playsound(src.loc, "sparks", 50, 1)
blink_mob(user)
- user.drop_item()
+ user.unEquip(src)
qdel(src)
/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L)
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index aa0343a1641..0450b8109c1 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -58,7 +58,8 @@
if(crystals.len >= max_crystals)
user << "There are not enough crystal slots."
return
- user.drop_item()
+ if(!user.drop_item())
+ return
crystals += W
W.loc = null
user.visible_message("[user] inserts [W] into \the [src]'s crystal slot.", "You insert [W] into \the [src]'s crystal slot.")
diff --git a/config/game_options.txt b/config/game_options.txt
index ed44c926e10..9c62544f085 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -280,3 +280,18 @@ MIDROUND_ANTAG_LIFE_CHECK 0.7
//Uncomment for explosions that react to doors and walls
REACTIONARY_EXPLOSIONS
+### Configure the bomb cap
+## This caps all explosions to the specified range. Used for both balance reasons and to prevent overloading the server and lagging the game out.
+## This is given as the 3rd number(light damage) in the standard (1,2,3) explosion notation. The other numbers are derived by dividing by 2 and 4.
+## eg: If you give the number 20. The bomb cap will be 5,10,20.
+## Can be any number between 4 and 128, some examples are provided below.
+
+## Default (3,7,14)
+BOMBCAP 14
+## One 'step' up (4,8,16) (recommended if you enable REACTIONARY_EXPLOSIONS above)
+#BOMBCAP 16
+## LagHell (7,14,28)
+#BOMBCAP 28
+
+
+
diff --git a/config/tips.txt b/config/tips.txt
index dd6b2f23f85..04ea4ab50d0 100644
--- a/config/tips.txt
+++ b/config/tips.txt
@@ -85,3 +85,6 @@ You can use . or # instead of : for radio channels. Building this habit reduces
While pulling something, clicking on a tile with an empty hand will move 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.
+If you stay out of camera range for 10 seconds, the AI's track on you will break.
+You can shoot cameras with bullets to disable them remotely.
+Disabling a camera with wirecutters will not cause a camera alarm, but bludgeoning it will.
diff --git a/html/changelog.html b/html/changelog.html
index 6845a7e00f6..457de93df40 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,31 @@
-->
+
18 June 2015
+
AnturK updated:
+
+ - Added new photo-over-pda function. Apply the photo to PDA to send it with your next message!
+
+
Ikarrus updated:
+
+ - Department Management consoles have been added to Head of Staff offices. These will enable heads to modify ID's access to their department, as well as preform demotions.
+
+
Miauw updated:
+
+ - Bullets can now damage cameras.
+ - Camera alarms now trigger 90 seconds after the first EMP pulse, instead of when all EMP pulses run out.
+ - Makes the force required to damage cameras greater than or equal to ten instead of greater than ten.
+ - Camera alarms now trigger when cameras are disabled with brute force or bullets.
+
+
Xhuis updated:
+
+ - Nanotrasen scientists have determined that a delaminating supermatter shard combining with a gravitational singularity is an extremely bad idea. They advise keeping the two as far apart as possible.
+
+
phil235 updated:
+
+ - Nerfed the xray gun. Its range is now 15 tiles.
+
+
15 June 2015
Incoming5643 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index a366f49f229..bd40cc75ed7 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2774,3 +2774,25 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Added a new sepia slime plasma reaction. Try it out!
spasticVerbalizer:
- rscfix: Drones can now properly quick-equip.
+2015-06-18:
+ AnturK:
+ - rscadd: Added new photo-over-pda function. Apply the photo to PDA to send it with
+ your next message!
+ Ikarrus:
+ - rscadd: Department Management consoles have been added to Head of Staff offices.
+ These will enable heads to modify ID's access to their department, as well as
+ preform demotions.
+ Miauw:
+ - tweak: Bullets can now damage cameras.
+ - tweak: Camera alarms now trigger 90 seconds after the first EMP pulse, instead
+ of when all EMP pulses run out.
+ - tweak: Makes the force required to damage cameras greater than or equal to ten
+ instead of greater than ten.
+ - tweak: Camera alarms now trigger when cameras are disabled with brute force or
+ bullets.
+ Xhuis:
+ - rscadd: Nanotrasen scientists have determined that a delaminating supermatter
+ shard combining with a gravitational singularity is an extremely bad idea. They
+ advise keeping the two as far apart as possible.
+ phil235:
+ - rscdel: Nerfed the xray gun. Its range is now 15 tiles.
diff --git a/html/changelogs/Ikarrus-gangimplants.yml b/html/changelogs/Ikarrus-gangimplants.yml
new file mode 100644
index 00000000000..000f9bd487f
--- /dev/null
+++ b/html/changelogs/Ikarrus-gangimplants.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# spellcheck (typo fixes)
+# experiment
+# tgs (TG-ported fixes?)
+#################################
+
+# Your name.
+author: Ikarrus
+
+# 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:
+ - rscdel: "Loyalty implants now treat gangs as it treats cultis. Implants can no longer deconvert gangsters, but it can still prevent recruitments."
+ - tweak: "Replaced tommy guns with 9mm 2-burst 32 mag uzis that costs 40 influence. Unlike tommy guns gangs will be able to purchase ammo for uzis."
\ No newline at end of file
diff --git a/icons/effects/352x352.dmi b/icons/effects/352x352.dmi
new file mode 100644
index 00000000000..86b40959d56
Binary files /dev/null and b/icons/effects/352x352.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 3258cb936d1..a0f217d1887 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 567fa80e5a7..6c8fd8bc903 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index c613bee4949..26e097b66bf 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 682103c7dcb..f7d418e6fcb 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 44ced44807d..befe563aa7b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -553,6 +553,7 @@
#include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm"
#include "code\game\objects\effects\spawners\lootdrop.dm"
+#include "code\game\objects\effects\spawners\structure.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm"
@@ -804,6 +805,7 @@
#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm"
+#include "code\modules\admin\secrets.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\DB ban\functions.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"