diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index c05e74a467a..043a47a02ad 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -50,8 +50,8 @@ CREATE TABLE `characters` ( `eyes_red` smallint(4) NOT NULL, `eyes_green` smallint(4) NOT NULL, `eyes_blue` smallint(4) NOT NULL, - `underwear` smallint(4) NOT NULL, - `undershirt` smallint(4) NOT NULL, + `underwear` mediumtext NOT NULL, + `undershirt` mediumtext NOT NULL, `backbag` smallint(4) NOT NULL, `b_type` varchar(45) NOT NULL, `alternate_option` smallint(4) NOT NULL, @@ -438,4 +438,21 @@ CREATE TABLE `whitelist` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +-- +-- Table structure for table `watch` +-- + +DROP TABLE IF EXISTS `erro_watch`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `erro_watch` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ckey` varchar(32) NOT NULL, + `reason` text NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- Dump completed on 2013-03-24 18:02:35 + -- Dump completed on 2015-05-28 19:57:44 diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 422689148ee..e24dc3825bc 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -663,7 +663,7 @@ "amM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/security/main) "amN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor,/area/security/main) "amO" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=1"; dir = 1; freq = 1400; location = "Security"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint) -"amP" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/obj/machinery/camera/xray{c_tag = "Brig Escape Pod"; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/fsmaint) +"amP" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Security Pod"; dir = 2; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "amQ" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/escape_pod3/station) "amR" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod3/station) "amS" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod3/station) @@ -1353,7 +1353,7 @@ "aAa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "neutral"; dir = 9},/area/crew_quarters/fitness) "aAb" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{icon_state = "neutral"; dir = 5},/area/crew_quarters/fitness) "aAc" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) -"aAd" = (/obj/machinery/requests_console{department = "Crew Quarters"; name = "Crew Quarters Requests Console"; pixel_y = 30},/obj/machinery/camera/xray{c_tag = "Dormitories North"; network = list("SS13")},/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) +"aAd" = (/obj/machinery/requests_console{department = "Crew Quarters"; name = "Crew Quarters Requests Console"; pixel_y = 30},/obj/machinery/vending/cigarette,/obj/machinery/camera{c_tag = "Dormitories North"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) "aAe" = (/obj/machinery/vending/cola,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) "aAf" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) "aAg" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) @@ -1369,7 +1369,7 @@ "aAq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/security/prison/cell_block/C) "aAr" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aAs" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fsmaint2) -"aAt" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Fore Starboard Solar APC"; pixel_x = -25; pixel_y = 3},/turf/simulated/floor/plating,/area/solar/auxstarboard) +"aAt" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Fore Starboard Solar APC"; pixel_x = -25; pixel_y = 3},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aAu" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aAv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry) "aAw" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -1464,7 +1464,7 @@ "aCh" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1450; master_tag = "bar_maint"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless/catwalk,/area/space) "aCi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/crew_quarters/fitness) "aCj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/fitness) -"aCk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/camera/xray{c_tag = "Fitness Rooms North"; network = list("SS13")},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) +"aCk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/machinery/camera{c_tag = "Fitness Rooms North"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) "aCl" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/fitness) "aCm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/crew_quarters/fitness) "aCn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) @@ -1582,7 +1582,7 @@ "aEv" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"}) "aEw" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "aEx" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_1_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_1_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) -"aEy" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light{dir = 1},/obj/machinery/camera/xray{c_tag = "Arrivals Escape Pods"},/turf/simulated/floor,/area/hallway/secondary/entry) +"aEy" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Arrivals Escape Pods"; dir = 2},/turf/simulated/floor,/area/hallway/secondary/entry) "aEz" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_2_berth"; pixel_x = -25; pixel_y = 30; tag_door = "escape_pod_2_berth_hatch"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry) "aEA" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry) "aEB" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry) @@ -1661,13 +1661,13 @@ "aFW" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aFX" = (/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aFY" = (/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aFZ" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aFZ" = (/obj/machinery/camera/motion{c_tag = "EVA Northwest"; dir = 2; network = list("SS13")},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva) "aGa" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aGb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/vending/eva,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aGc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aGd" = (/obj/machinery/power/apc{dir = 1; name = "EVA APC"; pixel_x = 3; pixel_y = 23},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) "aGe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aGf" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aGf" = (/obj/machinery/camera{c_tag = "EVA Northeast"; dir = 2; network = list("SS13")},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) "aGg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aGh" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aGi" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) @@ -2198,7 +2198,7 @@ "aQn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aQo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen) "aQp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/wall,/area/crew_quarters/kitchen) -"aQq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) +"aQq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Kitchen Maintenance"; req_access_txt = "28"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aQr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Kitchen"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/fsmaint2) "aQs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aQt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) @@ -2265,9 +2265,9 @@ "aRC" = (/obj/item/clothing/suit/space/eva/mime,/obj/item/clothing/head/helmet/space/eva/mime,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aRD" = (/obj/item/clothing/suit/space/eva/clown,/obj/item/clothing/head/helmet/space/eva/clown,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aRE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aRF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/ai_monitored/storage/eva) +"aRF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "EVA Soutwest"; dir = 1; network = list("SS13")},/turf/simulated/floor,/area/ai_monitored/storage/eva) "aRG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aRH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA South"; dir = 1; network = list("SS13")},/turf/simulated/floor,/area/ai_monitored/storage/eva) +"aRH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA Southeast"; dir = 1; network = list("SS13")},/turf/simulated/floor,/area/ai_monitored/storage/eva) "aRI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) "aRJ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) "aRK" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/flora/kirbyplants,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north) @@ -2299,7 +2299,7 @@ "aSk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hydroponics) "aSl" = (/turf/simulated/wall,/area/hydroponics) "aSm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/wall,/area/hydroponics) -"aSn" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/hydroponics) +"aSn" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Hydroponics Maintenance"; req_access_txt = "35"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aSo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hydroponics) "aSp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/maintenance/electrical) "aSq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -3662,7 +3662,7 @@ "bsv" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/exit) "bsw" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/entry) "bsx" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bsy" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/solar/starboard) +"bsy" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "bsz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bsA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/port) "bsB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/port) @@ -3881,7 +3881,7 @@ "bwG" = (/obj/machinery/power/apc{dir = 1; name = "Bridge Maintenance APC"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/maintcentral) "bwH" = (/obj/effect/decal/cleanable/generic,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/port) "bwI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room) -"bwJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/account_database{anchored = 1},/obj/machinery/camera{c_tag = "Head of Personnel's Office Back Room"; dir = 2; network = list("SS13")},/turf/simulated/floor,/area/bridge/meeting_room) +"bwJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/computer/account_database{anchored = 1},/turf/simulated/floor,/area/bridge/meeting_room) "bwK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/bridge/meeting_room) "bwL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/bridge/meeting_room) "bwM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/lattice,/turf/space,/area/space) @@ -3976,7 +3976,7 @@ "byx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/maintcentral) "byy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room) "byz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/bridge/meeting_room) -"byA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/bridge/meeting_room) +"byA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Gravity Generator Room South"; dir = 8; network = list("SS13")},/turf/simulated/floor,/area/bridge/meeting_room) "byB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/bridge/meeting_room) "byC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/space) "byD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/space,/area/space) @@ -4306,7 +4306,7 @@ "bEP" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bEQ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "bER" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "bot"},/area/medical/research{name = "Research Division"}) -"bES" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bot"},/area/medical/research{name = "Research Division"}) +"bES" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor{icon_state = "bot"},/area/medical/research{name = "Research Division"}) "bET" = (/obj/machinery/door_control{id = "rdlab2"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = -24; req_access_txt = "47"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bEU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) "bEV" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Cargo Office"; dir = 4; network = list("SS13")},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/device/multitool,/turf/simulated/floor,/area/quartermaster/office) @@ -5307,7 +5307,7 @@ "bYc" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"; req_access_txt = "0"},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "bYd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating/airless,/area/toxins/test_area) "bYe" = (/obj/machinery/camera{c_tag = "Research Toxins Test Chamber North"; network = list("Toxins","Research","SS13")},/obj/machinery/light{dir = 1},/turf/simulated/floor/airless,/area/toxins/test_area) -"bYf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/solar/starboard) +"bYf" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "bYg" = (/obj/item/weapon/ore/silver,/obj/item/weapon/ore/silver,/obj/structure/closet/crate,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_dock_pump"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/quartermaster/miningdock) "bYh" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor{icon_state = "warning"},/area/quartermaster/miningdock) "bYi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/wall,/area/quartermaster/miningdock) @@ -5928,7 +5928,7 @@ "cjZ" = (/obj/machinery/atmospherics/pipe/tank/toxins{volume = 3200},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cka" = (/obj/machinery/atmospherics/pipe/tank/oxygen{volume = 3200},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckb" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"ckc" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/incinerator) +"ckc" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Human remains"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckd" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cke" = (/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/obj/machinery/light{dir = 8},/obj/machinery/camera{c_tag = "Virology Lab West"; dir = 4; network = list("SS13")},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/obj/machinery/light_switch{pixel_x = -27},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "ckf" = (/obj/machinery/power/smes{charge = 5e+006; input_attempt = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor,/area/aisat/maintenance) @@ -6003,7 +6003,6 @@ "clw" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "clx" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cly" = (/obj/machinery/power/apc{dir = 4; name = "Incinerator APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"clz" = (/turf/simulated/wall,/area/maintenance/incinerator) "clA" = (/obj/machinery/light/small{dir = 8},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint) "clB" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/storage/tech) "clC" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/storage/tech) @@ -6195,9 +6194,9 @@ "cpg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) "cph" = (/obj/machinery/chem_dispenser,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) "cpi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitepurple"},/area/toxins/misc_lab) -"cpj" = (/turf/simulated/wall/r_wall,/area/solar/starboard) -"cpk" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/solar/starboard) -"cpl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/solar/starboard) +"cpj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) +"cpk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cpl" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cpm" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "cpn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/toxins/test_area) "cpo" = (/obj/machinery/power/apc{dir = 4; name = "Explosives Testing APC"; pixel_x = 25},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/toxins/test_area) @@ -6251,9 +6250,9 @@ "cqk" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/reagentgrinder,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) "cql" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/toxins/misc_lab) "cqm" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) -"cqn" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/solar/starboard) +"cqn" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cqo" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"cqp" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/solar/starboard) +"cqp" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cqq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "cqr" = (/obj/item/clothing/mask/cigarette,/turf/simulated/floor/plating/airless,/area/toxins/test_area) "cqs" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/toxins/test_area) @@ -6284,6 +6283,7 @@ "cqR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall/r_wall,/area/medical/medbay2) "cqS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "cqT" = (/obj/machinery/light{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) +"cqU" = (/obj/structure/stool,/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cqV" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cqW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "cqX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -6297,9 +6297,9 @@ "crf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) "crg" = (/obj/structure/piano,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "crh" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/secure_closet/research_reagents,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) -"cri" = (/obj/structure/stool,/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/solar/starboard) -"crj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/solar/starboard) -"crk" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/solar/starboard) +"cri" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"crj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "10;13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"crk" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "crl" = (/obj/machinery/computer/secure_data,/obj/machinery/alarm{pixel_y = 26},/turf/simulated/floor{dir = 6; icon_state = "red"},/area/bridge) "crm" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "crn" = (/obj/structure/spacepoddoor,/turf/simulated/floor/engine,/area/engine/mechanic_workshop) @@ -6364,9 +6364,9 @@ "csu" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 5; layer = 2.9},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) "csv" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/dropper/precision,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/toxins/misc_lab) "csw" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/insulated,/obj/machinery/ignition_switch{id = "testigniter"; pixel_x = 3; pixel_y = -3},/obj/machinery/door_control{id = "RnDChem"; name = "Chamber Blast Doors"; pixel_x = 3; pixel_y = 5},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) -"csx" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/solar/starboard) -"csy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "10;13"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/solar/starboard) -"csz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/solar/starboard) +"csx" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"csy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"csz" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "csA" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "csB" = (/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "csC" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) @@ -6404,15 +6404,22 @@ "cti" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "ctj" = (/obj/machinery/computer/operating,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "ctk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"ctl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"ctm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"ctn" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cto" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "ctp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ctq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/medical/virology) "ctr" = (/obj/structure/sign/biohazard{pixel_x = -32},/obj/effect/decal/warning_stripes/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_viro"; name = "Virology Quarantine Lockdown"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "cts" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_viro"; name = "Virology Quarantine Lockdown"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "ctt" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/effect/decal/warning_stripes/yellow,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_viro"; name = "Virology Quarantine Lockdown"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) +"ctu" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) +"ctv" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/portsolar) +"ctw" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"ctx" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Xenobiology Access"; dir = 2; network = list("Research","SS13"); pixel_x = 0},/turf/simulated/floor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology) "cty" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology) "ctz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"ctA" = (/obj/structure/closet/emcloset,/obj/machinery/camera/xray{c_tag = "Xenobiology Access"; network = list("Research","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology) +"ctA" = (/obj/machinery/light{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/turf/simulated/floor{icon_state = "dark"},/area/atmos) "ctB" = (/obj/structure/table/reinforced,/obj/item/device/taperecorder,/obj/item/device/tape/random{pixel_x = 3; pixel_y = -3},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) "ctC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) "ctD" = (/obj/machinery/atmospherics/pipe/simple/hidden/green{dir = 4; level = 2},/turf/simulated/wall/r_wall,/area/toxins/test_chamber) @@ -6423,7 +6430,8 @@ "ctI" = (/obj/machinery/light,/obj/structure/clownstatue,/turf/simulated/floor/wood,/area/clownoffice) "ctJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/engine{icon_state = "stage_stairs"; name = "reinforced stairs"},/area/toxins/test_chamber) "ctK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/sparker{id = "testigniter"; name = "Test Igniter"; pixel_x = -25},/turf/simulated/floor/engine,/area/toxins/test_chamber) -"ctM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/solar/starboard) +"ctL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/atmos) +"ctM" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering Northwest"; network = list("SS13")},/turf/simulated/floor,/area/engine/engineering) "ctP" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/three_tile_ver{id_tag = "mechpodbay"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "ctQ" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "ctR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) @@ -6478,7 +6486,6 @@ "cuU" = (/obj/machinery/light,/obj/machinery/computer/security/telescreen{desc = "Used for watching the horrors within the test chamber."; name = "Research Monitor"; network = list("TestChamber"); pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) "cuV" = (/obj/machinery/camera{c_tag = "Research Test Chamber"; dir = 2; network = list("TestChamber","SS13","Research"); pixel_x = 0},/turf/simulated/floor/engine,/area/toxins/test_chamber) "cuW" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/engine,/area/toxins/test_chamber) -"cuY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/turf/simulated/floor/plating,/area/solar/starboard) "cuZ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/radio{pixel_y = 6},/turf/simulated/floor,/area/engine/mechanic_workshop) "cva" = (/turf/simulated/floor,/area/engine/mechanic_workshop) "cvb" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/flora/kirbyplants,/turf/simulated/floor{icon_state = "dark"},/area/engine/mechanic_workshop) @@ -6538,7 +6545,6 @@ "cwk" = (/obj/machinery/optable,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cwl" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/fitness) "cwm" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/space) -"cwo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/solar/starboard) "cwp" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) "cwq" = (/obj/structure/table,/obj/item/pod_parts/core,/obj/item/weapon/circuitboard/mecha/pod,/obj/item/clothing/glasses/welding{pixel_y = 12},/turf/simulated/floor,/area/engine/mechanic_workshop) "cwr" = (/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor,/area/engine/mechanic_workshop) @@ -6814,7 +6820,6 @@ "cCf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/hallway/primary/aft) "cCh" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor,/area/engine/equipmentstorage) "cCm" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/door/firedoor{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor,/area/engine/equipmentstorage) -"cCo" = (/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/turf/simulated/floor{icon_state = "dark"},/area/atmos) "cCp" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/turf/simulated/floor{icon_state = "dark"},/area/atmos) "cCq" = (/turf/simulated/floor,/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos) "cCr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/atmos) @@ -6871,7 +6876,6 @@ "cDu" = (/turf/simulated/floor,/area/engine/equipmentstorage) "cDv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/engine/equipmentstorage) "cDw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/atmos) -"cDx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor{icon_state = "dark"},/area/atmos) "cDy" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor{icon_state = "dark"},/area/atmos) "cDz" = (/turf/simulated/floor,/obj/item/device/radio/beacon,/turf/simulated/floor{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos) "cDA" = (/turf/simulated/floor,/area/atmos) @@ -6915,9 +6919,6 @@ "cEq" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port) "cEu" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/portsolar) "cEv" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cEw" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cEx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/portsolar) -"cEy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) "cEz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) "cEA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) "cEB" = (/obj/machinery/optable{name = "Robotics Operating Table"},/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/assembly/assembly_line) @@ -6975,13 +6976,11 @@ "cFE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "robotics_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cFF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "robotics_solar_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cFG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar) -"cFH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cFI" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cFJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) "cFK" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/aft) "cFL" = (/obj/structure/stool/bed/chair,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cFM" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/table,/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 3; pixel_y = 3},/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor,/area/engine/engineering) -"cFN" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/turf/simulated/floor,/area/engine/engineering) "cFO" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/turf/simulated/floor,/area/engine/engineering) "cFP" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/engine/engineering) "cFR" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 1; name = "Engineering Hardsuit Storage APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engine/hardsuitstorage) @@ -8142,25 +8141,25 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZcgfcgecggbTCceIcghcghcghcghcghcghbTIbTIbTIbTIbTIbTIbTIcgicgjcgkcglcgmcgncgocgocgpcgqcfbbHTbHTcgrcgscgtbHTbHTbHTcgucgvcgwcdEcgxcgycgzcfucgAcgBcgCbQWcgBcgDcdTcdTcdTcdTcdTcdTcgBcdTcdTcdTbQWcgEcgFcgGcgHcgIcgJcgKcgLcaAcgMcgNcehcgOcehcgPcgQcgRcgScgTcgUcgVbzwcgWceobXVcgXbDbbDicgYcgZchabumbvWbvWbThchbchcchdchechfchgchhchichjchkchlbThchmchnchochpaacaacaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaachqbWFbWFbWFbWFbWFbWFbWFchrchsbWHbWHbWHbWHchtbdqbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccZccZccZccZbTCceIccZaaaaaaaaaaaachuchvchwchxchychzchAchBchCchDchEbhrchGchHchIchIchJchKchLchMchMchMchMchNchMbHTbHTbNRchOchPchQchRchSchTcgIchUchVchWchXchYchZciacdTcdTcibcicbhsciebhscicbEDcifcigcigcihciicijcakcikcilcaAcimcinciocipciqcirciscaAcaAbDbcitbDbbDbbDbciucivciwbDbbvWcgYcixciybumbumbumbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThbThaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabUNcbicbicbicbicbicbicizbWHcbhcbiciAbWHbWHbWHbWHbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciBaaaaabaabciCciCciCciCciCciCciDciCbTCcdbbhtaaabhubjJbhYbjYciJciKciLciMciNciOciPciQciRciSciTciUciVciWciXciYciZchLcjacjbcjbcjbcjcchMbHTbHTcjdcjdcjdcjdcjecjdcjfcjfcjgcjdcjdcjhcjdcjicjjbkycjlbkycjmcjncjocjpcjqbuXbuXcjrcjscjtcjucjvcjwcjxcbScaAcaAcjycaAcjzcaAcjAcjBcjCcfdcjDcjFcjGcjHcjIcjJcjKcjLcjIbvWcgYcjMbvWcjNcjOcjPcjQcfQbvWbvWbvWbvWbvWbvWbvWcjRcjEaZCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNbWHbWHbWHbWHbWHbWHceDbWHciAbWHbWHbWHbWHbWHbUNbUNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjTcjUcjUcjUbkzcjWcjXcjYcjZckackbckccjScdbbhtaaabmZckgckhckickjciKckkbURckmcknchBckoceTbZUbhrckpcgockqcgockrcksbneckuckvckvckvckwchMbHTbHTcjdckxckyckzckAckBckCckCckDckEckFckGckHckIckJckKcdXcdXckLckMckNckOckPaaaaaacjvckQckRckScjrckdckUckVckWckWckXbGickYckZclaclbckZckZckZclcckZckZcldcleclfclgclhclicljclkbWycllclmbWybWybWybWyclnclobWybWybWybWyclpbvWaZCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNbUNccYbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclrclsclsclsclscltcluclvclwclxclxclyclzclAceIbhtaaabmZclBclCclDclEclFclGclHclEclEclIclJclKclLclMclMclNclOcgoclPclQbneckvckvckvckvclSchMbHTbHTcjdclTclUclVclWclXclYclYclZcmacmbcmccmdcmecjdcmfcdTcmgbEDcmhckNcmickPaaaaaacjvcmjcmkcmlcjvbHUcmmcmncmncmncmncmncmnckTcmpcmqcmocmscmsbnfbnfcmscmvcmwcmxcmycmzcmAcmBcmCcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAbvWcmDcmraZCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZEbUNbUNcgbcgbbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcmFcmGcmHcmGcmIcmJcmKcmLbRSbGWclzcmNcdbbhtaaabmZcmOcmPcmQcmRciKcmScmTcmUcmVchBckoceTcmWcmXceVcmYcmZbhrbhrbhrcndcneckvckvcnfcngchMbHTcnhcjdcnicnjcnkcnlcnlcnlcnmcnncnlcnlcnocnkcnpcnqcnrcdTcnsbEDcntckNcnuckPaaaaaacjvcnvcnwcnxcjvcnybHTcnhcnzcnzcnzcnzcnzbngbnkbnjcnzcnzaaaaaaaaaaaacjIcnDcnEcnFcmAcnGcnIcnHcnKcnJcnMcnLcnOcnNcnQcnPcoXcnRcpacmAcnScnTcnUcnVcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnXcnYbUNbYcbUNbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaacmEcnZcoacobcocclwcodclwcoeclwcofbxgcohcoibhtaaabnlbjJbnIbjYcomciKciKconcoocopcoqcorcoscotcouceVcovcowcoxcoycozchLcoAckvckvckvcoBchMbHTbHTcoCcoCcoDcoEboQboQboQcoCbpobpobpocoLcoMcoDcoNcmfcdTcmgbEDcoOckNckOckPaaaaaacjvcoPcoQcoRcjvbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcoTcoUcoVbqlcpbcoYcoYcoZcoYcoYcoYcoYcoYcpdcpccpfcpecphcpjcpjcpkcplcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNcpmcpncpobUNbUNbWHbWHcppbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcpqcmGcprcmGcpsbSzbSHbSEcmKcpwclzcpxcdbccZaaaaaaaaaaaachucpycpzcpAcpAchBcpBchBcpCceTbZUcpDcpEcpFcpGcpHcpHcpHcpIcpJckvcpKckvcpLchMbHTbHTcoCcpMcpNcpOcpPcpQcpRcoCcpQcpRcpPcpScpTcpUcoNcnrcpVcnsbEDcpWckNcpXckPcnzcnzcjvcjvcjvcjvcjvcpYbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqacqbcqccqdcpicqfcqhcpgcoYcoYcqjcoYcoYcpdcpfcpfcpfcoXcpjcqnbYfcqpcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgcqrcqsbYdbUMbUNbUNbWHbdqbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcqtcqtcqucqucqucqucquciCclzclzclzclzclzclzcqvcqwcqxcqxcqxcqxcqxchuchBchBchBchBchBchBchBcqyceTbZUcqzcqAcqBcqCcqDcqEcqFcqGcqHcqIcqJcqKcqLchMbHTbHTcoCcqMcqNcpOcpPcpPcqOcoCcqPcpPcpPcpScpOcqQcoNbEDbEDbEDcqRcqSckNcqTckPczvbHTbHTbHTbHTcqVbHTbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqXcqYcqZbricqlcqgcqecqicoYcoYcoYcoYcqmcrhcrbcsvcsucqkcpjcricrjcrkcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgbcgbcgbcgbUMbUMbUNbUNbUNbUNbUOaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncrocrpcrqcrqcrrcrscrtcrucrvcrwcrxbrMcrzcrzcrzcrAcrBcrCcrDcrDcrEcrFcrGcrHcrIcrHcrHcrHcrGcrHcrHcrJcrKcrLcrMceTbZUcrNcrPcrOcrQceVcrRclMcrScrTcrUcrVcrWcrXcrYbHTbHTcoCcrZcsacsbcsccsdcoHcoCcoIcsdcsgcshcsbcsicoNbHTbHTbHTcsjcoOckNcoOcskbHTbHTcFLbHTbHTbHTbHTbHTcfccGOcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcjIcsmcjLcslcrccrecrdcuQcrfcsocsncoYcoYcsqcspcsscsrcstcpjcsxcsycszcpjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncsAcsBcsCcsBcsDcsEcsFcsGcsHcsIcsHcsJcsKcsKcsecsKceTcsfbZVbZVcsKcsLcsKcsKcsKcsKcsKcsKcsKcsKcsKcsKcsMcsNcsOcsPcsQcsRcsScsTcsUcsVcsWcsXcsYcsZctactbctcctdctecmnctfctgcthctictjcoJcoScoKcoCcoWcpPcoJcptcpOctocoNctpcmscmsctqctrctscttckPbnjbnjbnjbnjcnzcnzcnzbnjbnjbnjcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIctyctzctAcjIcmAcmAcmAcmAcmAcmAcuTcsncuUctBcswctCcmAcmAcpjbsyctMbsybsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmctPcsBctQctRctSctTctUctVctWctXctYctZcuacubcucctkcudcuecdqcufcdqcubcugcubcubcubcubcubcubcubcubcubcubcuhcsKcuicujcukbszbuccuncuocupcuqcurcuscutbufcuvcuwcuxcrVcdzcuycuzcuAcpPcpOcpPcpPcpucoCcpvcpPcpPcpScpOcuEcoNcuFcnzaaacuGckPcuHckPckPaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcuIcuJcuKcjIaabaabaaaaaaaabcmAcmActEcmActGctFctHcmAaaaaaabsycuYbsyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcuZcvacvacvbcsHcvccqtcqxcvdcvecvecvfcvecvgcvecvebvYbvZcvecvebvZbvZbvZcvecvecvecvecvlcvmcvncvocvpcvqcvrcvscvtcvscvscvucvscvvbxNcvxcvycvzcrYbHTcuFcvAcvBcvCcvDcvEcvFcvGcoCcvHcvFcvIcpScvJcvKcoNcuFcnzaaacuGcvLcvMcvNckPaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcvPcvQcvRbxWcvTcvUcvVcvWcvXcvYcvZcjIaabaaaaaaaaaaabaabcwectJcuVcxCcxBcwacweaaaaaabsycwobsyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjTcjUcjUcjUbkzcjWcjXcjYcjZckackbciDcjScdbbhtaaabmZckgckhckickjciKckkbURckmcknchBckoceTbZUbhrckpcgockqcgockrcksbneckuckvckvckvckwchMbHTbHTcjdckxckyckzckAckBckCckCckDckEckFckGckHckIckJckKcdXcdXckLckMckNckOckPaaaaaacjvckQckRckScjrckdckUckVckWckWckXbGickYckZclaclbckZckZckZclcckZckZcldcleclfclgclhclicljclkbWycllclmbWybWybWybWyclnclobWybWybWybWyclpbvWaZCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNbUNccYbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclrclsclsclsclscltcluclvclwclxclxclyciCclAceIbhtaaabmZclBclCclDclEclFclGclHclEclEclIclJclKclLclMclMclNclOcgoclPclQbneckvckvckvckvclSchMbHTbHTcjdclTclUclVclWclXclYclYclZcmacmbcmccmdcmecjdcmfcdTcmgbEDcmhckNcmickPaaaaaacjvcmjcmkcmlcjvbHUcmmcmncmncmncmncmncmnckTcmpcmqcmocmscmsbnfbnfcmscmvcmwcmxcmycmzcmAcmBcmCcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAcmAbvWcmDcmraZCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZEbUNbUNcgbcgbbWHbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcmFcmGcmHcmGcmIcmJcmKcmLbRSbGWciCcmNcdbbhtaaabmZcmOcmPcmQcmRciKcmScmTcmUcmVchBckoceTcmWcmXceVcmYcmZbhrbhrbhrcndcneckvckvcnfcngchMbHTcnhcjdcnicnjcnkcnlcnlcnlcnmcnncnlcnlcnocnkcnpcnqcnrcdTcnsbEDcntckNcnuckPaaaaaacjvcnvcnwcnxcjvcnybHTcnhcnzcnzcnzcnzcnzbngbnkbnjcnzcnzaaaaaaaaaaaacjIcnDcnEcnFcmAcnGcnIcnHcnKcnJcnMcnLcnOcnNcnQcnPcoXcnRcpacmAcnScnTcnUcnVcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnWcnXcnYbUNbYcbUNbWHbWHbWHbWHbWHbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaacmEcnZcoacobcocclwcodckccoeclwcofbxgcohcoibhtaaabnlbjJbnIbjYcomciKciKconcoocopcoqcorcoscotcouceVcovcowcoxcoycozchLcoAckvckvckvcoBchMbHTbHTcoCcoCcoDcoEboQboQboQcoCbpobpobpocoLcoMcoDcoNcmfcdTcmgbEDcoOckNckOckPaaaaaacjvcoPcoQcoRcjvbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcoTcoUcoVbqlcpbcoYcoYcoZcoYcoYcoYcoYcoYcpdcpccpfcpecphbsybsybYfcpjbsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUNcpmcpncpobUNbUNbWHbWHcppbWHbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmEcpqcmGcprcmGcpsbSzbSHbSEcmKcpwciCcpxcdbccZaaaaaaaaaaaachucpycpzcpAcpAchBcpBchBcpCceTbZUcpDcpEcpFcpGcpHcpHcpHcpIcpJckvcpKckvcpLchMbHTbHTcoCcpMcpNcpOcpPcpQcpRcoCcpQcpRcpPcpScpTcpUcoNcnrcpVcnsbEDcpWckNcpXckPcnzcnzcjvcjvcjvcjvcjvcpYbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqacqbcqccqdcpicqfcqhcpgcoYcoYcqjcoYcoYcpdcpfcpfcpfcoXbsycplcpkcqnbsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgcqrcqsbYdbUMbUNbUNbWHbdqbWHbUNbUNaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcqtcqtcqucqucqucqucquciCciCciCciCciCciCciCcqvcqwcqxcqxcqxcqxcqxchuchBchBchBchBchBchBchBcqyceTbZUcqzcqAcqBcqCcqDcqEcqFcqGcqHcqIcqJcqKcqLchMbHTbHTcoCcqMcqNcpOcpPcpPcqOcoCcqPcpPcpPcpScpOcqQcoNbEDbEDbEDcqRcqSckNcqTckPczvbHTbHTbHTbHTcqVbHTbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqXcqYcqZbricqlcqgcqecqicoYcoYcoYcoYcqmcrhcrbcsvcsucqkbsycqUcqpcribsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgbcgbcgbcgbUMbUMbUNbUNbUNbUNbUOaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncrocrpcrqcrqcrrcrscrtcrucrvcrwcrxbrMcrzcrzcrzcrAcrBcrCcrDcrDcrEcrFcrGcrHcrIcrHcrHcrHcrGcrHcrHcrJcrKcrLcrMceTbZUcrNcrPcrOcrQceVcrRclMcrScrTcrUcrVcrWcrXcrYbHTbHTcoCcrZcsacsbcsccsdcoHcoCcoIcsdcsgcshcsbcsicoNbHTbHTbHTcsjcoOckNcoOcskbHTbHTcFLbHTbHTbHTbHTbHTcfccGOcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcjIcsmcjLcslcrccrecrdcuQcrfcsocsncoYcoYcsqcspcsscsrcstbsycrkcrjcsxbsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncsAcsBcsCcsBcsDcsEcsFcsGcsHcsIcsHcsJcsKcsKcsecsKceTcsfbZVbZVcsKcsLcsKcsKcsKcsKcsKcsKcsKcsKcsKcsKcsMcsNcsOcsPcsQcsRcsScsTcsUcsVcsWcsXcsYcsZctactbctcctdctecmnctfctgcthctictjcoJcoScoKcoCcoWcpPcoJcptcpOctocoNctpcmscmsctqctrctscttckPbnjbnjbnjbnjcnzcnzcnzbnjbnjbnjcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIctyctzctxcjIcmAcmAcmAcmAcmAcmAcuTcsncuUctBcswctCcmAcmAbsycszcsycszcszaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmctPcsBctQctRctSctTctUctVctWctXctYctZcuacubcucctkcudcuecdqcufcdqcubcugcubcubcubcubcubcubcubcubcubcubcuhcsKcuicujcukbszbuccuncuocupcuqcurcuscutbufcuvcuwcuxcrVcdzcuycuzcuAcpPcpOcpPcpPcpucoCcpvcpPcpPcpScpOcuEcoNcuFcnzaaacuGckPcuHckPckPaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcuIcuJcuKcjIaabaabaaaaaaaabcmAcmActEcmActGctFctHcmAaaaaaacszctlcszaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcuZcvacvacvbcsHcvccqtcqxcvdcvecvecvfcvecvgcvecvebvYbvZcvecvebvZbvZbvZcvecvecvecvecvlcvmcvncvocvpcvqcvrcvscvtcvscvscvucvscvvbxNcvxcvycvzcrYbHTcuFcvAcvBcvCcvDcvEcvFcvGcoCcvHcvFcvIcpScvJcvKcoNcuFcnzaaacuGcvLcvMcvNckPaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcvPcvQcvRbxWcvTcvUcvVcvWcvXcvYcvZcjIaabaaaaaaaaaaabaabcwectJcuVcxCcxBcwacweaaaaaacszctmcszaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczaczakSakSaczakSakSakSalwakSakSaabalwawTaaaaabaabcwpcwpcwpcqtcwqcwrcwscwtcwucwvcwwcogcwybxZcwAcwBcwCcwDcwEcwFcwGcwHcwIcvecwHcwJcwKcwLcwLcwMcvecwNcwOcwPcwQbZUcwRbyfcwTcwUcwVcwWcwVcwXcwYbzncxacxbcnBcrYcrYcuFcvAcoNcoNcxdcoNcoNcxecxfcxgcxgcxgcxhcxgcxicxgcxjcnzaaacuGcxkcvMcxlckPbhsbhsbhsbhsckPckPcxpcxqcxqcxrcxqcxqcxrcxsaaaaaacjIcxtbTHcxtcxvcxwcqacxxcvWcxycxzcxycjIaaaaaaaaaaaaaaaaaacwecwbcuWcxCcxCcwccweaaaaaaaaacxJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaczaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaaaawTaaaaaaaaaaabaabcwpcqtcqtcqtcqtcqtcqtcqtcqtcxLcwybxZcxNcxOcxPcxQcxQcxQcxQcxRcxScxTcwLcxUcwLcwLcxVcwLcxWcxXcxYcxZcwQbZUcyacybcyccwUcydcyecyfcwUcygcyhcyicyjcykcnCcymcyncyocypcypcyqcyrcyscytcyucdzcdzcdzcyvbHTbHTcbRbHTcnzaaacuGcywcvMcyxcyycyzcyAcyBcyCbzLcyEbTJbzLcyEbTLbzLcyHcyIcyJaaaaaacjIcxtcxtcxtbzMcyLcyMcyNcyOcyPcyQcyRcjIaaaaaaaaaaaaaaaaaacwectKcxCczMcxCcuLcweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaczaaacyYcyZczaaaacyYcyZczaaaacyYcyZczaaabczbaabaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaabxYcwybxZczdcwLcxVczecwLcwLcwLczfcwLczdczdcwLcwLcwLcwLczgbzPcxXczicsKczjbZUcybcybczkcwUczlczmczncwUczoctaczpczqczrczscztcHZbHTczucbSczubHTbHTbHTcuFcZScnzbnjbnjbnjbnjbnjcnzcnzaaaczwczxczycjqczzczAcoOcoOczBbAbczDczEbAbczDczEbAbczDczEcyJaaaaabcjIcvWcvWcvWcvWczFcqaczGczHczIczJczKcjIaabaaaaaaaaaaaaaaacwecuPcuMcxCcxCcuOctDcEpaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaaacyYczVczaaaacyYczVczaaaacyYczVczaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbxYcwybxZczdczYcwLczZcAacAbcAbcxUcwLczdcAccwLcwLcwLcwLcAdcAecAfcAgbYxcAhcAicAjcAkcAlcwUczlcAmcAncwUcAoctacrYcApcrVcAqcArcAscAtcAucAvcAwcAtcAtcAtcAxcAtcnzaaaaaaaaaaaaaaaaaaaabaaacuGcAycvMcAzcAAcABcoOcoOczBbAbcADbAbbAbcADbAbbAbcADbAbcyJaabaabcjIcvPcvQcvRbBBcAIcyMcAJcAKcALcAMcANcjIaabaabaabaabaabaaacwecwecuScuRcwdcwecweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaagaaaaaaaaaakSaabcyYczVczaaaacyYczVczaaabcyYczVczaaabaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaabaaaaaabxYcwycvecAWcwLcAXcAYcAZcBacBbcBacBccBacBdcBecwHcBfczdczdbzPcBgcBhcBicBjcBkcBlcBmcBncBocBpcBqcBrcBscBtcBucBvcBvcBwcBxcBycBzbBGcBBcBCcBDcBEcBFcBGcBHbBHaabaaaaaaaaaaaaaaaaaaaabaabczwcBJcBKcBLcBMcBNcoOcoOcoOcBOcoOcoOcoOcoOcoOcoOcoOcBPbBIaaaaaacjIcxtbTXcxtcBRcxwcqacBScBTcBUcBVcBWcjIcjIcjIcjIcjIaabaaaaaacwecwecwecwecweaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaaaaaacxLcBZcvecCacCbcCbcCccvecvecvecvecvecvecvecvecvecvecvecvecvecCdcCecCdcCfcCdcqxbBYcChbCibChbChbCkcCmbClcBucCocCpcCqcCrcCscCtbBGcCvcCwcCxcCycCzcCAcCBbCwaabcCDcCDcCDcCDcCDaaaaaaaabcuGcCEcvMcCFcCGcCHcCIcoOcoOcCJcoOcoOcoOcoOcoOcCKcoOcCLbBIaaaaaacjIcxtcxtcxtbBBcCNcyMcCOcCPcCQcCRcCScCTcCUcCVcCWcjIaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaabaaaaaaaaaaaaaaaaaaaaaaaaaabbCxcCYcCYcCYcCYcxLcCZcwycDacDbcDccDccDdcDecDfcDgcDgcDgcDgcDhcDicDjcDicDicDkcDkcDicDlcDmcDncDocDocDpcDqcDrcDscDtcDucDucDvcDwcDxcDycDzcDAcCscDBbBGcDCcDDcDEcDFcDGcDHcDIbCycDKcDLcDMcDNcDOcCDaaaaaacDPcDQcDRcDScDTcDRcDUcDVcDWcDXcDYcDZbzLcDYcEbcEccEdcEebCMcyJaaaaaacjIcvWcvWcvWcvWcEgcqacBScEhcEicBVcEjcEkcElcEmcEnbSIcEpaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcEqaabaabaabcEqaabaaaaabcEqaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcEucEvcEwcExcEycEzcEAcDacDacEBcECcvecvecEDcEEcEEcEEcEEcEFcEGcEHcEGcEGcEGcDocDocEIcEJcEKcELcEMcDucENcDrcDucDucDucDucEOcBucEPcEQcCqcDAcCscDAbBGcDCcDDcEScETcEUcEVcEWbCUaabcEYcEZcDOcFacCDaaaaaaaaacDQcFbcFccFdcDRcFecFfcFgcFhcFiczEczDcFicFjcFkcFlczEczDcyJaaaaaacjIcvPcvQcvRbDrcAIcyMcFncFocFpcEmcFqcFrcFscFtcFucjIaabaabaagaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaakSaabcFvcFwcFwcFxcFycFzcFzcFzcFycFzcFzcFzcFycFzcFzcFAcFwcFwcFwcFwcFwcFBcFCcFDcFEcFFcFGcFHcFIcFJceHcwycFKcDacvecvecvecZTcEDcEEcFMcFNcFOcFPbGIcFRcFScFTcFUbDtcFWcFXcFYcFZcGabDtcGccGdcDrcGecDucDucDucGfcBucGgcGgcDAcGhcGicGjcGkcGlcGmcGncGocGpcGqcGrbCycGscDLcGtcDOcDOcCDaaaaaaaabcDQcGucFccGvcDRcGwcGxcCIcGycFicGzcGAcFicGBcGCcFlcGzcGDcyJaaaaaacjIcxtbTHcxtcGEcxwcqacGFcFocGGcqacqacGHcvWcvWcvWcjIaaaaaaaaaaaaamjamjamjawTaabaabaabaabcGIaabaabaabaabaabalwamjamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaaaaaacxLcBZcvecCacCbcCbcCccvecvecvecvecvecvecvecvecvecvecvecvecvecCdcCecCdcCfcCdcqxbBYcChbCibChbChbCkcCmbClcBuctAcCpcCqcCrcCscCtbBGcCvcCwcCxcCycCzcCAcCBbCwaabcCDcCDcCDcCDcCDaaaaaaaabcuGcCEcvMcCFcCGcCHcCIcoOcoOcCJcoOcoOcoOcoOcoOcCKcoOcCLbBIaaaaaacjIcxtcxtcxtbBBcCNcyMcCOcCPcCQcCRcCScCTcCUcCVcCWcjIaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaabaaaaaaaaaaaaaaaaaaaaaaaaaabbCxcCYcCYcCYcCYcxLcCZcwycDacDbcDccDccDdcDecDfcDgcDgcDgcDgcDhcDicDjcDicDicDkcDkcDicDlcDmcDncDocDocDpcDqcDrcDscDtcDucDucDvcDwctLcDycDzcDAcCscDBbBGcDCcDDcDEcDFcDGcDHcDIbCycDKcDLcDMcDNcDOcCDaaaaaacDPcDQcDRcDScDTcDRcDUcDVcDWcDXcDYcDZbzLcDYcEbcEccEdcEebCMcyJaaaaaacjIcvWcvWcvWcvWcEgcqacBScEhcEicBVcEjcEkcElcEmcEnbSIcEpaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcEqaabaabaabcEqaabaaaaabcEqaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcEucEvctnctvctucEzcEAcDacDacEBcECcvecvecEDcEEcEEcEEcEEcEFcEGcEHcEGcEGcEGcDocDocEIcEJcEKcELcEMcDucENcDrcDucDucDucDucEOcBucEPcEQcCqcDAcCscDAbBGcDCcDDcEScETcEUcEVcEWbCUaabcEYcEZcDOcFacCDaaaaaaaaacDQcFbcFccFdcDRcFecFfcFgcFhcFiczEczDcFicFjcFkcFlczEczDcyJaaaaaacjIcvPcvQcvRbDrcAIcyMcFncFocFpcEmcFqcFrcFscFtcFucjIaabaabaagaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaakSaabcFvcFwcFwcFxcFycFzcFzcFzcFycFzcFzcFzcFycFzcFzcFAcFwcFwcFwcFwcFwcFBcFCcFDcFEcFFcFGctwcFIcFJceHcwycFKcDacvecvecvecZTcEDcEEcFMctMcFOcFPbGIcFRcFScFTcFUbDtcFWcFXcFYcFZcGabDtcGccGdcDrcGecDucDucDucGfcBucGgcGgcDAcGhcGicGjcGkcGlcGmcGncGocGpcGqcGrbCycGscDLcGtcDOcDOcCDaaaaaaaabcDQcGucFccGvcDRcGwcGxcCIcGycFicGzcGAcFicGBcGCcFlcGzcGDcyJaaaaaacjIcxtbTHcxtcGEcxwcqacGFcFocGGcqacqacGHcvWcvWcvWcjIaaaaaaaaaaaaamjamjamjawTaabaabaabaabcGIaabaabaabaabaabalwamjamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcGJaabaaaaabcGJaabaaaaabcGJaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcGLcGMcGNcCYcZUceHcGPcEzcEzcEzcEzcGQcEzcFJcEEcGRcGScGTcGUbDGcGWcGXcGYcGZbEocHbcHccHdbFlcktbGPcGccENcDrcZicHjcDucDucHkcBucHlcHmcDAcHncCscHocHpbFvbFtbGBbFQbGEbGCbGEbGGaabcCDcCDcCDcCDcCDaabaabaabcHxcHycFccGvcDRcHzcHAcHBcHCcHDcHEcHFcHFcHGcHFcHHcHIcDRcHJaaaaaacjIcxtcxtcxtbDrcHKcHLcHMcHNcHOcCTcCTcCTcHPcHQcHRbGHaaaaaaaaaaaaamjaaaaabaaaaabaaaaaaaaacHTaaaaabaabaaaaaaaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabbCxcCYcCYcCYcCYcHWcHXcHYceHcZVceHceHcEDcIaceHcEEbYRcaecGTcajbGIcamcIhcIicIjbGRcIlcImcIncIocIpbGRcIrcIscItcIucIvcIwcIxcIycIzcIAcGjcIBcICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMbGVcDKcDLcIPcIOcIOcCDaaaaaaaabcDQcIQcFccIRcDRbIxbIxbIxbIxcDRcIVcIWcIXcIYcIZcJacJbcIYbIBaaacDPcjIcjIcjIcjIcjIcJdcqacJecyMcJfcyMcJgcyMcJhcyMcJibGHaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmaaaaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaacyYcHUczaaabcyYcHUczaaaacyYcHUczaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcJncJncJncJncJncJncJncJocJncJncEEcJpcJqcGTcajbGIbICbGIbJhcJvcDocJwcJxcFZcJycJzcDocJAcDucDrcJBcJCcJDcIxcJEcJFcJGcJHcJIcJJcJKcJHcJLcJMcJNcJOcDAcJPcJQcJRbJCaabcEYcJUcJTcJVcCDaaaaaaaaacDQcDRcJWcJXcDRcJYcJZcKacKbciIcFccKdcKecIYbJEcKgcKhcKibIBaabaaaaaaaaaaaaaaacjIcKkcKlcKmcKncKocKpcKqcKrcKocKpcKscjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycKzaabamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 31fbcc1fb0b..571e5e81d99 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -119,8 +119,8 @@ "co" = (/turf/unsimulated/wall,/area/prison/solitary) "cp" = (/turf/simulated/wall/mineral/alien,/area/xenos_station/start) "cq" = (/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 8},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor/shutters{color = "purple"; density = 0; dir = 2; icon_state = "shutter0"; id_tag = "alienshutters"; name = "Alien Blast Shutters"; opacity = 0},/turf/simulated/floor/plating/airless,/area/xenos_station/start) -"cr" = (/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor/shutters{color = "purple"; density = 0; dir = 2; icon_state = "shutter0"; id_tag = "alienshutters"; name = "Alien Blast Shutters"; opacity = 0},/turf/simulated/floor/plating/airless,/area/xenos_station/start) -"cs" = (/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor/shutters{color = "purple"; density = 0; dir = 2; icon_state = "shutter0"; id_tag = "alienshutters"; name = "Alien Blast Shutters"; opacity = 0},/turf/simulated/floor/plating/airless,/area/xenos_station/start) +"cr" = (/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor/shutters{color = "purple"; density = 0; dir = 2; icon_state = "shutter0"; id_tag = "alienshutters"; name = "Alien Blast Shutters"; opacity = 0},/turf/simulated/floor/plating/airless,/area/xenos_station/start) +"cs" = (/obj/structure/grille,/obj/structure/window/plasmareinforced,/obj/structure/window/plasmareinforced{dir = 4},/obj/structure/window/plasmareinforced{dir = 1},/obj/machinery/door/poddoor/shutters{color = "purple"; density = 0; dir = 2; icon_state = "shutter0"; id_tag = "alienshutters"; name = "Alien Blast Shutters"; opacity = 0},/turf/simulated/floor/plating/airless,/area/xenos_station/start) "ct" = (/turf/simulated/floor/holofloor{tag = "icon-asteroid5"; icon_state = "asteroid5"; dir = 2},/area/holodeck/source_desert) "cu" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding6"; icon_state = "wood_siding6"; dir = 2},/area/holodeck/source_picnicarea) "cv" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/holofloor{tag = "icon-wood_siding10"; icon_state = "wood_siding10"; dir = 2},/area/holodeck/source_picnicarea) @@ -1128,7 +1128,7 @@ "vJ" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_centcom_dock"; pixel_y = -25; req_access_txt = "109"; tag_door = "specops_centcom_dock_inner"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "vK" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_y = 16; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_y = -4; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_y = 6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) "vL" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops) -"vM" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; pixel_y = 28},/obj/machinery/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops) +"vM" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; pixel_y = 28},/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops) "vN" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) "vO" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) "vP" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_centcom_dock_inner"; locked = 1; name = "Shuttle Hatch"; req_access = null; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) @@ -1370,7 +1370,7 @@ "Ar" = (/obj/machinery/door/unpowered/shuttle{req_access_txt = "106"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "As" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "106"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "At" = (/obj/machinery/door/airlock/external{name = "Transport Shuttle"; opacity = 0; req_access_txt = "106"},/turf/unsimulated/floor{name = "plating"},/area/space) -"Au" = (/obj/machinery/computer/shuttle_control{req_access = null; req_access_txt = "106"; shuttle_tag = "Centcom"},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 25; pixel_y = 0; req_access_txt = "106"; req_one_access_txt = "0"; tag_door = "centcom_shuttle_bay_door"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) +"Au" = (/obj/machinery/computer/shuttle_control{req_access = null; req_access_txt = "106"; shuttle_tag = "Centcom"},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle"; pixel_x = 25; pixel_y = 0; req_access_txt = "106"; req_one_access_txt = "0"; tag_door = "centcom_shuttle_hatch"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) "Av" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape/centcom) "Aw" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/centcom/evac) "Ax" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/shuttle/floor,/area/centcom/evac) @@ -1389,7 +1389,7 @@ "AK" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/transport1/centcom) "AL" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor,/area/centcom/evac) "AM" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor,/area/centcom/evac) -"AN" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 25; pixel_y = 0; req_access_txt = "106"; req_one_access_txt = "0"; tag_door = "admin_shuttle_bay_door"},/obj/machinery/computer/shuttle_control{req_access_txt = "106"; req_one_access_txt = "0"; shuttle_tag = "Administration"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) +"AN" = (/obj/machinery/computer/shuttle_control{req_access_txt = "106"; req_one_access_txt = "0"; shuttle_tag = "Administration"},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "admin_shuttle_port"; pixel_x = 25; pixel_y = 0; req_one_access_txt = "106"; tag_door = "admin_shuttle_hatch_port"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) "AO" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/centcom/evac) "AP" = (/obj/structure/table,/obj/item/device/radio,/turf/simulated/shuttle/floor,/area/centcom/evac) "AQ" = (/obj/machinery/door/airlock/external{name = "Administration Shuttle"; opacity = 0; req_access_txt = "106"},/turf/unsimulated/floor{name = "plating"},/area/centcom/evac) @@ -1666,7 +1666,7 @@ "Gb" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/syndicate,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) "Gc" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) "Gd" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/admin) -"Ge" = (/obj/machinery/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Ge" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Gf" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Gg" = (/obj/item/weapon/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) "Gh" = (/obj/structure/table/woodentable,/obj/item/weapon/lighter/zippo/fluff/naples_1,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) @@ -1678,7 +1678,7 @@ "Gn" = (/obj/machinery/computer/message_monitor,/obj/item/weapon/paper/monitorkey,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Go" = (/obj/machinery/computer/atmos_alert,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Gp" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gq" = (/obj/machinery/account_database{name = "Admin Accounts Database"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gq" = (/obj/machinery/computer/account_database{name = "Admin Accounts Database"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Gr" = (/obj/structure/table,/obj/item/weapon/gun/projectile/automatic/pistol,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Gs" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch to lock down external access to the admin room."; icon_state = "doorctrl0"; id = "ADMINLOCKDOWN"; name = "Lockdown"; pixel_y = 0; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "Gt" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/syndicate,/obj/item/weapon/reagent_containers/food/drinks/cans/adminbooze,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/obj/item/weapon/reagent_containers/food/drinks/cans/madminmalt,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) @@ -1805,7 +1805,7 @@ amaVbabdaYbfaTaXbbaWbeaZbgaUbcaSaTbfbebabdaXaZaYaUaWaeaqarasatauavbhaxbjbkboblbm adaYaWbgaXbcbaaTbebfaUbbaSbdaZaVbabcaUaWbgaTbbaXbdbfahbhbibjbkboblbmaDapaqarasatauavbhbiavbhbibjbmbnapaqarasatauavbhaxaLaMaYaWbgaXbcbaaTbebfaUbbaSbdaZaVbabcaUaWbgaTaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpbqbObqbqbqbsbPbQbPbQbPbsbIbIbIbIbIbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD alaXbfaSaTaZaWbaaUbcbdbeaVbgbbaYaWaZbdbfaSbabeaTbgbcagbmbnapaqarasataJavbhbibjbkboblbmbnasatauavatauavbhbibjbkboblbmaDaLaMaXbfaSaTaZaWbaaUbcbdbeaVbgbbaYaWaZbdbfaSbaaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpbqbqbRbSbqbsbTbTbTbTbTbsbUbUbUbUbVbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD aoaTbcaVbabbbfaWbdaZbgbWbXbYbWbWbfbbbgbcaVaWaUbaaSaZacbhbibjbkboblbmaDapaqarasatauavbhbibjbkboblbmbnapaqarasatauavbhaxaLaMaTbcaVbabbbfaWbdaZbgaUaYaSbeaXbfbbbgbcaVaWaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpcabqbqbqbqbscbcccdcccebscfcgchcicfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsbLbMbMbMbNbD -abbaaZaYaWbebcbfbgbbcjbXckclcmcnbWbeaSaZaYbfbdaWaVbbaiarasatauavbhbiaybkboblbmbnapaqarasapaqarasbibjbkboblbmbnapaqaraHaLaMbaaZaYaWbebcbfbgbbaSbdaXaVaUaYbcbeaSaZaYbfaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZbZcpcqcscrcpbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpbqcabqbqctbscucccdcccvbscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD +abbaaZaYaWbebcbfbgbbcjbXckclcmcnbWbeaSaZaYbfbdaWaVbbaiarasatauavbhbiaybkboblbmbnapaqarasapaqarasbibjbkboblbmbnapaqaraHaLaMbaaZaYaWbebcbfbgbbaSbdaXaVaUaYbcbeaSaZaYbfaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZbZcpcqcrcscpbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNbpbqcabqbqctbscucccdcccvbscfcwcxcycfbsbxbxbJbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD aeaWbbaXbfaUaZbcaScBcCckclcmcDcDcEcFaVbbaXbcbgbfaYbeafboblbmbnapaqaraHatauavbhbibjbkbocGcHcIcJcKcLasatauavbhbibjbkboaBaLaMaWbbaXbfaUaZbccjcBcMcNcOcPcQbaaZaUaVbbaXbcaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcRcScTcocScUcocScVcocWcXcocScUcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZbZcpcpcYcZdacpcpbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNbpbqbEcabqbRbsbTbTbTbTbTbsdbcwcxcydbbsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD ahbfbeaTbcbdbbaZaVdcdddddedfckdgdgcFaYbeaTaZaSbcaXaUanbnapaqarasatauaKbhbibjbkboblbmbncIdhdidjdkdlavbhbibjbkboblbmbnaEaLaMbfbeaTbcbdbbcEcFdmdmdmdmdmcNdnbbbdaYbeaTaZaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcododpcodocXcododqcodocUcodocTcoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZcpcpdadadrdadacpcpbZaNaNaNaNaNaNaNaNaNaNaNaNaNbpbqbqbqcabqbsdsdtdsdtdsbsducwcxcydubsbxbxbxbxbxbsbybybybybybsbzbzbzbzbzbsczbMbMbMcAbD agbcaUbaaZbgbebbaYdvdededwdxdyclcldzaXaUbabbaVaZaTbdakbjbkboblbmbnapaFarasatauavbhbibjdAdBdCdDdhdEaqarasatauavbhbibjazaLaMbcaUbaaZbgcBcFdmdmdmdmdmdmdmdFcBbfaXaUbabbaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcocococococococococococococococoaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNbZcpdadadadadadadacpbZaNaNaNaNaNaNaNaNaNaNaNaNaNbpbqdGbqbqcabsbGbHbGbHbGbsducwcxcydubsbxbJbxbJbxbsbybybybybybsbzbKbzbKbzbsczbMbMbMcAbD @@ -2055,4 +2055,3 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN "} - diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index afd45e79a66..bea6ad97392 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -341,7 +341,7 @@ "gC" = (/obj/machinery/turretid/stun{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AI's from interacting with this device."; name = "Telecoms Foyer Turret Control"; pixel_y = 30; req_access = list(61)},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/tcommsat/entrance) "gD" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) "gE" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/tcommsat/entrance) -"gF" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/tcommsat/entrance) +"gF" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/camera{c_tag = "Telecomms Foyer"; dir = 2; network = list("Telecomms")},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "gG" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/space) "gH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/tcommsat/entrance) "gI" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/tcommsat/entrance) @@ -360,7 +360,7 @@ "gV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/simulated/floor{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance) "gW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/tcommsat/entrance) "gX" = (/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/tcommsat/entrance) -"gY" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/tcommsat/entrance) +"gY" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "gZ" = (/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol) "ha" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/tcommsat/entrance) "hb" = (/obj/machinery/power/apc{dir = 1; name = "Telecoms Sat. Teleporter APC"; pixel_x = 1; pixel_y = 26},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/tcommsat/entrance) @@ -372,7 +372,7 @@ "hh" = (/obj/machinery/camera/xray{c_tag = "Telecomms Airlock"; network = list("Telecomms")},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hi" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hj" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"hk" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/camera{c_tag = "Telecomms Foyer"; dir = 2; network = list("Telecomms")},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"hk" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor,/area/tcommsat/entrance) "hl" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "hm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) "hn" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/entrance) @@ -442,7 +442,7 @@ "iz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/tcommsat/entrance) "iA" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iB" = (/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"iC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"iC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/closet/crate,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iE" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "Telecoms Sat. Power Control APC"; pixel_x = 25},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iF" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance) @@ -451,9 +451,9 @@ "iI" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol) "iJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol) "iK" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol) -"iL" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"iL" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"iN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"iN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iO" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Power Control"; req_access_txt = "61"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor,/area/tcommsat/entrance) @@ -462,10 +462,9 @@ "iT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor,/area/tcommsat/entrance) "iU" = (/obj/machinery/power/smes{charge = 2.5e+006; input_attempt = 1; input_level = 250000; inputting = 1; output_level = 250000},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "iV" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"iW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) -"iX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; on = 1; pressure_checks = 0},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"iW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/light_switch{pixel_y = -28},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/tcommsat/powercontrol) +"iX" = (/obj/structure/closet/crate,/obj/machinery/light_switch{pixel_y = -28},/obj/item/clothing/glasses/night,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/tcommsat/entrance) "iY" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol) -"iZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor/plating,/area/tcommsat/powercontrol) "ja" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/space) "jb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) "jc" = (/obj/structure/lattice,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) @@ -609,11 +608,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiecccccdcfcgcgcgcgcgcdgthagMgwgKgLgMgNgMgOgtcdcgcgcgcgcgcfcdccccieaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidibcccccdcdcdcdcdcdcdgtgtgtgtgPgQgRgtgtgtgtcdcdcdcdcdcdcdcccchHicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidibgZgZgZgZgZgZgZgZgZgZgtgtgSgTgUgtcccccccccccccccccccccchHicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiegZhchhhdhjhihkhihlgZgtgtgVgWgXgtgtbWhHhZhZhZhZhZhZhZhZicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmgZhoiqgZiwivivivixgZgtgYiziygMhbgtgtiebWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiegZhchhhdhjhigYgFhlgZgtgtgVgWgXgtgtbWhHhZhZhZhZhZhZhZhZicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmgZhoiqgZiwivivivixgZgthkiziygMhbgtgtiebWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahmgZiAgZgZiCiBiDiBiEgZiFheiHiGhfhfhggtieaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagGiJiIiKgZiLiBiNiMiPiOiRiQiTiShfhfhngtieaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYhGbYgZiViUiXiWiZiYgFhqhfhfhfhfhggtiebWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagGiJiIiKgZiLiMiMiMiPiOiRiQiTiShfhfhngtieaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYhGbYgZiViUiviNiWiYiXhqhfhfhfhfhggtiebWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYhGbYgZgZgZgZgZgZgZgthrhshshshtgtgtiebWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaeRiueRjbhZhZhZhZhZibgtgthuhvhwgtgthHicbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWbWidibgtgtgtgtgthHicbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/__DEFINES/btime.dm b/code/__DEFINES/btime.dm index a80446d441c..33d5def1deb 100644 --- a/code/__DEFINES/btime.dm +++ b/code/__DEFINES/btime.dm @@ -10,8 +10,8 @@ var/global/__btime__libName = "btime.[world.system_type==MS_WINDOWS?"dll":"so"]" // This will always return 1 unless the btime library cannot be accessed if(TimeOfHour || 1) return 1 catch(var/exception/e) - world.log << "PRECISE_TIMER_AVAILABLE is defined in btime.dm, but calling the btime library failed: [e]" - world.log << "This is a fatal error. The world will now shut down." + log_to_dd("PRECISE_TIMER_AVAILABLE is defined in btime.dm, but calling the btime library failed: [e]") + log_to_dd("This is a fatal error. The world will now shut down.") del(world) #else #define TimeOfHour (world.timeofday % 36000) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index ff2ac44ffe2..49d3e68c031 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -137,7 +137,7 @@ if(sight_check && !isInSight(A, O)) continue L |= M - //world.log << "[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])" + //log_to_dd("[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])") else if(include_radio && istype(A, /obj/item/device/radio)) if(sight_check && !isInSight(A, O)) @@ -167,7 +167,7 @@ var/mob/M = A if(M.client) hear += M - //world.log << "Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])" + //log_to_dd("Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])") else if(istype(A, /obj/item/device/radio)) hear += A diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 210e5ed891e..c69742b94c8 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -4,32 +4,16 @@ ////////////////////////// /proc/makeDatumRefLists() + //hair + init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, hair_styles_list, hair_styles_male_list, hair_styles_female_list) + //facial hair + init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, facial_hair_styles_list, facial_hair_styles_male_list, facial_hair_styles_female_list) + //underwear + init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear, underwear_list, underwear_m, underwear_f) + //undershirt + init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f) + var/list/paths - - //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name - paths = subtypesof(/datum/sprite_accessory/hair) - for(var/path in paths) - var/datum/sprite_accessory/hair/H = new path() - hair_styles_list[H.name] = H - switch(H.gender) - if(MALE) hair_styles_male_list += H.name - if(FEMALE) hair_styles_female_list += H.name - else - hair_styles_male_list += H.name - hair_styles_female_list += H.name - - //Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name - paths = subtypesof(/datum/sprite_accessory/facial_hair) - for(var/path in paths) - var/datum/sprite_accessory/facial_hair/H = new path() - facial_hair_styles_list[H.name] = H - switch(H.gender) - if(MALE) facial_hair_styles_male_list += H.name - if(FEMALE) facial_hair_styles_female_list += H.name - else - facial_hair_styles_male_list += H.name - facial_hair_styles_female_list += H.name - //Surgery Steps - Initialize all /datum/surgery_step into a list paths = subtypesof(/datum/surgery_step) for(var/T in paths) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index c0b2d3af292..5f4be64c9db 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -370,7 +370,7 @@ //Don't use this on lists larger than half a dozen or so /proc/insertion_sort_numeric_list_ascending(var/list/L) - //world.log << "ascending len input: [L.len]" + //log_to_dd("ascending len input: [L.len]") var/list/out = list(pop(L)) for(var/entry in L) if(isnum(entry)) @@ -383,13 +383,13 @@ if(!success) out.Add(entry) - //world.log << " output: [out.len]" + //log_to_dd(" output: [out.len]") return out /proc/insertion_sort_numeric_list_descending(var/list/L) - //world.log << "descending len input: [L.len]" + //log_to_dd("descending len input: [L.len]") var/list/out = insertion_sort_numeric_list_ascending(L) - //world.log << " output: [out.len]" + //log_to_dd(" output: [out.len]") return reverselist(out) /proc/dd_sortedObjectList(var/list/L, var/cache=list()) @@ -583,4 +583,3 @@ proc/dd_sortedObjectList(list/incoming) /datum/alarm/dd_SortValue() return "[sanitize(last_name)]" - \ No newline at end of file diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index ac569991aa7..fd07b20e641 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -8,16 +8,16 @@ /proc/error(msg) - world.log << "## ERROR: [msg]" + log_to_dd("## ERROR: [msg]") #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") //print a warning message to world.log /proc/warning(msg) - world.log << "## WARNING: [msg]" + log_to_dd("## WARNING: [msg]") //print a testing-mode debug message to world.log /proc/testing(msg) - world.log << "## TESTING: [msg]" + log_to_dd("## TESTING: [msg]") /proc/log_admin(text) admin_log.Add(text) @@ -80,3 +80,8 @@ /proc/log_misc(text) diary << "\[[time_stamp()]]MISC: [text][log_end]" + +/proc/log_to_dd(text) + world.log << text //this comes before the config check because it can't possibly runtime + if(config.log_world_output) + diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]" \ No newline at end of file diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 4658e6691ea..619716363f9 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -1,4 +1,16 @@ -proc/random_hair_style(gender, species = "Human") +/proc/random_underwear(var/gender) + switch(gender) + if(MALE) return pick(underwear_m) + if(FEMALE) return pick(underwear_f) + else return pick(underwear_list) + +/proc/random_undershirt(var/gender) + switch(gender) + if(MALE) return pick(undershirt_m) + if(FEMALE) return pick(undershirt_f) + else return pick(undershirt_list) + +proc/random_hair_style(var/gender, species = "Human") var/h_style = "Bald" var/list/valid_hairstyles = list() @@ -29,7 +41,7 @@ proc/random_hair_style(gender, species = "Human") if(SOUTHEAST) return NORTHWEST return 0 -proc/random_facial_hair_style(gender, species = "Human") +proc/random_facial_hair_style(var/gender, species = "Human") var/f_style = "Shaved" var/list/valid_facialhairstyles = list() @@ -136,14 +148,14 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul if(!user) return if(ismob(user)) - user.attack_log += text("\[[time_stamp()]\] Has [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition]") + user.attack_log += text("\[[time_stamp()]\] Has [what_done] [key_name(target)][object ? " with [object]" : " "][addition]") if(ismob(target)) - target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [user.name][ismob(user) ? "([user.ckey])" : ""][object ? " with [object]" : " "][addition]") + target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [key_name(user)][object ? " with [object]" : " "][addition]") if(admin) - log_attack("[user.name][ismob(user) ? "([user.ckey])" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition]") + log_attack("[key_name(user)] [what_done] [key_name(target)][object ? " with [object]" : " "][addition]") if(target.client) if(what_done in ignore) return if(target == user)return if(!admin) return - msg_admin_attack("[user.name][ismob(user) ? "([user.ckey])" : ""][isAntag(user) ? "(ANTAG)" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition](JMP)") + msg_admin_attack("[key_name_admin(user)] [what_done] [key_name_admin(target)][object ? " with [object]" : " "][addition]") diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 4b521f9bfbb..1be69032cf1 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -14,7 +14,7 @@ /proc/sanitize_inlist(value, list/List, default) if(value in List) return value if(default) return default - if(List && List.len)return List[1] + if(List && List.len)return pick(List) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 2b840e6759c..bdeac1a9565 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -18,6 +18,9 @@ var/sqltext = dbcon.Quote(t); return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that +/proc/format_table_name(table as text) + return sqlfdbktableprefix + table + /* * Text sanitization */ @@ -339,4 +342,19 @@ proc/checkhtml(var/t) /proc/trim_strip_html_properly(var/input, var/max_length = MAX_MESSAGE_LEN) return trim(strip_html_properly(input, max_length)) + +//Used in preferences' SetFlavorText and human's set_flavor verb +//Previews a string of len or less length +/proc/TextPreview(var/string,var/len=40) + if(lentext(string) <= len) + if(!lentext(string)) + return "\[...\]" + else + return string + else + return "[copytext_preserve_html(string, 1, 37)]..." + +//alternative copytext() for encoded text, doesn't break html entities (" and other) +/proc/copytext_preserve_html(var/text, var/first, var/last) + return html_encode(copytext(html_decode(text), first, last)) \ No newline at end of file diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index cbc7fd08920..af4de68fd7a 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -4,25 +4,14 @@ #define HOURS *36000 //Returns the world time in english -proc/worldtime2text(time = world.time) +/proc/worldtime2text(time = world.time) return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" -proc/time_stamp() +/proc/time_stamp() return time2text(world.timeofday, "hh:mm:ss") - -/* Preserving this so future generations can see how fucking retarded some people are -proc/time_stamp() - var/hh = text2num(time2text(world.timeofday, "hh")) // Set the hour - var/mm = text2num(time2text(world.timeofday, "mm")) // Set the minute - var/ss = text2num(time2text(world.timeofday, "ss")) // Set the second - var/ph - var/pm - var/ps - if(hh < 10) ph = "0" - if(mm < 10) pm = "0" - if(ss < 10) ps = "0" - return"[ph][hh]:[pm][mm]:[ps][ss]" -*/ + +/proc/gameTimestamp(format = "hh:mm:ss") // Get the game time in text + return time2text(world.time - timezoneOffset + 432000, format) /* Returns 1 if it is the selected month and day */ proc/isDay(var/month, var/day) @@ -35,3 +24,8 @@ proc/isDay(var/month, var/day) // Uncomment this out when debugging! //else //return 1 + +//returns timestamp in a sql and ISO 8601 friendly format +/proc/SQLtime() + return time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") + \ No newline at end of file diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index bac5959d630..1ef5f60488e 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -248,7 +248,7 @@ proc/tg_text2list(text, glue=",", assocglue=";") if(4.0) return EAST if(8.0) return WEST else - world.log << "UNKNOWN DIRECTION: [direction]" + log_to_dd("UNKNOWN DIRECTION: [direction]") /proc/dir2text(direction) switch(direction) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index e5219516f27..3612c4d8c4d 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -653,7 +653,15 @@ Turf and target are seperate in case you want to teleport some distance from a t return . /proc/key_name_admin(var/whom, var/include_name = 1) - return key_name(whom, 1, include_name) + var/message = "[key_name(whom, 1, include_name)](?)[isAntag(whom) ? " (ANTAG)" : ""] ([admin_jump_link(whom, "holder")])" + return message + +/proc/get_mob_by_ckey(key) + if(!key) + return + for(var/mob/M in mob_list) + if(M.ckey == key) + return M // Returns the atom sitting on the turf. // For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. diff --git a/code/_globalvars/database.dm b/code/_globalvars/database.dm index 437f479f99c..987b31b9ff7 100644 --- a/code/_globalvars/database.dm +++ b/code/_globalvars/database.dm @@ -9,6 +9,7 @@ var/sqlpass = "example" var/sqlfdbkdb = "paradise" var/sqlfdbklogin = "root" var/sqlfdbkpass = "example" +var/sqlfdbktableprefix = "erro_" //backwords compatibility with downstream server hosts var/sqllogging = 0 // Should we log deaths, population stats, etc? diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 8ec230cc13b..882331d21de 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -8,12 +8,13 @@ var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused //Underwear -var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None") -var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None") -var/global/list/underwear_list = underwear_m + underwear_f - //undershirt -var/global/list/undershirt_t = list("White Shirt", "White Tank top", "Black shirt", "Black Tank top", "Grey Shirt", "Grey tank top", "Lover Shirt", "Blue Ian Shirt", "UK Shirt","I Love NT Shirt", "Peace Shirt", "Band Shirt", "PogoMan Shirt", "Matroska Shirt", "White Short-sleeved shirt", "Purple Short-sleeved shirt", "Blue Short-sleeved shirt", "Green Short-sleeved shirt", "Black Short-Sleeved shirt", "Blue T-Shirt", "Red T-Shirt", "Yellow T-Shirt", "Green T-Shirt", "Blue Polo Shirt", "Red Polo Shirt", "White Polo Shirt", "Gray-Yellow Polo Shirt", "Green Sports Shirt", "Red Sports Shirt", "Blue Sports Shirt", "SS13 Shirt", "Fire Tank Top", "Question Shirt", "Skull Shirt", "Commie Shirt", "Nanotrasen Shirt", "Striped Shirt", "Blue Shirt", "Red Shirt", "Green Shirt", "Meat Shirt", "Tie-Dye Shirt", "Red Jersey", "Blue Jersey", "None") -var/global/list/undershirt_list = undershirt_t +var/global/list/underwear_list = list() //stores /datum/sprite_accessory/underwear indexed by name +var/global/list/underwear_m = list() //stores only underwear name +var/global/list/underwear_f = list() //stores only underwear name + //Undershirts +var/global/list/undershirt_list = list() //stores /datum/sprite_accessory/undershirt indexed by name +var/global/list/undershirt_m = list() //stores only undershirt name +var/global/list/undershirt_f = list() //stores only undershirt name //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index b2ddadd7404..9d2e9fc5c89 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -8,6 +8,7 @@ var/global/list/whitelisted_species = list() var/list/clients = list() //list of all clients var/list/admins = list() //list of all clients whom are admins +var/list/deadmins = list() //list of all clients who have used the de-admin verb. var/list/directory = list() //list of all ckeys with associated client //Since it didn't really belong in any other category, I'm putting this here diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index cd38e6e34d8..00a878bf27f 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -64,4 +64,6 @@ var/score_dmgestjob = null var/score_dmgestdamage = 0 var/score_dmgestkey = null -var/TAB = "    " \ No newline at end of file +var/TAB = "    " + +var/timezoneOffset = 0 // The difference betwen midnight (of the host computer) and 0 world.ticks. \ No newline at end of file diff --git a/code/_hooks/hooks.dm b/code/_hooks/hooks.dm index 07f4bfd0618..b78526bfc2b 100644 --- a/code/_hooks/hooks.dm +++ b/code/_hooks/hooks.dm @@ -32,21 +32,21 @@ var/global/list/hooks = list() for (var/hook_path in typesof(/hook)) var/hook/hook = new hook_path hooks[hook.name] = hook -// world.log << "Found hook: " + hook.name +// log_to_dd("Found hook: " + hook.name) for (var/hook_path in typesof(/hook_handler)) var/hook_handler/hook_handler = new hook_path for (var/name in hooks) if (hascall(hook_handler, "On" + name)) var/hook/hook = hooks[name] hook.handlers += hook_handler -// world.log << "Found hook handler for: " + name +// log_to_dd("Found hook handler for: " + name) for (var/hook/hook in hooks) hook.Setup() /proc/CallHook(var/name as text, var/list/args) var/hook/hook = hooks[name] if (!hook) - //world.log << "WARNING: Hook with name " + name + " does not exist" + //log_to_dd("WARNING: Hook with name " + name + " does not exist") return if (hook.Called(args)) return diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 9c586c3873e..745f747684f 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -191,6 +191,8 @@ var/mob/living/silicon/robot/r = mymob + if(!r.client) return + if(r.shown_robot_modules) //Modules display is shown r.client.screen += r.throw_icon //"store" icon diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index c09b5730b69..eb6350a73b6 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -360,9 +360,9 @@ if(istype(thrower, /atom)) var/atom/A = thrower ptext += " ([A]) ([A.x],[A.y],[A.z])" - world.log << "\[[time_stamp()]\] Process [name] caught exception[ptext]: [etext]" + log_to_dd("\[[time_stamp()]\] Process [name] caught exception[ptext]: [etext]") if(exceptions[eid] >= 10) - world.log << "This exception will now be ignored for ten minutes." + log_to_dd("This exception will now be ignored for ten minutes.") spawn(6000) exceptions[eid] = 0 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c727a275a0b..a958c3b4eec 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -17,6 +17,7 @@ var/log_adminchat = 0 // log admin chat messages var/log_adminwarn = 0 // log warnings admins get about bomb construction and such var/log_pda = 0 // log pda messages + var/log_world_output = 0 // log world.log << messages var/log_runtimes = 0 // Logs all runtimes. var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits var/log_runtime = 0 // logs world.log to a file @@ -159,7 +160,7 @@ var/allow_holidays = 0 var/player_overflow_cap = 0 //number of players before the server starts rerouting var/list/overflow_whitelist = list() //whitelist for overflow - + var/disable_away_missions = 0 // disable away missions /datum/configuration/New() @@ -267,6 +268,9 @@ if ("log_pda") config.log_pda = 1 + if ("log_world_output") + config.log_world_output = 1 + if ("log_hrefs") config.log_hrefs = 1 @@ -518,7 +522,7 @@ if("overflow_server_url") config.overflow_server_url = value - + if("disable_away_missions") config.disable_away_missions = 1 @@ -630,6 +634,8 @@ sqlfdbklogin = value if ("feedback_password") sqlfdbkpass = value + if("feedback_tableprefix") + sqlfdbktableprefix = value if ("enable_stat_tracking") sqllogging = 1 else diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 4194567ae10..7bdbb664724 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -70,8 +70,9 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle wait_for_launch = 0 //calls the shuttle for an emergency evacuation -/datum/emergency_shuttle_controller/proc/call_evac() - if(!can_call()) return 0 +/datum/emergency_shuttle_controller/proc/call_evac(var/reason) + if(!can_call()) + return 0 //set the launch timer autopilot = 1 @@ -82,7 +83,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle shuttle.move_time = SHUTTLE_TRANSIT_DURATION evac = 1 - emergency_shuttle_called.Announce("An emergency evacuation shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.") + var/emergencytext = "An emergency evacuation shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes." + if(reason) + emergencytext += "\n\nReason: [reason]" + emergency_shuttle_called.Announce(emergencytext) for(var/area/A in world) if(istype(A, /area/hallway)) A.readyalert() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 48cc625ab47..0553e65edfb 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -274,7 +274,7 @@ client body += "" body += "" body += "" - body += "" + body += "" body += "" body += "" if(isobj(D)) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 864a0f0d6b0..8f74d67cc62 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -71,7 +71,7 @@ datum/mind proc/transfer_to(mob/living/new_character) if(!istype(new_character)) - world.log << "## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn" + log_to_dd("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn") if(current) //remove ourself from our old body's mind variable current.mind = null @@ -142,7 +142,7 @@ datum/mind var/mob/living/carbon/human/H = current if (istype(current, /mob/living/carbon/human)) /** Impanted**/ - if(H.is_loyalty_implanted(H)) + if(H.is_loyalty_implanted()) text = "Loyalty Implant:Remove|Implanted
" else text = "Loyalty Implant:No Implant|Implant him!
" @@ -152,7 +152,7 @@ datum/mind if (ticker.mode.config_tag=="revolution") text += uppertext(text) text = "[text]: " - if (H.is_loyalty_implanted(H)) + if (H.is_loyalty_implanted()) text += "LOYAL EMPLOYEE|headrev|rev" else if (src in ticker.mode.head_revolutionaries) text = "employee|HEADREV|rev" @@ -188,7 +188,7 @@ datum/mind if (ticker.mode.config_tag=="cult") text = uppertext(text) text = "[text]: " - if (H.is_loyalty_implanted(H)) + if (H.is_loyalty_implanted()) text += "LOYAL EMPLOYEE|cultist" else if (src in ticker.mode.cult) text += "employee|CULTIST" @@ -302,7 +302,7 @@ datum/mind if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") text = uppertext(text) text = "[text]: " - if (H.is_loyalty_implanted(H)) + if (H.is_loyalty_implanted()) text +="traitor|LOYAL EMPLOYEE" else if (src in ticker.mode.traitors) diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index 91d065e5279..52c0af1af82 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -140,7 +140,7 @@ proc/sql_commit_feedback() log_game("SQL ERROR during feedback reporting. Failed to connect.") else - var/DBQuery/max_query = dbcon.NewQuery("SELECT MAX(roundid) AS max_round_id FROM erro_feedback") + var/DBQuery/max_query = dbcon.NewQuery("SELECT MAX(roundid) AS max_round_id FROM [format_table_name("feedback")]") max_query.Execute() var/newroundid @@ -160,7 +160,7 @@ proc/sql_commit_feedback() var/variable = item.get_variable() var/value = item.get_value() - var/DBQuery/query = dbcon.NewQuery("INSERT INTO erro_feedback (id, roundid, time, variable, value) VALUES (null, [newroundid], Now(), '[variable]', '[value]')") + var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("feedback")] (id, roundid, time, variable, value) VALUES (null, [newroundid], Now(), '[variable]', '[value]')") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during death reporting. Error : \[[err]\]\n") \ No newline at end of file diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index 4fa3a5358cd..88ff95833ad 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -203,6 +203,6 @@ var/global/max_secret_rooms = 6 new garbage(T) areapoints -= 5 emptyturfs -= T - //world.log << "The [theme] themed [T.loc] has been created!" + //log_to_dd("The [theme] themed [T.loc] has been created!") return 1 \ No newline at end of file diff --git a/code/game/dna/dna.dm b/code/game/dna/dna.dm index 2835a1614ed..716d563a6e7 100644 --- a/code/game/dna/dna.dm +++ b/code/game/dna/dna.dm @@ -74,7 +74,7 @@ //Hair var/hair = 0 if(!character.h_style) - character.h_style = "Bald" + character.h_style = random_hair_style(character.gender) var/hrange = round(4095 / hair_styles_list.len) var/index = hair_styles_list.Find(character.h_style) @@ -84,7 +84,7 @@ //Facial Hair var/beard = 0 if(!character.f_style) - character.f_style = "Shaved" + character.f_style = random_facial_hair_style(character.gender) var/f_hrange = round(4095 / facial_hair_styles_list.len) index = facial_hair_styles_list.Find(character.f_style) diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index db34ccbdbbb..7ea73a79ddd 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -335,8 +335,8 @@ var/mob/living/carbon/L = usr if(L) - usr.attack_log += text("\[[time_stamp()]\] [usr.real_name] ([usr.ckey]) cast the spell [name] on [L.real_name] ([L.ckey]).") - msg_admin_attack("[usr.real_name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has cast the spell [name] on [L.real_name] ([L.ckey]) (JMP)") + usr.attack_log += text("\[[time_stamp()]\] [key_name(usr)] cast the spell [name] on [key_name(L)]") + msg_admin_attack("[key_name_admin(usr)] has cast the spell [name] on [key_name_admin(L)]") L.adjust_fire_stacks(0.5) L.visible_message("\red [L.name] suddenly bursts into flames!") diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 452a8cd6c8d..06a16390fa7 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -169,13 +169,13 @@ if(H.internal) H.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [H]!", "[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.") - log_admin("[ckey(usr.key)] has used cryokinesis on [ckey(C.key)], internals yes, suit yes") - msg_admin_attack("[usr.real_name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has cast cryokinesis on [C.real_name] ([C.ckey]), (JMP)") + log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit") + msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") else H.visible_message("\red [usr] sprays a cloud of fine ice crystals engulfing, [H]!", "[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") - log_admin("[usr.real_name] ([ckey(usr.key)]) has used cryokinesis on [C.real_name] ([ckey(C.key)]), ()") - msg_admin_attack("[usr.real_name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has cast cryokinesis on [C.real_name] ([C.ckey]), (JMP)") + log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]") + msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") H.bodytemperature = max(0, H.bodytemperature - 50) H.adjustFireLoss(5) if(!handle_suit) @@ -184,8 +184,8 @@ C.ExtinguishMob() C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!") - log_admin("[ckey(usr.key)] has used cryokinesis on [ckey(C.key)], internals no, suit no") - msg_admin_attack("[usr.real_name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has cast cryokinesis on [C.real_name] ([C.ckey]), (JMP)") + log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] without internals or a suit") + msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") //playsound(usr.loc, 'bamf.ogg', 50, 0) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 93f2c468aa6..50819be8c1d 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -16,6 +16,8 @@ return 0 if(iscultist(mind.current)) return 1 //If they're already in the cult, assume they are convertable + if(jobban_isbanned(mind.current, "cultist") || jobban_isbanned(mind.current, "Syndicate")) + return 0 if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0 if(ishuman(mind.current)) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 98451fe2ee7..f58a93b931f 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -330,9 +330,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", attack(mob/living/M as mob, mob/living/user as mob) - M.attack_log += text("\[[time_stamp()]\] Has had the [name] used on him by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used [name] on [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used [name] on [M.name] ([M.ckey]) (JMP)") + M.attack_log += text("\[[time_stamp()]\] Has had the [name] used on him by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] Used [name] on [key_name(M)]") + msg_admin_attack("[key_name_admin(user)] used [name] on [key_name_admin(M)]") if(!iscarbon(M)) M.LAssailant = null else diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index d6343e88142..c42c9cec293 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -111,7 +111,7 @@ var/list/sacrificed = list() "\red AAAAAAHHHH!.", \ "\red You hear an anguished scream.") cult_log("[key_name_admin(usr)] tried to convert [key_name_admin(M)]") - if(is_convertable_to_cult(M.mind) && !jobban_isbanned(M, "cultist") && !jobban_isbanned(M,"Syndicate"))//putting jobban check here because is_convertable uses mind as argument + if(is_convertable_to_cult(M.mind)) ticker.mode.add_cultist(M.mind) M.mind.special_role = "Cultist" M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root." diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index c72cf729bee..87d8e4e083c 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -96,7 +96,7 @@ sleep(150) command_announcement.Announce("Gr3y.T1d3 virus detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert") else - world.log << "ERROR: Could not initate grey-tide virus. Unable find prison or brig area." + log_to_dd("ERROR: Could not initate grey-tide virus. Unable find prison or brig area.") /proc/carp_migration() // -- Darem for(var/obj/effect/landmark/C in landmarks_list) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index fb2168181e3..7438d5c7978 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -129,17 +129,12 @@ msg += "You have been sent the $[pay], as agreed." else msg += "However, we were unable to send you the $[pay] you're entitled." - if(useMS) + if(useMS && P) // THIS SHOULD HAVE DONE EVERYTHING FOR ME useMS.send_pda_message("[P.owner]", "[command_name()] Payroll", msg) // BUT NOPE, NEED TO DO THIS BULLSHIT. - P.tnote += "← From [command_name()] (Payroll):
[msg]
" - - if (!P.silent) - playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, P.loc)) - if(!P.silent) O.show_message(text("\icon[P] *[P.ttone]*")) + P.play_ringtone() //Search for holder of the PDA. var/mob/living/L = null if(P.loc && isliving(P.loc)) @@ -562,4 +557,11 @@ proc/get_nt_opposed() if(BE_ALIEN) roletext="alien" if(BE_MUTINEER) roletext="mutineer" if(BE_BLOB) roletext="blob" - return roletext \ No newline at end of file + return roletext + +/proc/get_nuke_code() + var/nukecode = "ERROR" + for(var/obj/machinery/nuclearbomb/bomb in world) + if(bomb && bomb.r_code && bomb.z == ZLEVEL_STATION) + nukecode = bomb.r_code + return nukecode \ No newline at end of file diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 164ff065758..5f4d14740a2 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -261,7 +261,7 @@ datum/game_mode/proc/auto_declare_completion_heist() text += "
[vox.key] was [vox.name] (" if(check_return) var/obj/stack = raiders[vox] - if(get_area(stack) != locate(/area/shuttle/vox/station)) + if(get_area(stack.loc) != locate(/area/shuttle/vox/station)) text += "left behind)" continue if(vox.current) diff --git a/code/game/gamemodes/mutiny/mutiny.dm b/code/game/gamemodes/mutiny/mutiny.dm index 150ff09f5fe..ad4513e6709 100644 --- a/code/game/gamemodes/mutiny/mutiny.dm +++ b/code/game/gamemodes/mutiny/mutiny.dm @@ -105,10 +105,7 @@ datum/game_mode/mutiny if (!pda) return 0 - if (!pda.silent) - playsound(pda.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, pda.loc)) - O.show_message(text("\icon[pda] *[pda.ttone]*")) + pda.play_ringtone() head_mutineer.current << fluff.get_pda_body() return 1 diff --git a/code/game/gamemodes/mutiny/mutiny_hooks.dm b/code/game/gamemodes/mutiny/mutiny_hooks.dm index 14766e520ec..f87ab7c1919 100644 --- a/code/game/gamemodes/mutiny/mutiny_hooks.dm +++ b/code/game/gamemodes/mutiny/mutiny_hooks.dm @@ -12,7 +12,7 @@ mode.update_icon(H.mind) return 1 -/hook/harvest_podman/proc/update_icon(mob/living/carbon/primitive/diona/D) +/hook/harvest_podman/proc/update_icon(mob/living/simple_animal/diona/D) var/datum/game_mode/mutiny/mode = get_mutiny_mode() if (!mode) return 1 diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index 52df698a96f..f0cc2f28cbe 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -293,8 +293,7 @@ datum/game_mode/nations else new_character.gender = pick(MALE,FEMALE) var/datum/preferences/A = new() - A.randomize_appearance_for(new_character) - new_character.real_name = real_name + A.copy_to(new_character) if(!new_character.real_name) if(new_character.gender == MALE) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index e9752e1e65b..faf3f353c16 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -10,7 +10,7 @@ var/bomb_set var/extended = 0.0 var/lighthack = 0 var/opened = 0.0 - var/timeleft = 60.0 + var/timeleft = 120.0 var/timing = 0.0 var/r_code = "ADMIN" var/code = "" @@ -51,12 +51,11 @@ var/bomb_set /obj/machinery/nuclearbomb/process() if (src.timing) bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed. - src.timeleft-- - if (src.timeleft <= 0) - explode() - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - nanomanager.update_uis(src) + timeleft = max(timeleft - 2, 0) // 2 seconds per process() + if (timeleft <= 0) + spawn + explode() + nanomanager.update_uis(src) return /obj/machinery/nuclearbomb/attackby(obj/item/weapon/O as obj, mob/user as mob, params) @@ -163,13 +162,13 @@ var/bomb_set return ..() - +/obj/machinery/nuclearbomb/attack_ghost(mob/user as mob) + ui_interact(user) + /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) if (src.extended) if (src.opened) - nukehack_win(user,50) - user.set_machine(src) - ui_interact(user) + ui_interact(user) else if (src.deployable) if(removal_stage < 5) src.anchored = 1 @@ -182,9 +181,6 @@ var/bomb_set src.extended = 1 return -obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) - ui_interact(user) - /obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] var/uiwidth @@ -193,8 +189,8 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) data["is_syndicate"] = is_syndicate if(!src.opened) data["hacking"] = 0 - data["auth"] = src.auth - if (src.auth) + data["auth"] = is_auth(user) + if (is_auth(user)) if (src.yes_code) data["authstatus"] = src.timing ? "Functional/Set" : "Functional" else @@ -211,7 +207,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) data["anchored"] = src.anchored data["yescode"] = src.yes_code data["message"] = "AUTH" - if (src.auth) + if (is_auth(user)) data["message"] = src.code if (src.yes_code) data["message"] = "*****" @@ -230,11 +226,13 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) uiwidth = 420 uiheight = 440 uititle = "Nuclear Bomb Defusion" + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "nuclear_bomb.tmpl", uititle, uiwidth, uiheight) ui.set_initial_data(data) ui.open() + ui.set_auto_update(1) /obj/machinery/nuclearbomb/verb/make_deployable() set category = "Object" @@ -252,137 +250,139 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) src.deployable = 1 return +/obj/machinery/nuclearbomb/proc/is_auth(user as mob) + if(auth) + return 1 + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 1 + else + return 0 + /obj/machinery/nuclearbomb/Topic(href, href_list) if(..()) - return - if (!usr.canmove || usr.stat || usr.restrained()) - return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) - usr.set_machine(src) - if(href_list["act"]) - var/temp_wire = href_list["wire"] - if(href_list["act"] == "pulse") - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" + return 1 + + if(href_list["act"]) + var/temp_wire = href_list["wire"] + if(href_list["act"] == "pulse") + if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) + usr << "You need a multitool!" + else + if(src.wires[temp_wire]) + usr << "You can't pulse a cut wire." else - if(src.wires[temp_wire]) - usr << "You can't pulse a cut wire." - else - if(src.light_wire == temp_wire) - src.lighthack = !src.lighthack - spawn(100) src.lighthack = !src.lighthack - if(src.timing_wire == temp_wire) - if(src.timing) - explode() - if(src.safety_wire == temp_wire) - src.safety = !src.safety - spawn(100) src.safety = !src.safety - if(src.safety == 1) - visible_message("\blue The [src] quiets down.") - if(!src.lighthack) - if (src.icon_state == "nuclearbomb2") - src.icon_state = "nuclearbomb1" - else - visible_message("\blue The [src] emits a quiet whirling noise!") - if(href_list["act"] == "wire") - if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) - usr << "You need wirecutters!" - else - wires[temp_wire] = !wires[temp_wire] - if(src.safety_wire == temp_wire) - if(src.timing) - explode() - if(src.timing_wire == temp_wire) - if(!src.lighthack) - if (src.icon_state == "nuclearbomb2") - src.icon_state = "nuclearbomb1" - src.timing = 0 - bomb_set = 0 if(src.light_wire == temp_wire) src.lighthack = !src.lighthack - - if (href_list["auth"]) - if (src.auth) - src.auth.loc = src.loc - src.yes_code = 0 - src.auth = null + spawn(100) src.lighthack = !src.lighthack + if(src.timing_wire == temp_wire) + if(src.timing) + spawn + explode() + if(src.safety_wire == temp_wire) + src.safety = !src.safety + spawn(100) src.safety = !src.safety + if(src.safety == 1) + visible_message("\blue The [src] quiets down.") + if(!src.lighthack) + if (src.icon_state == "nuclearbomb2") + src.icon_state = "nuclearbomb1" + else + visible_message("\blue The [src] emits a quiet whirling noise!") + if(href_list["act"] == "wire") + if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) + usr << "You need wirecutters!" else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/disk/nuclear)) - usr.drop_item() - I.loc = src - src.auth = I - if (src.auth) - if (href_list["type"]) - if (href_list["type"] == "E") - if (src.code == src.r_code) - src.yes_code = 1 - src.code = null - else - src.code = "ERROR" - else - if (href_list["type"] == "R") - src.yes_code = 0 - src.code = null - else - lastentered = text("[]", href_list["type"]) - if (text2num(lastentered) == null) - var/turf/LOC = get_turf(usr) - message_admins("[key_name_admin(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]! ([LOC ? "JMP" : "null"])", 0) - log_admin("EXPLOIT: [key_name(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]!") - else - src.code += lastentered - if (length(src.code) > 5) - src.code = "ERROR" - if (src.yes_code) - if (href_list["time"]) - var/time = text2num(href_list["time"]) - src.timeleft += time - src.timeleft = min(max(round(src.timeleft), 60), 600) - if (href_list["timer"]) - if (src.timing == -1.0) - return - if (src.safety) - usr << "\red The safety is still on." - nanomanager.update_uis(src) - return - src.timing = !( src.timing ) - if (src.timing) - if(!src.lighthack) - src.icon_state = "nuclearbomb2" - if(!src.safety) - bomb_set = 1//There can still be issues with this reseting when there are multiple bombs. Not a big deal tho for Nuke/N - else - bomb_set = 0 - else - bomb_set = 0 - if(!src.lighthack) + wires[temp_wire] = !wires[temp_wire] + if(src.safety_wire == temp_wire) + if(src.timing) + spawn + explode() + if(src.timing_wire == temp_wire) + if(!src.lighthack) + if (src.icon_state == "nuclearbomb2") src.icon_state = "nuclearbomb1" - if (href_list["safety"]) - src.safety = !( src.safety ) - if(safety) - src.timing = 0 - bomb_set = 0 - if (href_list["anchor"]) - if(removal_stage == 5) - src.anchored = 0 - visible_message("\red \The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") - return + src.timing = 0 + bomb_set = 0 + if(src.light_wire == temp_wire) + src.lighthack = !src.lighthack - src.anchored = !( src.anchored ) - if(src.anchored) - visible_message("\red With a steely snap, bolts slide out of [src] and anchor it to the flooring.") + if (href_list["auth"]) + if (src.auth) + src.auth.loc = src.loc + src.yes_code = 0 + src.auth = null + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/disk/nuclear)) + usr.drop_item() + I.loc = src + src.auth = I + if (is_auth(usr)) + if (href_list["type"]) + if (href_list["type"] == "E") + if (src.code == src.r_code) + src.yes_code = 1 + src.code = null + else + src.code = "ERROR" + else + if (href_list["type"] == "R") + src.yes_code = 0 + src.code = null + else + lastentered = text("[]", href_list["type"]) + if (text2num(lastentered) == null) + var/turf/LOC = get_turf(usr) + message_admins("[key_name_admin(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]! ([LOC ? "JMP" : "null"])", 0) + log_admin("EXPLOIT: [key_name(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]!") else - visible_message("\red The anchoring bolts slide back into the depths of [src].") + src.code += lastentered + if (length(src.code) > 5) + src.code = "ERROR" + if (src.yes_code) + if (href_list["time"]) + var/time = text2num(href_list["time"]) + src.timeleft += time + src.timeleft = min(max(round(src.timeleft), 120), 600) + if (href_list["timer"]) + if (src.timing == -1.0) + nanomanager.update_uis(src) + return + if (src.safety) + usr << "\red The safety is still on." + nanomanager.update_uis(src) + return + src.timing = !( src.timing ) + if (src.timing) + if(!src.lighthack) + src.icon_state = "nuclearbomb2" + if(!src.safety) + bomb_set = 1//There can still be issues with this reseting when there are multiple bombs. Not a big deal tho for Nuke/N + else + bomb_set = 0 + else + bomb_set = 0 + if(!src.lighthack) + src.icon_state = "nuclearbomb1" + if (href_list["safety"]) + src.safety = !( src.safety ) + if(safety) + src.timing = 0 + bomb_set = 0 + if (href_list["anchor"]) + if(removal_stage == 5) + src.anchored = 0 + visible_message("\red \The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") + nanomanager.update_uis(src) + return - src.add_fingerprint(usr) - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - nanomanager.update_uis(src) - else - return - return + src.anchored = !( src.anchored ) + if(src.anchored) + visible_message("\red With a steely snap, bolts slide out of [src] and anchor it to the flooring.") + else + visible_message("\red The anchoring bolts slide back into the depths of [src].") + nanomanager.update_uis(src) /obj/machinery/nuclearbomb/ex_act(severity) return @@ -394,7 +394,6 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) return ..() return - #define NUKERANGE 80 /obj/machinery/nuclearbomb/proc/explode() if (src.safety) @@ -479,8 +478,8 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) var/obj/item/weapon/disk/nuclear/NEWDISK = new(pick(blobstart)) transfer_fingerprints_to(NEWDISK) var/turf/diskturf = get_turf(src) - message_admins("[src] has been destroyed in ([diskturf.x], [diskturf.y] ,[diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).") - log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y] ,[diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).") + message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).") + log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y], [diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).") return QDEL_HINT_HARDDEL_NOW else error("[src] was supposed to be destroyed, but we were unable to locate a blobstart landmark to spawn a new one.") diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 591d5f8f5ba..099a8e61bad 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -250,7 +250,7 @@ if(beingborged) rev_mind.current << "\red The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now." - + message_admins("[key_name_admin(rev_mind.current)] has been borged while being a member of the revolution.") else rev_mind.current << "\red You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..." diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index ae4e41babed..11dbb239be3 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -374,15 +374,15 @@ if(t_mind.current.client) for(var/image/I in t_mind.current.client.images) if((I.icon_state == "greytide" || I.icon_state == "greytide_head") && I.loc == traitor_mind.current) - //world.log << "deleting [traitor_mind] overlay" + //log_to_dd("deleting [traitor_mind] overlay") qdel(I) if(head) - //world.log << "found [head.name]" + //log_to_dd("found [head.name]") if(head.current) if(head.current.client) for(var/image/I in head.current.client.images) if((I.icon_state == "greytide" || I.icon_state == "greytide_head") && I.loc == traitor_mind.current) - //world.log << "deleting [traitor_mind] overlay" + //log_to_dd("deleting [traitor_mind] overlay") qdel(I) if(traitor_mind.current) if(traitor_mind.current.client) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 921f50dce9d..13507d847cb 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -416,15 +416,15 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(t_mind.current.client) for(var/image/I in t_mind.current.client.images) if((I.icon_state == "vampthrall" || I.icon_state == "vampire") && I.loc == vampire_mind.current) - //world.log << "deleting [vampire_mind] overlay" + //log_to_dd("deleting [vampire_mind] overlay") qdel(I) if(head) - //world.log << "found [head.name]" + //log_to_dd("found [head.name]") if(head.current) if(head.current.client) for(var/image/I in head.current.client.images) if((I.icon_state == "vampthrall" || I.icon_state == "vampire") && I.loc == vampire_mind.current) - //world.log << "deleting [vampire_mind] overlay" + //log_to_dd("deleting [vampire_mind] overlay") qdel(I) if(vampire_mind.current) if(vampire_mind.current.client) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index eff70300720..b25aa1b6ae8 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -11,7 +11,7 @@ var/datum/vampire/vampire = src.mind.vampire if(!vampire) - world.log << "[src] has vampire verbs but isn't a vampire." + log_to_dd("[src] has vampire verbs but isn't a vampire.") return 0 var/fullpower = (VAMP_FULL in vampire.powers) @@ -198,7 +198,8 @@ if(M.current.vampire_power(50, 0)) M.current.visible_message("[M.current.name] transforms!") M.current.client.prefs.real_name = M.current.generate_name() //random_name(M.current.gender) - M.current.client.prefs.randomize_appearance_for(M.current) + M.current.client.prefs.random_character() + M.current.client.prefs.copy_to(M.current) M.current.regenerate_icons() M.current.remove_vampire_blood(50) M.current.verbs -= /client/vampire/proc/vampire_shapeshift @@ -300,7 +301,7 @@ enthrall_safe = 1 break if(!C) - world.log << "something bad happened on enthralling a mob src is [src] [src.key] \ref[src]" + log_to_dd("something bad happened on enthralling a mob src is [src] [src.key] \ref[src]") return 0 if(!C.mind) src << "\red [C.name]'s mind is not there for you to enthrall." diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 148a4b41a25..6ccb27d2c2b 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -65,17 +65,11 @@ /datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard) switch(rand(1,100)) if(1 to 30) - var/datum/objective/assassinate/kill_objective = new kill_objective.owner = wizard kill_objective.find_target() wizard.objectives += kill_objective - - if (!(locate(/datum/objective/escape) in wizard.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = wizard - wizard.objectives += escape_objective - if(31 to 60) + var/datum/objective/steal/steal_objective = new steal_objective.owner = wizard steal_objective.find_target() @@ -85,8 +79,7 @@ var/datum/objective/escape/escape_objective = new escape_objective.owner = wizard wizard.objectives += escape_objective - - if(61 to 85) + if(31 to 60) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = wizard kill_objective.find_target() @@ -102,7 +95,23 @@ survive_objective.owner = wizard wizard.objectives += survive_objective + if(61 to 85) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = wizard + kill_objective.find_target() + wizard.objectives += kill_objective + + if (!(locate(/datum/objective/hijack) in wizard.objectives)) + var/datum/objective/hijack/hijack_objective = new + hijack_objective.owner = wizard + wizard.objectives += hijack_objective + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = wizard + steal_objective.find_target() + wizard.objectives += steal_objective + if (!(locate(/datum/objective/hijack) in wizard.objectives)) var/datum/objective/hijack/hijack_objective = new hijack_objective.owner = wizard @@ -302,4 +311,4 @@ Made a proc so this is not repeated 14 (or more) times.*/ return 1 /proc/iswizard(mob/living/M as mob) - return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.wizards) \ No newline at end of file + return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.wizards) diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index 74b4bea15cd..fa6390a1935 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -150,13 +150,6 @@ else return 0 -/datum/game_mode/xenos/proc/get_nuke_code() - var/nukecode = "ERROR" - for(var/obj/machinery/nuclearbomb/bomb in world) - if(bomb && bomb.r_code && bomb.z == ZLEVEL_STATION) - nukecode = bomb.r_code - return nukecode - /datum/game_mode/xenos/proc/xenos_alive() var/list/livingxenos = list() for(var/datum/mind/xeno in xenos) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 5667a13a40d..b11edd5ae8d 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -695,7 +695,7 @@ data["danger"] = danger return data -/obj/machinery/alarm/proc/get_nano_data(mob/user) +/obj/machinery/alarm/proc/get_nano_data(mob/user, href_list) var/data[0] data["name"] = sanitize(name) data["air"] = ui_air_status() @@ -705,7 +705,7 @@ // Locked when: // Not sent from atmos console AND // Not silicon AND locked. - data["locked"] = (!(istype(user, /mob/living/silicon)) && locked) + data["locked"] = is_locked(user,href_list) data["rcon"] = rcon_setting data["target_temp"] = target_temperature - T0C data["atmos_alarm"] = alarm_area.atmosalm @@ -805,15 +805,15 @@ return thresholds /obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state) - var/list/data = get_nano_data(user) - + var/list/href = state.href_list(user) var/remote_connection = 0 var/remote_access = 0 - if(state) - var/list/href = state.href_list(user) + if(href) remote_connection = href["remote_connection"] // Remote connection means we're non-adjacent/connecting from another computer remote_access = href["remote_access"] // Remote access means we also have the privilege to alter the air alarm. + var/list/data = get_nano_data(user, href) + data["remote_connection"] = remote_connection data["remote_access"] = remote_access @@ -825,13 +825,25 @@ ui.set_auto_update(1) /obj/machinery/alarm/proc/is_authenticated(mob/user as mob, href_list) - if(isAI(user) || isrobot(user) || emagged || is_auth_rcon(href_list)) + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 1 + else if(isAI(user) || isrobot(user) || emagged || is_auth_rcon(href_list)) return 1 else return !locked +/obj/machinery/alarm/proc/is_locked(mob/user as mob, href_list) + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 0 + else if(is_auth_rcon(href_list)) + return 0 + else if(isAI(user) || isrobot(user)) + return 0 + else + return locked + /obj/machinery/alarm/proc/is_auth_rcon(href_list) - if(href_list["remote_connection"] && href_list["remote_access"]) + if(href_list && href_list["remote_connection"] && href_list["remote_access"]) return 1 else return 0 @@ -840,7 +852,7 @@ if(buildstage != 2) return STATUS_CLOSE - if(aidisabled && isAI(user)) + if(aidisabled && (isAI(user) || isrobot(user))) user << "AI control for \the [src] interface has been disabled." return STATUS_CLOSE diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 27a825e2d5c..702f7512535 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -438,16 +438,26 @@ update_flag menu = text2num(href_list["mode_target"]) if(href_list["toggle"]) + var/logmsg if (valve_open) if (holding) - release_log += "Valve was closed by [usr] ([usr.ckey]), stopping the transfer into the [holding]
" + logmsg = "Valve was closed by [usr] ([usr.ckey]), stopping the transfer into the [holding]
" else - release_log += "Valve was closed by [usr] ([usr.ckey]), stopping the transfer into the air
" + logmsg = "Valve was closed by [usr] ([usr.ckey]), stopping the transfer into the air
" else if (holding) - release_log += "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the [holding]
" + logmsg = "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the [holding]
" else - release_log += "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the air
" + logmsg = "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the air
" + if(air_contents.toxins > 0) + message_admins("[key_name_admin(usr)] opened a canister that contains plasma! (JMP)") + log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]") + var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases + if(sleeping_agent && (sleeping_agent.moles > 1)) + message_admins("[key_name_admin(usr)] opened a canister that contains N2O! (JMP)") + log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]") + investigate_log(logmsg, "atmos") + release_log += logmsg valve_open = !valve_open if (href_list["remove_tank"]) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 5ed58c833ca..c08ae986c6d 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -43,7 +43,7 @@ for(var/obj/machinery/camera/C in cameranet.cameras) var/list/tempnetwork = C.network&src.network if(C != src && C.c_tag == src.c_tag && tempnetwork.len) - world.log << "[src.c_tag] [src.x] [src.y] [src.z] conflicts with [C.c_tag] [C.x] [C.y] [C.z]" + log_to_dd("[src.c_tag] [src.x] [src.y] [src.z] conflicts with [C.c_tag] [C.x] [C.y] [C.z]") */ ..() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 62629ca59ec..f8e177a32d8 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -50,8 +50,12 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/proc/is_centcom() return istype(src, /obj/machinery/computer/card/centcom) -/obj/machinery/computer/card/proc/is_authenticated() - return scan ? check_access(scan) : 0 +/obj/machinery/computer/card/proc/is_authenticated(user as mob) + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 1 + if(scan) + return check_access(scan) + return 0 /obj/machinery/computer/card/proc/get_target_rank() return modify && modify.assignment ? modify.assignment : "Unassigned" @@ -180,7 +184,7 @@ var/time_last_changed_position = 0 data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() data["scan_name"] = scan ? scan.name : "-----" - data["authenticated"] = is_authenticated() + data["authenticated"] = is_authenticated(user) data["has_modify"] = !!modify data["account_number"] = modify ? modify.associated_account_number : null data["centcom_access"] = is_centcom() @@ -285,7 +289,7 @@ var/time_last_changed_position = 0 if("access") if(href_list["allowed"]) - if(is_authenticated()) + if(is_authenticated(usr)) var/access_type = text2num(href_list["access_target"]) var/access_allowed = text2num(href_list["allowed"]) if(access_type in (is_centcom() ? get_all_centcom_access() : get_all_accesses())) @@ -295,11 +299,11 @@ var/time_last_changed_position = 0 if("skin") var/skin = href_list["skin_target"] - if(is_authenticated() && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom()))) + if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom()))) modify.icon_state = href_list["skin_target"] if ("assign") - if (is_authenticated() && modify) + if (is_authenticated(usr) && modify) var/t1 = href_list["assign_target"] if(t1 == "Custom") var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN)) @@ -330,7 +334,7 @@ var/time_last_changed_position = 0 callHook("reassign_employee", list(modify)) if ("reg") - if (is_authenticated()) + if (is_authenticated(usr)) var/t2 = modify if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) var/temp_name = reject_bad_name(href_list["reg"]) @@ -341,7 +345,7 @@ var/time_last_changed_position = 0 nanomanager.update_uis(src) if ("account") - if (is_authenticated()) + if (is_authenticated(usr)) var/t2 = modify if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) var/account_num = text2num(href_list["account"]) @@ -381,7 +385,7 @@ var/time_last_changed_position = 0 P.info += " [get_access_desc(A)]" if ("terminate") - if (is_authenticated()) + if (is_authenticated(usr)) modify.assignment = "Terminated" modify.access = list() @@ -389,7 +393,7 @@ var/time_last_changed_position = 0 if("make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS - if(is_authenticated()) + if(is_authenticated(usr)) var/edit_job_target = href_list["job"] var/datum/job/j = job_master.GetJob(edit_job_target) if(!j) @@ -404,7 +408,7 @@ var/time_last_changed_position = 0 if("make_job_unavailable") // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS - if(is_authenticated()) + if(is_authenticated(usr)) var/edit_job_target = href_list["job"] var/datum/job/j = job_master.GetJob(edit_job_target) if(!j) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index fff7bcecb9a..189338e14e9 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -64,50 +64,69 @@ var/shuttle_call/shuttle_calls[0] /obj/machinery/computer/communications/New() ..() crew_announcement.newscast = 1 + +/obj/machinery/computer/communications/proc/is_authenticated(user as mob, var/message = 1) + if(authenticated == 2) + return 2 + else if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 2 + else if(authenticated) + return 1 + else + if(message) + user << "Access denied." + return 0 /obj/machinery/computer/communications/Topic(href, href_list) if(..(href, href_list)) return 1 if ((!(src.z in config.station_levels) && !(src.z in config.admin_levels))) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" + usr << "Unable to establish a connection: You're too far away from the station!" + return 1 + + if(href_list["login"]) + var/mob/living/carbon/human/M = usr + var/obj/item/card = M.get_active_hand() + var/obj/item/weapon/card/id/I = (card && card.GetID())||M.wear_id||M.wear_pda + if (istype(I, /obj/item/device/pda)) + var/obj/item/device/pda/pda = I + I = pda.id + if (I && istype(I)) + if(src.check_access(I)) + authenticated = 1 + if(access_captain in I.access) + authenticated = 2 + crew_announcement.announcer = GetNameAndAssignmentFromId(I) + nanomanager.update_uis(src) + return + + if(href_list["logout"]) + authenticated = 0 + crew_announcement.announcer = "" + setMenuState(usr,COMM_SCREEN_MAIN) + nanomanager.update_uis(src) return - usr.set_machine(src) + if(!is_authenticated(usr)) + return 1 - if(!href_list["operation"]) - return switch(href_list["operation"]) - // main interface if("main") setMenuState(usr,COMM_SCREEN_MAIN) - if("login") - var/mob/M = usr - var/obj/item/weapon/card/id/I = M.get_active_hand() - if (istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if (I && istype(I)) - if(src.check_access(I)) - authenticated = 1 - if(access_captain in I.access) - authenticated = 2 - crew_announcement.announcer = GetNameAndAssignmentFromId(I) - if("logout") - authenticated = 0 - crew_announcement.announcer = "" - setMenuState(usr,COMM_SCREEN_MAIN) - - // ALART LAVUL + if("changeseclevel") setMenuState(usr,COMM_SCREEN_SECLEVEL) if("newalertlevel") - if(issilicon(usr)) - return + if(isAI(usr) || isrobot(usr)) + usr << "Firewalls prevent you from changing the alert level." + nanomanager.update_uis(src) + return 1 tmp_alertlevel = text2num(href_list["level"]) - var/mob/M = usr - var/obj/item/weapon/card/id/I = M.get_active_hand() + var/mob/living/carbon/human/L = usr + var/obj/item/card = L.get_active_hand() + var/obj/item/weapon/card/id/I = (card && card.GetID())||L.wear_id||L.wear_pda if (istype(I, /obj/item/device/pda)) var/obj/item/device/pda/pda = I I = pda.id @@ -128,20 +147,22 @@ var/shuttle_call/shuttle_calls[0] if(SEC_LEVEL_BLUE) feedback_inc("alert_comms_blue",1) tmp_alertlevel = 0 - else: - usr << "You are not authorized to do this." + else + usr << "You are not authorized to do this." tmp_alertlevel = 0 setMenuState(usr,COMM_SCREEN_MAIN) else - usr << "You need to swipe your ID." + usr << "You need to swipe your ID." if("announce") - if(src.authenticated==2) + if(is_authenticated(usr) == 2) if(message_cooldown) - usr << "Please allow at least one minute to pass between announcements" + usr << "Please allow at least one minute to pass between announcements." + nanomanager.update_uis(src) return var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") - if(!input || !(usr in view(1,src))) + if(!input || ..() || !(is_authenticated(usr) == 2)) + nanomanager.update_uis(src) return crew_announcement.Announce(input) message_cooldown = 1 @@ -149,27 +170,34 @@ var/shuttle_call/shuttle_calls[0] message_cooldown = 0 if("callshuttle") - if(src.authenticated) - var/response = alert("Are you sure you wish to call the shuttle?", "Confirm", "Yes", "No") - if(response == "Yes") - call_shuttle_proc(usr) - if(emergency_shuttle.online()) - post_status("shuttle") + var/input = input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + if(!input || ..() || !is_authenticated(usr)) + nanomanager.update_uis(src) + return + + call_shuttle_proc(usr, input) + if(emergency_shuttle.online()) + post_status("shuttle") setMenuState(usr,COMM_SCREEN_MAIN) + if("cancelshuttle") - if(issilicon(usr)) return - if(src.authenticated) - var/response = alert("Are you sure you wish to recall the shuttle?", "Confirm", "Yes", "No") - if(response == "Yes") - cancel_call_proc(usr) - if(emergency_shuttle.online()) - post_status("shuttle") + if(isAI(usr) || isrobot(usr)) + usr << "Firewalls prevent you from recalling the shuttle." + nanomanager.update_uis(src) + return 1 + var/response = alert("Are you sure you wish to recall the shuttle?", "Confirm", "Yes", "No") + if(response == "Yes") + cancel_call_proc(usr) + if(emergency_shuttle.online()) + post_status("shuttle") setMenuState(usr,COMM_SCREEN_MAIN) + if("messagelist") src.currmsg = 0 if(href_list["msgid"]) setCurrentMessage(usr, text2num(href_list["msgid"])) setMenuState(usr,COMM_SCREEN_MESSAGES) + if("delmessage") if(href_list["msgid"]) src.currmsg = text2num(href_list["msgid"]) @@ -203,18 +231,39 @@ var/shuttle_call/shuttle_calls[0] if("setmsg1") stat_msg1 = input("Line 1", "Enter Message Text", stat_msg1) as text|null setMenuState(usr,COMM_SCREEN_STAT) + if("setmsg2") stat_msg2 = input("Line 2", "Enter Message Text", stat_msg2) as text|null setMenuState(usr,COMM_SCREEN_STAT) - // OMG CENTCOMM LETTERHEAD - if("MessageCentcomm") - if(src.authenticated==2) + if("nukerequest") + if(is_authenticated(usr) == 2) if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." + usr << "Arrays recycling. Please stand by." + nanomanager.update_uis(src) return - var/input = input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") - if(!input || !(usr in view(1,src))) + var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") as text|null + if(!input || ..() || !(is_authenticated(usr) == 2)) + nanomanager.update_uis(src) + return + Nuke_request(input, usr) + usr << "Request sent." + log_say("[key_name(usr)] has requested the nuclear codes from Centcomm") + priority_announcement.Announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/AI/commandreport.ogg') + centcomm_message_cooldown = 1 + spawn(6000)//10 minute cooldown + centcomm_message_cooldown = 0 + setMenuState(usr,COMM_SCREEN_MAIN) + + if("MessageCentcomm") + if(is_authenticated(usr) == 2) + if(centcomm_message_cooldown) + usr << "Arrays recycling. Please stand by." + nanomanager.update_uis(src) + return + var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null + if(!input || ..() || !(is_authenticated(usr) == 2)) + nanomanager.update_uis(src) return Centcomm_announce(input, usr) usr << "Message transmitted." @@ -224,15 +273,16 @@ var/shuttle_call/shuttle_calls[0] centcomm_message_cooldown = 0 setMenuState(usr,COMM_SCREEN_MAIN) - // OMG SYNDICATE ...LETTERHEAD if("MessageSyndicate") - if((src.authenticated==2) && (src.emagged)) + if((is_authenticated(usr) == 2) && (src.emagged)) if(centcomm_message_cooldown) usr << "Arrays recycling. Please stand by." + nanomanager.update_uis(src) return - var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") - if(!input || !(usr in view(1,src))) + var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null + if(!input || ..() || !(is_authenticated(usr) == 2)) + nanomanager.update_uis(src) return Syndicate_announce(input, usr) usr << "Message transmitted." @@ -247,17 +297,18 @@ var/shuttle_call/shuttle_calls[0] src.emagged = 0 setMenuState(usr,COMM_SCREEN_MAIN) + nanomanager.update_uis(src) return 1 /obj/machinery/computer/communications/emag_act(user as mob) if(!emagged) src.emagged = 1 - user << "You scramble the communication routing circuits!" + user << "You scramble the communication routing circuits!" + nanomanager.update_uis(src) /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) return src.attack_hand(user) - /obj/machinery/computer/communications/attack_hand(var/mob/user as mob) if(..(user)) return @@ -266,7 +317,7 @@ var/shuttle_call/shuttle_calls[0] return if (!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM))) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: You're too far away from the station!" return ui_interact(user) @@ -274,10 +325,10 @@ var/shuttle_call/shuttle_calls[0] /obj/machinery/computer/communications/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) // this is the data which will be sent to the ui var/data[0] - data["is_ai"] = issilicon(user) + data["is_ai"] = isAI(user)||isrobot(user) data["menu_state"] = data["is_ai"] ? ai_menu_state : menu_state data["emagged"] = emagged - data["authenticated"] = authenticated + data["authenticated"] = is_authenticated(user, 0) data["screen"] = getMenuState(usr) data["stat_display"] = list( @@ -297,7 +348,7 @@ var/shuttle_call/shuttle_calls[0] ) ) data["security_level"] = security_level - data["str_security_level"] = get_security_level() + data["str_security_level"] = capitalize(get_security_level()) data["levels"] = list( list("id"=SEC_LEVEL_GREEN, "name"="Green"), list("id"=SEC_LEVEL_BLUE, "name"="Blue"), @@ -333,29 +384,27 @@ var/shuttle_call/shuttle_calls[0] ui.set_initial_data(data) // open the new ui window ui.open() - // auto update every Master Controller tick - ui.set_auto_update(1) /obj/machinery/computer/communications/proc/setCurrentMessage(var/mob/user,var/value) - if(issilicon(user)) + if(isAI(user) || isrobot(user)) aicurrmsg=value else currmsg=value /obj/machinery/computer/communications/proc/getCurrentMessage(var/mob/user) - if(issilicon(user)) + if(isAI(user) || isrobot(user)) return aicurrmsg else return currmsg /obj/machinery/computer/communications/proc/setMenuState(var/mob/user,var/value) - if(issilicon(user)) + if(isAI(user) || isrobot(user)) ai_menu_state=value else menu_state=value /obj/machinery/computer/communications/proc/getMenuState(var/mob/user) - if(issilicon(user)) + if(isAI(user) || isrobot(user)) return ai_menu_state else return menu_state @@ -364,39 +413,38 @@ var/shuttle_call/shuttle_calls[0] for(var/obj/machinery/computer/prison_shuttle/PS in world) PS.allowedtocall = !(PS.allowedtocall) -/proc/call_shuttle_proc(var/mob/user) +/proc/call_shuttle_proc(var/mob/user, var/reason) if ((!( ticker ) || !emergency_shuttle.location())) return if(sent_strike_team == 1) - user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated." + user << "Central Command will not allow the shuttle to be called. Consider all contracts terminated." return if(emergency_shuttle.deny_shuttle) - user << "The emergency shuttle may not be sent at this time. Please try again later." + user << "The emergency shuttle may not be sent at this time. Please try again later." return if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE - user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/60)] minutes before trying again." + user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minutes before trying again." return if(emergency_shuttle.going_to_centcom()) - user << "The emergency shuttle may not be called while returning to CentCom." + user << "The emergency shuttle may not be called while returning to Central Command." return if(emergency_shuttle.online()) - user << "The emergency shuttle is already on its way." + user << "The emergency shuttle is already on its way." return if(ticker.mode.name == "blob") - user << "Under directive 7-10, [station_name()] is quarantined until further notice." + user << "Under directive 7-10, [station_name()] is quarantined until further notice." return - emergency_shuttle.call_evac() + emergency_shuttle.call_evac(reason) log_game("[key_name(user)] has called the shuttle.") message_admins("[key_name_admin(user)] has called the shuttle.", 1) - return /proc/init_shift_change(var/mob/user, var/force = 0) @@ -422,7 +470,7 @@ var/shuttle_call/shuttle_calls[0] return if(world.time < 54000) // 30 minute grace period to let the game get going - user << "The shuttle is refueling. Please wait another [round((54000-world.time)/60)] minutes before trying again." + user << "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again." return if(ticker.mode.name == "epidemic") diff --git a/code/game/machinery/computer/hologram.dm b/code/game/machinery/computer/hologram.dm index c21e3cf8b4f..bfd95d46457 100644 --- a/code/game/machinery/computer/hologram.dm +++ b/code/game/machinery/computer/hologram.dm @@ -36,7 +36,7 @@ I.Blend(rgb(- src.lumens, -src.lumens, -src.lumens), ICON_SUBTRACT) I.Blend(new /icon('icons/mob/human.dmi', "mouth_m_s"), ICON_OVERLAY) - I.Blend(new /icon('icons/mob/human.dmi', "underwear1_m_s"), ICON_OVERLAY) + I.Blend(new /icon('icons/mob/underwear.dmi', "Mens White"), ICON_OVERLAY) var/icon/U = new /icon('icons/mob/human_face.dmi', "hair_a_s") U.Blend(rgb(src.h_r, src.h_g, src.h_b), ICON_ADD) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 8a7d4d170a8..3099d738a70 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -446,16 +446,13 @@ //Sender isn't faking as someone who exists if(isnull(PDARec)) src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]") - if (!customrecepient.silent) - playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, customrecepient.loc)) - O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) - if( customrecepient.loc && ishuman(customrecepient.loc) ) - var/mob/living/carbon/human/H = customrecepient.loc - H << "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)" - log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") - customrecepient.overlays.Cut() - customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") + customrecepient.play_ringtone() + if( customrecepient.loc && ishuman(customrecepient.loc) ) + var/mob/living/carbon/human/H = customrecepient.loc + H << "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)" + log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") + customrecepient.overlays.Cut() + customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") //Sender is faking as someone who exists else src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]") @@ -464,16 +461,13 @@ if(!customrecepient.conversations.Find("\ref[PDARec]")) customrecepient.conversations.Add("\ref[PDARec]") - if (!customrecepient.silent) - playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, customrecepient.loc)) - O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) - if( customrecepient.loc && ishuman(customrecepient.loc) ) - var/mob/living/carbon/human/H = customrecepient.loc - H << "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)" - log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") - customrecepient.overlays.Cut() - customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") + customrecepient.play_ringtone() + if( customrecepient.loc && ishuman(customrecepient.loc) ) + var/mob/living/carbon/human/H = customrecepient.loc + H << "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)" + log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") + customrecepient.overlays.Cut() + customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") //Finally.. ResetMessage() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index ba3727ee30b..4fda7a334d3 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -72,14 +72,14 @@ target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." target.ResetSecurityCodes() else - message_admins("\blue [key_name_admin(usr)] detonated [target.name]!") - log_game("\blue [key_name_admin(usr)] detonated [target.name]!") + message_admins("[key_name_admin(usr)] detonated [key_name_admin(target)] (JMP)!") + log_game("\[key_name(usr)] detonated [key_name(target)]!") target << "Self-destruct command received." + if(target.connected_ai) + target.connected_ai << "

ALERT - Cyborg detonation detected: [target.name]
" spawn(10) target.self_destruct() - - // Locks or unlocks the cyborg else if (href_list["lockdown"]) var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["lockdown"]) @@ -101,15 +101,13 @@ if(!target || !istype(target)) return - message_admins("\blue [key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [target.name]!") - log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [target.name]!") + message_admins("[key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [key_name_admin(target)]!") + log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [key_name(target)]!") target.canmove = !target.canmove - if (target.lockcharge) - target.lockcharge = !target.lockcharge - target << "Your lockdown has been lifted!" - else - target.lockcharge = !target.lockcharge - target << "You have been locked down!" + target.lockcharge = !target.lockcharge + target << "[!target.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]" + if(target.connected_ai) + target.connected_ai << "[!target.lockcharge ? "NOTICE - Cyborg lockdown lifted" : "ALERT - Cyborg lockdown detected"]: [target.name]
" // Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs. else if (href_list["hack"]) @@ -137,8 +135,8 @@ if(!target || !istype(target)) return - message_admins("\blue [key_name_admin(usr)] emagged [target.name] using robotic console!") - log_game("[key_name(usr)] emagged [target.name] using robotic console!") + message_admins("\blue [key_name_admin(usr)] emagged [key_name_admin(target)] using robotic console!") + log_game("[key_name(usr)] emagged [key_name(target)] using robotic console!") target.emagged = 1 target << "Failsafe protocols overriden. New tools available." @@ -160,9 +158,9 @@ user << "Self-destruct aborted - safety active" return - message_admins("\blue [key_name_admin(usr)] detonated all cyborgs!") - log_game("[key_name(usr)] detonated all cyborgs!") - + message_admins("[key_name_admin(usr)] detonated all cyborgs!") + log_game("\[key_name(usr)] detonated all cyborgs!") + for(var/mob/living/silicon/robot/R in mob_list) if(istype(R, /mob/living/silicon/robot/drone)) continue @@ -170,6 +168,8 @@ if(R.scrambledcodes) continue R << "Self-destruct command received." + if(R.connected_ai) + R.connected_ai << "

ALERT - Cyborg detonation detected: [R.name]
" spawn(10) R.self_destruct() diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index d9f3dcd996e..28125a24c96 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -37,12 +37,12 @@ src.authorized -= W:registered_name src.authorized += W:registered_name if (src.auth_need - src.authorized.len > 0) - message_admins("[key_name_admin(user)] has authorized early shuttle launch") - log_game("[user.ckey] has authorized early shuttle launch") + message_admins("[key_name_admin(user.client)] has authorized early shuttle launch ",0,1) + log_game("[key_name(user)] has authorized early shuttle launch in ([x],[y],[z])") world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) else - message_admins("[key_name_admin(user)] has launched the shuttle") - log_game("[user.ckey] has launched the shuttle early") + message_admins("[key_name_admin(user.client)] has launched the emergency shuttle before launch.",0,1) + log_game("[key_name(user)] has launched the emergency shuttle before launch in ([x],[y],[z]).") world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" emergency_shuttle.set_launch_countdown(10) //src.authorized = null @@ -59,13 +59,15 @@ src.authorized = list( ) return - emag_act(user as mob) + emag_act(mob/user as mob) if (!emagged) var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel") if(!emagged && !emergency_shuttle.location()) switch(choice) if("Launch") + message_admins("[key_name_admin(user.client)] has emagged the emergency shuttle before launch.",0,1) + log_game("[key_name(user)] has emagged the emergency shuttle in ([x],[y],[z]) before launch.") world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" emergency_shuttle.set_launch_countdown(10) emagged = 1 diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index d52c6d2adf7..c28edd89e55 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -488,9 +488,8 @@ Gh << "Warning: Your body has entered cryostorage." // Book keeping! - var/turf/location = get_turf(src) - log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)") - message_admins("[key_name_admin(M)] has entered a stasis pod.") + log_admin("[key_name(M)] has entered a stasis pod.") + message_admins("[key_name_admin(user)] has entered a stasis pod. (JMP)") //Despawning occurs when process() is called with an occupant without a client. src.add_fingerprint(M) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 6eaa50bc1f1..abc14227433 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -851,7 +851,9 @@ About the new airlock wires panel: return /obj/machinery/door/airlock/plasma/attackby(C as obj, mob/user as mob, params) - if(C) + if(is_hot(C) > 300) + message_admins("Plasma airlock ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)") + log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])") ignite(is_hot(C)) ..() diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index fb909dee555..bf6fe4f0fe7 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -45,7 +45,7 @@ /obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/Topic(href, href_list) if(..()) - return + return 1 usr.set_machine(src) src.add_fingerprint(usr) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index b0e0a52d948..06a5266d17e 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -26,6 +26,9 @@ update_icon() src.updateDialog() +/obj/machinery/embedded_controller/attack_ghost(mob/user as mob) + src.ui_interact(user) + /obj/machinery/embedded_controller/attack_ai(mob/user as mob) src.ui_interact(user) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 5322c3da301..e32146ff69f 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -82,7 +82,7 @@ if (istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - if ((E.damage > E.min_bruised_damage && prob(E.damage + 50))) + if (E && (E.damage > E.min_bruised_damage && prob(E.damage + 50))) flick("e_flash", O:flash) E.damage += rand(1, 2) else diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index df6727ce3f8..db49facd824 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -339,7 +339,7 @@ return if(UserOverride) - msg_admin_attack("[occupant] ([occupant.ckey]) was gibbed by an autogibber (\the [src]) at (JMP)") + msg_admin_attack("[key_name_admin(occupant)] was gibbed by an autogibber (\the [src]) (JMP)") if(src.operating) return diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index eaa0fa170b4..14c72f6ee9c 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -224,7 +224,7 @@ Class Procs: var/re_init=0 if("set_tag" in href_list) if(!(href_list["set_tag"] in settagwhitelist))//I see you're trying Href exploits, I see you're failing, I SEE ADMIN WARNING. (seriously though, this is a powerfull HREF, I originally found this loophole, I'm not leaving it in on my PR) - message_admins("set_tag HREF (var attempted to edit: [href_list["set_tag"]]) exploit attempted by [key_name(user, user.client)] (?) on [src] ([x],[y],[z] - JMP)") + message_admins("set_tag HREF (var attempted to edit: [href_list["set_tag"]]) exploit attempted by [key_name_admin(user)] on [src] (JMP)") return 1 if(!(href_list["set_tag"] in vars)) usr << "Something went wrong: Unable to find [href_list["set_tag"]] in vars!" diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 5ebcb512d72..7bb074e03f4 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -174,7 +174,7 @@ var/list/turret_icons user << "There seems to be a firewall preventing you from accessing this device." return 1 - if(locked && !(isrobot(user) || isAI(user))) + if(locked && !(isrobot(user) || isAI(user) || isobserver(user))) user << "Access denied." return 1 @@ -185,6 +185,9 @@ var/list/turret_icons return ui_interact(user) + +/obj/machinery/porta_turret/attack_ghost(mob/user) + ui_interact(user) /obj/machinery/porta_turret/attack_hand(mob/user) if(isLocked(user)) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 915def6bdda..11ec8837c87 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -87,7 +87,7 @@ M << "You have joined the ranks of the Syndicate and become a traitor to the station!" - message_admins("[N]/([N.ckey]) has accepted a traitor objective from a syndicate beacon.") + message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.") var/obj_count = 1 for(var/datum/objective/OBJ in M.mind.objectives) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 7ad9f121d06..04a5d3e45dd 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -138,7 +138,7 @@ var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) if(payload && !istype(payload, /obj/item/weapon/bombcore/training)) - msg_admin_attack("[key_name(user)][isAntag(user) ? "(ANTAG)" : ""]? has primed a [name] ([payload]) for detonation at [A.name] (JMP).") + msg_admin_attack("[key_name_admin(user)] has primed a [name] ([payload]) for detonation at [A.name] (JMP).") log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!" @@ -311,10 +311,9 @@ var/turf/T = get_turf(src) var/area/A = get_area(T) detonated-- - var/log_str = "[key_name(user)]? has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] (JMP)." - bombers += log_str - message_admins(log_str) - log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])") + message_admins("[key_name_admin(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] (JMP).") + bombers += "[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] ([T.x],[T.y],[T.z])" + log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name] ([T.x],[T.y],[T.z])") detonated = 0 existant = 0 cooldown = 1 diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 7823dabea92..85ec4928a0c 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -637,7 +637,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(do_sleep) sleep(rand(10,25)) - //world.log << "Level: [signal.data["level"]] - Done: [signal.data["done"]]" + //log_to_dd("Level: [signal.data["level"]] - Done: [signal.data["done"]]") return signal diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 3657410b400..f3b84e75f89 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -604,8 +604,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(istext(t)) rawcode = t -/obj/machinery/telecomms/server/proc/compile() +/obj/machinery/telecomms/server/proc/compile(mob/user as mob) if(Compiler) + admin_log(user) return Compiler.Compile(rawcode) /obj/machinery/telecomms/server/proc/update_logs() @@ -627,8 +628,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() log_entries.Add(log) update_logs() - - +/obj/machinery/telecomms/server/proc/admin_log(var/mob/mob) + var/msg="[key_name(mob)] has compiled a script to server [src]:" + diary << msg + diary << rawcode + src.investigate_log("[msg]
[rawcode]", "ntsl") + if(length(rawcode)) // Let's not bother the admins for empty code. + message_admins("[key_name_admin(mob)] has compiled and uploaded a NTSL script to [src.id] (JMP)") // Simple log entry datum diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 90db7efaec9..458c8a369cb 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -443,6 +443,8 @@ P.failchance = 0 P.icon_state = "anom" P.name = "wormhole" + message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](?) (FLW) used a Wormhole Generator in ([T.x],[T.y],[T.z] - JMP)",0,1) + log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([T.x],[T.y],[T.z])") do_after_cooldown() src = null spawn(rand(150,300)) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 1aec90c414f..1727a4f25fa 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -166,6 +166,9 @@ chassis.use_power(energy_drain) log_message("Honked from [src.name]. HONK!") + var/turf/T = get_turf(src) + message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](?) (FLW) used a Mecha Honker in ([T.x],[T.y],[T.z] - JMP)",0,1) + log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in ([T.x],[T.y],[T.z])") do_after_cooldown() return @@ -238,6 +241,9 @@ sleep(2) set_ready_state(0) log_message("Fired from [src.name], targeting [target].") + var/turf/T = get_turf(src) + message_admins("[key_name(chassis.occupant, chassis.occupant.client)](?) fired a [src] in ([T.x],[T.y],[T.z] - JMP)",0,1) + log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])") do_after_cooldown() return @@ -351,6 +357,9 @@ M.throw_at(target, missile_range, missile_speed, chassis) projectiles-- log_message("Fired from [src.name], targeting [target].") + var/turf/T = get_turf(src) + message_admins("[key_name(chassis.occupant, chassis.occupant.client)](?) (FLW) fired a [src] in ([T.x],[T.y],[T.z] - JMP)",0,1) + log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])") do_after_cooldown() return diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 3f6b92c98ce..42837d06aba 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -13,8 +13,13 @@ temperature = TCMB /turf/simulated/floor/mech_bay_recharge_floor/Destroy() - recharge_console.recharge_floor = null - recharge_port.recharge_floor = null + if(recharge_console && recharge_console.recharge_floor == src) + recharge_console.recharge_floor = null + recharge_console = null + if(recharge_port && recharge_port.recharge_floor == src) + recharge_port.recharge_floor = null + recharge_port = null + recharging_mecha = null ..() /turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha) @@ -285,4 +290,4 @@ // open the new ui window ui.open() // auto update every Master Controller tick - ui.set_auto_update(1) + ui.set_auto_update(1) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 1d25b822d9b..329cbe8c152 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -483,7 +483,7 @@ steam.start() -- spawns the effect var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) var/more = "" if(M) - more = "(?)" + more = " " msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1) log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") else @@ -1226,7 +1226,7 @@ steam.start() -- spawns the effect var/r = rand(0,255) var/g = rand(0,255) var/b = rand(0,255) - world.log << "Colour , [r],[g],[b]" + log_to_dd("Colour , [r],[g],[b]") I.Blend(rgb(r,g,b),ICON_MULTIPLY) src.icon = I playsound(src.loc, "sparks", 100, 1) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 735b006d75e..74919873a29 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -144,7 +144,7 @@ var/timeofhour = TimeOfHour var/took = round((start <= timeofhour) ? ((timeofhour-start)/10) : ((timeofhour-(start-36000))/10), 0.01) //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare - if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds." + if(Debug2) log_to_dd("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") //Machines which report explosions. for(var/i,i<=doppler_arrays.len,i++) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6e8df50c0e7..842fa1edb45 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -599,10 +599,10 @@ user << "\red You cannot locate any eyes on this creature!" return - user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + user.attack_log += "\[[time_stamp()]\] Attacked [key_name(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])" + M.attack_log += "\[[time_stamp()]\] Attacked by [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)])" if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") //BS12 EDIT ALG + msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG if(!iscarbon(user)) M.LAssailant = null diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 6f743230357..74c1f2f51ff 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -921,14 +921,7 @@ var/global/list/obj/item/device/pda/PDAs = list() ai.show_message("Intercepted message from [who]: [t]") */ - if (!P.silent) - var/sound/S = sound('sound/machines/twobeep.ogg') - - if(P.ttone in ttone_sound) - S = ttone_sound[P.ttone] - playsound(P.loc, S, 50, 1) - for (var/mob/O in hearers(3, P.loc)) - if(!P.silent) O.show_message(text("\icon[P] *[P.ttone]*")) + P.play_ringtone() //Search for holder of the PDA. var/mob/living/L = null if(P.loc && isliving(P.loc)) @@ -951,6 +944,15 @@ var/global/list/obj/item/device/pda/PDAs = list() else U << "ERROR: Messaging server is not responding." +/obj/item/device/pda/proc/play_ringtone() + if (!silent) + var/sound/S = sound('sound/machines/twobeep.ogg') + + if(ttone in ttone_sound) + S = ttone_sound[ttone] + playsound(loc, S, 50, 1) + for (var/mob/O in hearers(3, loc)) + if(!silent) O.show_message(text("\icon[src] *[ttone]*")) /obj/item/device/pda/verb/verb_remove_id() set category = null diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index ff16cf9e43c..2e6a91b6909 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -13,9 +13,9 @@ if(!istype(M, /mob/living/silicon/ai))//If target is not an AI. return ..() - M.attack_log += text("\[[time_stamp()]\] Has been carded with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to card [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used the [src.name] to card [M.name] ([M.ckey]) (JMP)") + M.attack_log += text("\[[time_stamp()]\] Has been carded with [src.name] by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to card [key_name(M)]") + msg_admin_attack("[key_name_admin(user)] used the [src.name] to card [M.name] ([M.ckey])") transfer_ai("AICORE", "AICARD", M, user) return diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index 9a3180a15e8..1f1b362078d 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -30,7 +30,7 @@ timer = Clamp(timer, 10, 100) icon_state = "pizzabox1" user << "You set the timer to [timer / 10] before activating the payload and closing \the [src]." - message_admins("[key_name(usr)]? has set a timer on a pizza bomb to [timer/10] seconds at (JMP).") + message_admins("[key_name_admin(usr)] has set a timer on a pizza bomb to [timer/10] seconds at (JMP).") log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer/10] seconds ([loc.x],[loc.y],[loc.z]).") armer = usr name = "pizza box" @@ -42,7 +42,7 @@ icon_state = "pizzabox_bomb" audible_message("\icon[src] *beep* *beep*") user << "That's no pizza! That's a bomb!" - message_admins("[key_name(usr)]? has triggered a pizza bomb armed by [armer] at (JMP).") + message_admins("[key_name_admin(usr)] has triggered a pizza bomb armed by [armer] at (JMP).") log_game("[key_name(usr)] has triggered a pizza bomb armed by [armer] ([loc.x],[loc.y],[loc.z]).") primed = 1 sleep(timer) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 7db62612994..ab61e766c91 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -42,6 +42,8 @@ anchored = 1 mode = 1 src.visible_message("[user] attaches [src] to the cable!") + message_admins("Power sink activated by [key_name_admin(user)] at ([x],[y],[z] - JMP)") + log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") return else user << "Device must be placed over an exposed cable to attach to it." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 7aafc777268..62498009f0b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -60,7 +60,7 @@ frequency = sanitize_frequency(frequency, maxf) // The max freq is higher than a regular headset to decrease the chance of people listening in, if you use the higher channels. else if (frequency < 1441 || frequency > maxf) - //world.log << "[src] ([type]) has a frequency of [frequency], sanitizing." + //log_to_dd("[src] ([type]) has a frequency of [frequency], sanitizing.") frequency = sanitize_frequency(frequency, maxf) set_frequency(frequency) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 30f09d8713d..82402e273c9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -72,7 +72,7 @@ REAGENT SCANNER spawn(pulse_duration) if(O) var/turf/U = O.loc - if(U.intact) + if(U && U.intact) O.invisibility = 101 O.alpha = 255 for(var/mob/living/M in T.contents) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index ee4f96b9230..a533efe0a58 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -51,7 +51,7 @@ A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). bombers += "[key_name(user)] attached a [item] to a transfer valve." - msg_admin_attack("[key_name_admin(user)][isAntag(user) ? "(ANTAG)" : ""] attached [item] to a transfer valve.") + msg_admin_attack("[key_name_admin(user)]attached [item] to a transfer valve.") log_game("[key_name_admin(user)] attached [item] to a transfer valve.") attacher = user nanomanager.update_uis(src) // update all UIs attached to src @@ -179,23 +179,13 @@ if(!attacher) attacher_name = "Unknown" else - attacher_name = "[attacher.name]([attacher.ckey])" - - var/log_str = "Bomb valve opened in [A.name] " - log_str += "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]" - - if(attacher) - log_str += "(?)" + attacher_name = "[key_name_admin(attacher)]" var/mob/mob = get_mob_by_key(src.fingerprintslast) - var/last_touch_info = "" - if(mob) - last_touch_info = "(?)" - - log_str += " Last touched by: [src.fingerprintslast][last_touch_info]" - bombers += log_str - msg_admin_attack(log_str, 0, 1) - log_game(log_str) + + bombers += "Bomb valve opened at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name(mob)]" + message_admins("Bomb valve opened at [A.name] (JMP) with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name_admin(mob)]") + log_game("Bomb valve opened at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) with [attached_device ? attached_device : "no device"], attached by [attacher_name]. Last touched by: [key_name(mob)]") merge_gases() spawn(20) // In case one tank bursts for (var/i=0,i<5,i++) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index d8baba60d41..3d496ca3b86 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -10,10 +10,10 @@ icon_state = "shock" attack(mob/M as mob, mob/living/silicon/robot/user as mob) - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") + M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [key_name(M)]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used the [src.name] to attack [M.name] ([M.ckey]) (JMP)") + msg_admin_attack("[key_name_admin(user)] used the [src.name] to attack [key_name_admin(M)]") if(!iscarbon(user)) M.LAssailant = null diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 09f3776bc01..7e49a4465b9 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -62,7 +62,7 @@ /obj/item/weapon/dnainjector/proc/inject(mob/living/M as mob, mob/user as mob) if(istype(M,/mob/living)) - M.apply_effect(rand(5,20),IRRADIATE,0) + M.apply_effect(rand(10,25),IRRADIATE,0) if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed // UI in syringe. @@ -85,8 +85,6 @@ M.dna.SetSEValue(block,src.GetValue()) domutcheck(M, null, block!=null) uses-- - if(prob(5)) - trigger_side_effect(M) spawn(0)//this prevents the collapse of space-time continuum if (user) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 8c2bb4fe51e..45ed9da7217 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -41,6 +41,8 @@ user.say(message_say) target = user + message_admins("[key_name_admin(user)] suicided with [src.name] at ([x],[y],[z] - JMP)",0,1) + message_admins("[key_name(user)] suicided with [src.name] at ([x],[y],[z])") explode(get_turf(user)) return . @@ -78,12 +80,12 @@ if (ismob(target)) add_logs(target, user, "planted [name] on") user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") - message_admins("[key_name(user, user.client)](?) planted C4 on [key_name(target)](?) with [timer] second fuse",0,1) - log_game("[key_name(user)] planted C4 on [key_name(target)] with [timer] second fuse") + message_admins("[key_name_admin(user)] planted [src.name] on [key_name_admin(target)] with [timer] second fuse",0,1) + log_game("[key_name(user)] planted [src.name] on [key_name(target)] with [timer] second fuse") else - message_admins("[key_name(user, user.client)](?) planted C4 on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [timer] second fuse",0,1) - log_game("[key_name(user)] planted C4 on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") + message_admins("[key_name_admin(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [timer] second fuse",0,1) + log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") user << "Bomb has been planted. Timer counting down from [timer]." diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 9e81b02d31c..57aec40f09e 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -66,6 +66,7 @@ var/turf/target_turf = get_turf(target) if(target_turf) var/turflist = getline(user, target_turf) + add_logs(user, target, "flamethrowered", addition="at [target.x],[target.y],[target.z]") flame_turf(turflist) /obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob, params) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 28bea3240a3..c5705d31069 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -18,7 +18,7 @@ var/affected_area = 3 var/obj/item/device/assembly_holder/nadeassembly = null var/label = null - + var/assemblyattacher /obj/item/weapon/grenade/chem_grenade/New() create_reagents(1000) @@ -90,10 +90,9 @@ update_icon() else if(clown_check(user)) // This used to go before the assembly check, but that has absolutely zero to do with priming the damn thing. You could spam the admins with it. - var/log_str = "[key_name(usr)][isAntag(usr) ? "(ANTAG)" : ""]? has primed a [name] for detonation at [A.name] (JMP)." - msg_admin_attack(log_str) - log_game(log_str) - bombers += "[log_str]" + message_admins("[key_name_admin(usr)] has primed a [name] for detonation at [A.name] (JMP)") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") + bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" user << "You prime the [name]! [det_time / 10] second\s!" active = 1 update_icon() @@ -138,9 +137,8 @@ contained = "\[[contained]\]" var/turf/bombturf = get_turf(loc) var/area/A = bombturf.loc - var/log_str = "[key_name(usr)][isAntag(usr) ? "(ANTAG)" : ""]? has completed [name] at [A.name] (JMP) [contained]." - msg_admin_attack(log_str) - log_game(log_str) + message_admins("[key_name_admin(usr)] has completed [name] at [A.name] (JMP) [contained].") + log_game("[key_name(usr)] has completed [name] at [bombturf.x], [bombturf.y], [bombturf.z].") else user << "You need to add at least one beaker before locking the assembly." else if(stage == READY && !nadeassembly) @@ -173,7 +171,7 @@ nadeassembly = A A.master = src A.loc = src - + assemblyattacher = user.ckey stage = WIRED user << "You add [A] to [src]!" update_icon() @@ -259,7 +257,15 @@ if(!has_reagents) playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) - return + return + + if(nadeassembly) + var/mob/M = get_mob_by_ckey(assemblyattacher) + var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) + var/turf/T = get_turf(src) + var/area/A = get_area(T) + message_admins("grenade primed by an assembly, attached by [key_name_admin(M)](?) ([admin_jump_link(M, "holder")]) and last touched by [key_name_admin(last)](?) ([admin_jump_link(last, "holder")]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") + log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") playsound(loc, 'sound/effects/bamf.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index bdbfd1fd4ea..d7d3dfb88e2 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -112,8 +112,8 @@ var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) - message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP).") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).") + message_admins("[key_name_admin(usr)] has primed a [name] for detonation at [A.name] (JMP)") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") if(iscarbon(user)) var/mob/living/carbon/C = user C.throw_mode_on() diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 2d5f6ac0d90..a2b5dccd963 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -63,10 +63,9 @@ add_fingerprint(user) var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) - var/log_str = "[key_name(usr)][isAntag(usr) ? "(ANTAG)" : ""]? has primed a [name] for detonation at [A.name] (JMP)." - msg_admin_attack(log_str) - log_game(log_str) - bombers += "[log_str]" + message_admins("[key_name_admin(usr)] has primed a [name] for detonation at [A.name] (JMP)") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") + bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" if(iscarbon(user)) var/mob/living/carbon/C = user C.throw_mode_on() diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 9b34938d480..f622a516b82 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -196,9 +196,9 @@ if(istype(M, /mob/living)) M << "\red You are stunned by the powerful acid of the Deathnettle!" - M.attack_log += text("\[[time_stamp()]\] Had the [src.name] used on them by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] on [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used the [src.name] on [M.name] ([M.ckey]) (JMP)") + M.attack_log += text("\[[time_stamp()]\] Had the [src.name] used on them by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] on [key_name(M)]") + msg_admin_attack("[key_name_admin(user)] used the [src.name] on [key_name_admin(M)]") if(!iscarbon(user)) M.LAssailant = null diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 965da5e0478..c964dd1e0b4 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -162,8 +162,8 @@ Implant Specifics:
"} var/need_gib = null if(istype(imp_in, /mob/)) var/mob/T = imp_in - message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") - log_game("Explosive implant triggered in [T] ([T.key]).") + message_admins("Explosive implant triggered in [key_name_admin(T)]") + log_game("Explosive implant triggered in [key_name(T)].") need_gib = 1 if(ishuman(imp_in)) diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 7e9b207ea4b..4de580b70de 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -32,9 +32,9 @@ for (var/mob/O in viewers(M, null)) O.show_message("\red [M] has been implanted by [user].", 1) - M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.imp.name]) by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.imp.name]) to implant [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.imp.name]) by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.imp.name]) to implant [key_name(M)]") + msg_admin_attack("[key_name_admin(user)] implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") user.show_message("\red You implanted the implant into [M].") if(src.imp.implanted(M, user)) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 207deb0bfc7..1925455529c 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -44,11 +44,8 @@ if(2,3) user.drop_item(src) I.loc = src - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - var/log_str = "[key_name(usr)]? has rigged a beartrap with an IED at [A.name] (JMP)." - message_admins(log_str) - log_game(log_str) + message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") + log_game("[key_name(user)] has rigged a beartrap with an IED.") user << "You sneak the [IED] underneath the pressure plate and connect the trigger wire." desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." else @@ -70,11 +67,8 @@ IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") IED.icon_state = initial(icon_state) + "_active" IED.assembled = 3 - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - var/log_str = "[key_name(usr)]? has triggered an IED-rigged [name] at [A.name] (JMP)." - message_admins(log_str) - log_game(log_str) + message_admins("[key_name_admin(usr)] has triggered an IED-rigged [name].") + log_game("[key_name(usr)] has triggered an IED-rigged [name].") spawn(IED.det_time) IED.prime() if(ishuman(AM)) @@ -95,7 +89,7 @@ H.update_inv_legcuffed() H << "You step on \the [src]!" if(IED && IED.active) - H << "The [src]'s IED has been activated!" + H << "\The [src]'s IED has been activated!" feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. for(var/mob/O in viewers(H, null)) if(O == H) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 6aa5340245d..a8551e96fd6 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -165,6 +165,7 @@ if(display_contents_with_number) for(var/datum/numbered_display/ND in display_contents) + ND.sample_object.mouse_opacity = 2 ND.sample_object.screen_loc = "[cx]:16,[cy]:16" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" ND.sample_object.layer = 20 @@ -174,6 +175,7 @@ cy-- else for(var/obj/O in contents) + O.mouse_opacity = 2 //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:16,[cy]:16" O.maptext = "" O.layer = 20 @@ -310,6 +312,7 @@ src.orient2hud(usr) if(usr.s_active) usr.s_active.show_to(usr) + W.mouse_opacity = 2 //So you can click on the area around the item to equip it, instead of having to pixel hunt update_icon() return 1 @@ -345,6 +348,7 @@ W.maptext = "" W.on_exit_storage(src) update_icon() + W.mouse_opacity = initial(W.mouse_opacity) return 1 //This proc is called when you want to place an item into the storage item. @@ -442,6 +446,9 @@ return /obj/item/weapon/storage/Destroy() + for(var/obj/O in contents) + O.mouse_opacity = initial(O.mouse_opacity) + qdel(boxes) qdel(closer) return ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 56a31ed5284..ee6fb876f05 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -41,11 +41,7 @@ else M.LAssailant = user - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") - - if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" - return + msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])") if ((CLUMSY in user.mutations) && prob(50)) user << "\red The rod slips out of your hand and hits your head." diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 6a773177c59..10898e80a47 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -6,47 +6,26 @@ density = 1 anchored = 1 -/obj/structure/dresser/proc/convUnM(mund) - return underwear_m.Find(mund) - -/obj/structure/dresser/proc/convUnF(fund) - return underwear_f.Find(fund) - -/obj/structure/dresser/proc/convUs(us) - return undershirt_list.Find(us) - /obj/structure/dresser/attack_hand(mob/user as mob) if(!Adjacent(user))//no tele-grooming return if(ishuman(user)) var/mob/living/carbon/human/H = user - var/choice = input(user, "Underwear, or Undershirt?", "Changing") as null|anything in list("Underwear","Undershirt") + var/choice = input(user, "Underwear or Undershirt?", "Changing") as null|anything in list("Underwear","Undershirt") if(!Adjacent(user)) return switch(choice) if("Underwear") - if(H.gender == FEMALE) - var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_f - if(new_undies) - H << "\red You selected [new_undies]." - var/freturn = convUnF(new_undies) - H.underwear = freturn - - else - var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_m - if(new_undies) - H << "\red You selected [new_undies]." - var/mreturn = convUnM(new_undies) - H.underwear = mreturn + var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_list + if(new_undies) + H.underwear = new_undies if("Undershirt") var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in undershirt_list if(new_undershirt) - H << "\red You selected [new_undershirt]" - var/usreturn = convUs(new_undershirt) - H.undershirt = usreturn + H.undershirt = new_undershirt add_fingerprint(H) H.update_body() \ No newline at end of file diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 967b96d2c05..21208b26ca6 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -221,6 +221,14 @@ icon_state = "" mineral = "plasma" walltype = "plasma" + +/obj/structure/falsewall/plasma/attackby(obj/item/weapon/W, mob/user, params) + if(is_hot(W) > 300) + message_admins("Plasma falsewall ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) + log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])") + burnbabyburn() + return + ..() /obj/structure/falsewall/plasma/proc/burnbabyburn(user) playsound(src, 'sound/items/Welder.ogg', 100, 1) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 69508a41940..3a792030371 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -194,10 +194,10 @@ mineralType = "plasma" attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - TemperatureAct(100) + if(is_hot(W)) + message_admins("Plasma mineral door ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) + log_game("Plasma mineral door ignited by [key_name(user)] in ([x],[y],[z])") + TemperatureAct(100) ..() temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 35c57a0f9f8..ee2b57d19d7 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -417,3 +417,51 @@ usr << "\red Access denied." return +/hook/Login/proc/update_morgue(var/client/client, var/mob/L) + //Update morgues on login/logout + if (L.stat == DEAD) + var/obj/structure/morgue/Morgue = null + var/mob/living/carbon/human/C = null + if (istype(L,/mob/dead/observer)) //We're a ghost, let's find our corpse + var/mob/dead/observer/G = L + if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control. + return + if (G.can_reenter_corpse && G.mind.current) + C = G.mind.current + else if (istype(L,/mob/living/carbon/human)) + C = L + + if (C) //We found our corpse, is it inside a morgue? + if (istype(C.loc,/obj/structure/morgue)) + Morgue = C.loc + else if (istype(C.loc,/obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = C.loc + if (istype(B.loc,/obj/structure/morgue)) + Morgue = B.loc + if (Morgue) + Morgue.update() + +/hook/Logout/proc/update_morgue(var/client/client, var/mob/L) + //Update morgues on login/logout + if (L.stat == DEAD) + var/obj/structure/morgue/Morgue = null + var/mob/living/carbon/human/C = null + if (istype(L,/mob/dead/observer)) //We're a ghost, let's find our corpse + var/mob/dead/observer/G = L + if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control. + return 1 + if (G.can_reenter_corpse && G.mind.current) + C = G.mind.current + else if (istype(L,/mob/living/carbon/human)) + C = L + + if (C) //We found our corpse, is it inside a morgue? + if (istype(C.loc,/obj/structure/morgue)) + Morgue = C.loc + else if (istype(C.loc,/obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = C.loc + if (istype(B.loc,/obj/structure/morgue)) + Morgue = B.loc + if (Morgue) + Morgue.update() + diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 334086d5f36..956bc6d7d07 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -155,9 +155,9 @@ if(pulling) occupant.visible_message("[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!") - pulling.attack_log += "\[[time_stamp()]\] Crashed [occupant.name]'s ([occupant.ckey]) [name] into \a [A]" - occupant.attack_log += "\[[time_stamp()]\] Thrusted into \a [A] by [pulling.name] ([pulling.ckey]) with \the [name]" - msg_admin_attack("[pulling.name] ([pulling.ckey])[isAntag(pulling) ? "(ANTAG)" : ""] has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (JMP)") + pulling.attack_log += "\[[time_stamp()]\] Crashed [key_name(occupant)] [name] into \a [A]" + occupant.attack_log += "\[[time_stamp()]\] Thrusted into \a [A] by [key_name(pulling)] with \the [name]" + msg_admin_attack("[key_name_admin(pulling)] has thrusted [key_name_admin(occupant)] [name] into \a [A]") else occupant.visible_message("[occupant] crashed into \the [A]!") diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 06e878f5d2f..a0255e1344f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -299,6 +299,10 @@ user.do_attack_animation(src) visible_message("[user] slices [src] apart!") destroy() + +/obj/structure/table/mech_melee_attack(obj/mecha/M) + visible_message("[M] smashes [src] apart!") + destroy() /obj/structure/table/attack_animal(mob/living/simple_animal/user) if(user.environment_smash) @@ -905,13 +909,15 @@ W.Move(loc) return -/obj/structure/table/attack_hand(mob/user) +/obj/structure/rack/attack_hand(mob/user) if(HULK in user.mutations) visible_message("[user] smashes [src] apart!") user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) destroy() - - + +/obj/structure/rack/mech_melee_attack(obj/mecha/M) + visible_message("[M] smashes [src] apart!") + destroy() /obj/structure/rack/attack_alien(mob/living/user) user.do_attack_animation(src) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 1abfa6cfb31..d40539cdbf7 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -530,11 +530,11 @@ var/list/mechtoys = list( /obj/machinery/computer/supplycomp/Topic(href, href_list) if(!supply_controller) - world.log << "## ERROR: Eek. The supply_controller controller datum is missing somehow." + log_to_dd("## ERROR: Eek. The supply_controller controller datum is missing somehow.") return var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle if (!shuttle) - world.log << "## ERROR: Eek. The supply/shuttle datum is missing somehow." + log_to_dd("## ERROR: Eek. The supply/shuttle datum is missing somehow.") return if(..()) return diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index 20d476238cb..1c2605238e0 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -89,6 +89,8 @@ /turf/simulated/wall/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob) if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite + message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) + log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])") ignite(is_hot(W)) return ..() diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 1cf5e73bc19..afbb84847f5 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -17,7 +17,7 @@ var/global/normal_ooc_colour = "#002eb8" src << "\red You have OOC muted." return - if(!(holder && holder.rights && (holder.rights & R_MOD))) + if(!check_rights(R_MOD,0)) if(!ooc_allowed) src << "\red OOC is globally muted" return @@ -141,9 +141,8 @@ var/global/normal_ooc_colour = "#002eb8" if(!M.client) continue var/client/C = M.client - if(C in admins) - if(C.holder.rights | R_MENTOR) - continue //they are handled after that + if(check_rights(R_MENTOR,0)) + continue //they are handled after that if(C.prefs.toggles & CHAT_LOOC) if(holder) @@ -160,7 +159,7 @@ var/global/normal_ooc_colour = "#002eb8" display_name = "[S.name]/([S.key])" for(var/client/C in admins) - if(C.holder.rights | R_MENTOR) + if(check_rights(R_MENTOR,0)) if(C.prefs.toggles & CHAT_LOOC) var/prefix = "(R)LOOC" if (C.mob in heard) diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm index 93c94aebf8e..01267f2fb08 100644 --- a/code/modules/DetectiveWork/detective_work.dm +++ b/code/modules/DetectiveWork/detective_work.dm @@ -17,19 +17,19 @@ atom/proc/add_fibers(mob/living/carbon/human/M) if(M.wear_suit) fibertext = "Material from \a [M.wear_suit]." if(prob(10*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" + //log_to_dd("Added fibertext: [fibertext]") suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & UPPER_TORSO)) if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed. - //world.log << "Added fibertext: [fibertext]" + //log_to_dd("Added fibertext: [fibertext]") suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & HANDS)) if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" + //log_to_dd("Added fibertext: [fibertext]") suit_fibers += fibertext else if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." @@ -39,10 +39,10 @@ atom/proc/add_fibers(mob/living/carbon/human/M) if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" + //log_to_dd("Added fibertext: [fibertext]") suit_fibers += "Material from a pair of [M.gloves.name]." else if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" + //log_to_dd("Added fibertext: [fibertext]") suit_fibers += "Material from a pair of [M.gloves.name]." \ No newline at end of file diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index da0c6d64e60..8cd511a3c9a 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -48,7 +48,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = computerid = bancid ip = banip - var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_player WHERE ckey = '[ckey]'") + var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("player")] WHERE ckey = '[ckey]'") query.Execute() var/validckey = 0 if(query.NextRow()) @@ -83,7 +83,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = reason = sql_sanitize_text(reason) - var/sql = "INSERT INTO erro_ban (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" + var/sql = "INSERT INTO [format_table_name("ban")] (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() usr << "\blue Ban saved to database." @@ -125,7 +125,7 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") else bantype_sql = "bantype = '[bantype_str]'" - var/sql = "SELECT id FROM erro_ban WHERE ckey = '[ckey]' AND [bantype_sql] AND (unbanned is null OR unbanned = false)" + var/sql = "SELECT id FROM [format_table_name("ban")] WHERE ckey = '[ckey]' AND [bantype_sql] AND (unbanned is null OR unbanned = false)" if(job) sql += " AND job = '[job]'" @@ -166,7 +166,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) usr << "Cancelled" return - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM erro_ban WHERE id = [banid]") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM [format_table_name("ban")] WHERE id = [banid]") query.Execute() var/eckey = usr.ckey //Editing admin ckey @@ -194,7 +194,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) usr << "Cancelled" return - var/DBQuery/update_query = dbcon.NewQuery("UPDATE erro_ban SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\"
') WHERE id = [banid]") + var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\"
') WHERE id = [banid]") update_query.Execute() message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s reason from [reason] to [value]",1) if("duration") @@ -204,7 +204,7 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) usr << "Cancelled" return - var/DBQuery/update_query = dbcon.NewQuery("UPDATE erro_ban SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]
'), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]") + var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]
'), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]") message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s duration from [duration] to [value]",1) update_query.Execute() if("unban") @@ -222,7 +222,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) if(!check_rights(R_BAN)) return - var/sql = "SELECT ckey FROM erro_ban WHERE id = [id]" + var/sql = "SELECT ckey FROM [format_table_name("ban")] WHERE id = [id]" establish_db_connection() if(!dbcon.IsConnected()) @@ -252,7 +252,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) var/unban_computerid = src.owner:computer_id var/unban_ip = src.owner:address - var/sql_update = "UPDATE erro_ban SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE id = [id]" + var/sql_update = "UPDATE [format_table_name("ban")] SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE id = [id]" message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.",1) var/DBQuery/query_update = dbcon.NewQuery(sql_update) @@ -410,7 +410,7 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) bantypesearch += "'PERMABAN' " - var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, ip, computerid FROM erro_ban WHERE 1 [playersearch] [adminsearch] [ipsearch] [cidsearch] [bantypesearch] ORDER BY bantime DESC LIMIT 100") + var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, ip, computerid FROM [format_table_name("ban")] WHERE 1 [playersearch] [adminsearch] [ipsearch] [cidsearch] [bantypesearch] ORDER BY bantime DESC LIMIT 100") select_query.Execute() while(select_query.NextRow()) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 29f745a8c17..6f843bc148b 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -6,7 +6,7 @@ world/IsBanned(key,address,computer_id) //Guest Checking if(!guests_allowed && IsGuestKey(key)) log_access("Failed Login: [key] - Guests not allowed") - message_admins("\blue Failed Login: [key] - Guests not allowed") + // message_admins("\blue Failed Login: [key] - Guests not allowed") return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.") //check if the IP address is a known TOR node @@ -34,7 +34,7 @@ world/IsBanned(key,address,computer_id) var/ckeytext = ckey(key) if(!establish_db_connection()) - world.log << "Ban database connection failure. Key [ckeytext] not checked" + log_to_dd("Ban database connection failure. Key [ckeytext] not checked") diary << "Ban database connection failure. Key [ckeytext] not checked" return @@ -51,7 +51,7 @@ world/IsBanned(key,address,computer_id) failedcid = 0 cidquery = " OR computerid = '[computer_id]' " - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM erro_ban WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM [format_table_name("ban")] WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)") query.Execute() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 050e21a8e17..060518108a1 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -44,7 +44,7 @@ var/global/nologevent = 0 body += "Options panel for [M]" if(M.client) body += " played by [M.client] " - body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" + body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" if(istype(M, /mob/new_player)) body += " Hasn't Entered Game " @@ -64,7 +64,8 @@ var/global/nologevent = 0 Ban | Jobban | Appearance Ban | - Notes + Notes | + Watchlist Flag "} if(M.client) @@ -121,7 +122,7 @@ var/global/nologevent = 0 Make Mask | Make Robot | Make Alien | - Make slime + Make Slime | Make Superhero "} @@ -1006,7 +1007,6 @@ proc/formatPlayerPanel(var/mob/U,var/text="PP") if (!frommob.ckey) return 0 - var/question = "" if (tomob.ckey) question = "This mob already has a user ([tomob.key]) in control of it! " @@ -1029,4 +1029,5 @@ proc/formatPlayerPanel(var/mob/U,var/text="PP") tomob.ckey = frommob.ckey qdel(frommob) - return 1 \ No newline at end of file + return 1 + \ No newline at end of file diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 4323644b480..aea9f51f715 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -23,10 +23,10 @@ if(!message) return var/F = investigate_subject2file(subject) if(!F) return - F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
" + F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" //ADMINVERBS -/client/proc/investigate_show( subject in list("hrefs","pda","singulo","gold core","cult") ) +/client/proc/investigate_show( subject in list("hrefs","pda","singulo","atmos","ntsl","gold core","cult") ) set name = "Investigate" set category = "Admin" if(!holder) return @@ -57,6 +57,20 @@ src << browse(F,"window=investigate[subject];size=800x300") if("cult") + var/F = investigate_subject2file(subject) + if(!F) + src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + return + src << browse(F,"window=investigate[subject];size=800x300") + + if("atmos") + var/F = investigate_subject2file(subject) + if(!F) + src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + return + src << browse(F,"window=investigate[subject];size=800x300") + + if("ntsl") var/F = investigate_subject2file(subject) if(!F) src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index d9f5d7d54ba..236fbe42779 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -61,6 +61,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights //clear the datums references admin_datums.Cut() for(var/client/C in admins) + C.remove_admin_verbs() C.holder = null admins.Cut() @@ -102,13 +103,13 @@ var/list/admin_ranks = list() //list of all ranks with associated rights establish_db_connection() if(!dbcon.IsConnected()) - world.log << "Failed to connect to database in load_admins(). Reverting to legacy system." + log_to_dd("Failed to connect to database in load_admins(). Reverting to legacy system.") diary << "Failed to connect to database in load_admins(). Reverting to legacy system." config.admin_legacy_system = 1 load_admins() return - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, rank, level, flags FROM erro_admin") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey, rank, level, flags FROM [format_table_name("admin")]") query.Execute() while(query.NextRow()) var/ckey = query.item[1] @@ -122,7 +123,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights //find the client for a ckey if they are connected and associate them with the new admin datum D.associate(directory[ckey]) if(!admin_datums) - world.log << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system." + log_to_dd("The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system.") diary << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system." config.admin_legacy_system = 1 load_admins() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 71990e49d55..b5274601aa3 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -2,6 +2,7 @@ var/list/admin_verbs_default = list( // /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/ + /client/proc/hide_verbs, /*hides all our adminverbs*/ // /client/proc/check_antagonists, /*shows all antags*/ // /client/proc/deadchat /*toggles deadchat on/off*/ /client/proc/cmd_mentor_check_new_players @@ -202,6 +203,48 @@ var/list/admin_verbs_mentor = list( if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn if(holder.rights & R_MOD) verbs += admin_verbs_mod if(holder.rights & R_MENTOR) verbs += admin_verbs_mentor + +/client/proc/remove_admin_verbs() + verbs.Remove( + admin_verbs_default, + /client/proc/togglebuildmodeself, + admin_verbs_admin, + admin_verbs_ban, + admin_verbs_event, + admin_verbs_server, + admin_verbs_debug, + admin_verbs_possess, + admin_verbs_permissions, + /client/proc/stealth, + admin_verbs_rejuv, + admin_verbs_sounds, + admin_verbs_spawn, + admin_verbs_mod, + admin_verbs_mentor, + admin_verbs_show_debug_verbs, + /client/proc/readmin, + ) + +/client/proc/hide_verbs() + set name = "Adminverbs - Hide All" + set category = "Admin" + + remove_admin_verbs() + verbs += /client/proc/show_verbs + + src << "Almost all of your adminverbs have been hidden." + feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + +/client/proc/show_verbs() + set name = "Adminverbs - Show" + set category = "Admin" + + verbs -= /client/proc/show_verbs + add_admin_verbs() + + src << "All of your adminverbs are now visible." + feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_ghost() set category = "Admin" @@ -526,12 +569,61 @@ var/list/admin_verbs_mentor = list( set category = "Admin" if(holder) - if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someont promoting you.",,"Yes","No") == "Yes") - log_admin("[src] deadmined themself.") - message_admins("[src] deadmined themself.", 1) - deadmin() - src << "You are now a normal player." + log_admin("[src] deadmined themself.") + message_admins("[src] deadmined themself.") + deadmin() + verbs += /client/proc/readmin + deadmins += ckey + src << "You are now a normal player." feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/readmin() + set name = "Re-admin self" + set category = "Admin" + set desc = "Regain your admin powers." + var/datum/admins/D = admin_datums[ckey] + var/rank = null + if(config.admin_legacy_system) + //load text from file + var/list/Lines = file2list("config/admins.txt") + for(var/line in Lines) + var/list/splitline = text2list(line, " - ") + if(n_lower(splitline[1]) == ckey) + if(splitline.len >= 2) + rank = ckeyEx(splitline[2]) + break + continue + else + if(!dbcon.IsConnected()) + message_admins("Warning, mysql database is not connected.") + src << "Warning, mysql database is not connected." + return + var/sql_ckey = sanitizeSQL(ckey) + var/DBQuery/query = dbcon.NewQuery("SELECT rank FROM [format_table_name("admin")] WHERE ckey = '[sql_ckey]'") + query.Execute() + while(query.NextRow()) + rank = ckeyEx(query.item[1]) + if(!D) + if(admin_ranks[rank] == null) + var/error_extra = "" + if(!config.admin_legacy_system) + error_extra = " Check mysql DB connection." + error("Error while re-adminning [src], admin rank ([rank]) does not exist.[error_extra]") + src << "Error while re-adminning, admin rank ([rank]) does not exist.[error_extra]" + return + D = new(rank,admin_ranks[rank],ckey) + var/client/C = directory[ckey] + D.associate(C) + message_admins("[src] re-adminned themselves.") + log_admin("[src] re-adminned themselves.") + deadmins -= ckey + feedback_add_details("admin_verb","RAS") + return + else + src << "You are already an admin." + verbs -= /client/proc/readmin + deadmins -= ckey + return /client/proc/toggle_log_hrefs() set name = "Toggle href logging" diff --git a/code/modules/admin/banappearance.dm b/code/modules/admin/banappearance.dm index 3262fb66219..7ecbde4c3fb 100644 --- a/code/modules/admin/banappearance.dm +++ b/code/modules/admin/banappearance.dm @@ -52,14 +52,14 @@ DEBUG log_admin("appearance_keylist was empty") else if(!establish_db_connection()) - world.log << "Database connection failed. Reverting to the legacy ban system." + log_to_dd("Database connection failed. Reverting to the legacy ban system.") diary << "Database connection failed. Reverting to the legacy ban system." config.ban_legacy_system = 1 appearance_loadbanfile() return //appearance bans - var/DBQuery/query = dbcon.NewQuery("SELECT ckey FROM erro_ban WHERE bantype = 'APPEARANCE_BAN' AND NOT unbanned = 1") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey FROM [format_table_name("ban")] WHERE bantype = 'APPEARANCE_BAN' AND NOT unbanned = 1") query.Execute() while(query.NextRow()) @@ -101,7 +101,7 @@ proc/DB_ban_isappearancebanned(var/playerckey) var/sqlplayerckey = sql_sanitize_text(ckey(playerckey)) - var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_ban WHERE CKEY = '[sqlplayerckey]' AND ((bantype = 'APPEARANCE_BAN') OR (bantype = 'APPEARANCE_TEMPBAN' AND expiration_time > Now())) AND unbanned != 1") + var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("ban")] WHERE CKEY = '[sqlplayerckey]' AND ((bantype = 'APPEARANCE_BAN') OR (bantype = 'APPEARANCE_TEMPBAN' AND expiration_time > Now())) AND unbanned != 1") query.Execute() while(query.NextRow()) return 1 diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 3ae14b22a31..a28de25ee39 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -64,14 +64,14 @@ DEBUG log_admin("jobban_keylist was empty") else if(!establish_db_connection()) - world.log << "Database connection failed. Reverting to the legacy ban system." + log_to_dd("Database connection failed. Reverting to the legacy ban system.") diary << "Database connection failed. Reverting to the legacy ban system." config.ban_legacy_system = 1 jobban_loadbanfile() return //Job permabans - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, job FROM erro_ban WHERE bantype = 'JOB_PERMABAN' AND isnull(unbanned)") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_PERMABAN' AND isnull(unbanned)") query.Execute() while(query.NextRow()) @@ -81,7 +81,7 @@ DEBUG jobban_keylist.Add("[ckey] - [job]") //Job tempbans - var/DBQuery/query1 = dbcon.NewQuery("SELECT ckey, job FROM erro_ban WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()") + var/DBQuery/query1 = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()") query1.Execute() while(query1.NextRow()) diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index 5b5ee047852..584dd9331b6 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -1,4 +1,5 @@ -/var/create_object_html = null +var/create_object_html = null +var/list/create_object_forms = list(/obj, /obj/structure, /obj/machinery, /obj/effect, /obj/item, /obj/mecha, /obj/item/weapon, /obj/item/clothing, /obj/item/stack, /obj/item/device, /obj/item/weapon/reagent_containers, /obj/item/weapon/gun) /datum/admins/proc/create_object(var/mob/user) if (!create_object_html) @@ -9,20 +10,14 @@ user << browse(replacetext(create_object_html, "/* ref src */", "\ref[src]"), "window=create_object;size=425x475") - /datum/admins/proc/quick_create_object(var/mob/user) + var/path = input("Select the path of the object you wish to create.", "Path", /obj) in create_object_forms + var/html_form = create_object_forms[path] - var/quick_create_object_html = null - var/pathtext = null + if (!html_form) + var/objectjs = list2text(typesof(path), ";") + html_form = file2text('html/create_object.html') + html_form = replacetext(html_form, "null /* object types */", "\"[objectjs]\"") + create_object_forms[path] = html_form - pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/item","/obj/item/weapon","/obj/item/clothing","/obj/machinery","/obj/mecha") - - var path = text2path(pathtext) - - if (!quick_create_object_html) - var/objectjs = null - objectjs = list2text(typesof(path), ";") - quick_create_object_html = file2text('html/create_object.html') - quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"") - - user << browse(replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "window=quick_create_object;size=425x475") \ No newline at end of file + user << browse(replacetext(html_form, "/* ref src */", "\ref[src]"), "window=qco[path];size=425x475") \ No newline at end of file diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 33fc2240830..17a2fc42239 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -28,11 +28,13 @@ var/list/admin_datums = list() owner = C owner.holder = src owner.add_admin_verbs() //TODO + owner.verbs -= /client/proc/readmin admins |= C /datum/admins/proc/disassociate() if(owner) admins -= owner + owner.remove_admin_verbs() owner.holder = null owner = null @@ -78,11 +80,17 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. usr << "Error: Cannot proceed. They have more or equal rights to us." return 0 - - /client/proc/deadmin() admin_datums -= ckey if(holder) holder.disassociate() del(holder) return 1 + +//This proc checks whether subject has at least ONE of the rights specified in rights_required. +/proc/check_rights_for(client/subject, rights_required) + if(subject && subject.holder) + if(rights_required && !(rights_required & subject.holder.rights)) + return 0 + return 1 + return 0 diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index fbd33cf0734..e53d4644c33 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -76,7 +76,7 @@ if(!istext(adm_ckey) || !istext(new_rank)) return - var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM erro_admin WHERE ckey = '[adm_ckey]'") + var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM [format_table_name("admin")] WHERE ckey = '[adm_ckey]'") select_query.Execute() var/new_admin = 1 @@ -86,16 +86,16 @@ admin_id = text2num(select_query.item[1]) if(new_admin) - var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO `erro_admin` (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, 0)") + var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("admin")] (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, '[adm_ckey]', '[new_rank]', -1, 0)") insert_query.Execute() - var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") + var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") log_query.Execute() usr << "\blue New admin added." else if(!isnull(admin_id) && isnum(admin_id)) - var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET rank = '[new_rank]' WHERE id = [admin_id]") + var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET rank = '[new_rank]' WHERE id = [admin_id]") insert_query.Execute() - var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');") + var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');") log_query.Execute() usr << "\blue Admin rank changed." @@ -128,7 +128,7 @@ if(!istext(adm_ckey) || !isnum(new_permission)) return - var/DBQuery/select_query = dbcon.NewQuery("SELECT id, flags FROM erro_admin WHERE ckey = '[adm_ckey]'") + var/DBQuery/select_query = dbcon.NewQuery("SELECT id, flags FROM [format_table_name("admin")] WHERE ckey = '[adm_ckey]'") select_query.Execute() var/admin_id @@ -141,14 +141,24 @@ return if(admin_rights & new_permission) //This admin already has this permission, so we are removing it. - var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = [admin_rights & ~new_permission] WHERE id = [admin_id]") + var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET flags = [admin_rights & ~new_permission] WHERE id = [admin_id]") insert_query.Execute() - var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") + var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") log_query.Execute() usr << "\blue Permission removed." else //This admin doesn't have this permission, so we are adding it. - var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]") + var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]") insert_query.Execute() - var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')") + var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')") log_query.Execute() - usr << "\blue Permission added." \ No newline at end of file + usr << "\blue Permission added." + +/datum/admins/proc/updateranktodb(ckey,newrank) + establish_db_connection() + if (!dbcon.IsConnected()) + return + var/sql_ckey = sanitizeSQL(ckey) + var/sql_admin_rank = sanitizeSQL(newrank) + + var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastadminrank = '[sql_admin_rank]' WHERE ckey = '[sql_ckey]'") + query_update.Execute() \ No newline at end of file diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 8d9a61b10e9..8873f385d90 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -81,9 +81,9 @@ body += "TP - " body += "PM - " body += "SM - " - body += "JMP" + body += "FLW" if(eyeref) - body += "|EYE" + body += "|EYE" body += "
" if(antagonist > 0) body += "Antagonist"; diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index a0ce958a5f4..3336a2ad10d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -160,6 +160,7 @@ admin_datums -= adm_ckey D.disassociate() + updateranktodb(adm_ckey, "player") message_admins("[key_name_admin(usr)] removed [adm_ckey] from the admins list") log_admin("[key_name(usr)] removed [adm_ckey] from the admins list") log_admin_rank_modification(adm_ckey, "Removed") @@ -204,6 +205,7 @@ var/client/C = directory[adm_ckey] //find the client with the specified ckey (if they are logged in) D.associate(C) //link up with the client and add verbs + updateranktodb(adm_ckey, new_rank) message_admins("[key_name_admin(usr)] edited the admin rank of [adm_ckey] to [new_rank]") log_admin("[key_name(usr)] edited the admin rank of [adm_ckey] to [new_rank]") log_admin_rank_modification(adm_ckey, new_rank) @@ -1032,6 +1034,63 @@ if("Cancel") return + //Watchlist + else if(href_list["watchlist"]) + if(!check_rights(R_ADMIN)) return + var/mob/M = locate(href_list["watchlist"]) + if(!dbcon.IsConnected()) + usr << "Failed to establish database connection." + return + if(!ismob(M)) + usr << "This can only be used on instances of type /mob" + return + if(!M.ckey) + usr << "This mob has no ckey" + return + var/sql_ckey = sanitizeSQL(M.ckey) + var/DBQuery/query = dbcon.NewQuery("SELECT ckey FROM [format_table_name("watch")] WHERE (ckey = '[sql_ckey]')") + query.Execute() + if(query.NextRow()) + switch(alert(usr, "Ckey already flagged", "[sql_ckey] is already on the watchlist, do you want to:", "Remove", "Edit reason", "Cancel")) + if("Cancel") + return + if("Remove") + var/DBQuery/query_watchdel = dbcon.NewQuery("DELETE FROM [format_table_name("watch")] WHERE ckey = '[sql_ckey]'") + if(!query_watchdel.Execute()) + var/err = query_watchdel.ErrorMsg() + log_game("SQL ERROR during removing watch entry. Error : \[[err]\]\n") + return + log_admin("[key_name_admin(usr)] has removed [key_name_admin(M)] from the watchlist") + message_admins("[key_name_admin(usr)] has removed [key_name_admin(M)] from the watchlist", 1) + if("Edit reason") + var/DBQuery/query_reason = dbcon.NewQuery("SELECT ckey, reason FROM [format_table_name("watch")] WHERE (ckey = '[sql_ckey]')") + query_reason.Execute() + if(query_reason.NextRow()) + var/watch_reason = query_reason.item[2] + var/new_reason = input("Insert new reason", "New Reason", "[watch_reason]", null) as null|text + new_reason = sanitizeSQL(new_reason) + if(!new_reason) + return + var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("watch")] SET reason = '[new_reason]' WHERE (ckey = '[sql_ckey]')") + if(!update_query.Execute()) + var/err = update_query.ErrorMsg() + log_game("SQL ERROR during edit watch entry reason. Error : \[[err]\]\n") + return + log_admin("[key_name_admin(usr)] has edited [sql_ckey]'s reason from [watch_reason] to [new_reason]",1) + message_admins("[key_name_admin(usr)] has edited [sql_ckey]'s reason from [watch_reason] to [new_reason]",1) + else + var/reason = input(usr,"Reason?","reason","Metagaming") as text|null + if(!reason) + return + reason = sanitizeSQL(reason) + var/DBQuery/query_watchadd = dbcon.NewQuery("INSERT INTO [format_table_name("watch")] (ckey, reason) VALUES ('[sql_ckey]', '[reason]')") + if(!query_watchadd.Execute()) + var/err = query_watchadd.ErrorMsg() + log_game("SQL ERROR during adding new watch entry. Error : \[[err]\]\n") + return + log_admin("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]") + message_admins("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]", 1) + else if(href_list["mute"]) if(!check_rights(R_MOD)) return @@ -1452,6 +1511,17 @@ if(!isobserver(usr)) C.admin_ghost() sleep(2) C.jumptomob(M) + + else if(href_list["adminplayerobservefollow"]) + if(!check_rights(R_MOD,0) && !check_rights(R_ADMIN)) return + + var/mob/M = locate(href_list["adminplayerobservefollow"]) + + var/client/C = usr.client + if(!isobserver(usr)) C.admin_ghost() + var/mob/dead/observer/A = C.mob + sleep(2) + A.ManualFollow(M) else if(href_list["check_antagonist"]) check_antagonists() @@ -1519,7 +1589,7 @@ src.owner << "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];" src.owner << "Location = [location_description];" src.owner << "[special_role_description]" - src.owner << "(PM) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA)" + src.owner << "(PM) (PP) (VV) (SM) (FLW) (CA)" else if(href_list["adminspawncookie"]) if(!check_rights(R_ADMIN|R_EVENT)) return @@ -1935,28 +2005,13 @@ dirty_paths = href_list["object_list"] var/paths = list() - var/removed_paths = list() for(var/dirty_path in dirty_paths) var/path = text2path(dirty_path) if(!path) - removed_paths += dirty_path continue else if(!ispath(path, /obj) && !ispath(path, /turf) && !ispath(path, /mob)) - removed_paths += dirty_path continue - else if(ispath(path, /obj/item/weapon/gun/energy/pulse_rifle)) - if(!check_rights((R_SERVER|R_EVENT),0)) - removed_paths += dirty_path - continue - else if(ispath(path, /obj/item/weapon/melee/energy/blade))//Not an item one should be able to spawn./N - if(!check_rights((R_SERVER|R_EVENT),0)) - removed_paths += dirty_path - continue - else if(ispath(path, /obj/effect/anomaly/bhole)) - if(!check_rights((R_SERVER|R_EVENT),0)) - removed_paths += dirty_path - continue paths += path if(!paths) @@ -1965,8 +2020,6 @@ if(length(paths) > 5) alert("Select fewer object types, (max 5)") return - else if(length(removed_paths)) - alert("Removed:\n" + list2text(removed_paths, "\n")) var/list/offset = text2list(href_list["offset"],",") var/number = dd_range(1, 100, text2num(href_list["object_count"])) @@ -1978,41 +2031,36 @@ if(!obj_dir || !(obj_dir in list(1,2,4,8,5,6,9,10))) obj_dir = 2 var/obj_name = sanitize(href_list["object_name"]) + + + var/atom/target //Where the object will be spawned var/where = href_list["object_where"] if (!( where in list("onfloor","inhand","inmarked") )) where = "onfloor" - if( where == "inhand" ) - usr << "Support for inhand not available yet. Will spawn on floor." - where = "onfloor" - if ( where == "inhand" ) //Can only give when human or monkey - if ( !( ishuman(usr) ) ) - usr << "Can only spawn in hand when you're a human or a monkey." - where = "onfloor" - else if ( usr.get_active_hand() ) - usr << "Your active hand is full. Spawning on floor." - where = "onfloor" + switch(where) + if("inhand") + if (!iscarbon(usr) && !isrobot(usr)) + usr << "Can only spawn in hand when you're a carbon mob or cyborg." + where = "onfloor" + target = usr - if ( where == "inmarked" ) - if ( !marked_datum ) - usr << "You don't have any object marked. Abandoning spawn." - return - else - if ( !istype(marked_datum,/atom) ) - usr << "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn." - return - - var/atom/target //Where the object will be spawned - switch ( where ) - if ( "onfloor" ) - switch (href_list["offset_type"]) + if("onfloor") + switch(href_list["offset_type"]) if ("absolute") target = locate(0 + X,0 + Y,0 + Z) if ("relative") target = locate(loc.x + X,loc.y + Y,loc.z + Z) - if ( "inmarked" ) - target = marked_datum + if("inmarked") + if(!marked_datum) + usr << "You don't have any object marked. Abandoning spawn." + return + else if(!istype(marked_datum,/atom)) + usr << "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn." + return + else + target = marked_datum if(target) for (var/path in paths) @@ -2020,9 +2068,8 @@ if(path in typesof(/turf)) var/turf/O = target var/turf/N = O.ChangeTurf(path) - if(N) - if(obj_name) - N.name = obj_name + if(N && obj_name) + N.name = obj_name else var/atom/O = new path(target) if(O) @@ -2032,18 +2079,30 @@ if(istype(O,/mob)) var/mob/M = O M.real_name = obj_name + if(where == "inhand" && isliving(usr) && istype(O, /obj/item)) + var/mob/living/L = usr + var/obj/item/I = O + L.put_in_hands(I) + if(isrobot(L)) + var/mob/living/silicon/robot/R = L + if(R.module) + R.module.modules += I + I.loc = R.module + R.module.rebuild() + R.activate_module(I) + R.module.fix_modules() if (number == 1) log_admin("[key_name(usr)] created a [english_list(paths)]") for(var/path in paths) if(ispath(path, /mob)) - message_admins("[key_name_admin(usr)] created a [english_list(paths)]", 1) + message_admins("[key_name_admin(usr)] created a [english_list(paths)]") break else log_admin("[key_name(usr)] created [number]ea [english_list(paths)]") for(var/path in paths) if(ispath(path, /mob)) - message_admins("[key_name_admin(usr)] created [number]ea [english_list(paths)]", 1) + message_admins("[key_name_admin(usr)] created [number]ea [english_list(paths)]") break return @@ -2992,15 +3051,15 @@ if(isAI(target)) // AI core/eye follow links var/mob/living/silicon/ai/A = target - . = "JMP" + . = "FLW" if(A.client && A.eyeobj) // No point following clientless AI eyes - . += "|EYE" + . += "|EYE" return else if(istype(target, /mob/dead/observer)) var/mob/dead/observer/O = target - . = "JMP" + . = "FLW" if(O.mind && O.mind.current) - . += "|BDY" + . += "|BDY" return else - return "JMP" + return "FLW" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 0a4b63a6892..1d7196c0d97 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -87,7 +87,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," mobs_found += found if(!ai_found && isAI(found)) ai_found = 1 - msg += "[original_word] (?) " + msg += "[original_word] " continue msg += "[original_word] " @@ -147,3 +147,31 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," send2adminirc("[selected_type] from [key_name(src)]: [original_msg]") feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return + +/proc/send2irc_adminless_only(source, msg, requiredflags = R_BAN) + var/admin_number_total = 0 //Total number of admins + var/admin_number_afk = 0 //Holds the number of admins who are afk + var/admin_number_ignored = 0 //Holds the number of admins without +BAN (so admins who are not really admins) + var/admin_number_decrease = 0 //Holds the number of admins with are afk, ignored or both + for(var/client/X in admins) + admin_number_total++; + var/invalid = 0 + if(requiredflags != 0 && !check_rights_for(X, requiredflags)) + admin_number_ignored++ + invalid = 1 + if(X.is_afk()) + admin_number_afk++ + invalid = 1 + if(X.holder.fakekey) + admin_number_ignored++ + invalid = 1 + if(invalid) + admin_number_decrease++ + var/admin_number_present = admin_number_total - admin_number_decrease //Number of admins who are neither afk nor invalid + if(admin_number_present <= 0) + if(!admin_number_afk && !admin_number_ignored) + send2irc(source, "[msg] - No admins online") + else + send2irc(source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])") + return admin_number_present + \ No newline at end of file diff --git a/code/modules/admin/verbs/check_customitem_activity.dm b/code/modules/admin/verbs/check_customitem_activity.dm index 19dfd6bbdce..18a796a0b08 100644 --- a/code/modules/admin/verbs/check_customitem_activity.dm +++ b/code/modules/admin/verbs/check_customitem_activity.dm @@ -55,7 +55,7 @@ var/inactive_keys = "None
" //run a query to get all ckeys inactive for over 2 months var/list/inactive_ckeys = list() if(ckeys_with_customitems.len) - var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey, lastseen FROM erro_player WHERE datediff(Now(), lastseen) > 60") + var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey, lastseen FROM [format_table_name("player")] WHERE datediff(Now(), lastseen) > 60") query_inactive.Execute() while(query_inactive.NextRow()) var/cur_ckey = query_inactive.item[1] @@ -67,7 +67,7 @@ var/inactive_keys = "None
" //if there are ckeys left over, check whether they have a database entry at all if(ckeys_with_customitems.len) for(var/cur_ckey in ckeys_with_customitems) - var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey FROM erro_player WHERE ckey = '[cur_ckey]'") + var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[cur_ckey]'") query_inactive.Execute() if(!query_inactive.RowCount()) inactive_ckeys += cur_ckey diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 18729e36a79..eb6b02cc626 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1103,7 +1103,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.regenerate_icons() log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") - message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1) + message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1) return /client/proc/startSinglo() diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index 9b383a93d17..e64cbf66574 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -79,13 +79,13 @@ var/global/sent_honksquad = 0 var/honksquad_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") var/honksquad_name = pick(clown_names) - new_honksquad.gender = pick(MALE, FEMALE) - var/datum/preferences/A = new()//Randomize appearance for the commando. - A.randomize_appearance_for(new_honksquad) - - new_honksquad.real_name = "[!honk_leader_selected ? honksquad_rank : honksquad_leader_rank] [honksquad_name]" - new_honksquad.age = !honk_leader_selected ? rand(23,35) : rand(35,45) + if(honk_leader_selected) + A.age = rand(35,45) + A.real_name = "[honksquad_leader_rank] [honksquad_name]" + else + A.real_name = "[honksquad_rank] [honksquad_name]" + A.copy_to(new_honksquad) new_honksquad.dna.ready_dna(new_honksquad)//Creates DNA. diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 319c76a6974..5acf6c21b44 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -118,33 +118,37 @@ var/intercom_range_display_status = 0 del(F) feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +var/list/admin_verbs_show_debug_verbs = list( + /client/proc/camera_view, //-errorage + /client/proc/sec_camera_report, //-errorage + /client/proc/intercom_view, //-errorage + /client/proc/Cell, //More air things + /client/proc/atmosscan, //check plumbing + /client/proc/powerdebug, //check power + /client/proc/count_objects_on_z_level, + /client/proc/count_objects_all, + /client/proc/cmd_assume_direct_control, //-errorage + /client/proc/startSinglo, + /client/proc/ticklag, + /client/proc/cmd_admin_grantfullaccess, +// /client/proc/splash, + /client/proc/cmd_admin_areatest, + /client/proc/cmd_admin_rejuvenate, + /datum/admins/proc/show_traitor_panel, + /client/proc/print_jobban_old, + /client/proc/print_jobban_old_filter, + /client/proc/forceEvent, + ///client/proc/cmd_admin_rejuvenate, + /client/proc/nanomapgen_DumpImage +) + /client/proc/enable_debug_verbs() set category = "Debug" set name = "Debug verbs" if(!check_rights(R_DEBUG)) return - src.verbs += /client/proc/camera_view //-errorage - src.verbs += /client/proc/sec_camera_report //-errorage - src.verbs += /client/proc/intercom_view //-errorage - src.verbs += /client/proc/Cell //More air things - src.verbs += /client/proc/atmosscan //check plumbing - src.verbs += /client/proc/powerdebug //check power - src.verbs += /client/proc/count_objects_on_z_level - src.verbs += /client/proc/count_objects_all - src.verbs += /client/proc/cmd_assume_direct_control //-errorage - src.verbs += /client/proc/startSinglo - src.verbs += /client/proc/ticklag - src.verbs += /client/proc/cmd_admin_grantfullaccess -// src.verbs += /client/proc/splash - src.verbs += /client/proc/cmd_admin_areatest - src.verbs += /client/proc/cmd_admin_rejuvenate - src.verbs += /datum/admins/proc/show_traitor_panel - src.verbs += /client/proc/print_jobban_old - src.verbs += /client/proc/print_jobban_old_filter - src.verbs += /client/proc/forceEvent - //src.verbs += /client/proc/cmd_admin_rejuvenate - src.verbs += /client/proc/nanomapgen_DumpImage + verbs += admin_verbs_show_debug_verbs feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index abca2a40d33..b49a0fe609a 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -546,7 +546,7 @@ var/list/forbidden_varedit_object_types = list( if("marked datum") O.vars[variable] = holder.marked_datum - world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]" + log_to_dd("### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]") log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]") message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 6bb2f96ba06..93e5bb5c078 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -396,16 +396,8 @@ client/proc/one_click_antag() //First we spawn a dude. var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. - new_character.gender = pick(MALE,FEMALE) - var/datum/preferences/A = new() - A.randomize_appearance_for(new_character) - if(new_character.gender == MALE) - new_character.real_name = "[pick(first_names_male)] [pick(last_names)]" - else - new_character.real_name = "[pick(first_names_female)] [pick(last_names)]" - new_character.name = new_character.real_name - new_character.age = rand(17,45) + A.copy_to(new_character) new_character.dna.ready_dna(new_character) new_character.key = G_found.key @@ -418,14 +410,13 @@ client/proc/one_click_antag() var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") var/syndicate_commando_name = pick(last_names) - new_syndicate_commando.gender = pick(MALE, FEMALE) - var/datum/preferences/A = new()//Randomize appearance for the commando. - A.randomize_appearance_for(new_syndicate_commando) - - new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]" - new_syndicate_commando.name = new_syndicate_commando.real_name - new_syndicate_commando.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45) + if(syndicate_leader_selected) + A.real_name = "[syndicate_commando_leader_rank] [syndicate_commando_name]" + A.age = rand(35,45) + else + A.real_name = "[syndicate_commando_rank] [syndicate_commando_name]" + A.copy_to(new_syndicate_commando) new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA. @@ -610,14 +601,7 @@ client/proc/one_click_antag() var/mob/living/carbon/human/newMember = new(L.loc) - newMember.gender = pick(MALE,FEMALE) - A.randomize_appearance_for(newMember) - if(newMember.gender == MALE) - newMember.real_name = "[pick(first_names_male)] [pick(last_names)]" - else - newMember.real_name = "[pick(first_names_female)] [pick(last_names)]" - newMember.name = newMember.real_name - newMember.age = rand(17,45) + A.copy_to(newMember) newMember.dna.ready_dna(newMember) @@ -639,14 +623,7 @@ client/proc/one_click_antag() var/mob/living/carbon/human/newMember = new(L.loc) - newMember.gender = pick(MALE,FEMALE) - A.randomize_appearance_for(newMember) - if(newMember.gender == MALE) - newMember.real_name = "[pick(first_names_male)] [pick(last_names)]" - else - newMember.real_name = "[pick(first_names_female)] [pick(last_names)]" - newMember.name = newMember.real_name - newMember.age = rand(17,45) + A.copy_to(newMember) newMember.dna.ready_dna(newMember) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 5560b5438ad..2985f05aab8 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -26,7 +26,7 @@ /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "\blue CENTCOMM:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" + msg = "\blue CENTCOMM: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" for(var/client/X in admins) if(R_EVENT & X.holder.rights) @@ -34,7 +34,7 @@ /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "\blue SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" + msg = "\blue SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" for(var/client/X in admins) if(R_EVENT & X.holder.rights) @@ -42,7 +42,7 @@ /proc/HONK_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "\blue HONK:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" + msg = "\blue HONK: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" for(var/client/X in admins) if(R_EVENT & X.holder.rights) @@ -50,8 +50,15 @@ /proc/ERT_Announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "\blue ERT REQUEST:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" + msg = "\blue ERT REQUEST: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" for(var/client/X in admins) if(R_EVENT & X.holder.rights) - X << msg \ No newline at end of file + X << msg + +/proc/Nuke_request(text , mob/Sender) + var/nuke_code = get_nuke_code() + var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) + msg = "NUKE CODE REQUEST: [key_name(Sender)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" + admins << msg + admins << "The nuke code is [nuke_code]." \ No newline at end of file diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index feb735baef2..088e9c7a050 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -433,14 +433,11 @@ Traitors and the like can also be revived with the previous role mostly intact. else new_character.gender = pick(MALE,FEMALE) var/datum/preferences/A = new() - A.randomize_appearance_for(new_character) - new_character.real_name = G_found.real_name + A.real_name = G_found.real_name + A.copy_to(new_character) if(!new_character.real_name) - if(new_character.gender == MALE) - new_character.real_name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - new_character.real_name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + new_character.real_name = random_name(new_character.gender) new_character.name = new_character.real_name if(G_found.mind && !G_found.mind.active) @@ -911,10 +908,13 @@ Traitors and the like can also be revived with the previous role mostly intact. choice = input("The shuttle will not be able to leave if you call it. Call anyway?") in list("Confirm", "Cancel") if(choice != "Confirm") return + + choice = input("Is this an emergency evacuation or a crew transfer?") in list("Emergency", "Crew Transfer") if (choice == "Emergency") - emergency_shuttle.call_evac() + var/reason = input(usr, "Optional: Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + emergency_shuttle.call_evac(reason) else emergency_shuttle.call_transfer() diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 347f461dca8..c4fda49439a 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -104,13 +104,13 @@ var/global/sent_strike_team = 0 var/commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") var/commando_name = pick(last_names) - new_commando.gender = pick(MALE, FEMALE) - var/datum/preferences/A = new()//Randomize appearance for the commando. - A.randomize_appearance_for(new_commando) - - new_commando.real_name = "[!leader_selected ? commando_rank : commando_leader_rank] [commando_name]" - new_commando.age = !leader_selected ? rand(23,35) : rand(35,45) + if(leader_selected) + A.age = rand(35,45) + A.real_name = "[commando_leader_rank] [commando_name]" + else + A.real_name = "[commando_rank] [commando_name]" + A.copy_to(new_commando) new_commando.dna.ready_dna(new_commando)//Creates DNA. diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 3113e58c2be..42a635feafb 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -108,13 +108,13 @@ var/global/sent_syndicate_strike_team = 0 var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") var/syndicate_commando_name = pick(last_names) - new_syndicate_commando.gender = pick(MALE, FEMALE) - var/datum/preferences/A = new()//Randomize appearance for the commando. - A.randomize_appearance_for(new_syndicate_commando) - - new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]" - new_syndicate_commando.age = !syndicate_leader_selected ? rand(23,35) : rand(35,45) + if(syndicate_leader_selected) + A.age = rand(35,45) + A.real_name = "[syndicate_commando_leader_rank] [syndicate_commando_name]" + else + A.real_name = "[syndicate_commando_rank] [syndicate_commando_name]" + A.copy_to(new_syndicate_commando) new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA. diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index f773d23229f..2b0e72aaade 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -53,7 +53,7 @@ process() if(timing && (time > 0)) - time-- + time -= 2 // 2 seconds per process() if(timing && time <= 0) timing = repeat timer_end() @@ -110,6 +110,10 @@ if(href_list["time"]) timing = !timing + if(timing && istype(holder, /obj/item/device/transfer_valve)) + message_admins("[key_name_admin(usr)] activated [src] attachment on [holder].") + bombers += "[key_name(usr)] activated [src] attachment for [loc]" + log_game("[key_name(usr)] activated [src] attachment for [loc]") update_icon() if(href_list["reset"]) time = set_time @@ -120,7 +124,7 @@ if(href_list["tp"]) var/tp = text2num(href_list["tp"]) set_time += tp - set_time = min(max(round(set_time), 5), 600) + set_time = min(max(round(set_time), 6), 600) if(!timing) time = set_time diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 03509d38ac3..76a0e4d490b 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -1,15 +1,59 @@ - -/obj/machinery/artillerycontrol - var/reload = 180 +/obj/machinery/computer/artillerycontrol name = "bluespace artillery control" - icon_state = "control_boxp1" - icon = 'icons/obj/machines/particle_accelerator.dmi' - density = 1 - anchored = 1 + icon_screen = "accelerator" + icon_keyboard = "accelerator_key" + icon_state = "computer-wires" + req_access = list(access_cent_commander) + var/last_fire = 0 + var/reload_cooldown = 180 // 3 minute cooldown + + light_color = LIGHT_COLOR_LIGHTBLUE -/obj/machinery/artillerycontrol/process() - if(src.reload<180) - src.reload++ +/obj/machinery/computer/artillerycontrol/attack_ai(user as mob) + user << "Access denied." + return + +/obj/machinery/computer/artillerycontrol/attack_hand(user as mob) + ui_interact(user) + +/obj/machinery/computer/artillerycontrol/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + var/time_to_wait = round(reload_cooldown - ((world.time / 10) - last_fire), 1) + var/mins = round(time_to_wait / 60) + var/seconds = time_to_wait - (60*mins) + data["reloadtime_mins"] = mins + data["reloadtime_secs"] = (seconds < 10) ? "0[seconds]" : seconds + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + + if (!ui) + ui = new(user, src, ui_key, "bluespace_artillery.tmpl", "Bluespace Control", 400, 260) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/artillerycontrol/Topic(href, href_list) + if(..()) + return 1 + + var/A + A = input("Area to jump bombard", "Open Fire", A) in teleportlocs + var/area/thearea = teleportlocs[A] + if(..() || !istype(thearea)) + return + + var/delta = (world.time / 10) - last_fire + if(reload_cooldown > delta) + return 1 + + command_announcement.Announce("Bluespace artillery fire detected. Brace for impact.") + message_admins("[key_name_admin(usr)] has launched an artillery strike.", 1) + var/list/L = list() + for(var/turf/T in get_area_turfs(thearea.type)) + L+=T + var/loc = pick(L) + explosion(loc,2,5,11) + last_fire = world.time / 10 /obj/structure/artilleryplaceholder name = "artillery" @@ -19,47 +63,3 @@ /obj/structure/artilleryplaceholder/decorative density = 0 - -/obj/machinery/artillerycontrol/attack_hand(mob/user as mob) - user.set_machine(src) - var/dat = "Bluespace Artillery Control:
" - dat += "Locked on
" - dat += "Charge progress: [reload]/180:
" - dat += "Open Fire
" - dat += "Deployment of weapon authorized by
Nanotrasen Naval Command

Remember, friendly fire is grounds for termination of your contract and life.
" - user << browse(dat, "window=scroll") - onclose(user, "scroll") - return - -/obj/machinery/artillerycontrol/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) - return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - var/A - A = input("Area to jump bombard", "Open Fire", A) in teleportlocs - var/area/thearea = teleportlocs[A] - if (usr.stat || usr.restrained()) return - if(src.reload < 180) return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - command_announcement.Announce("Bluespace artillery fire detected. Brace for impact.") - message_admins("[key_name_admin(usr)] has launched an artillery strike.", 1) - var/list/L = list() - for(var/turf/T in get_area_turfs(thearea.type)) - L+=T - var/loc = pick(L) - explosion(loc,2,5,11) - reload = 0 - -/*mob/proc/openfire() - var/A - A = input("Area to jump bombard", "Open Fire", A) in teleportlocs - var/area/thearea = teleportlocs[A] - command_announcement.Announce("Bluespace artillery fire detected. Brace for impact.") - spawn(30) - var/list/L = list() - - for(var/turf/T in get_area_turfs(thearea.type)) - L+=T - var/loc = pick(L) - explosion(loc,2,5,11)*/ \ No newline at end of file diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm index a53bd552329..8f15d071b0f 100644 --- a/code/modules/awaymissions/maploader/swapmaps.dm +++ b/code/modules/awaymissions/maploader/swapmaps.dm @@ -585,7 +585,7 @@ proc/SwapMaps_CreateFromTemplate(template_id) else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt")) text=1 else - world.log << "SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found." + log_to_dd("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.") return if(text) S=new @@ -612,7 +612,7 @@ proc/SwapMaps_LoadChunk(chunk_id,turf/locorner) else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) text=1 else - world.log << "SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found." + log_to_dd("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.") return if(text) S=new @@ -630,9 +630,9 @@ proc/SwapMaps_LoadChunk(chunk_id,turf/locorner) proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2) if(!corner1 || !corner2) - world.log << "SwapMaps error in SwapMaps_SaveChunk():" - if(!corner1) world.log << " corner1 turf is null" - if(!corner2) world.log << " corner2 turf is null" + log_to_dd("SwapMaps error in SwapMaps_SaveChunk():") + if(!corner1) log_to_dd(" corner1 turf is null") + if(!corner2) log_to_dd(" corner2 turf is null") return var/swapmap/M=new M.id=chunk_id @@ -659,7 +659,7 @@ proc/SwapMaps_GetSize(id) else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) text=1 else - world.log << "SwapMaps error in SwapMaps_GetSize(): map_[id] file not found." + log_to_dd("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.") return if(text) S=new diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 51b66024215..06689601523 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -44,7 +44,7 @@ proc/createRandomZlevel() if(air_master) air_master.setup_allturfs(block(locate(1, 1, world.maxz), locate(world.maxx, world.maxy, world.maxz))) create_lighting_overlays(world.maxz) - world.log << "away mission loaded: [map]" + log_to_dd("away mission loaded: [map]") for(var/obj/effect/landmark/L in landmarks_list) if (L.name != "awaystart") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 2efc59f66c5..80c4114059a 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -31,7 +31,7 @@ //search the href for script injection if( findtext(href,"Notice: [key_name_admin(src)] is flagged for watching and has just connected - Reason: [query_watch.item[2]]") + send2irc_adminless_only("Watchlist", "[key_name_admin(src)] is flagged for watching and has just connected - Reason: [query_watch.item[2]]") + //Just the standard check to see if it's actually a number if(sql_id) if(istext(sql_id)) @@ -348,16 +354,16 @@ if(sql_id) //Player already identified previously, we need to just update the 'lastseen', 'ip' and 'computer_id' variables - var/DBQuery/query_update = dbcon.NewQuery("UPDATE erro_player SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]") + var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastseen = Now(), ip = '[sql_ip]', computerid = '[sql_computerid]', lastadminrank = '[sql_admin_rank]' WHERE id = [sql_id]") query_update.Execute() else //New player!! Need to insert all the stuff - var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO erro_player (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") + var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") query_insert.Execute() //Logging player access var/serverip = "[world.internet_address]:[world.port]" - var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `erro_connection_log`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[sql_ckey]','[sql_ip]','[sql_computerid]');") + var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[sql_ckey]','[sql_ip]','[sql_computerid]');") query_accesslog.Execute() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 6c985f2a002..7b71c2b5877 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -30,7 +30,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts num2text(BE_REV) = 14, num2text(BE_VAMPIRE) = 14, num2text(BE_BLOB) = 14, - num2text(BE_REVENANT) = 14, + num2text(BE_REVENANT) = 14, num2text(BE_OPERATIVE) = 21, num2text(BE_CULTIST) = 21, num2text(BE_RAIDER) = 21, @@ -104,8 +104,8 @@ datum/preferences var/age = 30 //age of character var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2). var/b_type = "A+" //blood type (not-chooseable) - var/underwear = 1 //underwear type - var/undershirt = 1 //undershirt type + var/underwear = "Nude" //underwear type + var/undershirt = "Nude" //undershirt type var/backbag = 2 //backpack type var/h_style = "Bald" //Hair type var/r_hair = 0 //Hair color @@ -185,14 +185,17 @@ datum/preferences var/volume = 100 /datum/preferences/New(client/C) b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") - if(istype(C)) - if(!IsGuestKey(C.key)) -// load_path(C.ckey) - if(load_preferences(C)) - if(load_character(C)) - return - gender = pick(MALE, FEMALE) + + var/loaded_preferences_successfully = load_preferences(C) + if(loaded_preferences_successfully) + if(load_character(C)) + return + //we couldn't load character data so just randomize the character appearance + name + random_character() //let's create a random character then - rather than a fat, bald and naked man. real_name = random_name(gender) + if(!loaded_preferences_successfully) + save_preferences(C) + save_character(C) //let's save this new random character so it doesn't keep generating new ones. /datum/preferences proc/ShowChoices(mob/user) @@ -316,11 +319,8 @@ datum/preferences dat += "\[...\]

" else dat += "

" - if(gender == MALE) - dat += "Underwear: [underwear_m[underwear]]
" - else - dat += "Underwear: [underwear_f[underwear]]
" - dat += "Undershirt: [undershirt_t[undershirt]]
" + dat += "Underwear:
[underwear]
" + dat += "Undershirt:
[undershirt]
" dat += "Backpack Type:
[backbaglist[backbag]]
" dat += "Nanotrasen Relation:
[nanotrasen_relation]
" dat += "Preview
" @@ -337,7 +337,7 @@ datum/preferences else dat += "[flavor_text]" else - dat += "[copytext(flavor_text, 1, 37)]...
" + dat += "[TextPreview(flavor_text)]...
" dat += "
" var/hairname = "Hair" @@ -984,10 +984,10 @@ datum/preferences if("f_style") f_style = random_facial_hair_style(gender, species) if("underwear") - underwear = rand(1,underwear_m.len) + underwear = random_underwear(gender) ShowChoices(user) if("undershirt") - undershirt = rand(1,undershirt_t.len) + undershirt = random_undershirt(gender) ShowChoices(user) if("eyes") r_eyes = rand(0,255) @@ -1006,7 +1006,7 @@ datum/preferences /*if("skin_style") h_style = random_skin_style(gender)*/ if("all") - randomize_appearance_for() //no params needed + random_character() if("input") switch(href_list["preference"]) if("name") @@ -1176,16 +1176,17 @@ datum/preferences var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options if(new_underwear) - underwear = underwear_options.Find(new_underwear) + underwear = new_underwear ShowChoices(user) if("undershirt") - var/list/undershirt_options - undershirt_options = undershirt_t - - var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_options - if (new_undershirt) - undershirt = undershirt_options.Find(new_undershirt) + var/new_undershirt + if(gender == MALE) + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m + else + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f + if(new_undershirt) + undershirt = new_undershirt ShowChoices(user) if("eyes") @@ -1340,7 +1341,7 @@ datum/preferences gender = FEMALE else gender = MALE - + underwear = random_underwear(gender) if("hear_adminhelps") sound ^= SOUND_ADMINHELP @@ -1410,7 +1411,10 @@ datum/preferences close_load_dialog(user) if("changeslot") - load_character(user,text2num(href_list["num"])) + if(!load_character(user,text2num(href_list["num"]))) + random_character() + real_name = random_name(gender) + save_character(user) close_load_dialog(user) if("tab") @@ -1420,7 +1424,7 @@ datum/preferences ShowChoices(user) return 1 - proc/copy_to(mob/living/carbon/human/character, safety = 0) + proc/copy_to(mob/living/carbon/human/character) if(be_random_name) real_name = random_name(gender,species) @@ -1517,12 +1521,7 @@ datum/preferences W.buckled_mob = character W.add_fingerprint(character) - if(underwear > underwear_m.len || underwear < 1) - underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES character.underwear = underwear - - if(undershirt > undershirt_t.len || undershirt < 1) - undershirt = 0 character.undershirt = undershirt if(backbag > 4 || backbag < 1) diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index f098ff77989..a9ce9b35621 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -1,6 +1,6 @@ /datum/preferences/proc/load_preferences(client/C) - var/DBQuery/query = dbcon.NewQuery("SELECT ooccolor,UI_style,UI_style_color,UI_style_alpha,be_special,default_slot,toggles,sound,randomslot,volume FROM erro_player WHERE ckey='[C.ckey]'") + var/DBQuery/query = dbcon.NewQuery("SELECT ooccolor,UI_style,UI_style_color,UI_style_alpha,be_special,default_slot,toggles,sound,randomslot,volume FROM [format_table_name("player")] WHERE ckey='[C.ckey]'") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during loading player preferences. Error : \[[err]\]\n") @@ -37,7 +37,7 @@ /datum/preferences/proc/save_preferences(client/C) - var/DBQuery/query = dbcon.NewQuery("UPDATE erro_player SET ooccolor='[ooccolor]',UI_style='[UI_style]',UI_style_color='[UI_style_color]',UI_style_alpha='[UI_style_alpha]',be_special='[be_special]',default_slot='[default_slot]',toggles='[toggles]',sound='[sound]',randomslot='[randomslot]',volume='[volume]' WHERE ckey='[C.ckey]'") + var/DBQuery/query = dbcon.NewQuery("UPDATE [format_table_name("player")] SET ooccolor='[ooccolor]',UI_style='[UI_style]',UI_style_color='[UI_style_color]',UI_style_alpha='[UI_style_alpha]',be_special='[be_special]',default_slot='[default_slot]',toggles='[toggles]',sound='[sound]',randomslot='[randomslot]',volume='[volume]' WHERE ckey='[C.ckey]'") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during saving player preferences. Error : \[[err]\]\n") @@ -51,7 +51,7 @@ slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) if(slot != default_slot) default_slot = slot - var/DBQuery/firstquery = dbcon.NewQuery("UPDATE erro_player SET default_slot=[slot] WHERE ckey='[C.ckey]'") + var/DBQuery/firstquery = dbcon.NewQuery("UPDATE [format_table_name("player")] SET default_slot=[slot] WHERE ckey='[C.ckey]'") firstquery.Execute() var/DBQuery/query = dbcon.NewQuery("SELECT * FROM characters WHERE ckey='[C.ckey]' AND slot='[slot]'") @@ -87,8 +87,8 @@ r_eyes = text2num(query.item[23]) g_eyes = text2num(query.item[24]) b_eyes = text2num(query.item[25]) - underwear = text2num(query.item[26]) - undershirt = text2num(query.item[27]) + underwear = query.item[26] + undershirt = query.item[27] backbag = text2num(query.item[28]) b_type = query.item[29] @@ -147,8 +147,8 @@ r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) - underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear)) - undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) + underwear = sanitize_text(underwear, initial(underwear)) + undershirt = sanitize_text(undershirt, initial(undershirt)) backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) b_type = sanitize_text(b_type, initial(b_type)) @@ -204,7 +204,7 @@ message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n") return return 1 - +/* /datum/preferences/proc/random_character(client/C) var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM characters WHERE ckey='[C.ckey]' ORDER BY slot") @@ -218,4 +218,4 @@ load_character(C) return 0 load_character(C,pick(saves)) - return 1 \ No newline at end of file + return 1*/ \ No newline at end of file diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm index dd22bde09ec..e2595bda76a 100644 --- a/code/modules/computer3/computers/communications.dm +++ b/code/modules/computer3/computers/communications.dm @@ -129,7 +129,10 @@ if(!computer.radio.subspace) return if(authenticated) - call_shuttle_proc(usr) + var/input = stripped_input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + if(!input || ..(href, href_list) || !authenticated) + return + call_shuttle_proc(usr, input) if(emergency_shuttle.online()) post_status("shuttle") state = STATE_DEFAULT @@ -236,7 +239,10 @@ if("ai-callshuttle2" in href_list) if(!computer.radio.subspace) return - call_shuttle_proc(usr) + var/input = stripped_input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + if(!input || ..(href, href_list)) + return + call_shuttle_proc(usr, input) aistate = STATE_DEFAULT if("ai-messagelist" in href_list) aicurrmsg = 0 diff --git a/code/modules/computer3/laptop.dm b/code/modules/computer3/laptop.dm index e4e3876e89f..b0789d6a740 100644 --- a/code/modules/computer3/laptop.dm +++ b/code/modules/computer3/laptop.dm @@ -49,10 +49,10 @@ if(!stored_computer) if(contents.len) for(var/obj/O in contents) - O.loc = loc + O.forceMove(loc) usr << "\The [src] crumbles to pieces." spawn(5) - qdel(src) + qdel(src) return if(!stored_computer.manipulating) @@ -65,7 +65,7 @@ spawn(5) stored_computer.manipulating = 0 - qdel(src) + qdel(src) else usr << "\red You are already opening the computer!" @@ -73,6 +73,9 @@ AltClick() if(Adjacent(usr)) open_computer() + + Destroy() + return QDEL_HINT_HARDDEL_NOW // Warning: GC'ing will cause the laptop to vanish when it next closes //Quickfix until Snapshot works out how he wants to redo power. ~Z /obj/item/device/laptop/verb/eject_id() @@ -150,12 +153,12 @@ return if(!portable) - portable=new + portable = new portable.stored_computer = src if(!manipulating) - portable.loc = loc - loc = portable + portable.forceMove(loc) + forceMove(portable) stat |= MAINT usr << "You close \the [src]." diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index e09a3b887c5..faf598f77e9 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -23,7 +23,7 @@ log transactions anchored = 1 use_power = 1 idle_power_usage = 10 - var/obj/machinery/account_database/linked_db + var/obj/machinery/computer/account_database/linked_db var/datum/money_account/authenticated_account var/number_incorrect_tries = 0 var/previous_account_number = 0 @@ -80,7 +80,7 @@ log transactions authenticated_account.charge(-amount,null,"Credit deposit",terminal_id=machine_id,dest_name = "Terminal") /obj/machinery/atm/proc/reconnect_database() - for(var/obj/machinery/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines' + for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines' if( DB.z == src.z && !(DB.stat & NOPOWER) && DB.activated ) linked_db = DB break diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 018ce78cd3a..9dbfb8c2d51 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -3,7 +3,7 @@ var/global/num_financial_terminals = 1 var/global/datum/money_account/station_account var/global/list/datum/money_account/department_accounts = list() var/global/next_account_number = 0 -var/global/obj/machinery/account_database/centcomm_account_db +var/global/obj/machinery/computer/account_database/centcomm_account_db var/global/datum/money_account/vendor_account var/global/list/all_money_accounts = list() @@ -57,7 +57,7 @@ var/global/list/all_money_accounts = list() //the current ingame time (hh:mm) can be obtained by calling: //worldtime2text() -/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/account_database/source_db) +/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/computer/account_database/source_db) //create a new account var/datum/money_account/M = new() @@ -336,7 +336,7 @@ var/global/list/all_money_accounts = list() src.attack_hand(usr) */ -/obj/machinery/account_database/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount) +/obj/machinery/computer/account_database/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount) if(!activated) return 0 for(var/datum/money_account/D in all_money_accounts) @@ -367,7 +367,7 @@ var/global/list/all_money_accounts = list() if( D.security_level <= security_level_passed && (!D.security_level || D.remote_access_pin == attempt_pin_number || !pin_needed) ) return D -/obj/machinery/account_database/proc/get_account(var/account_number) +/obj/machinery/computer/account_database/proc/get_account(var/account_number) for(var/datum/money_account/D in all_money_accounts) if(D.account_number == account_number) return D diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 1b798ca0d86..4c40a9ef035 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -1,9 +1,8 @@ -/obj/machinery/account_database - name = "Accounts uplink terminal" +/obj/machinery/computer/account_database + name = "Accounts Uplink Terminal" desc = "Access transaction logs, account data and all kinds of other financial records." - icon = 'icons/obj/computer.dmi' - icon_state = "aiupload" + icon_screen = "accounts" density = 1 req_one_access = list(access_hop, access_captain, access_cent_commander) var/receipt_num @@ -12,34 +11,38 @@ var/datum/money_account/detailed_account_view var/creating_new_account = 0 var/activated = 1 + + light_color = LIGHT_COLOR_GREEN - proc/get_access_level() - if (!held_card) - return 0 - if(access_cent_commander in held_card.access) - return 2 - else if(access_hop in held_card.access || access_captain in held_card.access) - return 1 +/obj/machinery/computer/account_database/proc/get_access_level(user as mob) + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 2 + if (!held_card) + return 0 + if(access_cent_commander in held_card.access) + return 2 + else if(access_hop in held_card.access || access_captain in held_card.access) + return 1 - proc/create_transation(target, reason, amount) - var/datum/transaction/T = new() - T.target_name = target - T.purpose = reason - T.amount = amount - T.date = current_date_string - T.time = worldtime2text() - T.source_terminal = machine_id - return T +/obj/machinery/computer/account_database/proc/create_transation(target, reason, amount) + var/datum/transaction/T = new() + T.target_name = target + T.purpose = reason + T.amount = amount + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = machine_id + return T - proc/accounting_letterhead(report_name) - return {" -

[report_name]

-
[station_name()] Accounting Report
-
- Generated By: [held_card.registered_name], [held_card.assignment]
- "} +/obj/machinery/computer/account_database/proc/accounting_letterhead(report_name) + return {" +

[report_name]

+
[station_name()] Accounting Report
+
+ Generated By: [held_card.registered_name], [held_card.assignment]
+ "} -/obj/machinery/account_database/New() +/obj/machinery/computer/account_database/New() if(!station_account) create_station_account() @@ -56,7 +59,7 @@ machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" ..() -/obj/machinery/account_database/attackby(obj/O, mob/user, params) +/obj/machinery/computer/account_database/attackby(obj/O, mob/user, params) if(!istype(O, /obj/item/weapon/card/id)) return ..() @@ -69,18 +72,17 @@ attack_hand(user) -/obj/machinery/account_database/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) return +/obj/machinery/computer/account_database/attack_hand(mob/user as mob) ui_interact(user) -/obj/machinery/account_database/ui_interact(mob/user, ui_key="main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/machinery/computer/account_database/ui_interact(mob/user, ui_key="main", var/datum/nanoui/ui = null, var/force_open = 1) user.set_machine(src) var/data[0] data["src"] = "\ref[src]" data["id_inserted"] = !!held_card data["id_card"] = held_card ? text("[held_card.registered_name], [held_card.assignment]") : "-----" - data["access_level"] = get_access_level() + data["access_level"] = get_access_level(user) data["machine_id"] = machine_id data["creating_new_account"] = creating_new_account data["detailed_account_view"] = !!detailed_account_view @@ -124,10 +126,29 @@ ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640) ui.set_initial_data(data) ui.open() - -/obj/machinery/account_database/Topic(href, href_list) + +/obj/machinery/computer/account_database/Topic(href, href_list) if(..()) return 1 + + if("insert_card") + if(held_card) + held_card.loc = src.loc + + if(ishuman(usr) && !usr.get_active_hand()) + usr.put_in_hands(held_card) + held_card = null + + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/C = I + usr.drop_item() + C.loc = src + held_card = C + + if(!get_access_level(usr)) + return 1 var/datum/nanoui/ui = nanomanager.get_open_ui(usr, src, "main") @@ -167,21 +188,6 @@ ui.close() creating_new_account = 0 - if("insert_card") - if(held_card) - held_card.loc = src.loc - - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(held_card) - held_card = null - - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = I - usr.drop_item() - C.loc = src - held_card = C if("view_account_detail") var/index = text2num(href_list["account_index"]) diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index ea56f8f28e4..efef8616f7f 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -10,7 +10,7 @@ var/transaction_amount = 0 var/transaction_purpose = "Default charge" var/access_code = 0 - var/obj/machinery/account_database/linked_db + var/obj/machinery/computer/account_database/linked_db var/datum/money_account/linked_account /obj/item/device/eftpos/New() @@ -53,7 +53,7 @@ if(!location) return - for(var/obj/machinery/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines' + for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines' if(DB.z == location.z) linked_db = DB break diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm index 846f1e926a4..a6997bab4f4 100644 --- a/code/modules/economy/utils.dm +++ b/code/modules/economy/utils.dm @@ -5,7 +5,7 @@ //////////////////////// /proc/get_money_account(var/account_number, var/from_z=-1) - for(var/obj/machinery/account_database/DB in world) + for(var/obj/machinery/computer/account_database/DB in world) if(from_z > -1 && DB.z != from_z) continue if((DB.stat & NOPOWER) || !DB.activated ) continue var/datum/money_account/acct = DB.get_account(account_number) diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 07f68b9b5c6..198b483ee10 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -104,10 +104,7 @@ //Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window. //P.tnote += "← From [sender] (Unknown / spam?):
[message]
" - if (!P.silent) - playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(3, P.loc)) - if(!P.silent) O.show_message(text("\icon[P] *[P.ttone]*")) + P.play_ringtone() //Search for holder of the PDA. var/mob/living/L = null if(P.loc && isliving(P.loc)) diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index b4a4788c8da..3bae54d75ac 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -4,7 +4,7 @@ var/releaseWhen = 60 var/list/area/areas = list() //List of areas to affect. Filled by start() - + var/eventDept = "Security" //Department name in announcement var/list/areaName = list("Brig") //Names of areas mentioned in AI and Engineering announcements var/list/areaType = list(/area/security/prison, /area/security/brig, /area/security/permabrig) //Area types to include. @@ -54,7 +54,7 @@ A << "Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department]." else - world.log << "ERROR: Could not initate grey-tide. Unable to find suitable containment area." + log_to_dd("ERROR: Could not initate grey-tide. Unable to find suitable containment area.") kill() diff --git a/code/modules/garbage collection/garbage_collector.dm b/code/modules/garbage collection/garbage_collector.dm index 41c01dc5672..5b3a070f570 100644 --- a/code/modules/garbage collection/garbage_collector.dm +++ b/code/modules/garbage collection/garbage_collector.dm @@ -166,4 +166,4 @@ var/global/datum/controller/process/garbage_collector/garbageCollector return ..() /proc/gcwarning(msg) - world.log << "## GC WARNING: [msg]" + log_to_dd("## GC WARNING: [msg]") diff --git a/code/modules/genetics/side_effects.dm b/code/modules/genetics/side_effects.dm deleted file mode 100644 index a3153beaa59..00000000000 --- a/code/modules/genetics/side_effects.dm +++ /dev/null @@ -1,91 +0,0 @@ -/datum/genetics/side_effect - var/name // name of the side effect, to use as a header in the manual - var/symptom // description of the symptom of the side effect - var/treatment // description of the treatment of the side effect - var/effect // description of what happens when not treated - var/duration = 0 // delay between start() and finish() - - proc/start(mob/living/carbon/human/H) - // start the side effect, this should give some cue as to what's happening, - // such as gasping. These cues need to be unique among side-effects. - - proc/finish(mob/living/carbon/human/H) - // Finish the side-effect. This should first check whether the cure has been - // applied, and if not, cause bad things to happen. - -/datum/genetics/side_effect/genetic_burn - name = "Genetic Burn" - symptom = "Subject's skin turns unusualy red." - treatment = "Inject small dose of salbutamol." - effect = "Subject's skin burns." - duration = 10*30 - - start(mob/living/carbon/human/H) - H.emote("me", 1, "starts turning very red..") - - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("salbutamol")) - for(var/organ_name in list("chest","l_arm","r_arm","r_leg","l_leg","head","groin")) - var/obj/item/organ/external/E = H.get_organ(organ_name) - E.take_damage(0, 5, 0) - -/datum/genetics/side_effect/bone_snap - name = "Bone Snap" - symptom = "Subject's limbs tremble notably." - treatment = "Inject small dose of Styptic Powder." - effect = "Subject's bone breaks." - duration = 10*60 - - start(mob/living/carbon/human/H) - H.emote("me", 1, "'s limbs start shivering uncontrollably.") - - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("styptic_powder")) - var/organ_name = pick("chest","l_arm","r_arm","r_leg","l_leg","head","groin") - var/obj/item/organ/external/E = H.get_organ(organ_name) - E.take_damage(20, 0, 0) - E.fracture() - -/datum/genetics/side_effect/monkey - name = "Monkey" - symptom = "Subject starts drooling uncontrollably." - treatment = "Inject small dose of charcoal." - effect = "Subject turns into monkey." - duration = 10*90 - - start(mob/living/carbon/human/H) - H.emote("me", 1, "has drool running down from his mouth.") - - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("charcoal")) - H.monkeyize() - -/datum/genetics/side_effect/confuse - name = "Confuse" - symptom = "Subject starts drooling uncontrollably." - treatment = "Inject small dose of charcoal." - effect = "Subject becomes confused." - duration = 10*30 - - start(mob/living/carbon/human/H) - H.emote("me", 1, "has drool running down from his mouth.") - - finish(mob/living/carbon/human/H) - if(!H.reagents.has_reagent("charcoal")) - H.confused += 100 - -proc/trigger_side_effect(mob/living/carbon/human/H) - spawn - if(!istype(H)) return - var/tp = pick(subtypesof(/datum/genetics/side_effect)) - var/datum/genetics/side_effect/S = new tp - - S.start(H) - spawn(20) - if(!istype(H)) return - H.Weaken(rand(0, S.duration / 50)) - sleep(S.duration) - - if(!istype(H)) return - H.SetWeakened(0) - S.finish(H) \ No newline at end of file diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index eb3a2a89fc1..9c19f780199 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -734,7 +734,7 @@ product = new /obj/item/weapon/reagent_containers/food/snacks/grown(get_turf(user),name) if(get_trait(TRAIT_PRODUCT_COLOUR)) if(modular_icon == 1) - if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/primitive/diona)) + if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/simple_animal/diona)) product.color = get_trait(TRAIT_PRODUCT_COLOUR) if(istype(product,/obj/item/weapon/reagent_containers/food)) var/obj/item/weapon/reagent_containers/food/food = product diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 919b2e5cbbc..ff24279989b 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -1184,7 +1184,7 @@ seed_noun = "nodes" display_name = "replicant pods" can_self_harvest = 1 - has_mob_product = /mob/living/carbon/primitive/diona + has_mob_product = /mob/living/simple_animal/diona /datum/seed/diona/New() ..() diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index d00baff79d7..b7fd3b4fdfd 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -69,7 +69,7 @@ host << "\green You awaken slowly, stirring into sluggish motion as the air caresses you." // This is a hack, replace with some kind of species blurb proc. - if(istype(host,/mob/living/carbon/primitive/diona)) + if(istype(host,/mob/living/simple_animal/diona)) host << "You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." host << "Too much darkness will send you into shock and starve you, but light will help you heal." diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 077ad9ce444..76ede0d9d2d 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -140,8 +140,8 @@ return ..() /obj/machinery/portable_atmospherics/hydroponics/proc/attack_generic(var/mob/user) - if(istype(user,/mob/living/carbon/primitive/diona)) - var/mob/living/carbon/primitive/diona/nymph = user + if(istype(user,/mob/living/simple_animal/diona)) + var/mob/living/simple_animal/diona/nymph = user if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained()) return diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index f23bdb4d25a..96f23aaea0f 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -287,7 +287,7 @@ var/global/list/rockTurfEdgeCache if(z != 5) notify_admins = 1 if(!triggered_by_explosion) - message_admins("[key_name_admin(user)]? (FLW) has triggered a gibtonite deposit reaction at [A.name] (JMP).") + message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).") else message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).") diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index cf66bdce72e..2815d1c5da7 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -174,9 +174,9 @@ if(triggered_by == 1) message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).") else if(triggered_by == 2) - message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [key_name_admin(attacher)]? (FLW)") + message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [key_name_admin(attacher)]") else - message_admins("[key_name_admin(user)]? (FLW) has triggered a [name] to detonate at [A.name] (JMP).") + message_admins("[key_name_admin(user)] has triggered a [name] to detonate at [A.name] (JMP).") if(triggered_by == 1) log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") else if(triggered_by == 2) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 84209d2ef37..0406f46cc22 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -311,13 +311,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(jobban_isbanned(M, "AntagHUD")) src << "\red You have been banned from using this feature" return - if(config.antag_hud_restricted && !M.has_enabled_antagHUD &&!client.holder) + if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !check_rights(R_MOD,0)) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") if(response == "No") return M.can_reenter_corpse = 0 if(M in respawnable_list) respawnable_list -= M - if(!M.has_enabled_antagHUD && !client.holder) + if(!M.has_enabled_antagHUD && !check_rights(R_MOD,0)) M.has_enabled_antagHUD = 1 if(M.antagHUD) M.antagHUD = 0 @@ -598,4 +598,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //add images for the 60inv things ghosts can normally see when darkness is enabled so they can see them now client.images |= ghost_darkness_images if (ghostimage) - client.images -= ghostimage //remove ourself \ No newline at end of file + client.images -= ghostimage //remove ourself + \ No newline at end of file diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 9264feaa869..edee5035f2d 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -115,12 +115,6 @@ if(vname) speaker_name = vname - - if(istype(speaker, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = speaker - if(H.voice) - speaker_name = H.voice - if(hard_to_hear) speaker_name = "unknown" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b67e2ad878e..b0b7d85e97e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -452,9 +452,9 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]" var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]" - M.attack_log += text("\[[time_stamp()]\] Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") - usr.attack_log += text("\[[time_stamp()]\] Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]") - msg_admin_attack("[usr.name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (JMP)") + M.attack_log += text("\[[time_stamp()]\] Has been thrown by [key_name(usr)] from [start_T_descriptor] with the target [end_T_descriptor]") + usr.attack_log += text("\[[time_stamp()]\] Has thrown [key_name(M)] from [start_T_descriptor] with the target [end_T_descriptor]") + msg_admin_attack("[key_name_admin(usr)] has thrown [key_name_admin(M)] from [start_T_descriptor] with the target [end_T_descriptor]") if(!iscarbon(usr)) M.LAssailant = null diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 0ff36b6d052..a9cf1ea1094 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -136,7 +136,7 @@ tod = worldtime2text() //weasellos time of death patch if(mind) mind.store_memory("Time of death: [tod]", 0) if(ticker && ticker.mode) -// world.log << "k" +// log_to_dd("k") sql_report_death(src) ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now return ..(gibbed) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index da2f516375b..5624355b161 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -841,11 +841,11 @@ set desc = "Sets a description which will be shown when someone examines you." set category = "IC" - pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN)) + pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN)) /mob/living/carbon/human/verb/set_flavor() set name = "Set Flavour Text" set desc = "Sets an extended description of your character's features." set category = "IC" - flavor_text = sanitize(copytext(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text, 1)) + flavor_text = TextPreview(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 2e7b903d98f..5ae42000949 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -431,12 +431,10 @@ var/armor_block = run_armor_check(affecting, "melee") apply_damage(damage, BRUTE, affecting, armor_block) -/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M) - if(!istype(M)) - return 0 - for(var/L in M.contents) +/mob/living/carbon/human/proc/is_loyalty_implanted() + for(var/L in contents) if(istype(L, /obj/item/weapon/implant/loyalty)) - for(var/obj/item/organ/external/O in M.organs) + for(var/obj/item/organ/external/O in organs) if(L in O.implants) return 1 return 0 @@ -696,6 +694,12 @@ // if looting pockets with gloves, do it quietly if(href_list["pockets"]) + if(isanimal(usr)) + return //animals cannot strip people + + if(frozen) + usr << "\red Do not attempt to strip frozen people." + return var/pocket_side = href_list["pockets"] var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store) var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store) @@ -722,16 +726,19 @@ // Update strip window if(usr.machine == src && in_range(src, usr)) show_inv(usr) - - - + else if(!pickpocket) // Display a warning if the user mocks up src << "You feel your [pocket_side] pocket being fumbled with!" - // if looting id with gloves, do it quietly - this allows pickpocket gloves to take/place id stealthily - Bone White if(href_list["item"]) + if(isanimal(usr)) + return //animals cannot strip people + + if(frozen) + usr << "\red Do not attempt to strip frozen people." + return var/itemTarget = href_list["item"] if(itemTarget == "id") if(pickpocket) @@ -764,9 +771,6 @@ // Display a warning if the user mocks up src << "You feel your ID slot being fumbled with!" - - - if (href_list["refresh"]) if((machine)&&(in_range(src, usr))) show_inv(machine) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index d1e7c798ae9..5b645a55fb0 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -105,16 +105,19 @@ if(M.zone_sel && M.zone_sel.selecting == "head" && src != M) if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining) if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH))) - M << "\red Remove their mask!" + M << "Remove their mask!" return 0 if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH))) - M << "\red Remove your mask!" + M << "Remove your mask!" return 0 if(mind && mind.vampire && (mind in ticker.mode.vampires)) - M << "\red Your fangs fail to pierce [src.name]'s cold flesh" + M << "Your fangs fail to pierce [src.name]'s cold flesh" return 0 if(SKELETON in mutations) - M << "\red There is no blood in a skeleton!" + M << "There is no blood in a skeleton!" + return 0 + if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not. + M << "Blood from a monkey is useless!" return 0 //we're good to suck the blood, blaah M.handle_bloodsucking(src) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 57a56dd84cf..036dcc78803 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -232,9 +232,9 @@ emp_act --src.meatleft user << "\red You hack off a chunk of meat from [src.name]" if(!src.meatleft) - src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by [user]/[user.ckey]" - user.attack_log += "\[[time_stamp()]\] Chopped up [src]/[src.ckey] into meat" - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] chopped up [src] ([src.ckey]) into meat (JMP)") + src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by [key_name(user)]" + user.attack_log += "\[[time_stamp()]\] Chopped up [key_name(src)] into meat" + msg_admin_attack("[key_name_admin(user)] chopped up [key_name_admin(src)] into meat") if(!iscarbon(user)) LAssailant = null else @@ -387,12 +387,11 @@ emp_act if(ismob(O.thrower)) var/mob/M = O.thrower - var/client/assailant = M.client - if(assailant) - src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [M.name] ([assailant.ckey])") - M.attack_log += text("\[[time_stamp()]\] Hit [src.name] ([src.ckey]) with a thrown [O]") + if(M) + src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)]") + M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O]") if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey])[isAntag(M) ? "(ANTAG)" : ""] (JMP)") + msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]") //thrown weapon embedded object code. if(dtype == BRUTE && istype(O,/obj/item)) @@ -490,8 +489,11 @@ emp_act M.occupant_message("You hit [src].") visible_message("[src] has been hit by [M.name].", \ "[src] has been hit by [M.name].") - add_logs(M.occupant, src, "attacked", object=M, addition="(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") + attack_log += text("\[[time_stamp()]\] Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])") + M.occupant.attack_log += text("\[[time_stamp()]\] Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])") + msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])") + else ..() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 39e0f052f2b..bc10d54b1c8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -29,8 +29,8 @@ var/age = 30 //Player's age (pure fluff) var/b_type = "A+" //Player's bloodtype - var/underwear = 1 //Which underwear the player wants - var/undershirt = 0 //Which undershirt the player wants. + var/underwear = "Nude" //Which underwear the player wants + var/undershirt = "Nude" //Which undershirt the player wants. var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack. //Equipment slots diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 538a1dbbf50..d0bdd400068 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -190,7 +190,7 @@ //These only pertain to common. Languages are handled by mob/say_understands() if (!speaking) - if (istype(other, /mob/living/carbon/primitive/diona)) + if (istype(other, /mob/living/simple_animal/diona)) if(other.languages.len >= 2) //They've sucked down some blood and can speak common now. return 1 if (istype(other, /mob/living/silicon)) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 0adf8163793..6f1fd285e20 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -406,7 +406,7 @@ ) /datum/species/diona/can_understand(var/mob/other) - var/mob/living/carbon/primitive/diona/D = other + var/mob/living/simple_animal/diona/D = other if(istype(D)) return 1 return 0 @@ -419,14 +419,14 @@ /* //overpowered and dumb as hell; they get cloning back, though. /datum/species/diona/handle_death(var/mob/living/carbon/human/H) - var/mob/living/carbon/primitive/diona/S = new(get_turf(H)) + var/mob/living/simple_animal/diona/S = new(get_turf(H)) if(H.mind) H.mind.transfer_to(S) else S.key = H.key - for(var/mob/living/carbon/primitive/diona/D in H.contents) + for(var/mob/living/simple_animal/diona/D in H.contents) if(D.client) D.loc = H.loc else @@ -498,4 +498,4 @@ H.h_style = "" spawn(100) if(H) H.update_hair() - \ No newline at end of file + diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index db0a0cfa0d1..2e7a5e2be23 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -318,10 +318,14 @@ var/global/list/damage_icon_parts = list() //Underwear if(underwear && species.flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY) + var/datum/sprite_accessory/underwear/U = underwear_list[underwear] + if(U) + stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) if(undershirt && species.flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "undershirt[undershirt]_s"), ICON_OVERLAY) + var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] + if(U2) + stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) if(update_icons) update_icons() diff --git a/code/modules/mob/living/carbon/primitive/emote.dm b/code/modules/mob/living/carbon/primitive/emote.dm deleted file mode 100644 index 970c4664afc..00000000000 --- a/code/modules/mob/living/carbon/primitive/emote.dm +++ /dev/null @@ -1,182 +0,0 @@ -/mob/living/carbon/primitive/emote(var/act,var/m_type=1,var/message = null) - - var/param = null - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - var/muzzled = is_muzzled() - - //Emote Cooldown System (it's so simple!) - // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] - var/on_CD = 0 - switch(act) - //Cooldown-inducing emotes - if("chirp") - if(istype(src,/mob/living/carbon/primitive/diona)) //Only Diona Nymphs can chirp - on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - else //Everyone else fails, skip the emote attempt - return - if("flip") - on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - //Everything else, including typos of the above emotes - else - on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - - if(on_CD == 1) // Check if we need to suppress the emote attempt. - return // Suppress emote, you're still cooling off. - //--FalseIncarnate - - switch(act) - if ("me") - if(silent) - return - if (src.client) - if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - if (stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - - - if ("custom") - return custom_emote(m_type, message) - - if ("chirp") - message = "The [src.name] chirps!" - playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0) - m_type = 2 - if("sign") - if (!src.restrained()) - message = text("The [src.name] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) - m_type = 1 - if("scratch") - if (!src.restrained()) - message = "The [src.name] scratches." - m_type = 1 - if("whimper") - if (!muzzled) - message = "The [src.name] whimpers." - m_type = 2 - if("roar") - if (!muzzled) - message = "The [src.name] roars." - m_type = 2 - if("tail") - message = "The [src.name] waves his tail." - m_type = 1 - if("gasp") - message = "The [src.name] gasps." - m_type = 2 - if("shiver") - message = "The [src.name] shivers." - m_type = 2 - if("drool") - message = "The [src.name] drools." - m_type = 1 - if("paw") - if (!src.restrained()) - message = "The [src.name] flails his paw." - m_type = 1 - if("scretch") - if (!muzzled) - message = "The [src.name] scretches." - m_type = 2 - if("choke") - message = "The [src.name] chokes." - m_type = 2 - if("moan") - message = "The [src.name] moans!" - m_type = 2 - if("nod") - message = "The [src.name] nods his head." - m_type = 1 - if("sit") - message = "The [src.name] sits down." - m_type = 1 - if("sway") - message = "The [src.name] sways around dizzily." - m_type = 1 - if("sulk") - message = "The [src.name] sulks down sadly." - m_type = 1 - if("twitch") - message = "The [src.name] twitches violently." - m_type = 1 - if("dance") - if (!src.restrained()) - message = "The [src.name] dances around happily." - m_type = 1 - if("roll") - if (!src.restrained()) - message = "The [src.name] rolls." - m_type = 1 - if("shake") - message = "The [src.name] shakes his head." - m_type = 1 - if("gnarl") - if (!muzzled) - message = "The [src.name] gnarls and shows his teeth.." - m_type = 2 - if("jump") - message = "The [src.name] jumps!" - m_type = 1 - if("collapse") - Paralyse(2) - message = "[src.name] collapses!" - m_type = 2 - if("deathgasp") - message = "The [src.name] lets out a faint chimper as it collapses and stops moving..." - m_type = 1 - if ("flip") - m_type = 1 - if (!src.restrained()) - var/M = null - if (param) - for (var/mob/A in view(1, null)) - if (param == A.name) - M = A - break - if (M == src) - M = null - if (M) - if(src.lying || src.weakened) - message = "[src] flops and flails around on the floor." - else - message = "[src] flips in [M]'s general direction." - src.SpinAnimation(5,1) - else - if(src.lying || src.weakened) - message = "[src] flops and flails around on the floor." - else - message = "[src] does a flip!" - src.SpinAnimation(5,1) - if("help") - var/text = "choke, " - if(istype(src,/mob/living/carbon/primitive/diona)) - text += "chirp, " - text += "flip, collapse, dance, deathgasp, drool, gasp, shiver, gnarl, jump, paw, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper" - src << text - else - src << text("Invalid Emote: []", act) - if ((message && src.stat == 0)) - if(src.client) - log_emote("[name]/[key] : [message]") - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - //Foreach goto(703) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) - //Foreach goto(746) - return \ No newline at end of file diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5c94d8d5dbd..d1017431eb8 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -115,12 +115,11 @@ if(ismob(O.thrower)) var/mob/M = O.thrower - var/client/assailant = M.client - if(assailant) - src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [M.name] ([assailant.ckey])") - M.attack_log += text("\[[time_stamp()]\] Hit [src.name] ([src.ckey]) with a thrown [O]") + if(M) + src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)]") + M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O]") if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey])[isAntag(M) ? "(ANTAG)" : ""] (JMP)") + msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]") // Begin BS12 momentum-transfer code. if(O.throw_source && speed >= 15) @@ -166,13 +165,16 @@ M.occupant_message("You hit [src].") visible_message("[src] has been hit by [M.name].", \ "[src] has been hit by [M.name].") - add_logs(M.occupant, src, "attacked", object=M, addition="(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") + attack_log += text("\[[time_stamp()]\] Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])") + M.occupant.attack_log += text("\[[time_stamp()]\] Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])") + msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])") + else + step_away(src,M) add_logs(M.occupant, src, "pushed", object=M, admin=0) M.occupant_message("You push [src] out of the way.") visible_message("[M] pushes [src] out of the way.") - return //Mobs on Fire diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 7c78b5ce604..714e9523feb 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -242,6 +242,7 @@ var/list/ai_verbs_default = list( powered_ai = ai if(isnull(powered_ai)) qdel(src) + return loc = powered_ai.loc use_power(1) // Just incase we need to wake up the power system. @@ -251,6 +252,7 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply/process() if(!powered_ai || powered_ai.stat & DEAD) qdel(src) + return if(!powered_ai.anchored) loc = powered_ai.loc use_power = 0 @@ -329,20 +331,21 @@ var/list/ai_verbs_default = list( set name = "Call Emergency Shuttle" set category = "AI Commands" - if(src.stat == 2) - src << "You can't call the shuttle because you are dead!" + if(src.stat == DEAD) + src << "You can't call the shuttle because you are dead!" return if(check_unable(AI_CHECK_WIRELESS)) return - var/confirm = alert("Are you sure you want to call the shuttle?", "Confirm Shuttle Call", "Yes", "No") + var/input = input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null + if(!input || stat) + return if(check_unable(AI_CHECK_WIRELESS)) return - if(confirm == "Yes") - call_shuttle_proc(src) + call_shuttle_proc(src, input) // hack to display shuttle timer if(emergency_shuttle.online()) diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 14a3733154d..9cba0094d4d 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -369,6 +369,8 @@ /mob/living/silicon/pai/proc/hackloop() var/turf/T = get_turf_or_move(src.loc) for(var/mob/living/silicon/ai/AI in player_list) + if(!T || !(T.z in config.contact_levels)) + break if(T.loc) AI << "Network Alert: Brute-force encryption crack in progress in [T.loc]." else diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 1b5c2df4cff..da2157f44bc 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -12,6 +12,7 @@ if(!O) return 0 + O.mouse_opacity = 2 if(istype(O,/obj/item/borg/sight)) var/obj/item/borg/sight/S = O sight_mode &= ~S.sight_mode @@ -44,6 +45,7 @@ src << "Already activated" return if(!module_state_1) + O.mouse_opacity = initial(O.mouse_opacity) module_state_1 = O O.layer = 20 O.screen_loc = inv1.screen_loc @@ -51,6 +53,7 @@ if(istype(module_state_1,/obj/item/borg/sight)) sight_mode |= module_state_1:sight_mode else if(!module_state_2) + O.mouse_opacity = initial(O.mouse_opacity) module_state_2 = O O.layer = 20 O.screen_loc = inv2.screen_loc @@ -58,6 +61,7 @@ if(istype(module_state_2,/obj/item/borg/sight)) sight_mode |= module_state_2:sight_mode else if(!module_state_3) + O.mouse_opacity = initial(O.mouse_opacity) module_state_3 = O O.layer = 20 O.screen_loc = inv3.screen_loc diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 9128fa216a5..4ff0c7f0425 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -30,6 +30,15 @@ src.modules += new /obj/item/device/flash/cyborg(src) src.emag = new /obj/item/toy/sword(src) src.emag.name = "Placeholder Emag Item" + + +/obj/item/weapon/robot_module/proc/fix_modules() + for(var/obj/item/I in modules) + I.flags |= NODROP + I.mouse_opacity = 2 + if(emag) + emag.flags |= NODROP + emag.mouse_opacity = 2 /obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R) if(!stacktypes || !stacktypes.len) return @@ -85,15 +94,16 @@ name = "standard robot module" - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/weapon/melee/baton/loaded(src) - src.modules += new /obj/item/weapon/extinguisher(src) - src.modules += new /obj/item/weapon/wrench(src) - src.modules += new /obj/item/weapon/crowbar(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.emag = new /obj/item/weapon/melee/energy/sword/cyborg(src) - return +/obj/item/weapon/robot_module/standard/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/weapon/melee/baton/loaded(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.emag = new /obj/item/weapon/melee/energy/sword/cyborg(src) + + fix_modules() /obj/item/weapon/robot_module/medical name = "medical robot module" @@ -105,36 +115,37 @@ /obj/item/stack/nanopaste = 5 ) - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/device/healthanalyzer/advanced(src) - src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/weapon/borg_defib(src) - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/weapon/reagent_containers/dropper(src) - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) - src.modules += new /obj/item/stack/medical/advanced/ointment(src) - src.modules += new /obj/item/stack/medical/splint(src) - src.modules += new /obj/item/stack/nanopaste(src) - src.modules += new /obj/item/weapon/scalpel(src) - src.modules += new /obj/item/weapon/hemostat(src) - src.modules += new /obj/item/weapon/retractor(src) - src.modules += new /obj/item/weapon/cautery(src) - src.modules += new /obj/item/weapon/bonegel(src) - src.modules += new /obj/item/weapon/FixOVein(src) - src.modules += new /obj/item/weapon/bonesetter(src) - src.modules += new /obj/item/weapon/circular_saw(src) - src.modules += new /obj/item/weapon/surgicaldrill(src) +/obj/item/weapon/robot_module/medical/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/device/healthanalyzer/advanced(src) + src.modules += new /obj/item/device/reagent_scanner/adv(src) + src.modules += new /obj/item/weapon/borg_defib(src) + src.modules += new /obj/item/roller_holder(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + src.modules += new /obj/item/weapon/reagent_containers/dropper(src) + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) + src.modules += new /obj/item/stack/medical/advanced/ointment(src) + src.modules += new /obj/item/stack/medical/splint(src) + src.modules += new /obj/item/stack/nanopaste(src) + src.modules += new /obj/item/weapon/scalpel(src) + src.modules += new /obj/item/weapon/hemostat(src) + src.modules += new /obj/item/weapon/retractor(src) + src.modules += new /obj/item/weapon/cautery(src) + src.modules += new /obj/item/weapon/bonegel(src) + src.modules += new /obj/item/weapon/FixOVein(src) + src.modules += new /obj/item/weapon/bonesetter(src) + src.modules += new /obj/item/weapon/circular_saw(src) + src.modules += new /obj/item/weapon/surgicaldrill(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) - src.emag.reagents.add_reagent("facid", 250) - src.emag.name = "Polyacid spray" - return + src.emag.reagents.add_reagent("facid", 250) + src.emag.name = "Polyacid spray" + + fix_modules() /obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R) if(src.emag) @@ -155,115 +166,113 @@ /obj/item/stack/tile/plasteel = 15 ) - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/rcd/borg(src) - src.modules += new /obj/item/weapon/extinguisher(src) - src.modules += new /obj/item/weapon/weldingtool/largetank(src) - src.modules += new /obj/item/weapon/screwdriver(src) - src.modules += new /obj/item/weapon/wrench(src) - src.modules += new /obj/item/weapon/crowbar(src) - src.modules += new /obj/item/weapon/wirecutters(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/device/t_scanner(src) - src.modules += new /obj/item/device/analyzer(src) - src.modules += new /obj/item/taperoll/engineering(src) - src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/weapon/matter_decompiler(src) +/obj/item/weapon/robot_module/engineering/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/weapon/weldingtool/largetank(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/weapon/wirecutters(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/device/t_scanner(src) + src.modules += new /obj/item/device/analyzer(src) + src.modules += new /obj/item/taperoll/engineering(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/weapon/matter_decompiler(src) - src.emag = new /obj/item/borg/stun(src) + src.emag = new /obj/item/borg/stun(src) - var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) - M.amount = 50 - src.modules += M + var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) + M.amount = 50 + src.modules += M - var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src) - R.amount = 50 - src.modules += R + var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src) + R.amount = 50 + src.modules += R - var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src) - G.amount = 50 - src.modules += G + var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src) + G.amount = 50 + src.modules += G - var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src) - W.amount = 50 - src.modules += W + var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src) + W.amount = 50 + src.modules += W - var/obj/item/stack/rods/Q = new /obj/item/stack/rods(src) - Q.amount = 15 - src.modules += Q + var/obj/item/stack/rods/Q = new /obj/item/stack/rods(src) + Q.amount = 15 + src.modules += Q - var/obj/item/stack/tile/plasteel/F = new /obj/item/stack/tile/plasteel(src) //floor tiles not regular plasteel, calm down - F.amount = 15 - src.modules += F + var/obj/item/stack/tile/plasteel/F = new /obj/item/stack/tile/plasteel(src) //floor tiles not regular plasteel, calm down + F.amount = 15 + src.modules += F - return + fix_modules() /obj/item/weapon/robot_module/security name = "security robot module" subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) - - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src) - src.modules += new /obj/item/weapon/melee/baton/loaded/robot(src) - src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src) - src.modules += new /obj/item/taperoll/police(src) - src.modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src) - src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) - return +/obj/item/weapon/robot_module/security/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src) + src.modules += new /obj/item/weapon/melee/baton/loaded/robot(src) + src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src) + src.modules += new /obj/item/taperoll/police(src) + src.modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src) + src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) + + fix_modules() /obj/item/weapon/robot_module/janitor name = "janitorial robot module" +/obj/item/weapon/robot_module/janitor/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/weapon/soap/nanotrasen(src) + src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src) + src.modules += new /obj/item/weapon/mop(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/weapon/holosign_creator(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/weapon/soap/nanotrasen(src) - src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src) - src.modules += new /obj/item/weapon/mop(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/weapon/holosign_creator(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - - src.emag.reagents.add_reagent("lube", 250) - src.emag.name = "Lube spray" - return - - + src.emag.reagents.add_reagent("lube", 250) + src.emag.name = "Lube spray" + + fix_modules() /obj/item/weapon/robot_module/butler name = "service robot module" +/obj/item/weapon/robot_module/butler/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) + src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) + src.modules += new /obj/item/weapon/pen(src) + src.modules += new /obj/item/weapon/razor(src) + src.modules += new /obj/item/device/violin(src) + src.modules += new /obj/item/device/guitar(src) - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) - src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) - src.modules += new /obj/item/weapon/pen(src) - src.modules += new /obj/item/weapon/razor(src) - src.modules += new /obj/item/device/violin(src) - src.modules += new /obj/item/device/guitar(src) + var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) + M.matter = 30 + src.modules += M - var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) - M.matter = 30 - src.modules += M + src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) + src.modules += new /obj/item/weapon/lighter/zippo(src) + src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src) + src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src) + src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) - src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) - src.modules += new /obj/item/weapon/lighter/zippo(src) - src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src) - src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src) - src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) - - var/datum/reagents/R = new/datum/reagents(50) - src.emag.reagents = R - R.my_atom = src.emag - R.add_reagent("beer2", 50) - src.emag.name = "Mickey Finn's Special Brew" - return + var/datum/reagents/R = new/datum/reagents(50) + src.emag.reagents = R + R.my_atom = src.emag + R.add_reagent("beer2", 50) + src.emag.name = "Mickey Finn's Special Brew" + + fix_modules() /obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R) var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules @@ -307,19 +316,19 @@ /obj/item/weapon/robot_module/miner name = "miner robot module" - - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/wrench(src) - src.modules += new /obj/item/weapon/screwdriver(src) - src.modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src) - src.modules += new /obj/item/weapon/storage/bag/ore/cyborg(src) - src.modules += new /obj/item/weapon/pickaxe/drill/cyborg(src) - src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) - src.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src) - src.emag = new /obj/item/borg/stun(src) - return +/obj/item/weapon/robot_module/miner/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src) + src.modules += new /obj/item/weapon/storage/bag/ore/cyborg(src) + src.modules += new /obj/item/weapon/pickaxe/drill/cyborg(src) + src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) + src.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src) + src.emag = new /obj/item/borg/stun(src) + + fix_modules() /obj/item/weapon/robot_module/deathsquad name = "NT advanced combat module" @@ -332,7 +341,8 @@ src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src) src.modules += new /obj/item/weapon/crowbar(src) src.emag = null - return + + fix_modules() /obj/item/weapon/robot_module/syndicate name = "syndicate robot module" @@ -347,38 +357,42 @@ src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/weapon/pinpointer/operative(src) src.emag = null - return + + fix_modules() /obj/item/weapon/robot_module/combat name = "combat robot module" - New() - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/borg/sight/thermal(src) - src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src) - src.modules += new /obj/item/weapon/gun/energy/plasmacutter(src) - src.modules += new /obj/item/borg/combat/shield(src) - src.modules += new /obj/item/borg/combat/mobility(src) - src.modules += new /obj/item/weapon/wrench(src) //Is a combat android really going to be stopped by a chair? - src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src) - return +/obj/item/weapon/robot_module/combat/New() + src.modules += new /obj/item/device/flash/cyborg(src) + src.modules += new /obj/item/borg/sight/thermal(src) + src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src) + src.modules += new /obj/item/weapon/gun/energy/plasmacutter(src) + src.modules += new /obj/item/borg/combat/shield(src) + src.modules += new /obj/item/borg/combat/mobility(src) + src.modules += new /obj/item/weapon/wrench(src) //Is a combat android really going to be stopped by a chair? + src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src) + + fix_modules() /obj/item/weapon/robot_module/alien/hunter name = "alien hunter module" - New() - src.modules += new /obj/item/weapon/melee/energy/alien/claws(src) - src.modules += new /obj/item/device/flash/cyborg/alien(src) - src.modules += new /obj/item/borg/sight/thermal/alien(src) - var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src) - S.reagents.add_reagent("ether",250) //nerfed to sleeptoxin to make it less instant drop. - src.modules += S - var/obj/item/weapon/reagent_containers/spray/alien/smoke/A = new /obj/item/weapon/reagent_containers/spray/alien/smoke(src) - S.reagents.add_reagent("water",50) //Water is used as a dummy reagent for the smoke bombs. More of an ammo counter. - src.modules += A - src.emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src) - src.emag.reagents.add_reagent("facid", 125) - src.emag.reagents.add_reagent("sacid", 125) +/obj/item/weapon/robot_module/alien/hunter/New() + src.modules += new /obj/item/weapon/melee/energy/alien/claws(src) + src.modules += new /obj/item/device/flash/cyborg/alien(src) + src.modules += new /obj/item/borg/sight/thermal/alien(src) + var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src) + S.reagents.add_reagent("ether",250) //nerfed to sleeptoxin to make it less instant drop. + src.modules += S + var/obj/item/weapon/reagent_containers/spray/alien/smoke/A = new /obj/item/weapon/reagent_containers/spray/alien/smoke(src) + S.reagents.add_reagent("water",50) //Water is used as a dummy reagent for the smoke bombs. More of an ammo counter. + src.modules += A + src.emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src) + src.emag.reagents.add_reagent("facid", 125) + src.emag.reagents.add_reagent("sacid", 125) + + fix_modules() /obj/item/weapon/robot_module/alien/hunter/add_languages(var/mob/living/silicon/robot/R) ..() @@ -398,27 +412,27 @@ /obj/item/stack/cable_coil/cyborg = 30 ) - New() - src.modules += new /obj/item/weapon/weldingtool(src) - src.modules += new /obj/item/weapon/screwdriver(src) - src.modules += new /obj/item/weapon/wrench(src) - src.modules += new /obj/item/weapon/crowbar(src) - src.modules += new /obj/item/weapon/wirecutters(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/weapon/matter_decompiler(src) - src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src) - src.modules += new /obj/item/weapon/soap(src) +/obj/item/weapon/robot_module/drone/New() + src.modules += new /obj/item/weapon/weldingtool(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/weapon/wirecutters(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/weapon/matter_decompiler(src) + src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src) + src.modules += new /obj/item/weapon/soap(src) - src.emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src) + src.emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src) - for(var/T in stacktypes) - var/obj/item/stack/sheet/W = new T(src) - W.amount = stacktypes[T] - src.modules += W + for(var/T in stacktypes) + var/obj/item/stack/sheet/W = new T(src) + W.amount = stacktypes[T] + src.modules += W - return + fix_modules() /obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R) var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules diff --git a/code/modules/mob/living/silicon/robot/wires.dm b/code/modules/mob/living/silicon/robot/wires.dm index 51d416c7f5d..f197e49b02e 100644 --- a/code/modules/mob/living/silicon/robot/wires.dm +++ b/code/modules/mob/living/silicon/robot/wires.dm @@ -21,7 +21,7 @@ BorgIndexToWireColor[flagIndex] = colorIndex BorgWireColorToIndex[colorIndex] = flagIndex colorIndexList -= colorIndex // Shortens the list. - //world.log << "Flag: [flag], CIndex: [colorIndex], FIndex: [flagIndex]" + //log_to_dd("Flag: [flag], CIndex: [colorIndex], FIndex: [flagIndex]") flagIndex+=1 return Borgwires diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 8f032a3147f..775bef4859c 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -241,7 +241,7 @@ set desc = "Sets an extended description of your character's features." set category = "IC" - flavor_text = sanitize(copytext(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text, 1)) + flavor_text = sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text) /mob/living/silicon/binarycheck() return 1 diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index c08009c9f6d..8ab01f44ab1 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -196,8 +196,8 @@ src << "\red You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system." host << "\red You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours." var/borer_key = src.key - host.attack_log += text("\[[time_stamp()]\] [src.name] ([src.ckey]) has assumed control of [host.name] ([host.ckey])") - msg_admin_attack("[src.name] ([src.ckey]) has assumed control of [host.name] ([host.ckey]) (JMP)") + host.attack_log += text("\[[time_stamp()]\] [key_name(src)] has assumed control of [key_name(host)]") + msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]") // host -> brain var/h2b_id = host.computer_id var/h2b_ip= host.lastKnownIP diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 9f28be0cd90..e099f8b3e4d 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -25,6 +25,7 @@ minbodytemp = 0 faction = list("cult") flying = 1 + universal_speak = 1 var/list/construct_spells = list() /mob/living/simple_animal/construct/New() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9d05f1b6c0e..b13714ae552 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -5,6 +5,7 @@ icon_state = "cat2" icon_living = "cat2" icon_dead = "cat2_dead" + icon_resting = "cat_rest" gender = MALE speak = list("Meow!", "Esp!", "Purr!", "HSSSSS") speak_emote = list("purrs", "meows") @@ -76,6 +77,7 @@ icon_state = "kitten" icon_living = "kitten" icon_dead = "kitten_dead" + icon_resting = null gender = NEUTER density = 0 pass_flags = PASSMOB @@ -86,6 +88,7 @@ icon_state = "Syndicat" icon_living = "Syndicat" icon_dead = "Syndicat_dead" + icon_resting = "Syndicat_rest" gender = FEMALE flags = NO_BREATHE faction = list("syndicate") diff --git a/code/modules/mob/living/carbon/primitive/dionaold.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm similarity index 52% rename from code/modules/mob/living/carbon/primitive/dionaold.dm rename to code/modules/mob/living/simple_animal/friendly/diona.dm index c5a7b5a5b70..5a8b2618233 100644 --- a/code/modules/mob/living/carbon/primitive/dionaold.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -3,57 +3,73 @@ */ //Mob defines. -/mob/living/carbon/primitive/diona +/mob/living/simple_animal/diona name = "diona nymph" - voice_name = "diona nymph" - speak_emote = list("chirrups") icon = 'icons/mob/monkey.dmi' - icon_state = "nymph1" + icon_state = "nymph" + icon_living = "nymph" + icon_dead = "nymph_dead" + icon_resting = "nymph_sleep" + pass_flags = PASSTABLE + small = 1 + ventcrawler = 2 + + maxHealth = 50 + health = 50 + + voice_name = "diona nymph" + speak_emote = list("chirrups") + emote_hear = list("chirrups") + emote_see = list("chirrups") + + response_help = "pets" + response_disarm = "pushes" + response_harm = "kicks" + + melee_damage_lower = 5 + melee_damage_upper = 8 + attacktext = "bites" + attack_sound = 'sound/weapons/bite.ogg' + + speed = 0 + stop_automated_movement = 0 + turns_per_move = 4 + status_flags = 0 + var/list/donors = list() var/ready_evolve = 0 - ventcrawler = 1 - var/environment_smash = 0 // This is a sloppy way to solve attack_animal runtimes. Stupid nymphs... holder_type = /obj/item/weapon/holder/diona -/mob/living/carbon/primitive/diona/New() - +/mob/living/simple_animal/diona/New() ..() - gender = NEUTER - //greaterform = "Diona" + if(name == initial(name)) //To stop Pun-Pun becoming generic. + name = "[name] ([rand(1, 1000)])" + real_name = name + add_language("Rootspeak") + src.verbs += /mob/living/simple_animal/diona/proc/merge -/mob/living/carbon/primitive/diona/attack_hand(mob/living/carbon/human/M as mob) - +/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M as mob) //Let people pick the little buggers up. if(M.a_intent == "help") if(M.species && M.species.name == "Diona") M << "You feel your being twine with that of [src] as it merges with your biomass." src << "You feel your being twine with that of [M] as you merge with its biomass." - src.verbs += /mob/living/carbon/primitive/diona/proc/split - src.verbs -= /mob/living/carbon/primitive/diona/proc/merge + src.verbs += /mob/living/simple_animal/diona/proc/split + src.verbs -= /mob/living/simple_animal/diona/proc/merge src.forceMove(M) else get_scooped(M) ..() -/mob/living/carbon/primitive/diona/New() - - ..() - gender = NEUTER - //greaterform = "Diona" - add_language("Rootspeak") - src.verbs += /mob/living/carbon/primitive/diona/proc/merge - - -/mob/living/carbon/primitive/diona/proc/merge() - +/mob/living/simple_animal/diona/proc/merge() set category = "Diona" set name = "Merge with gestalt" set desc = "Merge with another diona." if(istype(src.loc,/mob/living/carbon)) - src.verbs -= /mob/living/carbon/primitive/diona/proc/merge + src.verbs -= /mob/living/simple_animal/diona/proc/merge return var/list/choices = list() @@ -76,19 +92,18 @@ src << "You feel your being twine with that of [M] as you merge with its biomass." src.loc = M - src.verbs += /mob/living/carbon/primitive/diona/proc/split - src.verbs -= /mob/living/carbon/primitive/diona/proc/merge + src.verbs += /mob/living/simple_animal/diona/proc/split + src.verbs -= /mob/living/simple_animal/diona/proc/merge else return -/mob/living/carbon/primitive/diona/proc/split() - +/mob/living/simple_animal/diona/proc/split() set category = "Diona" set name = "Split from gestalt" set desc = "Split away from your gestalt as a lone nymph." if(!(istype(src.loc,/mob/living/carbon))) - src.verbs -= /mob/living/carbon/primitive/diona/proc/split + src.verbs -= /mob/living/simple_animal/diona/proc/split return src.loc << "You feel a pang of loss as [src] splits away from your biomass." @@ -97,8 +112,8 @@ var/mob/living/M = src.loc src.loc = get_turf(src) - src.verbs -= /mob/living/carbon/primitive/diona/proc/split - src.verbs += /mob/living/carbon/primitive/diona/proc/merge + src.verbs -= /mob/living/simple_animal/diona/proc/split + src.verbs += /mob/living/simple_animal/diona/proc/merge if(istype(M)) for(var/atom/A in M.contents) @@ -106,8 +121,7 @@ return M.status_flags &= ~PASSEMOTES -/mob/living/carbon/primitive/diona/verb/fertilize_plant() - +/mob/living/simple_animal/diona/verb/fertilize_plant() set category = "Diona" set name = "Fertilize plant" set desc = "Turn your food into nutrients for plants." @@ -123,10 +137,9 @@ src.nutrition -= ((10-target.nutrilevel)*5) target.nutrilevel = 10 - src.visible_message("\red [src] secretes a trickle of green liquid from its tail, refilling [target]'s nutrient tray.","\red You secrete a trickle of green liquid from your tail, refilling [target]'s nutrient tray.") - -/mob/living/carbon/primitive/diona/verb/eat_weeds() + src.visible_message("[src] secretes a trickle of green liquid from its tail, refilling [target]'s nutrient tray.","\red You secrete a trickle of green liquid from your tail, refilling [target]'s nutrient tray.") +/mob/living/simple_animal/diona/verb/eat_weeds() set category = "Diona" set name = "Eat Weeds" set desc = "Clean the weeds out of soil or a hydroponics tray." @@ -142,24 +155,23 @@ src.nutrition += target.weedlevel * 15 target.weedlevel = 0 - src.visible_message("\red [src] begins rooting through [target], ripping out weeds and eating them noisily.","\red You begin rooting through [target], ripping out weeds and eating them noisily.") - -/mob/living/carbon/primitive/diona/verb/evolve() + src.visible_message("[src] begins rooting through [target], ripping out weeds and eating them noisily.","You begin rooting through [target], ripping out weeds and eating them noisily.") +/mob/living/simple_animal/diona/verb/evolve() set category = "Diona" set name = "Evolve" set desc = "Grow to a more complex form." if(donors.len < 5) - src << "You need more blood in order to ascend to a new state of consciousness..." + src << "You need more blood in order to ascend to a new state of consciousness..." return if(nutrition < 500) - src << "You need to binge on weeds in order to have the energy to grow..." + src << "You need to binge on weeds in order to have the energy to grow..." return src.split() - src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") + src.visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") var/mob/living/carbon/human/diona/adult = new(get_turf(src.loc)) adult.set_species("Diona") @@ -184,7 +196,7 @@ qdel(src) -/mob/living/carbon/primitive/diona/verb/steal_blood() +/mob/living/simple_animal/diona/verb/steal_blood() set category = "Diona" set name = "Steal Blood" set desc = "Take a blood sample from a suitable donor." @@ -198,14 +210,14 @@ if(!M || !src) return if(M.species.flags & NO_BLOOD) - src << "\red That donor has no blood to take." + src << "That donor has no blood to take." return if(donors.Find(M.real_name)) - src << "\red That donor offers you nothing new." + src << "That donor offers you nothing new." return - src.visible_message("\red [src] flicks out a feeler and neatly steals a sample of [M]'s blood.","\red You flick out a feeler and neatly steal a sample of [M]'s blood.") + src.visible_message("[src] flicks out a feeler and neatly steals a sample of [M]'s blood.","You flick out a feeler and neatly steal a sample of [M]'s blood.") donors += M.real_name for(var/datum/language/L in M.languages) if(!(L.flags & HIVEMIND)) @@ -214,36 +226,37 @@ spawn(25) update_progression() -/mob/living/carbon/primitive/diona/proc/update_progression() - +/mob/living/simple_animal/diona/proc/update_progression() if(!donors.len) return if(donors.len == 5) ready_evolve = 1 - src << "\green You feel ready to move on to your next stage of growth." + src << "You feel ready to move on to your next stage of growth." else if(donors.len == 3) universal_understand = 1 - src << "\green You feel your awareness expand, and realize you know how to understand the creatures around you." + src << "You feel your awareness expand, and realize you know how to understand the creatures around you." else - src << "\green The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind." + src << "The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind." -/mob/living/carbon/primitive/diona/put_in_hands(obj/item/W) +/mob/living/simple_animal/diona/put_in_hands(obj/item/W) W.loc = get_turf(src) W.layer = initial(W.layer) W.dropped() -/mob/living/carbon/primitive/diona/put_in_active_hand(obj/item/W) - src << "\red You don't have any hands!" +/mob/living/simple_animal/diona/put_in_active_hand(obj/item/W) + src << "You don't have any hands!" return + -/mob/living/carbon/primitive/diona/say(var/message) +/mob/living/simple_animal/diona/say(var/message) if(client) if(client.prefs.muted & MUTE_IC) src << "\red You cannot speak in IC (Muted)." return + var/verb message = trim_strip_html_properly(message) if(stat) @@ -257,5 +270,22 @@ if(copytext(message,1,2) == "*") return emote(copytext(message,2)) + + //parse the language code and consume it + var/datum/language/speaking = parse_language(message) + if(speaking) + message = copytext(message,2+length(speaking.key)) + else + speaking = get_default_language() - ..(message) + var/ending = copytext(message, length(message)) + if (speaking) + // This is broadcast to all mobs with the language, + // irrespective of distance or anything else. + if(speaking.flags & HIVEMIND) + speaking.broadcast(src,trim(message)) + return + //If we've gotten this far, keep going! + verb = speaking.get_spoken_verb(ending) + + ..(message,speaking,verb) diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 136c24ad615..38d79141803 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -30,5 +30,6 @@ icon_state = "Syndifox" icon_living = "Syndifox" icon_dead = "Syndifox_dead" + icon_resting = "Syndifox_rest" flags = NO_BREATHE faction = list("syndicate") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 85645d08a90..7fd2dba5c90 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -8,6 +8,7 @@ var/icon_living = "" var/icon_dead = "" + var/icon_resting = "" var/icon_gib = null //We only try to show a gibbing animation if this exists. var/oxygen_alert = 0 @@ -86,6 +87,10 @@ return /mob/living/simple_animal/Life() + if(paralysis || stunned || weakened || buckled || resting) + canmove = 0 + else + canmove = 1 //Health if(stat == DEAD) @@ -97,12 +102,16 @@ density = 1 return 0 - if(health < 1) Die() if(health > maxHealth) health = maxHealth + + if(resting && icon_resting && stat != DEAD) + icon_state = icon_resting + else if(icon_resting && stat != DEAD) + icon_state = icon_living if(sleeping) sleeping = max(sleeping-1, 0) @@ -548,7 +557,7 @@ gib() return -/mob/living/simple_animal/say(var/message) +/mob/living/simple_animal/say(var/message,var/datum/language/speaking,var/verb) if(stat) return @@ -558,11 +567,11 @@ if(stat) return - var/verb = "says" + verb = "says" if(speak_emote.len) verb = pick(speak_emote) message = capitalize(trim_left(message)) - ..(message, null, verb) + ..(message, speaking, verb) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 39a1fb53631..e72157aedfb 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -45,6 +45,9 @@ client.perspective = MOB_PERSPECTIVE + if(ckey in deadmins) + verbs += /client/proc/readmin + //Clear ability list and update from mob. client.verbs -= ability_verbs @@ -57,27 +60,3 @@ client.verbs |= H.species.abilities CallHook("Login", list("client" = src.client, "mob" = src)) - - //Update morgues on login/logout - if (stat == DEAD) - var/obj/structure/morgue/Morgue = null - var/mob/living/carbon/human/C = null - if (istype(src,/mob/dead/observer)) //We're a ghost, let's find our corpse - var/mob/dead/observer/G = src - if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control. - return - if (G.can_reenter_corpse && G.mind.current) - C = G.mind.current - else if (istype(src,/mob/living/carbon/human)) - C = src - - if (C) //We found our corpse, is it inside a morgue? - if (istype(C.loc,/obj/structure/morgue)) - Morgue = C.loc - else if (istype(C.loc,/obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = C.loc - if (istype(B.loc,/obj/structure/morgue)) - Morgue = B.loc - if (Morgue) - Morgue.update() - diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index 36df2619e38..8be55390b17 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -10,28 +10,7 @@ if(admins_number == 0) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. send2adminirc("[key_name(src)] logged out - no more admins online.") ..() - - //Update morgues on login/logout - if (stat == DEAD) - var/obj/structure/morgue/Morgue = null - var/mob/living/carbon/human/C = null - if (istype(src,/mob/dead/observer)) //We're a ghost, let's find our corpse - var/mob/dead/observer/G = src - if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control. - return 1 - if (G.can_reenter_corpse && G.mind.current) - C = G.mind.current - else if (istype(src,/mob/living/carbon/human)) - C = src - - if (C) //We found our corpse, is it inside a morgue? - if (istype(C.loc,/obj/structure/morgue)) - Morgue = C.loc - else if (istype(C.loc,/obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = C.loc - if (istype(B.loc,/obj/structure/morgue)) - Morgue = B.loc - if (Morgue) - Morgue.update() - + + CallHook("Logout", list("client" = src.client, "mob" = src)) + return 1 \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2b94fdae71c..9cd4cb9b25f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -605,7 +605,7 @@ var/list/slot_equipment_priority = list( \ if(lentext(msg) <= 40) return "\blue [msg]" else - return "\blue [copytext(msg, 1, 37)]... More..." + return "\blue [copytext_preserve_html(msg, 1, 37)]... More..." /mob/proc/is_dead() return stat == DEAD diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 4257d29b1fb..dc13bd8c00a 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -406,7 +406,7 @@ if(isalien(attacker) && iscarbon(prey)) //Xenomorphs eating carbon mobs return 1 - if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/primitive/diona)) //Kidan eating nymphs + if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/simple_animal/diona)) //Kidan eating nymphs return 1 if(ishuman(attacker) && attacker.get_species() == "Tajaran" && istype(prey,/mob/living/simple_animal/mouse)) //Tajaran eating mice. Meow! diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ef3c88fe5cb..a67a2eed0d9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -480,7 +480,7 @@ var/list/intents = list("help","disarm","grab","harm") name = realname for(var/mob/M in player_list) - if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && (M.client.holder.rights & R_MOD))) && (M.client.prefs.toggles & CHAT_DEAD)) + if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || check_rights(R_MOD,0)) && (M.client.prefs.toggles & CHAT_DEAD)) var/follow var/lname if(subject) @@ -491,7 +491,7 @@ var/list/intents = list("help","disarm","grab","harm") var/mob/dead/observer/DM if(istype(subject, /mob/dead/observer)) DM = subject - if(M.client.holder) // What admins see + if(check_rights(R_MOD,0)) // What admins see lname = "[keyname][(DM && DM.anonsay) ? "*" : (DM ? "" : "^")] ([name])" else if(DM && DM.anonsay) // If the person is actually observer they have the option to be anonymous diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 53946a3eb1d..8c8e10493dc 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -30,6 +30,8 @@ CallHook("Login", list("client" = src.client, "mob" = src)) new_player_panel() + if(ckey in deadmins) + verbs += /client/proc/readmin spawn(40) if(client) handle_privacy_poll() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 15456b3fa7c..cdbf376e97f 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -43,7 +43,7 @@ var/isadmin = 0 if(src.client && src.client.holder) isadmin = 1 - var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM erro_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM erro_poll_textreply WHERE ckey = \"[ckey]\")") + var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")") query.Execute() var/newpoll = 0 while(query.NextRow()) @@ -178,7 +178,7 @@ var/voted = 0 //First check if the person has not voted yet. - var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'") + var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("privacy")] WHERE ckey='[src.ckey]'") query.Execute() while(query.NextRow()) voted = 1 @@ -203,7 +203,7 @@ return if(!voted) - var/sql = "INSERT INTO erro_privacy VALUES (null, Now(), '[src.ckey]', '[option]')" + var/sql = "INSERT INTO [format_table_name("privacy")] VALUES (null, Now(), '[src.ckey]', '[option]')" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() usr << "Thank you for your vote!" @@ -468,11 +468,9 @@ if(is_alien_whitelisted(src, client.prefs.language) || !config.usealienwhitelist || !(chosen_language.flags & WHITELISTED)) new_character.add_language(client.prefs.language) if(ticker.random_players || appearance_isbanned(new_character)) - new_character.gender = pick(MALE, FEMALE) + client.prefs.random_character() client.prefs.real_name = random_name(new_character.gender) - client.prefs.randomize_appearance_for(new_character) - else - client.prefs.copy_to(new_character) + client.prefs.copy_to(new_character) src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index 884b7ffc4ee..4786537d36b 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -5,7 +5,7 @@ return var/voted = 0 - var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'") + var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("privacy")] WHERE ckey='[src.ckey]'") query.Execute() while(query.NextRow()) voted = 1 @@ -53,7 +53,7 @@ if(src.client && src.client.holder) isadmin = 1 - var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime") + var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime") select_query.Execute() var/output = "
Player polls" @@ -84,7 +84,7 @@ establish_db_connection() if(dbcon.IsConnected()) - var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM erro_poll_question WHERE id = [pollid]") + var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]") select_query.Execute() var/pollstarttime = "" @@ -109,7 +109,7 @@ switch(polltype) //Polls that have enumerated options if("OPTION") - var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") + var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") voted_query.Execute() var/voted = 0 @@ -121,7 +121,7 @@ var/list/datum/polloption/options = list() - var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]") + var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") options_query.Execute() while(options_query.NextRow()) var/datum/polloption/PO = new() @@ -162,7 +162,7 @@ //Polls with a text input if("TEXT") - var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") + var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") voted_query.Execute() var/voted = 0 @@ -204,7 +204,7 @@ //Polls with a text input if("NUMVAL") - var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM erro_poll_option o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid") + var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid") voted_query.Execute() var/output = "
Player poll" @@ -230,7 +230,7 @@ var/minid = 999999 var/maxid = 0 - var/DBQuery/option_query = dbcon.NewQuery("SELECT id, text, minval, maxval, descmin, descmid, descmax FROM erro_poll_option WHERE pollid = [pollid]") + var/DBQuery/option_query = dbcon.NewQuery("SELECT id, text, minval, maxval, descmin, descmid, descmax FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") option_query.Execute() while(option_query.NextRow()) var/optionid = text2num(option_query.item[1]) @@ -273,7 +273,7 @@ src << browse(output,"window=playerpoll;size=500x500") if("MULTICHOICE") - var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") + var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") voted_query.Execute() var/list/votedfor = list() @@ -286,7 +286,7 @@ var/maxoptionid = 0 var/minoptionid = 0 - var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]") + var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") options_query.Execute() while(options_query.NextRow()) var/datum/polloption/PO = new() @@ -345,7 +345,7 @@ establish_db_connection() if(dbcon.IsConnected()) - var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime") + var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime") select_query.Execute() var/validpoll = 0 @@ -363,7 +363,7 @@ usr << "\red Poll is not valid." return - var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]") + var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]") select_query2.Execute() var/validoption = 0 @@ -378,7 +378,7 @@ var/alreadyvoted = 0 - var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") + var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") voted_query.Execute() while(voted_query.NextRow()) @@ -399,7 +399,7 @@ adminrank = usr.client.holder.rank - var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')") + var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')") insert_query.Execute() usr << "\blue Vote successful." @@ -415,7 +415,7 @@ establish_db_connection() if(dbcon.IsConnected()) - var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime") + var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime") select_query.Execute() var/validpoll = 0 @@ -432,7 +432,7 @@ var/alreadyvoted = 0 - var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") + var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'") voted_query.Execute() while(voted_query.NextRow()) @@ -457,7 +457,7 @@ usr << "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again." return - var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_textreply (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')") + var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_textreply")] (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')") insert_query.Execute() usr << "\blue Feedback logging successful." @@ -473,7 +473,7 @@ establish_db_connection() if(dbcon.IsConnected()) - var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime") + var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime") select_query.Execute() var/validpoll = 0 @@ -488,7 +488,7 @@ usr << "\red Poll is not valid." return - var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]") + var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]") select_query2.Execute() var/validoption = 0 @@ -503,7 +503,7 @@ var/alreadyvoted = 0 - var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_vote WHERE optionid = [optionid] AND ckey = '[usr.ckey]'") + var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND ckey = '[usr.ckey]'") voted_query.Execute() while(voted_query.NextRow()) @@ -519,7 +519,7 @@ adminrank = usr.client.holder.rank - var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])") + var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])") insert_query.Execute() usr << "\blue Vote successful." diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 363675b723c..b60ebe12c5d 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,11 +1,12 @@ datum/preferences //The mob should have a gender you want before running this proc. Will run fine without H - proc/randomize_appearance_for(var/mob/living/carbon/human/H) - if(H) - if(H.gender == MALE) - gender = MALE - else - gender = FEMALE + proc/random_character(gender_override) + if(gender_override) + gender = gender_override + else + gender = pick(MALE, FEMALE) + underwear = random_underwear(gender) + undershirt = random_undershirt(gender) if(species == "Human") s_tone = random_skin_tone() h_style = random_hair_style(gender, species) @@ -16,12 +17,8 @@ datum/preferences randomize_eyes_color() if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin") randomize_skin_color() - underwear = rand(1,underwear_m.len) - undershirt = rand(1,undershirt_t.len) backbag = 2 age = rand(AGE_MIN,AGE_MAX) - if(H) - copy_to(H,1) proc/randomize_hair_color(var/target = "hair") @@ -256,12 +253,16 @@ datum/preferences var/icon/underwear_s = null - if(underwear > 0 && underwear < 7 && current_species.flags & HAS_UNDERWEAR) - underwear_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "underwear[underwear]_[g]_s") + if(underwear && current_species.flags & HAS_UNDERWEAR) + var/datum/sprite_accessory/underwear/U = underwear_list[underwear] + if(U) + underwear_s = new/icon(U.icon, "[U.icon_state]_s", ICON_OVERLAY) var/icon/undershirt_s = null - if(undershirt > 0 && undershirt < 45 && current_species.flags & HAS_UNDERWEAR) - undershirt_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "undershirt[undershirt]_s") + if(undershirt && current_species.flags & HAS_UNDERWEAR) + var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] + if(U2) + undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY) var/icon/clothes_s = null var/uniform_dmi='icons/mob/uniform.dmi' diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 24959d7e151..45fe53c3d82 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -17,16 +17,29 @@ conversion in savefile.dm */ +/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female) + if(!istype(L)) L = list() + if(!istype(male)) male = list() + if(!istype(female)) female = list() + + for(var/path in subtypesof(prototype)) + var/datum/sprite_accessory/D = new path() + + L[D.name] = D + + switch(D.gender) + if(MALE) male += D.name + if(FEMALE) female += D.name + else + male += D.name + female += D.name + return L + /datum/sprite_accessory - - var/icon // the icon file the accessory is located in - var/icon_state // the icon_state of the accessory - var/preview_state // a custom preview state for whatever reason - - var/name // the preview name of the accessory - - // Determines if the accessory will be skipped or included in random hair generations - var/gender = NEUTER + var/icon //the icon file the accessory is located in + var/icon_state //the icon_state of the accessory + var/name //the preview name of the accessory + var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations // Restrict some styles to specific species var/list/species_allowed = list("Human") @@ -935,3 +948,316 @@ icon_state = "default" icon = 'icons/mob/human_races/r_skrell.dmi' species_allowed = list("Skrell") + +/////////////////////////// +// Underwear Definitions // +/////////////////////////// +/datum/sprite_accessory/underwear + icon = 'icons/mob/underwear.dmi' + + species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + + nude + name = "Nude" + icon_state = null + gender = NEUTER + + male_white + name = "Mens White" + icon_state = "male_white" + gender = MALE + + male_grey + name = "Mens Grey" + icon_state = "male_grey" + gender = MALE + + male_green + name = "Mens Green" + icon_state = "male_green" + gender = MALE + + male_blue + name = "Mens Blue" + icon_state = "male_blue" + gender = MALE + + male_black + name = "Mens Black" + icon_state = "male_black" + gender = MALE + + male_mankini + name = "Mankini" + icon_state = "male_mankini" + gender = MALE + + female_red + name = "Ladies Red" + icon_state = "female_red" + gender = FEMALE + + female_white + name = "Ladies White" + icon_state = "female_white" + gender = FEMALE + + female_yellow + name = "Ladies Yellow" + icon_state = "female_yellow" + gender = FEMALE + + female_blue + name = "Ladies Blue" + icon_state = "female_blue" + gender = FEMALE + + female_black + name = "Ladies Black" + icon_state = "female_black" + gender = FEMALE + + female_kinky + name = "Ladies Kinky" + icon_state = "female_kinky" + gender = FEMALE + +//////////////////////////// +// Undershirt Definitions // +//////////////////////////// +/datum/sprite_accessory/undershirt + icon = 'icons/mob/underwear.dmi' + + species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + +/datum/sprite_accessory/undershirt/nude + name = "Nude" + icon_state = null + gender = NEUTER + +//plain color shirts +/datum/sprite_accessory/undershirt/shirt_white + name = "White Shirt" + icon_state = "shirt_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_black + name = "Black Shirt" + icon_state = "shirt_black" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_grey + name = "Grey Shirt" + icon_state = "shirt_grey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_red + name = "Red Shirt" + icon_state = "shirt_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_blue + name = "Blue Shirt" + icon_state = "shirt_blue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_yellow + name = "Yellow Shirt" + icon_state = "shirt_yellow" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_green + name = "Green Shirt" + icon_state = "shirt_green" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_darkblue + name = "Dark Blue Shirt" + icon_state = "shirt_darkblue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_darkred + name = "Dark Red Shirt" + icon_state = "shirt_darkred" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_darkgreen + name = "Dark Green Shirt" + icon_state = "shirt_darkgreen" + gender = NEUTER +//end plain color shirts + +/datum/sprite_accessory/undershirt/shirt_heart + name = "Heart Shirt" + icon_state = "shirt_heart" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_corgi + name = "Corgi Shirt" + icon_state = "shirt_corgi" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_jack + name = "Union Jack Shirt" + icon_state = "shirt_jack" + gender = NEUTER + +/datum/sprite_accessory/undershirt/love_nt + name = "I Love NT Shirt" + icon_state = "shirt_lovent" + gender = NEUTER + +/datum/sprite_accessory/undershirt/peace + name = "Peace Shirt" + icon_state = "shirt_peace" + gender = NEUTER + +/datum/sprite_accessory/undershirt/mondmondjaja + name = "Band Shirt" + icon_state = "shirt_band" + gender = NEUTER + +/datum/sprite_accessory/undershirt/pacman + name = "Pogoman Shirt" + icon_state = "shirt_pogoman" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_ss13 + name = "SS13 Shirt" + icon_state = "shirt_ss13" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_question + name = "Question Mark Shirt" + icon_state = "shirt_question" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_skull + name = "Skull Shirt" + icon_state = "shirt_skull" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_commie + name = "Communist Shirt" + icon_state = "shirt_commie" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_nano + name = "Nanotrasen Shirt" + icon_state = "shirt_nano" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_meat + name = "Meat Shirt" + icon_state = "shirt_meat" + gender = NEUTER + +/datum/sprite_accessory/undershirt/shirt_tiedie + name = "Tiedie Shirt" + icon_state = "shirt_tiedie" + gender = NEUTER + +/datum/sprite_accessory/undershirt/blue_striped + name = "Striped Blue Shirt" + icon_state = "shirt_bluestripe" + gender = NEUTER + +/datum/sprite_accessory/undershirt/brightblue_striped + name = "Striped Bright Blue Shirt" + icon_state = "shirt_brightbluestripe" + gender = NEUTER + + +//short sleeved +/datum/sprite_accessory/undershirt/short_white + name = "White Short-sleeved Shirt" + icon_state = "short_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_purple + name = "Purple Short-sleeved Shirt" + icon_state = "short_purple" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_blue + name = "Blue Short-sleeved Shirt" + icon_state = "short_blue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_green + name = "Green Short-sleeved Shirt" + icon_state = "short_green" + gender = NEUTER + +/datum/sprite_accessory/undershirt/short_black + name = "Black Short-sleeved Shirt" + icon_state = "short_black" + gender = NEUTER +//end short sleeved + +//polo shirts +/datum/sprite_accessory/undershirt/polo_blue + name = "Blue Polo Shirt" + icon_state = "polo_blue" + gender = NEUTER + +/datum/sprite_accessory/undershirt/polo_red + name = "Red Polo Shirt" + icon_state = "polo_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/polo_greyelllow + name = "Grey-Yellow Polo Shirt" + icon_state = "polo_greyellow" + gender = NEUTER +//end polo shirts + +//sport shirts +/datum/sprite_accessory/undershirt/sport_green + name = "Green Sports Shirt" + icon_state = "sport_green" + gender = NEUTER + +/datum/sprite_accessory/undershirt/sport_red + name = "Red Sports Shirt" + icon_state = "sport_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/sport_blue + name = "Blue Sports Shirt" + icon_state = "sport_blue" + gender = NEUTER +//end sport shirts + +/datum/sprite_accessory/undershirt/jersey_red + name = "Red Jersey" + icon_state = "jersey_red" + gender = NEUTER + +/datum/sprite_accessory/undershirt/jersey_blue + name = "Blue Jersey" + icon_state = "jersey_blue" + gender = NEUTER + + +//tanktops +/datum/sprite_accessory/undershirt/tank_white + name = "White Tank-Top" + icon_state = "tank_white" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_black + name = "Black Tank-Top" + icon_state = "tank_black" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_grey + name = "Grey Tank-Top" + icon_state = "tank_grey" + gender = NEUTER + +/datum/sprite_accessory/undershirt/tank_fire + name = "Fire Tank-Top" + icon_state = "tank_fire" + gender = NEUTER +//end tanktops \ No newline at end of file diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index bd2734c5134..93aa753e446 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -121,8 +121,9 @@ O.add_ai_verbs() O.rename_self("ai",1) - . = O - qdel(src) + spawn + qdel(src) + return O /mob/living/carbon/human/make_into_mask(var/should_gib = 0) for(var/t in organs) @@ -481,7 +482,7 @@ return 1 //Friendly Creatures! - if(ispath(MP, /mob/living/carbon/primitive/diona) && !jobban_isbanned(src, "Dionaea")) + if(ispath(MP, /mob/living/simple_animal/diona) && !jobban_isbanned(src, "Dionaea")) return 1 //Not in here? Must be untested! diff --git a/code/modules/nano/nanomapgen.dm b/code/modules/nano/nanomapgen.dm index d77ff24af20..44154cdb675 100644 --- a/code/modules/nano/nanomapgen.dm +++ b/code/modules/nano/nanomapgen.dm @@ -19,42 +19,42 @@ /client/proc/nanomapgen_DumpImage() set name = "Generate NanoUI Map" set category = "Mapping" - + if(holder) - nanomapgen_DumpTile(1, 1, text2num(input(usr,"Enter the Z level to generate"))) + nanomapgen_DumpTile(1, 1, text2num(input(usr,"Enter the Z level to generate"))) /client/proc/nanomapgen_DumpTile(var/startX = 1, var/startY = 1, var/currentZ = 1, var/endX = -1, var/endY = -1) if (endX < 0 || endX > world.maxx) endX = world.maxx - + if (endY < 0 || endY > world.maxy) endY = world.maxy - + if (currentZ < 0 || currentZ > world.maxz) usr << "NanoMapGen: ERROR: currentZ ([currentZ]) must be between 1 and [world.maxz]" - + sleep(3) return NANOMAP_TERMINALERR - + if (startX > endX) usr << "NanoMapGen: ERROR: startX ([startX]) cannot be greater than endX ([endX])" - + sleep(3) return NANOMAP_TERMINALERR - + if (startY > endX) usr << "NanoMapGen: ERROR: startY ([startY]) cannot be greater than endY ([endY])" sleep(3) return NANOMAP_TERMINALERR - + var/icon/Tile = icon(file("nano/mapbase1024.png")) if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) - world.log << "NanoMapGen: ERROR: BASE IMAGE DIMENSIONS ARE NOT [NANOMAP_MAX_ICON_DIMENSION]x[NANOMAP_MAX_ICON_DIMENSION]" + log_to_dd("NanoMapGen: ERROR: BASE IMAGE DIMENSIONS ARE NOT [NANOMAP_MAX_ICON_DIMENSION]x[NANOMAP_MAX_ICON_DIMENSION]") sleep(3) return NANOMAP_TERMINALERR - - world.log << "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])" + + log_to_dd("NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])") usr << "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])" var/count = 0; @@ -62,26 +62,26 @@ for(var/WorldY = startY, WorldY <= endY, WorldY++) var/atom/Turf = locate(WorldX, WorldY, currentZ) - + var/icon/TurfIcon = new(Turf.icon, Turf.icon_state) TurfIcon.Scale(NANOMAP_ICON_SIZE, NANOMAP_ICON_SIZE) - + Tile.Blend(TurfIcon, ICON_OVERLAY, ((WorldX - 1) * NANOMAP_ICON_SIZE), ((WorldY - 1) * NANOMAP_ICON_SIZE)) - + count++ - + if (count % 8000 == 0) - world.log << "NanoMapGen: [count] tiles done" + log_to_dd("NanoMapGen: [count] tiles done") sleep(1) - + var/mapFilename = "nanomap_z[currentZ]-new.png" - - world.log << "NanoMapGen: sending [mapFilename] to client" + + log_to_dd("NanoMapGen: sending [mapFilename] to client") usr << browse(Tile, "window=picture;file=[mapFilename];display=0") - - world.log << "NanoMapGen: Done." - + + log_to_dd("NanoMapGen: Done.") + usr << "NanoMapGen: Done. File [mapFilename] uploaded to your cache." if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) diff --git a/code/modules/ninja/suit/SpiderOS.dm b/code/modules/ninja/suit/SpiderOS.dm index 8b030b11ffb..fed3c2bd1f9 100644 --- a/code/modules/ninja/suit/SpiderOS.dm +++ b/code/modules/ninja/suit/SpiderOS.dm @@ -216,10 +216,17 @@ display_to << "Error: unable to deliver message." display_spideros() return - P.tnote += "← From an unknown source:
[t]
" - if (!P.silent) - playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) - P.audible_message("\icon[P] *[P.ttone]*", null, 3) + //Search for holder of the PDA. + var/mob/living/L = null + if(P.loc && isliving(P.loc)) + L = P.loc + //Maybe they are a pAI! + else + L = get(P, /mob/living/silicon) + + if(L) + L << "\icon[P] Message from unknown source: \"[t]\" (Unable to Reply)" + P.play_ringtone() P.overlays.Cut() P.overlays += image('icons/obj/pda.dmi', "pda-r") diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 9b4b7e2e4d2..01b95c09ddf 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -242,9 +242,9 @@ var/list/organ_cache = list() if(owner && vital) if(user) - user.attack_log += "\[[time_stamp()]\] removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)])" - owner.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])" - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)") + user.attack_log += "\[[time_stamp()]\] removed a vital organ ([src]) from [key_name(owner)] (INTENT: [uppertext(user.a_intent)])" + owner.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)])" + msg_admin_attack("[key_name_admin(user)] removed a vital organ ([src]) from [key_name_admin(owner)]") owner.death() owner = null diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index 29434bc1459..735b5120582 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -8,7 +8,7 @@ return 0 spawn(1) // So it has time to be thrown about by the gib() proc. - var/mob/living/carbon/alien/diona/D = new(get_turf(organ)) + var/mob/living/simple_animal/diona/D = new(get_turf(organ)) var/datum/ghosttrap/plant/P = get_ghost_trap("living plant") P.request_player(D, "A diona nymph has split off from its gestalt. ") spawn(60) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index aa9db67f9ab..07c0ea13e8d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -750,7 +750,7 @@ return var/list/data = list( - "locked" = locked, + "locked" = is_locked(user), "isOperating" = operating, "externalPower" = main_status, "powerCellStatus" = cell ? cell.percent() : null, @@ -799,7 +799,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new one - ui = new(user, src, ui_key, "apc.tmpl", "[area.name] - APC", 500, data["siliconUser"] ? 465 : 390) + ui = new(user, src, ui_key, "apc.tmpl", "[area.name] - APC", 510, data["siliconUser"] ? 465 : 390) // When the UI is first opened this is the data it will use ui.set_initial_data(data) ui.open() @@ -834,25 +834,9 @@ /obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic() - if (user.stat && !isobserver(user)) - user << "You must be conscious to use this [src]!" - return 0 - if(stat & (NOPOWER|BROKEN)) - return 0 - if(!user.client) - return 0 - if(!user.IsAdvancedToolUser()) - return 0 - if ( ! (istype(user, /mob/living/carbon/human) || \ - istype(user, /mob/living/silicon))) - user << "You don't have the dexterity to use this [src]!" - return 0 - if(user.restrained()) - user << "You must have free hands to use this [src]" - return 0 - if(user.lying) - user << "You must stand to use this [src]!" - return 0 + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 1 + autoflag = 5 if (istype(user, /mob/living/silicon)) var/mob/living/silicon/ai/AI = user @@ -886,10 +870,20 @@ return 1 /obj/machinery/power/apc/proc/is_authenticated(mob/user as mob) + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 1 if(isAI(user) || isrobot(user)) return 1 else return !locked + +/obj/machinery/power/apc/proc/is_locked(mob/user as mob) + if(isobserver(user) && check_rights(R_ADMIN, 0, user)) + return 0 + if(isAI(user) || isrobot(user)) + return 0 + else + return locked /obj/machinery/power/apc/Topic(href, href_list, var/usingUI = 1) if(..()) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index af09f71e271..44a4eda8612 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -234,7 +234,7 @@ //remove the old powernet and replace it with a new one throughout the network. /proc/propagate_network(var/obj/O, var/datum/powernet/PN) - //world.log << "propagating new network" + //log_to_dd("propagating new network") var/list/worklist = list() var/list/found_machines = list() var/index = 1 @@ -282,7 +282,7 @@ //merge net2 into net1 for(var/obj/structure/cable/Cable in net2.cables) //merge cables net1.add_cable(Cable) - + if(!net2) return net1 for(var/obj/machinery/power/Node in net2.nodes) //merge power machines diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a30d2de451e..8f228eb30f4 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -107,17 +107,17 @@ if(src.active==1) src.active = 0 user << "You turn off the [src]." - msg_admin_attack("Emitter turned off by [key_name(user, user.client)][isAntag(user) ? "(ANTAG)" : ""](?) in ([x],[y],[z] - JMP)",0,1) - log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])") - investigate_log("turned off by [user.key]","singulo") + message_admins("Emitter turned off by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) + log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])") + investigate_log("turned off by [key_name(usr)]","singulo") else src.active = 1 user << "You turn on the [src]." src.shot_number = 0 src.fire_delay = 100 - msg_admin_attack("Emitter turned on by [key_name(user, user.client)][isAntag(user) ? "(ANTAG)" : ""](?) in ([x],[y],[z] - JMP)",0,1) - log_game("Emitter turned on by [user.ckey]([user]) in ([x],[y],[z])") - investigate_log("turned on by [user.key]","singulo") + message_admins("Emitter turned on by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) + log_game("Emitter turned on by [key_name(user)] in ([x],[y],[z])") + investigate_log("turned on by [key_name(usr)]","singulo") update_icon() else user << "\red The controls are locked!" diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 05543580e79..490af2d6fb9 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -122,9 +122,11 @@ if(strength > strength_upper_limit) strength = strength_upper_limit else - msg_admin_attack("PA Control Computer increased to [strength] by [key_name(usr, usr.client)][isAntag(usr) ? "(ANTAG)" : ""](?) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])") - use_log += text("\[[time_stamp()]\] [usr.name] ([usr.ckey]) has increased the PA Control Computer to [strength].") + message_admins("PA Control Computer increased to [strength] by [key_name_admin(usr)] in ([x],[y],[z] - JMP)",0,1) + log_game("PA Control Computer increased to [strength] by [key_name(usr)] in ([x],[y],[z])") + investigate_log("increased to [strength] by [key_name(usr)]","singulo") + use_log += text("\[[time_stamp()]\] [usr.name] ([key_name(usr)]) has increased the PA Control Computer to [strength].") + investigate_log("increased to [strength] by [usr.key]","singulo") strength_change() @@ -134,8 +136,11 @@ if(strength < 0) strength = 0 else - investigate_log("decreased to [strength] by [usr.key]","singulo") - use_log += text("\[[time_stamp()]\] [usr.name] ([usr.ckey]) has decreased the PA Control Computer to [strength].") + message_admins("PA Control Computer decreased to [strength] by [key_name_admin(usr)] in ([x],[y],[z] - JMP)",0,1) + log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in ([x],[y],[z])") + investigate_log("decreased to [strength] by [key_name(usr)]","singulo") + use_log += text("\[[time_stamp()]\] [usr.name] ([key_name(usr)]) has decreased the PA Control Computer to [strength].") + strength_change() /obj/machinery/particle_accelerator/control_box/power_change() @@ -215,7 +220,7 @@ src.active = !src.active investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo") if (active) - msg_admin_attack("PA Control Computer turned ON by [key_name(usr, usr.client)][isAntag(usr) ? "(ANTAG)" : ""](?) in ([x],[y],[z] - JMP)",0,1) + msg_admin_attack("PA Control Computer turned ON by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])") use_log += text("\[[time_stamp()]\] [usr.name] ([usr.ckey]) has turned on the PA Control Computer.") if(src.active) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 5fc9e1ae4b0..12dd496303d 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -313,7 +313,7 @@ var/mob/living/user = AM user.dust() power += 200 - message_admins("[src] has consumed [key_name_admin(user)]? (FLW) (JMP).") + message_admins("[src] has consumed [key_name_admin(user)] (JMP).") investigate_log("has consumed [key_name(user)].", "supermatter") else if(isobj(AM) && !istype(AM, /obj/effect)) investigate_log("has consumed [AM].", "supermatter") diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c279baaa290..f236200337b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -98,7 +98,7 @@ qdel(src) return - if (!user.IsAdvancedToolUser() || istype(user, /mob/living/carbon/primitive/diona)) + if (!user.IsAdvancedToolUser() || istype(user, /mob/living/simple_animal/diona)) user << "\red You don't have the dexterity to do this!" return if(istype(user, /mob/living)) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 79ebef8774a..0eee855c3da 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -308,7 +308,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. flags = CONDUCT | OPENCONTAINER attack_verb = list("attacked", "slashed", "cut", "sliced") charge_cost = 250 - fire_delay = 10 + fire_delay = 15 icon_override = 'icons/mob/in-hand/guns.dmi' can_charge = 0 @@ -336,7 +336,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. modifystate = "adv_plasmacutter" origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2" projectile_type = /obj/item/projectile/plasma/adv - fire_delay = 8 + fire_delay = 10 charge_cost = 100 /obj/item/weapon/gun/energy/disabler diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b981433ac0a..8542729e3d1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -142,18 +142,18 @@ playsound(loc, hitsound, 20, 1, -1) visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter if(istype(firer, /mob)) - M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type][reagent_note]" - firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type][reagent_note]" + M.attack_log += "\[[time_stamp()]\] [key_name(firer)] shot [M]/[M.ckey] with a [src.type][reagent_note]" + firer.attack_log += "\[[time_stamp()]\] [key_name(firer)] shot [M]/[M.ckey] with a [src.type][reagent_note]" if(M.ckey && chatlog_attacks) - msg_admin_attack("[firer] ([firer.ckey])[isAntag(firer) ? "(ANTAG)" : ""] shot [M] ([M.ckey]) with a [src][reagent_note] (JMP)") //BS12 EDIT ALG + msg_admin_attack("[key_name_admin(firer)] shot [key_name_admin(M)] with a [src][reagent_note]") //BS12 EDIT ALG if(!iscarbon(firer)) M.LAssailant = null else M.LAssailant = firer else - M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src][reagent_note]" + M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [key_name(M)] with a [src][reagent_note]" if(M.ckey && chatlog_attacks) - msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src][reagent_note] (JMP)") //BS12 EDIT ALG + msg_admin_attack("UNKNOWN shot [key_name_admin(M)] with a [src][reagent_note] (JMP)") //BS12 EDIT ALG spawn(0) if(A) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 6304ba6b2bd..b263e03afeb 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -244,29 +244,31 @@ obj/item/projectile/kinetic/New() icon_state = "plasmacutter" damage_type = BRUTE damage = 5 - range = 1 + range = 3 /obj/item/projectile/plasma/New() var/turf/proj_turf = get_turf(src) if(!istype(proj_turf, /turf)) return var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure < 30) - name = "full strength plasma blast" - damage *= 3 - range += 3 + if(environment) + var/pressure = environment.return_pressure() + if(pressure < 30) + name = "full strength plasma blast" + damage *= 3 ..() -/obj/item/projectile/plasma/on_hit(var/atom/target) +/obj/item/projectile/plasma/on_hit(atom/target) + . = ..() if(istype(target, /turf/simulated/mineral)) var/turf/simulated/mineral/M = target M.gets_drilled(firer) - return ..() + range = max(range - 1, 1) + return -1 /obj/item/projectile/plasma/adv - range = 2 + range = 5 /obj/item/projectile/plasma/adv/mech damage = 10 - range = 3 + range = 6 diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 08560c6011e..03dd8cfbcf6 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -155,8 +155,8 @@ ui.open() /obj/machinery/chem_dispenser/Topic(href, href_list) - if(stat & (NOPOWER|BROKEN)) - return 0 // don't update UIs attached to this object + if(..()) + return 1 if(href_list["amount"]) amount = round(text2num(href_list["amount"]), 5) // round to nearest 5 @@ -245,6 +245,9 @@ /obj/machinery/chem_dispenser/attack_ai(mob/user as mob) return src.attack_hand(user) + +/obj/machinery/chem_dispenser/attack_ghost(mob/user as mob) + return src.attack_hand(user) /obj/machinery/chem_dispenser/attack_hand(mob/user as mob) if(stat & BROKEN) @@ -444,9 +447,8 @@ return /obj/machinery/chem_master/Topic(href, href_list) - if(stat & (BROKEN|NOPOWER)) return - if(usr.stat || usr.restrained()) return - if(!in_range(src, usr)) return + if(..()) + return 1 src.add_fingerprint(usr) usr.set_machine(src) @@ -457,7 +459,8 @@ loaded_pill_bottle.loc = src.loc loaded_pill_bottle = null else if(href_list["close"]) - usr << browse(null, "window=chemmaster") + usr << browse(null, "window=chem_master") + onclose(usr, "chem_master") usr.unset_machine() return @@ -559,6 +562,7 @@ var/count = 1 if (href_list["createpill_multiple"]) count = isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num) if (count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? + if (count <= 0) return var/amount_per_pill = reagents.total_volume/count if (amount_per_pill > 50) amount_per_pill = 50 var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) @@ -636,6 +640,9 @@ /obj/machinery/chem_master/attack_ai(mob/user as mob) return src.attack_hand(user) + +/obj/machinery/chem_master/attack_ghost(mob/user as mob) + return src.attack_hand(user) /obj/machinery/chem_master/attack_hand(mob/user as mob) if(stat & BROKEN) diff --git a/code/modules/reagents/dartgun.dm b/code/modules/reagents/dartgun.dm index 75825c4939c..585e468c70e 100644 --- a/code/modules/reagents/dartgun.dm +++ b/code/modules/reagents/dartgun.dm @@ -180,15 +180,15 @@ M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a dartgun ([R])" user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a dartgun ([R])" if(M.ckey) - msg_admin_attack("[user] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] shot [M] ([M.ckey]) with a dartgun ([R]) (JMP)") + msg_admin_attack("[key_name_admin(user)] shot [M] ([M.ckey]) with a dartgun ([R]).") if(!iscarbon(user)) M.LAssailant = null else M.LAssailant = user else - M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a dartgun ([R])" - msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a dartgun ([R]) (JMP)") + M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [key_name_admin(M)] with a dartgun ([R])" + msg_admin_attack("UNKNOWN shot [key_name(M)] with a dartgun ([R]) (JMP)") if(D.reagents) D.reagents.trans_to(M, 15) diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index 3cac4649290..00135ad0c05 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -610,8 +610,8 @@ datum/reagent/atrazine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volu H.adjustToxLoss(50) ..() return - else if(istype(M,/mob/living/carbon/primitive/diona)) //plantmen monkeys (diona) take EVEN MORE damage - var/mob/living/carbon/primitive/diona/D = M + else if(istype(M,/mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage + var/mob/living/simple_animal/diona/D = M D.adjustToxLoss(100) ..() return diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 253613a7360..0097cf45907 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -70,10 +70,10 @@ for(var/datum/reagent/R in src.reagents.reagent_list) injected += R.name var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [user.name] ([user.ckey]). Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [M.name] ([M.key]). Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] squirted [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else @@ -88,8 +88,8 @@ badshit += reagents_to_log[bad_reagent] if(badshit.len) var/hl="\red ([english_list(badshit)]) \black" - message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") - log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") + message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") + log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You transfer [trans] units of the solution." diff --git a/code/modules/reagents/reagent_containers/drugs.dm b/code/modules/reagents/reagent_containers/drugs.dm index d6804f54778..312cbf297a2 100644 --- a/code/modules/reagents/reagent_containers/drugs.dm +++ b/code/modules/reagents/reagent_containers/drugs.dm @@ -67,8 +67,8 @@ badshit += reagents_to_log[bad_reagent] if(badshit.len) var/hl="\red ([english_list(badshit)]) \black" - message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") - log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") + message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") + log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You transfer [trans] units of the solution to [target]." diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index f79dc8ded09..309f928288b 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -48,10 +48,10 @@ for(var/mob/O in viewers(world.view, user)) O.show_message("\red [user] feeds [M] [src].", 1) - M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") - user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]") + M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [key_name(user)] Reagents: [reagentlist(src)]") + user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [key_name(M)] Reagents: [reagentlist(src)]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index cb1d48d98aa..8528e364dc7 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -55,9 +55,9 @@ for(var/mob/O in viewers(world.view, user)) O.show_message("\red [user] feeds [M] [src].", 1) - M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") - user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]") - log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)]) (JMP)") + M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [key_name(user)] Reagents: [reagentlist(src)]") + user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [key_name(M)] Reagents: [reagentlist(src)]") + log_attack("[key_name_admin(user)] fed [key_name_admin(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 20da18a668f..205837633de 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -97,10 +97,10 @@ else O.show_message(text("\red [target] has attacked himself with a bottle of [src.name]!"), 1) //Attack logs - user.attack_log += text("\[[time_stamp()]\] Has attacked [target.name] ([target.ckey]) with a bottle!") - target.attack_log += text("\[[time_stamp()]\] Has been smashed with a bottle by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Has attacked [key_name(target)] with a bottle!") + target.attack_log += text("\[[time_stamp()]\] Has been smashed with a bottle by [key_name(user)]") if(target.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with a bottle. (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) target.LAssailant = null else diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index cf4f8794bf0..608fbc405be 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -85,10 +85,10 @@ for(var/datum/reagent/R in src.reagents.reagent_list) injected += R.name var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been splashed with [src.name] by [user.name] ([user.ckey]). Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to splash [M.name] ([M.key]). Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been splashed with [src.name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to splash [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] splashed [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] splashed [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else @@ -129,8 +129,8 @@ badshit += reagents_to_log[bad_reagent] if(badshit.len) var/hl="\red ([english_list(badshit)]) \black" - message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") - log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") + message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") + log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You transfer [trans] units of the solution to [target]." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index e24378fb137..72d4c18297c 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -33,10 +33,10 @@ for(var/datum/reagent/R in src.reagents.reagent_list) injected += R.name var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [user.name] ([user.ckey]). Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [M.name] ([M.key]). Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] injected [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 21ce9e059e2..534de035872 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -54,10 +54,10 @@ for(var/mob/O in viewers(world.view, user)) O.show_message("[user] forces [M] to [apply_method] [src].", 1) - M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") - user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]") + M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [key_name(user)] Reagents: [reagentlist(src)]") + user.attack_log += text("\[[time_stamp()]\] Fed [src.name] to [key_name(M)]) Reagents: [reagentlist(src)]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] fed [M.name] ([M.ckey]) with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else diff --git a/code/modules/reagents/reagent_containers/robodropper.dm b/code/modules/reagents/reagent_containers/robodropper.dm index 8f2a1d4e9e5..c5da1639304 100644 --- a/code/modules/reagents/reagent_containers/robodropper.dm +++ b/code/modules/reagents/reagent_containers/robodropper.dm @@ -33,8 +33,8 @@ badshit += reagents_to_log[bad_reagent] if(badshit.len) var/hl="\red ([english_list(badshit)]) \black" - message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") - log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") + message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") + log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") else if(ismob(target)) if(istype(target , /mob/living/carbon/human)) @@ -78,10 +78,10 @@ for(var/datum/reagent/R in src.reagents.reagent_list) injected += R.name var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [user.name] ([user.ckey]). Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [M.name] ([M.key]). Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] squirted [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index fe255c9caf7..252f7ed0208 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -51,10 +51,10 @@ message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].") log_game("[key_name(user)] fired sulphuric acid from \a [src].") if(reagents.has_reagent("facid")) - message_admins("[key_name_admin(user)] fired Fluorosulfuric Acid from \a [src].") + message_admins("[key_name_admin(user)] fired fluorosulfuric acid from \a [src].") log_game("[key_name(user)] fired Fluorosulfuric Acid from \a [src].") if(reagents.has_reagent("lube")) - message_admins("[key_name_admin(user)] fired Space lube from \a [src].") + message_admins("[key_name_admin(user)] fired space lube from \a [src].") log_game("[key_name(user)] fired Space lube from \a [src].") return diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 4892815ff49..408076341ee 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -202,10 +202,10 @@ for(var/datum/reagent/R in src.reagents.reagent_list) injected += R.name var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [user.name] ([user.ckey]). Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [M.name] ([M.key]). Reagents: [contained]") + M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained]") if(M.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] injected [M.name] ([M.key]) with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) M.LAssailant = null else @@ -224,8 +224,8 @@ badshit += reagents_to_log[bad_reagent] if(badshit.len) var/hl="\red ([english_list(badshit)]) \black" - message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") - log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") + message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] ") + log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") spawn(5) var/datum/reagent/blood/B @@ -290,7 +290,7 @@ user.attack_log += "\[[time_stamp()]\] Attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" target.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" if(target.ckey) - msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with [src.name] (INTENT: [uppertext(user.a_intent)])") if(!iscarbon(user)) target.LAssailant = null else diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index e810847876e..95d4d13ad1c 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -124,10 +124,10 @@ for (var/mob/C in viewers(src)) C.show_message("\red [GM.name] has been placed in the [src] by [user].", 3) qdel(G) - usr.attack_log += text("\[[time_stamp()]\] Has placed [GM.name] ([GM.ckey]) in disposals.") - GM.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [usr.name] ([usr.ckey])") + usr.attack_log += text("\[[time_stamp()]\] Has placed [key_name(GM)] in disposals.") + GM.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [key_name(user)]") if(GM.ckey) - msg_admin_attack("[usr] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] placed [GM] ([GM.ckey]) in a disposals unit. (JMP)") + msg_admin_attack("[key_name_admin(user)] placed [key_name_admin(GM)] in a disposals unit. (JMP)") return if(!I) return @@ -262,7 +262,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "disposal_bin.tmpl", "Waste Disposal Unit", 375, 250) + ui = new(user, src, ui_key, "disposal_bin.tmpl", "Waste Disposal Unit", 395, 250) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 21182bd0e10..ac92bd70b33 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -284,14 +284,12 @@ if(deliveryCheck == 0) H.destinationTag = 1 - air_contents = new() // new empty gas resv. - sleep(10) playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0) sleep(5) // wait for animation to finish H.init(src) // copy the contents of disposer to holder - + air_contents = new() // The holder just took our gas; replace it H.start(src) // start the holder processing movement flushing = 0 // now reset disposal state diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index da6bf1244bf..34a10b97f1d 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -295,7 +295,7 @@ var/obj/machinery/blackbox_recorder/blackbox if(!dbcon.IsConnected()) return var/round_id - var/DBQuery/query = dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM erro_feedback") + var/DBQuery/query = dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]") query.Execute() while(query.NextRow()) round_id = query.item[1] @@ -305,7 +305,7 @@ var/obj/machinery/blackbox_recorder/blackbox round_id++ for(var/datum/feedback_variable/FV in feedback) - var/sql = "INSERT INTO erro_feedback VALUES (null, Now(), [round_id], \"[FV.get_variable()]\", [FV.get_value()], \"[FV.get_details()]\")" + var/sql = "INSERT INTO [format_table_name("feedback")] VALUES (null, Now(), [round_id], \"[FV.get_variable()]\", [FV.get_value()], \"[FV.get_details()]\")" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() diff --git a/code/modules/scripting/IDE.dm b/code/modules/scripting/IDE.dm index b9b53b274d2..1733895a91f 100644 --- a/code/modules/scripting/IDE.dm +++ b/code/modules/scripting/IDE.dm @@ -11,7 +11,6 @@ client/verb/tcssave() var/tcscode=winget(src, "tcscode", "text") var/msg="[mob.name] is adding script to server [Server]: [tcscode]" diary << msg - message_admins("[mob.name] has uploaded a NTLS script to [Machine.SelectedServer] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) Server.setcode( tcscode ) // this actually saves the code from input to the server src << output(null, "tcserror") // clear the errors else @@ -36,7 +35,7 @@ client/verb/tcscompile() if(Machine.SelectedServer) var/obj/machinery/telecomms/server/Server = Machine.SelectedServer Server.setcode( winget(src, "tcscode", "text") ) // save code first - var/list/compileerrors = Server.compile() // then compile the code! + var/list/compileerrors = Server.compile(usr) // then compile the code! // Output all the compile-time errors src << output(null, "tcserror") diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index dcff5244f6d..f93bbb0cb67 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -66,7 +66,7 @@ interpreter.SetVar("$science", 1351) interpreter.SetVar("$command", 1353) interpreter.SetVar("$medical", 1355) - interpreter.SetVar("$engineering",1357) + interpreter.SetVar("$engineering", 1357) interpreter.SetVar("$security", 1359) interpreter.SetVar("$supply", 1347) interpreter.SetVar("$service", 1349) @@ -79,6 +79,12 @@ interpreter.SetVar("$job" , signal.data["job"]) interpreter.SetVar("$sign" , signal) interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0 + + var/datum/language/speaking = signal.data["language"] + if(speaking) + interpreter.SetVar("$language", speaking.name) + else + interpreter.SetVar("$language", "Unknown") // Set up the script procs @@ -102,49 +108,9 @@ */ interpreter.SetProc("mem", "mem", signal, list("address", "value")) - /* - -> Delay code for a given amount of deciseconds - @format: sleep(time) - - @param time: time to sleep in deciseconds (1/10th second) - */ - interpreter.SetProc("sleep", /proc/delay) - - /* - -> Replaces a string with another string - @format: replace(string, substring, replacestring) - - @param string: the string to search for substrings (best used with $content$ constant) - @param substring: the substring to search for - @param replacestring: the string to replace the substring with - - */ - interpreter.SetProc("replace", /proc/string_replacetext) - - /* - -> Locates an element/substring inside of a list or string - @format: find(haystack, needle, start = 1, end = 0) - - @param haystack: the container to search - @param needle: the element to search for - @param start: the position to start in - @param end: the position to end in - - */ - interpreter.SetProc("find", /proc/smartfind) - - /* - -> Finds the length of a string or list - @format: length(container) - - @param container: the list or container to measure - - */ - interpreter.SetProc("length", /proc/smartlength) - /* -- Clone functions, carried from default BYOND procs --- */ - - // vector namespace + + // Vector interpreter.SetProc("vector", /proc/n_list) interpreter.SetProc("at", /proc/n_listpos) interpreter.SetProc("copy", /proc/n_listcopy) @@ -153,19 +119,22 @@ interpreter.SetProc("cut", /proc/n_listcut) interpreter.SetProc("swap", /proc/n_listswap) interpreter.SetProc("insert", /proc/n_listinsert) - interpreter.SetProc("pick", /proc/n_pick) - interpreter.SetProc("prob", /proc/prob_chance) - interpreter.SetProc("substr", /proc/docopytext) + interpreter.SetProc("prob", /proc/n_prob) + interpreter.SetProc("substr", /proc/n_substr) + interpreter.SetProc("find", /proc/n_smartfind) + interpreter.SetProc("length", /proc/n_smartlength) - // Donkie~ // Strings interpreter.SetProc("lower", /proc/n_lower) interpreter.SetProc("upper", /proc/n_upper) - interpreter.SetProc("explode", /proc/string_explode) + interpreter.SetProc("explode", /proc/n_explode) + interpreter.SetProc("implode", /proc/n_implode) interpreter.SetProc("repeat", /proc/n_repeat) interpreter.SetProc("reverse", /proc/n_reverse) interpreter.SetProc("tonum", /proc/n_str2num) + interpreter.SetProc("replace", /proc/n_replace) + interpreter.SetProc("proper", /proc/n_proper) // Numbers interpreter.SetProc("tostring", /proc/n_num2str) @@ -176,8 +145,20 @@ interpreter.SetProc("round", /proc/n_round) interpreter.SetProc("clamp", /proc/n_clamp) interpreter.SetProc("inrange", /proc/n_inrange) - // End of Donkie~ + interpreter.SetProc("rand", /proc/n_rand) + interpreter.SetProc("randseed", /proc/n_randseed) + interpreter.SetProc("min", /proc/n_min) + interpreter.SetProc("max", /proc/n_max) + interpreter.SetProc("sin", /proc/n_sin) + interpreter.SetProc("cos", /proc/n_cos) + interpreter.SetProc("asin", /proc/n_asin) + interpreter.SetProc("acos", /proc/n_acos) + interpreter.SetProc("log", /proc/n_log) + // Time + interpreter.SetProc("time", /proc/n_time) + interpreter.SetProc("sleep", /proc/n_delay) + interpreter.SetProc("timestamp", /proc/gameTimestamp) // Run the compiled code interpreter.Run() diff --git a/code/modules/scripting/Implementations/_Logic.dm b/code/modules/scripting/Implementations/_Logic.dm index af422c4f04c..4034315aab3 100644 --- a/code/modules/scripting/Implementations/_Logic.dm +++ b/code/modules/scripting/Implementations/_Logic.dm @@ -1,15 +1,16 @@ // Script -> BYOND code procs #define SCRIPT_MAX_REPLACEMENTS_ALLOWED 200 + // --- List operations (lists known as vectors in n_script) --- -// Clone of list() +// Creates a list out of all the arguments /proc/n_list() var/list/returnlist = list() for(var/e in args) returnlist.Add(e) return returnlist -// Clone of pick() +// Picks one random item from the list /proc/n_pick() var/list/finalpick = list() for(var/e in args) @@ -23,7 +24,7 @@ return pick(finalpick) -// Clone of list[] +// Gets/Sets a value at a key in the list /proc/n_listpos(var/list/L, var/pos, var/value) if(!istype(L, /list)) return if(isnum(pos)) @@ -39,12 +40,12 @@ else L[pos] = value -// Clone of list.Copy() +// Copies the list into a new one /proc/n_listcopy(var/list/L, var/start, var/end) if(!istype(L, /list)) return return L.Copy(start, end) -// Clone of list.Add() +// Adds arg 2,3,4,5... to the end of list at arg 1 /proc/n_listadd() var/list/chosenlist var/i = 1 @@ -58,7 +59,7 @@ if(chosenlist) chosenlist.Add(e) -// Clone of list.Remove() +// Removes arg 2,3,4,5... from list at arg 1 /proc/n_listremove() var/list/chosenlist var/i = 1 @@ -72,34 +73,26 @@ if(chosenlist) chosenlist.Remove(e) -// Clone of list.Cut() +// Cuts out a copy of a list /proc/n_listcut(var/list/L, var/start, var/end) if(!istype(L, /list)) return return L.Cut(start, end) -// Clone of list.Swap() +// Swaps two values in the list /proc/n_listswap(var/list/L, var/firstindex, var/secondindex) if(!istype(L, /list)) return if(L.len >= secondindex && L.len >= firstindex) return L.Swap(firstindex, secondindex) -// Clone of list.Insert() +// Inserts a value into the list /proc/n_listinsert(var/list/L, var/index, var/element) if(!istype(L, /list)) return return L.Insert(index, element) -// --- Miscellaneous functions --- +// --- String methods --- -// Clone of sleep() -/proc/delay(var/time) - sleep(time) - -// Clone of prob() -/proc/prob_chance(var/chance) - return prob(chance) - -// Merge of list.Find() and findtext() -/proc/smartfind(var/haystack, var/needle, var/start = 1, var/end = 0) +//If list, finds a value in it, if text, finds a substring in it +/proc/n_smartfind(var/haystack, var/needle, var/start = 1, var/end = 0) if(haystack && needle) if(isobject(haystack)) if(istype(haystack, /list)) @@ -111,65 +104,41 @@ if(istext(haystack)) if(length(haystack) >= end && start > 0) return findtext(haystack, needle, start, end) - -// Clone of copytext() -/proc/docopytext(var/string, var/start = 1, var/end = 0) + +//Returns a substring of the string +/proc/n_substr(var/string, var/start = 1, var/end = 0) if(istext(string) && isnum(start) && isnum(end)) if(start > 0) return copytext(string, start, end) -// Clone of length() -/proc/smartlength(var/container) +//Returns the length of the string or list +/proc/n_smartlength(var/container) if(container) if(istype(container, /list) || istext(container)) return length(container) -// BY DONKIE~ -// String stuff +//Lowercase all characters /proc/n_lower(var/string) if(istext(string)) return lowertext(string) +//Uppercase all characters /proc/n_upper(var/string) if(istext(string)) return uppertext(string) -/* -//Makes a list where all indicies in a string is a seperate index in the list -// JUST A HELPER DON'T ADD TO NTSCRIPT -proc/string_tolist(var/string) - var/list/L = new/list() - - var/i - for(i=1, i<=lentext(string), i++) - L.Add(copytext(string, i, i)) - - return L - -proc/string_explode(var/string, var/separator) - if(istext(string)) - if(istext(separator) && separator == "") - return string_tolist(string) - var/i - var/lasti = 1 - var/list/L = new/list() - - for(i=1, i<=lentext(string)+1, i++) - if(copytext(string, i, i+1) == separator) // We found a separator - L.Add(copytext(string, lasti, i)) - lasti = i+1 - - L.Add(copytext(string, lasti, lentext(string)+1)) // Adds the last segment - - return L - -Just found out there was already a string explode function, did some benchmarking, and that function were a bit faster, sticking to that. -*/ -proc/string_explode(var/string, var/separator) - if(istext(string) && istext(separator)) +//Converts a string to a list +/proc/n_explode(var/string, var/separator = "") + if(istext(string) && (istext(separator) || isnull(separator))) return text2list(string, separator) -proc/n_repeat(var/string, var/amount) +//Converts a list to a string +/proc/n_implode(var/list/li, var/separator) + if(istype(li) && (istext(separator) || isnull(separator))) + return list2text(li, separator) + +//Repeats the string x times +/proc/n_repeat(var/string, var/amount) if(istext(string) && isnum(amount)) var/i var/newstring = "" @@ -182,7 +151,8 @@ proc/n_repeat(var/string, var/amount) return newstring -proc/n_reverse(var/string) +//Reverses the order of the string. "Clown" becomes "nwolC" +/proc/n_reverse(var/string) if(istext(string)) var/newstring = "" var/i @@ -193,45 +163,92 @@ proc/n_reverse(var/string) return newstring -// I don't know if it's neccesary to make my own proc, but I think I have to to be able to check for istext. -proc/n_str2num(var/string) +// String -> Number +/proc/n_str2num(var/string) if(istext(string)) return text2num(string) +/proc/n_proper(var/string) + if(!istext(string)) + return "" + + return text("[][]", uppertext(copytext(string, 1, 2)), lowertext(copytext(string, 2))) + + +// --- Number methods --- + +//Returns the highest value of the arguments +//Need custom functions here cause byond's min and max runtimes if you give them a string or list. +/proc/n_max() + if(args.len == 0) + return 0 + + var/max = args[1] + for(var/e in args) + if(isnum(e) && e > max) + max = e + + return max + +//Returns the lowest value of the arguments +/proc/n_min() + if(args.len == 0) + return 0 + + var/min = args[1] + for(var/e in args) + if(isnum(e) && e < min) + min = e + + return min + +/proc/n_prob(var/chance) + return prob(chance) + +/proc/n_randseed(var/seed) + rand_seed(seed) + return 0 + +/proc/n_rand(var/low, var/high) + if(isnull(low) && isnull(high)) + return rand() + + return rand(low, high) + // Number shit -proc/n_num2str(var/num) +/proc/n_num2str(var/num) if(isnum(num)) return num2text(num) // Squareroot -proc/n_sqrt(var/num) +/proc/n_sqrt(var/num) if(isnum(num)) return sqrt(num) // Magnitude of num -proc/n_abs(var/num) +/proc/n_abs(var/num) if(isnum(num)) return abs(num) // Round down -proc/n_floor(var/num) +/proc/n_floor(var/num) if(isnum(num)) return round(num) // Round up -proc/n_ceil(var/num) +/proc/n_ceil(var/num) if(isnum(num)) return round(num)+1 // Round to nearest integer -proc/n_round(var/num) +/proc/n_round(var/num) if(isnum(num)) if(num-round(num)<0.5) return round(num) return n_ceil(num) // Clamps N between min and max -proc/n_clamp(var/num, var/min=-1, var/max=1) +/proc/n_clamp(var/num, var/min=-1, var/max=1) if(isnum(num)&&isnum(min)&&isnum(max)) if(num<=min) return min @@ -240,52 +257,60 @@ proc/n_clamp(var/num, var/min=-1, var/max=1) return num // Returns 1 if N is inbetween Min and Max -proc/n_inrange(var/num, var/min=-1, var/max=1) +/proc/n_inrange(var/num, var/min=-1, var/max=1) if(isnum(num)&&isnum(min)&&isnum(max)) return ((min <= num) && (num <= max)) -// END OF BY DONKIE :( -// Non-recursive -// Imported from Mono string.ReplaceUnchecked -/proc/string_replacetext(var/haystack,var/a,var/b) - if(istext(haystack)&&istext(a)&&istext(b)) - var/i = 1 - var/lenh=lentext(haystack) - var/lena=lentext(a) - //var/lenb=lentext(b) +// Returns the sine of num +/proc/n_sin(var/num) + if(isnum(num)) + return sin(num) + +// Returns the cosine of num +/proc/n_cos(var/num) + if(isnum(num)) + return cos(num) + +// Returns the arcsine of num +/proc/n_asin(var/num) + if(isnum(num)&&-1<=num&&num<=1) + return arcsin(num) + +// Returns the arccosine of num +/proc/n_acos(var/num) + if(isnum(num)&&-1<=num&&num<=1) + return arccos(num) + +// Returns the natural log of num +/proc/n_log(var/num) + if(isnum(num)&&0 SCRIPT_MAX_REPLACEMENTS_ALLOWED) break - else - if (count < SCRIPT_MAX_REPLACEMENTS_ALLOWED) - dat+=found - count+=1 - else - //diary << "Script found [a] [count] times, aborted" - break - //diary << "Found [a] at [found]! Moving up..." - i = found + lena - if (count == 0) - return haystack - //var/nlen = lenh + ((lenb - lena) * count) - var/buf = copytext(haystack,1,dat[1]) // Prefill - var/lastReadPos = 0 - for (i = 1, i <= count, i++) - var/precopy = dat[i] - lastReadPos-1 - //internal static unsafe void CharCopy (String target, int targetIndex, String source, int sourceIndex, int count) - //fixed (char* dest = target, src = source) - //CharCopy (dest + targetIndex, src + sourceIndex, count); - //CharCopy (dest + curPos, source + lastReadPos, precopy); - buf+=copytext(haystack,lastReadPos,precopy) - diary << "buf+=copytext([haystack],[lastReadPos],[precopy])" - diary<<"[buf]" - lastReadPos = dat[i] + lena - //CharCopy (dest + curPos, replace, newValue.length); - buf+=b - diary<<"[buf]" - buf+=copytext(haystack,lastReadPos, 0) - return buf \ No newline at end of file + var/found = findtext(text, find, last_found, 0) + . += copytext(text, last_found, found) + if(found) + . += replacement + last_found = found + find_len + continue + return + +// --- Miscellaneous functions --- + +/proc/n_time() + return world.timeofday + +// Clone of sleep() +/proc/n_delay(var/time) + sleep(time) \ No newline at end of file diff --git a/code/modules/scripting/Interpreter/Evaluation.dm b/code/modules/scripting/Interpreter/Evaluation.dm index 02cdc929c5c..0b612608e7f 100644 --- a/code/modules/scripting/Interpreter/Evaluation.dm +++ b/code/modules/scripting/Interpreter/Evaluation.dm @@ -134,7 +134,7 @@ else if(isobject(b) && !isobject(a)) RaiseError(new/runtimeError/TypeMismatch("/", a, b)) return null - if(b==0) + if(b==0 || b==null) RaiseError(new/runtimeError/DivisionByZero()) return null return a/b diff --git a/code/modules/scripting/Scanner/Scanner.dm b/code/modules/scripting/Scanner/Scanner.dm index 35f21b39fd0..a667becea17 100644 --- a/code/modules/scripting/Scanner/Scanner.dm +++ b/code/modules/scripting/Scanner/Scanner.dm @@ -118,13 +118,14 @@ for(, src.codepos<=lentext(code), src.codepos++) var/char=copytext(code, codepos, codepos+1) + var/nextchar=copytext(code, codepos+1, codepos+2) if(char=="\n") line++ linepos=codepos if(ignore.Find(char)) continue - else if(char == "/") + else if(char == "/" && (nextchar == "/" || nextchar == "*")) ReadComment() else if(end_stmt.Find(char)) tokens+=new /token/end(char, line, COL) diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 0950f5d1594..8164fca3f39 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -122,7 +122,7 @@ confirmed = 0 trigger_event(event) log_game("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]") - message_admins("[key_name(event_triggered_by)] triggered and [key_name(event_confirmed_by)] confirmed event [event]", 1) + message_admins("[key_name_admin(event_triggered_by)] ([admin_jump_link(event_triggered_by, "holder")]) triggered and [key_name_admin(event_confirmed_by)] ([admin_jump_link(event_confirmed_by, "holder")]) confirmed event [event]", 1) reset() /obj/machinery/keycard_auth/proc/receive_request(var/obj/machinery/keycard_auth/source) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 621044a24e7..eb6ff7e1400 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -13,8 +13,8 @@ if(..(user)) return - if(!allowed(user)) - user << "\red Access Denied." + if(!allowed(user) && !isobserver(user)) + user << "Access Denied." return 1 ui_interact(user) diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index 09f1bce62a1..7ad8d881aa2 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -56,8 +56,8 @@ if(..(user)) return 1 - if(!allowed(user)) - user << "\red Access Denied." + if(!allowed(user) && !isobserver(user)) + user << "Access Denied." return 1 ui_interact(user) diff --git a/code/modules/store/store.dm b/code/modules/store/store.dm index 9f9ecc33919..f0199089704 100644 --- a/code/modules/store/store.dm +++ b/code/modules/store/store.dm @@ -22,7 +22,7 @@ var/global/datum/store/centcomm_store=new var/list/datum/storeitem/items=list() var/list/datum/storeorder/orders=list() - var/obj/machinery/account_database/linked_db + var/obj/machinery/computer/account_database/linked_db /datum/store/New() for(var/itempath in subtypesof(/datum/storeitem)) @@ -47,7 +47,7 @@ var/global/datum/store/centcomm_store=new return 1 /datum/store/proc/reconnect_database() - for(var/obj/machinery/account_database/DB in world) + for(var/obj/machinery/computer/account_database/DB in world) if((DB.z in config.station_levels)) linked_db = DB break diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index a11df776f3a..3a12e06abbe 100644 --- a/code/modules/surgery/braincore.dm +++ b/code/modules/surgery/braincore.dm @@ -92,9 +92,9 @@ if(borer) borer.detatch() //Should remove borer if the brain is removed - RR - user.attack_log += "\[[time_stamp()]\] Debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])" - target.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])" - msg_admin_attack("[user.name] ([user.ckey]) debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + user.attack_log += "\[[time_stamp()]\] Debrained [key_name(target)] with [tool.name] (INTENT: [uppertext(user.a_intent)])" + target.attack_log += "\[[time_stamp()]\] Debrained by [key_name(user)] with [tool.name] (INTENT: [uppertext(user.a_intent)])" + msg_admin_attack("[key_name_admin(user)] debrained [key_name_admin(target)] with [tool.name]") var/obj/item/organ/brain/B = target.internal_organs_by_name["brain"] if(B && istype(B)) diff --git a/code/modules/vehicle/train/train.dm b/code/modules/vehicle/train/train.dm index e180b52ee0f..aaf88bdbd18 100644 --- a/code/modules/vehicle/train/train.dm +++ b/code/modules/vehicle/train/train.dm @@ -55,7 +55,7 @@ if(istype(load, /mob/living/carbon/human)) var/mob/living/D = load D << "\red You hit [M]!" - msg_admin_attack("[D.name] ([D.ckey])[isAntag(D) ? "(ANTAG)" : ""] hit [M.name] ([M.ckey]) with [src]. (JMP)") + msg_admin_attack("[key_name_admin(D)] hit [key_name_admin(M)] with [src].") //------------------------------------------- diff --git a/code/modules/vehicle/train/trains/ambulance.dm b/code/modules/vehicle/train/trains/ambulance.dm index a6ba690d166..36baeecd86a 100644 --- a/code/modules/vehicle/train/trains/ambulance.dm +++ b/code/modules/vehicle/train/trains/ambulance.dm @@ -162,10 +162,10 @@ var/mob/living/carbon/human/D = load D << "\red \b You ran over [H]!" visible_message("\red \The [src] ran over [H]!") - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])") - msg_admin_attack("[D.name] ([D.ckey])[isAntag(D) ? "(ANTAG)" : ""] ran over [H.name] ([H.ckey]). (JMP)") + attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]") + msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]") else - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey])") + attack_log += text("\[[time_stamp()]\] ran over [key_name(H)]") //------------------------------------------- diff --git a/code/modules/vehicle/train/trains/janicart.dm b/code/modules/vehicle/train/trains/janicart.dm index 11fdf993b0b..0894d1b9e44 100644 --- a/code/modules/vehicle/train/trains/janicart.dm +++ b/code/modules/vehicle/train/trains/janicart.dm @@ -212,10 +212,10 @@ var/mob/living/carbon/human/D = load D << "\red \b You ran over [H]!" visible_message("\red \The [src] ran over [H]!") - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])") - msg_admin_attack("[D.name] ([D.ckey])[isAntag(D) ? "(ANTAG)" : ""] ran over [H.name] ([H.ckey]). (JMP)") + attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]") + msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]") else - attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey])") + attack_log += text("\[[time_stamp()]\] ran over [key_name(H)]") //------------------------------------------- diff --git a/code/world.dm b/code/world.dm index e56ce1ce9c8..2adf9da3032 100644 --- a/code/world.dm +++ b/code/world.dm @@ -30,7 +30,7 @@ var/global/datum/global_init/init = new () diaryofmeanpeople << "\n\nStarting up. [time2text(world.timeofday, "hh:mm.ss")]\n---------------------" if(byond_version < RECOMMENDED_VERSION) - world.log << "Your server's byond version does not meet the recommended requirements for this code. Please update BYOND" + log_to_dd("Your server's byond version does not meet the recommended requirements for this code. Please update BYOND") if(config && config.log_runtimes) log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log") @@ -42,6 +42,8 @@ var/global/datum/global_init/init = new () // dumb and hardcoded but I don't care~ config.server_name += " #[(world.port % 1000) / 100]" + timezoneOffset = text2num(time2text(0,"hh")) * 36000 + if(config && config.log_runtime) log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log") @@ -410,9 +412,9 @@ var/failed_old_db_connections = 0 /hook/startup/proc/connectDB() if(!setup_database_connection()) - world.log << "Your server failed to establish a connection with the feedback database." + log_to_dd("Your server failed to establish a connection with the feedback database.") else - world.log << "Feedback database connection established." + log_to_dd("Feedback database connection established.") return 1 proc/setup_database_connection() @@ -435,7 +437,7 @@ proc/setup_database_connection() failed_db_connections = 0 //If this connection succeeded, reset the failed connections counter. else failed_db_connections++ //If it failed, increase the failed connections counter. - world.log << dbcon.ErrorMsg() + log_to_dd(dbcon.ErrorMsg()) return . @@ -452,9 +454,9 @@ proc/establish_db_connection() /hook/startup/proc/connectOldDB() if(!setup_old_database_connection()) - world.log << "Your server failed to establish a connection with the SQL database." + log_to_dd("Your server failed to establish a connection with the SQL database.") else - world.log << "SQL database connection established." + log_to_dd("SQL database connection established.") return 1 //These two procs are for the old database, while it's being phased out. See the tgstation.sql file in the SQL folder for more information. @@ -478,7 +480,7 @@ proc/setup_old_database_connection() failed_old_db_connections = 0 //If this connection succeeded, reset the failed connections counter. else failed_old_db_connections++ //If it failed, increase the failed connections counter. - world.log << dbcon.ErrorMsg() + log_to_dd(dbcon.ErrorMsg()) return . diff --git a/config/example/config.txt b/config/example/config.txt index 0153daa34e6..1ee86a8a09c 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -54,6 +54,9 @@ LOG_PDA ## log world.log and runtime errors to a file LOG_RUNTIME +## log world.log messages +# LOG_WORLD_OUTPUT + ## log all Topic() calls (for use by coders in tracking down Topic issues) # LOG_HREFS diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 4bb4e58b096..01d38fd1c56 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -20,6 +20,8 @@ PASSWORD mypassword FEEDBACK_DATABASE paradise FEEDBACK_LOGIN mylogin FEEDBACK_PASSWORD mypassword +# Table prefix - make sure you properly prefix the tables currently marked as erro_ in the .sql file as this is not fully implemented +FEEDBACK_TABLEPREFIX erro # Track population and death statistics # Comment this out to disable diff --git a/html/create_object.html b/html/create_object.html index a1f115b7839..ac47cc7769b 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -27,7 +27,7 @@
- Type
+ Type
Offset: A @@ -39,12 +39,12 @@ Where:


- +