diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 15dccc0a805..4946add50f2 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -134,7 +134,7 @@ CREATE TABLE `SS13_death` ( DROP TABLE IF EXISTS `SS13_donators`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `donators` ( +CREATE TABLE `SS13_donators` ( `patreon_name` varchar(32) NOT NULL, `tier` int(2), `ckey` varchar(32) COMMENT 'Manual Field', diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index 6375ad8257f..9493caeb02d 100644 --- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm @@ -8,16 +8,16 @@ "ah" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Fore) "ai" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/BMPship/Fore) "aj" = (/mob/living/simple_animal/hostile/carp,/turf/space,/area/space) -"ak" = (/obj/machinery/porta_turret{lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) +"ak" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Gate) "al" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore) -"am" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) -"an" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Aft) +"am" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship/Gate) +"an" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Gate) "ao" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) "ap" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) -"aq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) +"aq" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Gate) "ar" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore) "as" = (/obj/structure/lattice,/turf/space,/area/space) -"at" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) +"at" = (/obj/machinery/porta_turret{lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) "au" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; equipment = 0; lighting = 0; locked = 0; operating = 0; pixel_y = 24; req_access = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore) "av" = (/obj/structure/table,/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship) "aw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 0; equipment = 3; locked = 0; operating = 0; req_access = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) @@ -25,41 +25,41 @@ "ay" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Aft) "az" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Aft) "aA" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship/Aft) -"aB" = (/obj/machinery/door/airlock/silver{locked = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Aft) +"aB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) "aC" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship/Aft) -"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/BMPship/Aft) -"aE" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft) -"aF" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship/Aft) -"aG" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aH" = (/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aI" = (/obj/item/restraints/handcuffs,/obj/structure/closet/crate,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aJ" = (/obj/item/scalpel,/obj/structure/closet/crate,/obj/item/tank/anesthetic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aK" = (/obj/item/bodybag,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aL" = (/obj/item/storage/box/syringes,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aO" = (/obj/machinery/computer/operating,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) +"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship/Gate) +"aE" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aF" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Gate) +"aG" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"aH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aI" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"aJ" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"aK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aL" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aM" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Gate) +"aN" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Gate) +"aO" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Gate) "aP" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship/Aft) -"aQ" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship/Aft) -"aR" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aS" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aT" = (/obj/structure/table,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aU" = (/obj/structure/table,/obj/item/storage/box,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aV" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aW" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Aft) -"aX" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/awaymission/BMPship/Aft) -"aY" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship/Aft) -"aZ" = (/obj/effect/gibspawner/generic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"ba" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) +"aQ" = (/obj/machinery/door/airlock/silver{locked = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Gate) +"aR" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship/Gate) +"aS" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/BMPship/Gate) +"aT" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship/Gate) +"aU" = (/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aV" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aW" = (/obj/item/scalpel,/obj/structure/closet/crate,/obj/item/tank/anesthetic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aX" = (/obj/item/restraints/handcuffs,/obj/structure/closet/crate,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aY" = (/obj/item/storage/box/syringes,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aZ" = (/obj/item/bodybag,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"ba" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) "bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship/Aft) -"bc" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Aft) +"bc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) "bd" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"be" = (/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bf" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bg" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bh" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bi" = (/obj/item/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bj" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) +"be" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship/Gate) +"bf" = (/obj/machinery/computer/operating,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"bg" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bh" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship/Gate) +"bi" = (/obj/structure/table,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bj" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) "bk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "bl" = (/obj/item/stack/spacecash/c500,/obj/item/stack/spacecash/c100,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) "bm" = (/obj/structure/stool/bed,/obj/item/bedsheet/yellow,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) @@ -69,17 +69,17 @@ "bq" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Fore) "br" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/awaymission/BMPship/Fore) "bs" = (/obj/structure/sign/vacuum,/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship/Fore) -"bt" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Aft) -"bu" = (/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Aft) -"bv" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"bw" = (/obj/machinery/door/unpowered/shuttle,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated,/area/awaymission/BMPship/Aft) -"bx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Aft) -"by" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bz" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bA" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bB" = (/obj/machinery/gateway/centeraway{calibrated = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bD" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) +"bt" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bu" = (/obj/structure/table,/obj/item/storage/box,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bv" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Gate) +"bw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 2; equipment = 0; lighting = 0; locked = 0; operating = 1; req_access = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bx" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship/Gate) +"by" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/awaymission/BMPship/Gate) +"bz" = (/obj/effect/gibspawner/generic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"bA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"bB" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship/Gate) +"bC" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Gate) +"bD" = (/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) "bE" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "bF" = (/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) "bG" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) @@ -87,10 +87,10 @@ "bI" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore) "bJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship/Aft) "bK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bL" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bM" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bN" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bO" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) +"bL" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bM" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bN" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bO" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Gate) "bP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "bQ" = (/turf/simulated/floor/plasteel{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/awaymission/BMPship/Fore) "bR" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Fore) @@ -98,15 +98,15 @@ "bT" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship/Fore) "bU" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship/Fore) "bV" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"},/area/awaymission/BMPship/Aft) -"bW" = (/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"bX" = (/obj/machinery/door_control{id = "packerMed"; pixel_y = -24},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"bY" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) +"bW" = (/obj/item/hand_labeler,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bX" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Gate) +"bY" = (/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Gate) "bZ" = (/obj/machinery/seed_extractor,/obj/item/seeds/plump/walkingmushroom,/turf/simulated/floor/plasteel{tag = "icon-green"; icon_state = "green"},/area/awaymission/BMPship/Midship) -"ca" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"cb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"cc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"cd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"ce" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) +"ca" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"cb" = (/obj/machinery/door/unpowered/shuttle,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated,/area/awaymission/BMPship/Gate) +"cc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Gate) +"ce" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) "cf" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/BMPship/Fore) "cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship/Fore) "ch" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plasteel{tag = "icon-carpetside (NORTH)"; icon_state = "carpetside"; dir = 1},/area/awaymission/BMPship/Fore) @@ -117,17 +117,17 @@ "cm" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Midship) "cn" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/BMPship/Aft) "co" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Aft) -"cp" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"cq" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship/Aft) -"cr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cs" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"ct" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cu" = (/obj/structure/closet/crate,/obj/item/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cv" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cw" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cz" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship/Aft) +"cp" = (/obj/machinery/gateway/centeraway{calibrated = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cq" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cr" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"ct" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cu" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship/Gate) +"cv" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cw" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cx" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cy" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Gate) +"cz" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"},/area/awaymission/BMPship/Gate) "cA" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore) "cB" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore) "cC" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore) @@ -151,7 +151,7 @@ "cU" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship) "cV" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship) "cW" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Aft) -"cX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerCargo"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) +"cX" = (/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) "cY" = (/turf/simulated/floor/plasteel{tag = "icon-carpet15-13 (EAST)"; icon_state = "carpet15-13"; dir = 4},/area/awaymission/BMPship/Fore) "cZ" = (/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore) "da" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore) @@ -473,6 +473,27 @@ "je" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaymission) "jf" = (/turf/space,/area/crew_quarters/bar) "jg" = (/turf/space,/area/exploration/methlab) +"jh" = (/obj/machinery/door_control{id = "packerMed"; pixel_y = -24},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"ji" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"jj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jn" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Gate) +"jo" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jp" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/BMPship/Gate) +"jq" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"jr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"js" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship/Gate) +"jt" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"ju" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jv" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jw" = (/obj/structure/closet/crate,/obj/item/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jy" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jz" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship/Gate) +"jA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerCargo"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -523,18 +544,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaCaxaxayaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamakezdhaoancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaajaaaaaaapezezeybdbdancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaaqakatdhbdbdbdcWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaEaxaxaxaxaxaxaxaxaxayaxaxaxazaAaBaCazazaxaDcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaVaVaVaVaVaWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagagagagagagagaiaaaaaaaaaaaaasaXaYaHaHaZaHaHaHbaaHaHbbbcbdbdbebdbdbfbgbhbdbibjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblbmbnbobpbqbpbqbpbrbsaaaaaaaaaaasbtaYaHbuaHaHaHaGaHbvaNaNbwbxbybdbzbdbdbAbBbCbDbdbjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaEaFaHbuaYaHbuaHaHaHaZaHaHaHbJbcbKbdbdbdbdbLbMbNbdbdbOaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaEbVbtbuaHbWbXaHaHaHbYaHbWbYaHaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCaucCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUavcVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaamakakanakaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBataEaDaGaFaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaajaaaaaaaHaEaEaIaJaJaFaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaaKataLaDaJaJaJaMaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaNakakakakakakakakakanakakakaOaRaQamaOaOakaSaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaTaVaUaXaWaZaYbcbabfbebhbgbjbibubtbtbtbtbtbwbvaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagagagagagagagaiaaaaaaaaaaaaasbybxaUaUbzaUaUaUbAaUaUbBbCaJaJbDaJaJbMbLbNaJbWbObeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblbmbnbobpbqbpbqbpbrbsaaaaaaaaaaasbXbxaUbYaUaUaUaVaUcababacbcdccaJceaJaJcqcpcscrctbObeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaNaTaUbYbxaUbYaUaUaUbzaUaUaUcubCctaJaJaJaJcwcvcxaJctcybeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaNczbXbYaUcXjhaUaUaUjiaUcXjiaUbebCjjjljkjkjmjkjkjkjkjojnbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmjpakakakakaRjqjqjqamakakakakczjsjrjujtjrjrjwjvjyjxjAjzbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCaucCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUavcVaMakakakakakakakakanaRjBamjpcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxaycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdodoawdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQbZdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVcDdIdZeaebdYbbedeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index 479699ce0f2..f37709c438e 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -520,7 +520,7 @@ "jZ" = (/obj/structure/table,/obj/item/firstaid_arm_assembly,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "ka" = (/obj/structure/table,/obj/item/flash,/obj/item/flash,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "kb" = (/obj/structure/stool/bed/chair{dir = 1},/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar) -"kc" = (/obj/structure/table,/obj/item/mmi/radio_enabled,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) +"kc" = (/obj/structure/table,/obj/item/mmi,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "kd" = (/obj/structure/table,/obj/item/storage/toolbox/mechanical,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "ke" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "101"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general) "kf" = (/obj/machinery/door/window/northright,/obj/machinery/door/window/southleft,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general) @@ -971,4 +971,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index b7b54265947..cad77b182db 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5878,7 +5878,7 @@ "cjb" = (/obj/machinery/door/airlock/external{id_tag = "mining_home";name = "Mining Dock Airlock";req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) "cjc" = (/obj/structure/sign/poster/random{pixel_x = 32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) "cjd" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) -"cje" = (/obj/structure/table/wood,/obj/item/clipboard{pixel_x = -2},/obj/item/folder,/obj/item/stamp/centcom,/obj/item/pen/multi/fountain,/turf/simulated/floor/carpet,/area/ntrep) +"cje" = (/obj/structure/disposalpipe/segment{dir = 2;icon_state = "pipe-c"},/obj/structure/cable{d1 = 2;d2 = 8;icon_state = "2-8";tag = ""},/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cjf" = (/obj/structure/table/wood,/obj/machinery/computer/skills{req_access_txt = "57"},/turf/simulated/floor/carpet,/area/ntrep) "cjg" = (/turf/simulated/floor/plasteel{dir = 8;icon_state = "brown"},/area/quartermaster/miningdock) "cjh" = (/obj/machinery/alarm{dir = 8;icon_state = "alarm0";pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) @@ -6108,7 +6108,7 @@ "cnx" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "0-4";d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/power/apc{dir = 2;name = "south bump";pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cny" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/aft) "cnz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4;d2 = 8;icon_state = "4-8";pixel_x = 0;tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8;icon_state = "pipe-j1s";name = "HoP Office";sortType = 15},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"cnA" = (/obj/structure/disposalpipe/segment{dir = 2;icon_state = "pipe-c"},/obj/structure/cable{d1 = 2;d2 = 8;icon_state = "2-8";tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cnA" = (/obj/structure/table/wood,/obj/item/clipboard{pixel_x = -2},/obj/item/folder,/obj/item/pen/multi/fountain,/obj/item/stamp/rep,/turf/simulated/floor/carpet,/area/ntrep) "cnB" = (/obj/structure/table/wood,/obj/item/ashtray/glass{pixel_x = -4;pixel_y = -4},/obj/item/lighter/zippo/blue{pixel_x = 7;pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) "cnC" = (/obj/machinery/keycard_auth{pixel_x = -24;pixel_y = 0},/obj/machinery/door/window{dir = 1;name = "Desk Door";req_access_txt = "67"},/turf/simulated/floor/wood,/area/blueshield) "cnD" = (/obj/structure/table/wood,/obj/item/paper_bin,/obj/item/pen/blue,/obj/item/folder/blue{pixel_x = 4;pixel_y = 6},/obj/item/paper/blueshield,/obj/item/book/manual/sop_command,/turf/simulated/floor/plasteel{icon_state = "bcarpet05"},/area/blueshield) @@ -6191,7 +6191,7 @@ "cpc" = (/obj/structure/sink{icon_state = "sink";dir = 8;pixel_x = -12;pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint) "cpd" = (/obj/machinery/shower{tag = "icon-shower (WEST)";icon_state = "shower";dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint) "cpe" = (/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"cpf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cpf" = (/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cpg" = (/obj/machinery/requests_console{announcementConsole = 1;department = "Blueshield";departmentType = 5;name = "Blueshield Requests Console";pixel_x = -30},/turf/simulated/floor/wood,/area/blueshield) "cph" = (/obj/structure/table/wood,/obj/item/paper_bin,/obj/item/flashlight/lamp/green{pixel_x = -5;pixel_y = 12},/obj/item/paper/ntrep,/turf/simulated/floor/carpet,/area/ntrep) "cpi" = (/obj/machinery/requests_console{announcementConsole = 1;department = "NT Representative";departmentType = 5;dir = 2;name = "NT Representative Requests Console";pixel_x = 30},/turf/simulated/floor/wood,/area/ntrep) @@ -6268,7 +6268,7 @@ "cqB" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cqC" = (/turf/simulated/floor/plasteel/airless{tag = "icon-warningcorner (NORTH)";icon_state = "warningcorner";dir = 1},/area/toxins/test_area) "cqD" = (/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"cqE" = (/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cqE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2;d2 = 8;icon_state = "2-8";tag = ""},/obj/structure/cable{d1 = 1;d2 = 8;icon_state = "1-8";tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cqF" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cqG" = (/obj/machinery/door_control{id = "blueshield";name = "Privacy Shutters Control";pixel_x = 0;pixel_y = -24;req_access_txt = "67"},/obj/machinery/computer/crew,/turf/simulated/floor/wood,/area/blueshield) "cqH" = (/obj/structure/closet/secure_closet/blueshield,/obj/machinery/firealarm{dir = 8;pixel_x = -24},/turf/simulated/floor/wood,/area/blueshield) @@ -6790,7 +6790,7 @@ "cAD" = (/obj/structure/cable{d1 = 4;d2 = 8;icon_state = "4-8";pixel_x = 0;tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cAE" = (/obj/structure/closet,/obj/item/card/id,/turf/simulated/floor/plating,/area/maintenance/genetics) "cAF" = (/obj/structure/cable{d1 = 4;d2 = 8;icon_state = "4-8";pixel_y = 0;tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area";req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/consarea) -"cAG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2;d2 = 8;icon_state = "2-8";tag = ""},/obj/structure/cable{d1 = 1;d2 = 8;icon_state = "1-8";tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cAG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cAH" = (/obj/structure/cable{icon_state = "0-4";d2 = 4},/obj/structure/cable,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/tech) "cAI" = (/obj/structure/cable{icon_state = "0-4";d2 = 4},/obj/structure/cable{d2 = 8;icon_state = "0-8"},/obj/effect/spawner/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/storage/tech) "cAJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/asmaint) @@ -6924,7 +6924,7 @@ "cDh" = (/obj/structure/table,/obj/item/pda,/turf/simulated/floor/plating,/area/maintenance/genetics) "cDi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'.";name = "KEEP CLEAR: DOCKING AREA";pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/mechanic_workshop) "cDj" = (/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint) -"cDk" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2";tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cDk" = (/obj/structure/cable{d1 = 1;d2 = 8;icon_state = "1-8";tag = ""},/obj/structure/disposalpipe/junction{dir = 1;icon_state = "pipe-y"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) "cDl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/item/radio/intercom{dir = 8;name = "station intercom (General)";pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8;icon_state = "cautioncorner"},/area/hallway/primary/aft) "cDm" = (/obj/effect/spawner/random_spawners/fungus_maybe,/turf/simulated/wall,/area/maintenance/asmaint) "cDn" = (/obj/effect/spawner/random_barrier/floor_probably,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -7024,7 +7024,6 @@ "cFd" = (/obj/structure/cable{d1 = 4;d2 = 8;icon_state = "4-8";pixel_x = 0;tag = ""},/obj/machinery/status_display{density = 0;layer = 4;pixel_x = 0;pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1;initialize_directions = 11;level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) "cFe" = (/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/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) "cFf" = (/obj/structure/disposalpipe/junction{dir = 8;icon_state = "pipe-j2";tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) -"cFg" = (/obj/structure/cable{d1 = 1;d2 = 8;icon_state = "1-8";tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{dir = 1;icon_state = "pipe-y"},/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) "cFh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) "cFi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) "cFj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Aft Primary Hallway 3";dir = 2;network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4;icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -9064,19 +9063,19 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIckdceRceRciTbRrbRAbRAbRrciUbRAbRAciVckhbPIbXEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfRckicimcimciWciXcfbcfbcjbcjgcfbcfbciscjicjhbYMbYMbYMbYMbYMbYMckpcgQchEcgSclRcjjcjlcjkckucgWckvcjmcjocjncePcgWcjpceQcjrchccjtcjscjvcjucjxcjwchcchfcjychfcebcebcfrcebchfcsLcgychfcjAcjzcjCcjBcjEcjDcfGcjFcjIcjHcjMcjLcjQcjPcDfcjScfPcjTcjYcjUckfckeckjckgcklckkcepckmcgacfZclpckncjGcjGclmckocjGckqclpcbjclqccZclrclrcbjcajclscalbPtcgsckrcgscgscgscgscgscgscgscluckscguckxckzckycguafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOafOckAcjZcjZclAciecieckbckbckBckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIclCclDclEbRrbRAclFbRrclGckDbRAbPIbPIbXEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceYcincincinceYbYPclJckFckEcjgcfbcfbclLckHckGckKckIckIckIckNcgQcgQcgQchEcgSclRcktclScktckOcgWckvckwclUckwckPcgWckRcHDckSchcckUcmacmbckVchbcgXchcchdckWchfchfchichfchfchfcsLcgychfckYckXclackZcjEclbcfGcjFclccjHclecldclgclfcDfchuclhcDfcljclicllclkcloclnclvcltcepclwcgaclxclpckncmMcjGcjGcjGclycmOclpcbjcmPccZclrclrcbjclzbUzcalbPtcmSclBcmUcgsclHclKclIclMcmZcnaclNcgucnccndcnecgucgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaclOcieckAciecieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaebPIbPIbPIbPIbPIbPIbPIbPIbPIbPIbXEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabafOcgQcngcngcgQcngcngcgQaaaaaacfRcnhcnicnjcfRbYPbYPbYPcamclQclPclTclTclTcamcamcgQcnnclVclYclWcgQclZcmccgSclRcktcktcktcmdcgWckvckwckwcnucmecgWcmgcHDcmhchcchcchcchcchccmichcchccmjcjycsLcsLcsLchfcABchJcsLcgychfcmkchKcmmcmlcjEcmncfGcjFcjIcjHcmqcmpciQcmrcDfciRcmscDfcmucmtchrcmvcmxcmwchrchrcepciYcjaciZclpcmzcodcmAcmAcmAcodcogcodcodcohcmBclrclrcbjcmCclscalcmDcolcmHcmEcmQcmIcoqcoqcmTcoscmVcoucmWcowcmXcoycnbcmYcoBcnfcoEcnkcnmcnlcnoaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacidciecnqcnpcnpckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacnrcdQcoNcdQcnsaaaaabaaacamcamcamcamcamcamcamcoPcgQcnvcntcnxcnwckIcnzcnAcgScnCcnBcnDcktcjccgWcjdckwcjfcjecnEcgWcnGcnFcnIcnHcnJcnJcnJcnJcnLcnKcnNcnMcnPcnOcnOcnQcjqcnRcnTcnScnUchfcnXcnWcnZcnYcobcoacoecoccoecofcojcoicomcokcooconcopcDfcorccWckCcotcoxcovcoAcozciYckJckLcgacpRcoCcpRcoDcoGcoFcpRcoHcoIcodcoMcoJcdacbjcbjcoOcqbcoQcqdcqecoRcqgcqhcoScqjcqkcoTcqmcoUcqocoVcqqcqrcqqcqscqrcqrcoWcoYcoXcoZcqxcpaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecpbckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcpccpdcgQcpecgQcgQcqFcgQcgQcpfcgScpgcqIcqJcqKcqLcgWckMcqOcphcqQcpicgWcpkcpjcplcJZcsDcsDcsDcsDcsDcpmcqZcrackQchfcuccpncsLcpockTcsLcsKchfcpqcppcpucptcCWcpvcpycpwcpzcDfcpBcpAcpFcpDcDfcDfcDfcDfcpHcpGckCcpJcpLcpKcpNcpMciYcpOcgacmfcpRcpPcpScrLcrMcrLcpTcrOcrPcodcbjcpUcbjcbjcrRcrSclsbLRbPtcgscpVcgscgscpWcpYcpXcqacpZcqfcqccqlcqicqncqicqncqpcqncqtcgEcqucrwcqvcqwaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcqyckbcqCckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcqDcgQcsocspcoLcgQcqEcgScqHcqGcqPclRcqRcgWcswckvcqTcqScqUcgWcqXcqWcqYcsDcsDcrbcrccsGcrfcrdcsJcsKcsLcrgchfcrhcsLcpockTchfchfchfcCWcCWcricCWcCWcxhcrkcrjcxhcDfcDfcDfcDfcDfcDfcrmcrncmocrpcrocrrcrqcrucrtcrxcrvciYcgacgacrycpRcrAcrCcrBcrFcrBcrHcrGcrLctuctvcrJbLRcrNbLRcrSclsbLRbIicrQcrUcrTcgscgscgscgscgscrVcqkcrWctDcsccqkctEcqkclucqkcrXcgEcrYcsacrZcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJcsbckbcsdctJcqCckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcnvcsecsecsfcsecsecsecsecsecsecsecsecsecsecsecsecntcgQcskcqzcsgcgQcqEctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWcsicshcsqcsncsscsrcmFcmFcmGcstcsJcsucsLcubcuccsvcsLcpocmJchicsLcsLcsKcCWcmLcmKcmNcCWcsycsxcsAcszcsEcsCcsIcsHcsOcsNcsRcsQcsTcsSckCcsUcsWcsVcsYcsXciYbQXcgacgacpRcsZctbctactccrLctectdctgctfcticthctjbLRctkcrSclscuMbIibPAcuNctlcuPcuQbGGbGGcgsctmctncuTcuUctocuWctpctrcuZcvacvbcgEcttdoKdoFctwaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaactxcjZcjZcjZcjZcjZcjZcjZcvhctyckbckbckbckbctzckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabaabafOcngcvkcvlcvmcoLcoLcvncoLcoLcqDcgQcgQcgQcgQcgQcgQcqFcgQcgQcgQcgQcvocvocvocvocvocvocvocvocvocgQcqEcvpaaaaaaaaaaaacvqctActCctBcvuctFctGcvxctIctHctKcvBcvCctLcvEcvEcvFctOcvHcvIcvIcvIcvIctPcvIcpocmJchfcnVcKOdercCWctSctQctUctTctWctVctXctXcudcuacufcuecuhcugcujcuiculcukciYciYciYciYciYciYciYciYcupcuncpRcwjcurcuqcutcuscuvcuucpRcpRbIicwpbIibIibIicuwcuzcuybIibGGcuNcuAcwucuQcuQcuQcgscgscgscgscgscgscgscgscgscgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecnpcnpcnpcnpcnpcnpcuBckbcnqcnpcuCckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcqDcwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLcpfcngaaacuDcuGcuFcuHcwNcwOcuIcuJcwRcwScwTcuLcuKcuRcuOcuVcuScuYcuXcvecvccvHcvfcvgcvgcvgcvicvIcpocmJchfdgmcQkcQkcQkcQkcvjcpxcQkcvrcvrcvrcvrcQkcvscvvcvtcQkcQncQncpCcvwcuocvybQXbQXcpEbQXbQXbQXbQXbQXcvzcpRcpRcpRcpRcvAcpRcpRcpRcxIcvDcpIcxKcvGcxMcxNcxOcvJcxQcxNbGGcuNcvKbGGbGGcxScxZcyacrQbGGbGGbGGbGGbGGbGGbGGcxVcvLbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcqyckbcuCckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxXcxYcxYcxYcxYcxYcxYcvNcvMcybcyccydcyecyfcwycqDcygcgQcoLcoLcwBcoLcoLcoLcwDcqBcwBcvocwFcyicwIcwIcyjcwIcykcvocvOcpfcngaaacvQcvScvRcvUcyqcwOcvVcvXcvWcyucvxcvYcqWcwacvBcyxctYcwbctYcyzcwccyBcwdcyDcyDcyDcwecvIcpocmJchfcQkcQkcwgcwfcQkcQkcQkcQkcwicwhcwlcwkcQkcQkcwmcQkcQkcTBdgmbQVcwnccWcqMcqMcqMcqMcqMcqMcqNbQXcwrcwqcwscwscwscwtcwwcwvcwvcwJcwvcwvcwvcwKcwLcwLcwPcwMcwUcwQcwWcwVcwYcwXcwZcwZcxacwZcwZcwZcwZcxbcxccwZcwZcwZcxecxdbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieciecpbckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFcxfczHcxgczJczKczKcxjcwxcqDcoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcqEcngaaacvQcxlcxkcxocxmcxrcxqcxscxmcxmcxtcxvcxucxwczZczZcxxcxyctYcxAcxzcyBcyDcyDcyDcyDcxCcvIcxDcmJcrlcQkcxFcxHcxGcUTcxJcxPcxLcxRcrscxUcxTcQncxWcylcyhcQkcrzcsLcvycymccWcrEcyncypcyocyrcqMcqMbUxcyscrIcrKcrKcrKcrKcsBcytcsMcsFcyvcsPcsPcAKcAKcAJcALcywcyAcyycAPcAPcAQcyCcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScyEcAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclOcieciectJctJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyGcyFcAXcyHcAXcyIcBacBbcBccBdcyLcwxcqDcgQcgQcBfcngcngcngcngcngcngcngcyMcvocwIcwIcwIcwIcBhcwIcwIcvocygcpfcngaaacvQcyQcyNcBkcBlcwOcyScyVcyUcBpcvxcvYcqWcnycyWcsDcyXcsDcvBcvBcvBczacyYcyDcyDczeczdcvIcpocmJcsLcQkcziczpczmczucztczwczvczyczxczAczzczCczBczGczDcQkcsLcJGbQVczLczIczPczOczRczQczTczScqMctqczUcfZcepcepcepcepcepctsctsctscepcepaaaaaaaaaaaacBRcBSczVcBUcAPczWczYczXcAacBZcAbcCbcCccAccAecAdcAgcAfcAhcAPcAScAicAkcAjcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAncAmcieckAcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyGcAocApcCqcAqczJcCtcArcAtczJcAxcAwcAycskcgQcoLcngaaaaaaaaaaaaaaacngcoLcAAcwFcCAcwIcwIcwIcwIcACcAFcADcAGcngaaacAHcuGcAIcuHcAMcwOcwOcATcARcCKcCLcAWcAVcAYcyWcsDcAZcCQcBecCScBgcvHcBicyDcyDcyDcBjcvIcpocmJctZcQkcBmcBocBncUTcBqcBscBrcumcBtcBvcBucQncBxcvdcBycQkcsLcrDcrDcBAcBzcuxcBBcBDcBCcBFcBEcqMcBIcBJbQXcepaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcBLcBWcBVcDucBXcDwcDwcBYcDwcDwcDwcDwcDwcCdcCacCfcCecCgbGHcChbUlbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecCicCkcCjciecieckbckbcClckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyGcCmcAXcCncAXcCocDLcCpcCrcBbcDOcwxcCscqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocwFcwFcwFcDScDTcwIcCucvocoLcpfcvpaaaaaaaaaaaacvqcCvcDWcCwcCwcvxcDYcvxcCxcqWcnycCycCzcEccCCcCBcCBcCBcCDcEgcyDcEhcyDcCEcvIcpocmJcuEcQkcCFcCHcCGcQkcCIcUTcvPcCJcQncQncQncQkcQkcQkcQkcQkcsLcrDcCMcvTcCNcuxcCOcCRcCPcCUcCTcqMcsLczUbQXcepaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcCXcCVcCZcCYcDbcDacDccDwcDwcEPcDwcDwcCdcCfcCfcCfcDdbGHcDebGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcDicEWcEWcEWcEWcEWcDjcEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcDkcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcDlcqWcnycDrcDtcDscDycDvcDAcDzcDCcDBcDDcFmcFncDEcvIcpocmJcKOcBPcvZdcCcQkcQkcDFcDGcUTcDIcDHcDKcDJcDNcDMcDPcQkcPccnVcrDcDUcDXcDVcuxcuxcEbcDZcEecEdcqMcsLczUbQXctsaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEfcEjcEicFKcEkcFMcElcEmcDwcDwcDwcDwcEncEpcEocEtcEscEwbGHcDebGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciechwaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcEJcFXcEKcFWcELcGbcGccGccENcEMcEOcDRcERcEQcEXcEVcFbcEZcEZcFccEZcFdcFecFecFgcFfcFicFhcFjcFhcFhcFhcFicFhcFhcFkcFocFlcFrcqWcnycFtcFvcFucGCcsDcFwczZcGEcGFcGGcGHcxicFxcGKcpocmJcFychfdcDcxpcxncQkcFzcFAcUTcFCcFBcFEcFDcUTcFFcFGcQkcsLcBwcrDcFHcmycFIcxBcuxcBPcBPcBPcBPchfcebczUbQXctsaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcFJcHgcBScFLcHicHjcFOcFNcFQcFPcDwcDwcHocHpcHqcHrcHsbGHcDebGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacgQcoKcoLcgQcoKcoLcgQaaaaaacnrcdQcoNcdQcnsaaaaabaaacamcamcamcamcamcamcamcoPcgQcnvcntcnxcnwckIcnzcjecgScnCcnBcnDcktcjccgWcjdckwcjfcnAcnEcgWcnGcnFcnIcnHcnJcnJcnJcnJcnLcnKcnNcnMcnPcnOcnOcnQcjqcnRcnTcnScnUchfcnXcnWcnZcnYcobcoacoecoccoecofcojcoicomcokcooconcopcDfcorccWckCcotcoxcovcoAcozciYckJckLcgacpRcoCcpRcoDcoGcoFcpRcoHcoIcodcoMcoJcdacbjcbjcoOcqbcoQcqdcqecoRcqgcqhcoScqjcqkcoTcqmcoUcqocoVcqqcqrcqqcqscqrcqrcoWcoYcoXcoZcqxcpaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacieciecpbckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOaaaafOcgQcqzcoLcgQcqzcoLcgQaaaaaaaabaabaabaabaabaabaabaabaabcgQcoLcqAcqBcgQcpccpdcgQcpecgQcgQcqFcgQcgQchEcgScpgcqIcqJcqKcqLcgWckMcqOcphcqQcpicgWcpkcpjcplcJZcsDcsDcsDcsDcsDcpmcqZcrackQchfcuccpncsLcpockTcsLcsKchfcpqcppcpucptcCWcpvcpycpwcpzcDfcpBcpAcpFcpDcDfcDfcDfcDfcpHcpGckCcpJcpLcpKcpNcpMciYcpOcgacmfcpRcpPcpScrLcrMcrLcpTcrOcrPcodcbjcpUcbjcbjcrRcrSclsbLRbPtcgscpVcgscgscpWcpYcpXcqacpZcqfcqccqlcqicqncqicqncqpcqncqtcgEcqucrwcqvcqwaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaacieckbckbckbckbckbckbcqyckbcqCckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcsjafOaabaMraMrafOcgQcgQcqFcgQcgQcqFcgQcgQcgQcngcngcngcgQcgQcgQcgQcgQcgQcgQcoLcskcslcgQcsmcgQcgQcqDcgQcsocspcoLcgQcpfcgScqHcqGcqPclRcqRcgWcswckvcqTcqScqUcgWcqXcqWcqYcsDcsDcrbcrccsGcrfcrdcsJcsKcsLcrgchfcrhcsLcpockTchfchfchfcCWcCWcricCWcCWcxhcrkcrjcxhcDfcDfcDfcDfcDfcDfcrmcrncmocrpcrocrrcrqcrucrtcrxcrvciYcgacgacrycpRcrAcrCcrBcrFcrBcrHcrGcrLctuctvcrJbLRcrNbLRcrSclsbLRbIicrQcrUcrTcgscgscgscgscgscrVcqkcrWctDcsccqkctEcqkclucqkcrXcgEcrYcsacrZcgEaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciectJctJctJctJctJctJcsbckbcsdctJcqCckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOafOcngcoLcoLcoLcoLctMctNcoLcoLcnvcsecsecsfcsecsecsecsecsecsecsecsecsecsecsecsecntcgQcskcqzcsgcgQcpfctRctRctRctRctRctRcgWcgWcgWcgWcgWcgWcgWcsicshcsqcsncsscsrcmFcmFcmGcstcsJcsucsLcubcuccsvcsLcpocmJchicsLcsLcsKcCWcmLcmKcmNcCWcsycsxcsAcszcsEcsCcsIcsHcsOcsNcsRcsQcsTcsSckCcsUcsWcsVcsYcsXciYbQXcgacgacpRcsZctbctactccrLctectdctgctfcticthctjbLRctkcrSclscuMbIibPAcuNctlcuPcuQbGGbGGcgsctmctncuTcuUctocuWctpctrcuZcvacvbcgEcttdoKdoFctwaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaactxcjZcjZcjZcjZcjZcjZcjZcvhctyckbckbckbckbctzckccieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabaabafOcngcvkcvlcvmcoLcoLcvncoLcoLcqDcgQcgQcgQcgQcgQcgQcqFcgQcgQcgQcgQcvocvocvocvocvocvocvocvocvocgQcpfcvpaaaaaaaaaaaacvqctActCctBcvuctFctGcvxctIctHctKcvBcvCctLcvEcvEcvFctOcvHcvIcvIcvIcvIctPcvIcpocmJchfcnVcKOdercCWctSctQctUctTctWctVctXctXcudcuacufcuecuhcugcujcuiculcukciYciYciYciYciYciYciYciYcupcuncpRcwjcurcuqcutcuscuvcuucpRcpRbIicwpbIibIibIicuwcuzcuybIibGGcuNcuAcwucuQcuQcuQcgscgscgscgscgscgscgscgscgscgscgscgscgEcgEcgEcgEcgEaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaciecnpcnpcnpcnpcnpcnpcuBckbcnqcnpcuCckbckbckbckbcieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgQcwxcwxcwxcwxcwxcwxcwycwxcqDcwzcgQcoLcwAcwBcwCcoLcwCcwDcwEcwBcvocwFcwFcvocwGcvocwHcwIcvocoLchEcngaaacuDcuGcuFcuHcwNcwOcuIcuJcwRcwScwTcuLcuKcuRcuOcuVcuScuYcuXcvecvccvHcvfcvgcvgcvgcvicvIcpocmJchfdgmcQkcQkcQkcQkcvjcpxcQkcvrcvrcvrcvrcQkcvscvvcvtcQkcQncQncpCcvwcuocvybQXbQXcpEbQXbQXbQXbQXbQXcvzcpRcpRcpRcpRcvAcpRcpRcpRcxIcvDcpIcxKcvGcxMcxNcxOcvJcxQcxNbGGcuNcvKbGGbGGcxScxZcyacrQbGGbGGbGGbGGbGGbGGbGGcxVcvLbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieckbckbckbckbckbckbcqyckbcuCckbckbckbckbckbciecieaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxXcxYcxYcxYcxYcxYcxYcvNcvMcybcyccydcyecyfcwycqDcygcgQcoLcoLcwBcoLcoLcoLcwDcqBcwBcvocwFcyicwIcwIcyjcwIcykcvocvOchEcngaaacvQcvScvRcvUcyqcwOcvVcvXcvWcyucvxcvYcqWcwacvBcyxctYcwbctYcyzcwccyBcwdcyDcyDcyDcwecvIcpocmJchfcQkcQkcwgcwfcQkcQkcQkcQkcwicwhcwlcwkcQkcQkcwmcQkcQkcTBdgmbQVcwnccWcqMcqMcqMcqMcqMcqMcqNbQXcwrcwqcwscwscwscwtcwwcwvcwvcwJcwvcwvcwvcwKcwLcwLcwPcwMcwUcwQcwWcwVcwYcwXcwZcwZcxacwZcwZcwZcwZcxbcxccwZcwZcwZcxecxdbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacieciecpbckbckbckbckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczEczFczFczFczFcxfczHcxgczJczKczKcxjcwxcqDcoLcqFcoLcoLcoLcoLcoLcoLcoLcoLcoLcvocvocwIczMcwIcvocwIczMcvoczNcpfcngaaacvQcxlcxkcxocxmcxrcxqcxscxmcxmcxtcxvcxucxwczZczZcxxcxyctYcxAcxzcyBcyDcyDcyDcyDcxCcvIcxDcmJcrlcQkcxFcxHcxGcUTcxJcxPcxLcxRcrscxUcxTcQncxWcylcyhcQkcrzcsLcvycymccWcrEcyncypcyocyrcqMcqMbUxcyscrIcrKcrKcrKcrKcsBcytcsMcsFcyvcsPcsPcAKcAKcAJcALcywcyAcyycAPcAPcAQcyCcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAPcAScyEcAUbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclOcieciectJctJckbckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyGcyFcAXcyHcAXcyIcBacBbcBccBdcyLcwxcqDcgQcgQcBfcngcngcngcngcngcngcngcyMcvocwIcwIcwIcwIcBhcwIcwIcvocygchEcngaaacvQcyQcyNcBkcBlcwOcyScyVcyUcBpcvxcvYcqWcnycyWcsDcyXcsDcvBcvBcvBczacyYcyDcyDczeczdcvIcpocmJcsLcQkcziczpczmczucztczwczvczyczxczAczzczCczBczGczDcQkcsLcJGbQVczLczIczPczOczRczQczTczScqMctqczUcfZcepcepcepcepcepctsctsctscepcepaaaaaaaaaaaacBRcBSczVcBUcAPczWczYczXcAacBZcAbcCbcCccAccAecAdcAgcAfcAhcAPcAScAicAkcAjcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAlcAncAmcieckAcieckbckbckbckbckbckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyGcAocApcCqcAqczJcCtcArcAtczJcAxcAwcAycskcgQcoLcngaaaaaaaaaaaaaaacngcoLcAAcwFcCAcwIcwIcwIcwIcACcAFcADcqEcngaaacAHcuGcAIcuHcAMcwOcwOcATcARcCKcCLcAWcAVcAYcyWcsDcAZcCQcBecCScBgcvHcBicyDcyDcyDcBjcvIcpocmJctZcQkcBmcBocBncUTcBqcBscBrcumcBtcBvcBucQncBxcvdcBycQkcsLcrDcrDcBAcBzcuxcBBcBDcBCcBFcBEcqMcBIcBJbQXcepaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcBLcBWcBVcDucBXcDwcDwcBYcDwcDwcDwcDwcDwcCdcCacCfcCecCgbGHcChbUlbGHbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciecCicCkcCjciecieckbckbcClckbckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyGcCmcAXcCncAXcCocDLcCpcCrcBbcDOcwxcCscqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocwFcwFcwFcDScDTcwIcCucvocoLchEcvpaaaaaaaaaaaacvqcCvcDWcCwcCwcvxcDYcvxcCxcqWcnycCycCzcEccCCcCBcCBcCBcCDcEgcyDcEhcyDcCEcvIcpocmJcuEcQkcCFcCHcCGcQkcCIcUTcvPcCJcQncQncQncQkcQkcQkcQkcQkcsLcrDcCMcvTcCNcuxcCOcCRcCPcCUcCTcqMcsLczUbQXcepaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcCXcCVcCZcCYcDbcDacDccDwcDwcEPcDwcDwcCdcCfcCfcCfcDdbGHcDebGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcDicEWcEWcEWcEWcEWcDjcEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcAGcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcDlcqWcnycDrcDtcDscDycDvcDAcDzcDCcDBcDDcFmcFncDEcvIcpocmJcKOcBPcvZdcCcQkcQkcDFcDGcUTcDIcDHcDKcDJcDNcDMcDPcQkcPccnVcrDcDUcDXcDVcuxcuxcEbcDZcEecEdcqMcsLczUbQXctsaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEfcEjcEicFKcEkcFMcElcEmcDwcDwcDwcDwcEncEpcEocEtcEscEwbGHcDebGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciechwaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcEJcFXcEKcFWcELcGbcGccGccENcEMcEOcDRcERcEQcEXcEVcFbcEZcEZcFccEZcFdcFecFecDkcFfcFicFhcFjcFhcFhcFhcFicFhcFhcFkcFocFlcFrcqWcnycFtcFvcFucGCcsDcFwczZcGEcGFcGGcGHcxicFxcGKcpocmJcFychfdcDcxpcxncQkcFzcFAcUTcFCcFBcFEcFDcUTcFFcFGcQkcsLcBwcrDcFHcmycFIcxBcuxcBPcBPcBPcBPchfcebczUbQXctsaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcFJcHgcBScFLcHicHjcFOcFNcFQcFPcDwcDwcHocHpcHqcHrcHsbGHcDebGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcEKcFWcFRcFXcANcFXcFScEacFTcGjcHzcHucHzcFUcFYcHDclXcHDcHDcFZcmhcmhcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcGdcGacGfcGecGhcGgcHPcHQcHRbWTcGkcGicHVcGlcGncGmcGKcpocmJctZcucdducxEddwcQkcGocGpcUTcGrcGqcGtcGscUTcGucGvcQkcyJcsLcrDcyKcGxcGwcpQcrDcGycGychfcyOcyPcebczUbQXctsaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcGzcGBcGAcBRcAPcAPcAPcAPcAPcAPcGDcFPcGIcGMcGJcIEcAPcAPbGHcDebGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcGNcFXcIGcFXcEKcGOcGQcGPcGRcILcGScIzcIBcIAcIQcIRcIScGTcGVcGUcGXcGWcGYcqVcIZcqVcGVcGZcGVcGVcGVcGVcGVcGVcGVcGVcGVcGVcHacHDcHccHbcHlcHhcJgcHmcHtcHncfjcfhcHvcfucHwcJpcyRcHxcGKcpocmJcsLchfchfcHychfcQkcQkcQkcQkcHBcHAcHEcHCcUTcHFcHJcyZcyJcsLchfchfchfchfchfchfcsLcGychfczbchfcsLczUbQXcepaaaaaaaaaaaaaabcBRcBRcBRcBRcBRcBRcBRcBRcBRcHKcHMcHLcxNcJKcJKcJLcBRaabcAPcAPcHNcAPcHTcHOcJPcAPcJQcuQcDebGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHUcJScEWcEWcEWcEWcHWcEYcEYcEYcEYcHXcEYcJVcJVcJVcJWcJXcHYcEYcJZcIccKbcKbcIdcKbcIecKbcKbcKecKfcKbcKbcKfcKfcKfcKbcKbcKbcKbcIfcKhcIhcIgcIjcIicIlcKndcgcKncKncKncKnchWcIocKrczccIvcGKcIwcIxcsLczfcsLcYiczgcuccTBcKOcyZcQkcQkcQkcQkcQkcQkcQkcQkcsLcKOchfczhczjcIyczkchfczlchfchfchfchfchfczUbQXcepaaaaaaaaaaaaaaacBRcKPcKQcKRcIDcICcIHcIFcxNcIIcIJcJlcxNcJKcKZcLacBRaabaabcLbcIMcIKcLecINcLgcLbbGGbGGcDecLhbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 686bc3e1759..593419b61b1 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -34,7 +34,7 @@ #define CANPUSH 8 #define PASSEMOTES 16 //Mob has a cortical borer or holders inside of it that need to see emotes. #define GOTTAGOFAST 32 -#define GOTTAGOREALLYFAST 64 +#define GOTTAGOFAST_METH 64 #define IGNORESLOWDOWN 128 #define GODMODE 4096 #define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 67a187c45db..4612c8cdce3 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -370,4 +370,7 @@ // used for alternate_option #define GET_RANDOM_JOB 0 #define BE_ASSISTANT 1 -#define RETURN_TO_LOBBY 2 \ No newline at end of file +#define RETURN_TO_LOBBY 2 + +//Melting Temperatures for various specific objects +#define GIRDER_MELTING_TEMP 5000 \ No newline at end of file diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 1d47ae409b3..056bc25be5d 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -129,6 +129,9 @@ #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully #define EYE_SHINE_THRESHOLD 6 //dark_view threshold past which a humanoid's eyes will 'shine' in the dark. +#define EMOTE_VISUAL 1 //A mob emote is visual +#define EMOTE_SOUND 2 //A mob emote is sound + //Human sub-species #define isshadowling(A) (is_species(A, /datum/species/shadow/ling)) #define isshadowlinglesser(A) (is_species(A, /datum/species/shadow/ling/lesser)) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index b47e60275e8..6ebaba5bc3b 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -56,7 +56,7 @@ /* This is used for displaying the "station time" equivelent of a world.time value Calling it with no args will give you the current time, but you can specify a world.time-based value as an argument - - You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date + - You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date which is much more useful for a player)*/ /proc/station_time(time=world.time, display_only=FALSE) return ((((time - round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) @@ -93,8 +93,8 @@ proc/isDay(var/month, var/day) /proc/stop_watch(wh) return round(0.1 * (TimeOfGame - wh), 0.1) -/proc/month2number(month) - return month_names.Find(month) +/proc/numberToMonthName(number) + return month_names.Find(number) //Take a value in seconds and returns a string of minutes and seconds in the format X minute(s) and X seconds. /proc/seconds_to_time(var/seconds as num) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 9f21eb23e2d..16193241ca8 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -284,9 +284,12 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/proc/setup_allturfs(var/list/turfs_to_init = block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz))) var/list/active_turfs = src.active_turfs + // Clear active turfs - faster than removing every single turf in the world + // one-by-one, and Initalize_Atmos only ever adds `src` back in. + active_turfs.Cut() + for(var/thing in turfs_to_init) var/turf/T = thing - active_turfs -= T if(T.blocks_air) continue T.Initialize_Atmos(times_fired) diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm index 2c5a8752cbb..b50b7e0a0c3 100644 --- a/code/datums/diseases/lycancoughy.dm +++ b/code/datums/diseases/lycancoughy.dm @@ -10,6 +10,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) desc = "If left untreated subject will regurgitate... puppies." severity = MEDIUM + var/barklimit = 0 /datum/disease/lycan/stage_act() ..() @@ -33,13 +34,21 @@ affected_mob.visible_message("[affected_mob] howls!", \ "You howl!") affected_mob.AdjustConfused(rand(6, 8)) - if(prob(3)) + if(prob(3) && barklimit <= 10) var/list/puppytype = list(/mob/living/simple_animal/pet/corgi/puppy, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/pet/fox) var/mob/living/puppypicked = pick(puppytype) affected_mob.visible_message("[affected_mob] coughs up [initial(puppypicked.name)]!", \ "You cough up [initial(puppypicked.name)]?!") - affected_mob.emote("cough") - affected_mob.adjustBruteLoss(5) new puppypicked(affected_mob.loc) new puppypicked(affected_mob.loc) + barklimit ++ + if(prob(1)) + var/list/plushtype = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox) + var/obj/item/toy/plushie/coughfox = pick(plushtype) + new coughfox(affected_mob.loc) + affected_mob.visible_message("[affected_mob] coughs up a [initial(coughfox.name)]!", \ + "You cough [initial(coughfox.name)] up ?!") + + affected_mob.emote("cough") + affected_mob.adjustBruteLoss(5) return diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 72f5b6545c8..015fa78df29 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -1,5 +1,5 @@ //wrapper -/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) +/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, bypass_area_flag=FALSE) var/datum/teleport/instant/science/D = new if(D.start(arglist(args))) return 1 @@ -14,14 +14,15 @@ var/soundin //soundfile to play before teleportation var/soundout //soundfile to play after teleportation var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation) + var/ignore_area_flag = FALSE -/datum/teleport/proc/start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) +/datum/teleport/proc/start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, bypass_area_flag=FALSE) if(!initTeleport(arglist(args))) return 0 return 1 -/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout) +/datum/teleport/proc/initTeleport(ateleatom, adestination, aprecision, afteleport, aeffectin, aeffectout, asoundin, asoundout, bypass_area_flag=FALSE) if(!setTeleatom(ateleatom)) return 0 if(!setDestination(adestination)) @@ -31,6 +32,7 @@ setEffects(aeffectin,aeffectout) setForceTeleport(afteleport) setSounds(asoundin,asoundout) + ignore_area_flag = bypass_area_flag return 1 //must succeed @@ -97,7 +99,8 @@ var/turf/destturf var/turf/curturf = get_turf(teleatom) - var/area/destarea = get_area(destination) + var/area/curarea = get_area(curturf) + if(precision) var/list/posturfs = list() var/center = get_turf(destination) @@ -109,6 +112,18 @@ else destturf = get_turf(destination) + if(!is_teleport_allowed(destturf.z)) + return 0 + // Only check the destination zlevel for is_teleport_allowed. Checking origin as well breaks ERT teleporters. + + var/area/destarea = get_area(destturf) + + if(!ignore_area_flag) + if(curarea.tele_proof) + return 0 + if(destarea.tele_proof) + return 0 + if(!destturf || !curturf) return 0 diff --git a/code/datums/spell.dm b/code/datums/spell.dm index f251fed2951..d1ba64824f5 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -146,7 +146,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(!istype(H.shoes, /obj/item/clothing/shoes/sandal)) to_chat(user, "I don't feel strong enough without my sandals.") return 0 - if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) && !istype(H.wear_suit, /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard)) + if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard)) to_chat(user, "I don't feel strong enough without my hat.") return 0 else if(!ishuman(user)) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 952711f3063..4f25dbf8d66 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1,16 +1,13 @@ -var/list/uplink_items = list() +GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /proc/get_uplink_items(var/job = null) - // If not already initialized.. + var/list/uplink_items = list() if(!uplink_items.len) - // Fill in the list and order it like this: - // A keyed list, acting as categories, which are lists to the datum. - var/list/last = list() - for(var/item in typesof(/datum/uplink_item)) + for(var/path in GLOB.uplink_items) - var/datum/uplink_item/I = new item() + var/datum/uplink_item/I = new path if(!I.item) continue if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) @@ -55,6 +52,9 @@ var/list/uplink_items = list() var/list/job = null var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it) var/hijack_only = FALSE //can this item be purchased only during hijackings? + var/refundable = FALSE + var/refund_path = null // Alternative path for refunds, in case the item purchased isn't what is actually refunded (ie: holoparasites). + var/refund_amount // specified refund amount in case there needs to be a TC penalty for refunds. /datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/uplink/U) if(hijack_only) @@ -214,7 +214,7 @@ var/list/uplink_items = list() /datum/uplink_item/jobspecific/rad_laser name = "Radiation Laser" - desc = "A radiation laser concealed inside of a Health Analyser. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyser, only appears like one. May not function correctly on radiation resistant humanoids!" + desc = "A radiation laser concealed inside of a Health Analyzer. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyzer, only appears like one. May not function correctly on radiation resistant humanoids!" reference = "RL" item = /obj/item/rad_laser cost = 5 @@ -500,6 +500,7 @@ var/list/uplink_items = list() reference = "AGG" item = /obj/item/storage/box/syndie_kit/atmosgasgrenades cost = 11 + surplus = 0 /datum/uplink_item/dangerous/emp name = "EMP Grenades and Implanter Kit" @@ -540,9 +541,11 @@ var/list/uplink_items = list() desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel." reference = "SC" item = /obj/item/antag_spawner/borg_tele + refund_path = /obj/item/antag_spawner/borg_tele cost = 50 gamemodes = list(/datum/game_mode/nuclear) surplus = 0 + refundable = TRUE /datum/uplink_item/dangerous/foamsmg name = "Toy Submachine Gun" @@ -571,19 +574,14 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 0 - -//for refunding the syndieborg teleporter -/datum/uplink_item/dangerous/syndieborg/spawn_item() - var/obj/item/antag_spawner/borg_tele/T = ..() - if(istype(T)) - T.TC_cost = cost - /datum/uplink_item/dangerous/guardian name = "Holoparasites" desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an organic host as a home base and source of fuel." item = /obj/item/storage/box/syndie_kit/guardian excludefrom = list(/datum/game_mode/nuclear) cost = 12 + refund_path = /obj/item/guardiancreator/tech/choose + refundable = TRUE // Ammunition diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index cdf25ce9651..d661e320dd8 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -7,7 +7,7 @@ /proc/key_name_helper(whom, include_name, include_link = FALSE, type = null) if(include_link != FALSE && include_link != TRUE) - log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]")) + log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]"), src) var/mob/M var/client/C diff --git a/code/game/area/depot-areas.dm b/code/game/area/depot-areas.dm index 9de680da82e..69205c3c35f 100644 --- a/code/game/area/depot-areas.dm +++ b/code/game/area/depot-areas.dm @@ -57,22 +57,32 @@ /area/syndicate_depot/core/proc/reset_alert() if(used_self_destruct) - return + for(var/obj/effect/overload/O in src) + new /obj/structure/fusionreactor(O.loc) + qdel(O) + + if(on_peaceful) + peaceful_mode(FALSE, TRUE) local_alarm = FALSE called_backup = FALSE + unlock_computers() used_self_destruct = FALSE + + run_started = FALSE + run_finished = FALSE + + despawn_guards() + hostile_list = list() + dead_list = list() + peaceful_list = list() + something_looted = FALSE detected_mech = FALSE detected_pod = FALSE detected_double_agent = FALSE updateicon() - despawn_guards() - guard_list = list() - hostile_list = list() - dead_list = list() - peaceful_list = list() alert_log += "Alert level reset." @@ -97,6 +107,13 @@ if(on_peaceful) increase_alert("Thieves!") +/area/syndicate_depot/core/proc/armory_locker_looted() + if(!run_finished && !used_self_destruct) + if(shield_list.len) + activate_self_destruct("Armory compromised despite armory shield being online.", FALSE) + return + declare_finished() + /area/syndicate_depot/core/proc/turret_died() something_looted = TRUE if(on_peaceful) @@ -133,19 +150,12 @@ if(L.opened) L.close() if(!L.locked) - L.locked = 1 + L.locked = !L.locked L.req_access = list(access_syndicate_leader) L.update_icon() for(var/obj/machinery/computer/syndicate_depot/teleporter/P in src) if(!P.portal_enabled) P.toggle_portal() - for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src) - if(!V.density) - V.close() - V.emergency = 0 - if(!V.locked) - V.locked = !V.locked - V.update_icon() else log_game("Depot visit: ended") alert_log += "Visitor mode ended." @@ -250,15 +260,17 @@ if(user) var/turf/T = get_turf(user) var/area/A = get_area(T) - var/log_msg = "[key_name(user)] has armed the depot self destruct device at [A.name] ([T.x],[T.y],[T.z])" + var/log_msg = "[key_name(user)] has triggered the depot self destruct at [A.name] ([T.x],[T.y],[T.z])" message_admins(log_msg) log_game(log_msg) playsound(user, 'sound/machines/Alarm.ogg', 100, 0, 0) else log_game("Depot self destruct activated.") if(reactor) - reactor.overload(containment_failure) + if(!reactor.has_overloaded) + reactor.overload(containment_failure) else + log_debug("Depot: [src] called activate_self_destruct with no reactor."); message_admins("Syndicate Depot lacks reactor to initiate self-destruct. Must be destroyed manually.") updateicon() @@ -269,13 +281,17 @@ for(var/obj/machinery/door/airlock/A in src) spawn(0) A.close() - if(A.density) + if(A.density && !A.locked) A.lock() /area/syndicate_depot/core/proc/lockout_computers() for(var/obj/machinery/computer/syndicate_depot/C in src) C.activate_security_lockout() +/area/syndicate_depot/core/proc/unlock_computers() + for(var/obj/machinery/computer/syndicate_depot/C in src) + C.security_lockout = FALSE + /area/syndicate_depot/core/proc/toggle_door_locks() for(var/obj/machinery/door/airlock/A in src) A.emergency = !A.emergency @@ -313,6 +329,12 @@ if(L.name == "syndi_depot_shield") var/obj/machinery/shieldwall/syndicate/S = new /obj/machinery/shieldwall/syndicate(L.loc) shield_list += S.UID() + for(var/obj/structure/closet/secure_closet/syndicate/depot/armory/L in src) + if(L.opened) + L.close() + if(!L.locked) + L.locked = !L.locked + L.update_icon() /area/syndicate_depot/core/proc/shields_key_check() if(!shield_list.len) @@ -327,6 +349,10 @@ if(S) qdel(S) shield_list = list() + for(var/obj/structure/closet/secure_closet/syndicate/depot/armory/L in src) + if(L.locked) + L.locked = !L.locked + L.update_icon() /area/syndicate_depot/core/proc/despawn_guards() for(var/mob/thismob in list_getmobs(guard_list)) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index ea3b9df4f54..3c541a308ff 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -305,6 +305,10 @@ /atom/proc/rpd_act() return +/atom/proc/rpd_blocksusage() + // Atoms that return TRUE prevent RPDs placing any kind of pipes on their turf. + return FALSE + /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 4e467e4eb18..50a578cc3b3 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -428,8 +428,11 @@ flick_overlay(I, viewing, 5) // 5 ticks/half a second // And animate the attack! - animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) - - + var/t_color = "#ffffff" + if(ismob(src) && ismob(A) && (!used_item)) + var/mob/M = src + t_color = M.a_intent == INTENT_HARM ? "#ff0000" : "#ffffff" + animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3, color = t_color) + /atom/movable/proc/portal_destroyed(obj/effect/portal/P) return diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 354536561c1..98a3b047883 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -533,7 +533,7 @@ occupantData["name"] = connected.occupant.dna.real_name occupantData["stat"] = connected.occupant.stat occupantData["isViableSubject"] = 1 - if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna) + if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna || connected.occupant.dna.species.bodyflags & NO_DNA) occupantData["isViableSubject"] = 0 occupantData["health"] = connected.occupant.health occupantData["maxHealth"] = connected.occupant.maxHealth diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 56417ac4335..8ab09fc781c 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -48,7 +48,7 @@ var/healpertick = -(total_healing / healing_ticks) user.heal_overall_damage((-healpertick/recent_uses), (-healpertick/recent_uses)) user.adjustOxyLoss(healpertick/recent_uses) - user.blood_volume += 30 + user.blood_volume = min(user.blood_volume + 30, BLOOD_VOLUME_NORMAL) user.updatehealth() else break diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 760868e8435..e64421f330b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -156,15 +156,7 @@ msg="Task #[count] completed! " if(pay>0) if(M.mind.initial_account) - M.mind.initial_account.money += pay - var/datum/transaction/T = new() - T.target_name = "[command_name()] Payroll" - T.purpose = "Payment" - T.amount = pay - T.date = current_date_string - T.time = station_time_timestamp() - T.source_terminal = "\[CLASSIFIED\] Terminal #[rand(111,333)]" - M.mind.initial_account.transaction_log.Add(T) + M.mind.initial_account.credit(pay, "Payment", "\[CLASSIFIED\] Terminal #[rand(111,333)]", "[command_name()] Payroll") msg += "You have been sent the $[pay], as agreed." else msg += "However, we were unable to send you the $[pay] you're entitled." diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 5d5c3342010..4bfc8c9672d 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -197,17 +197,17 @@ /datum/game_mode/proc/auto_declare_completion_abduction() var/text = "" if(abductors.len) - text += "
The abductors were:" + text += "
The abductors were:
" for(var/datum/mind/abductor_mind in abductors) text += printplayer(abductor_mind) text += printobjectives(abductor_mind) - text += "
" + text += "
" if(abductees.len) - text += "
The abductees were:" + text += "
The abductees were:
" for(var/datum/mind/abductee_mind in abductees) text += printplayer(abductee_mind) text += printobjectives(abductee_mind) - text += "
" + text += "
" to_chat(world, text) //Landmarks diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 9593ee6b792..45998cd4b30 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -363,7 +363,9 @@ if(M.has_brain_worms()) to_chat(src, "[M] is already infested!") return + host = M + add_attack_logs(src, host, "Infested as borer") M.borer = src forceMove(M) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 68e8c16c5da..ab3af13e98d 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -415,6 +415,9 @@ failure_message = "...ERROR. BOOT SEQUENCE ABORTED. AI FAILED TO INTIALIZE. PLEASE CONTACT SUPPORT OR TRY AGAIN LATER." ling_failure = "The holoparasites recoil in horror. They want nothing to do with a creature like you." +/obj/item/guardiancreator/tech/check_uplink_validity() + return !used + /obj/item/guardiancreator/tech/choose random = FALSE diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b7364970351..a0ba4773785 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -329,11 +329,17 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu explanation_text = "Destroy the station with a nuclear device." martyr_compatible = 1 - - /datum/objective/steal var/datum/theft_objective/steal_target martyr_compatible = 0 + var/theft_area + +/datum/objective/steal/proc/get_location() + if(steal_target.location_override) + return steal_target.location_override + var/obj/item/T = locate(steal_target.typepath) + theft_area = get_area(T.loc) + return "[theft_area]" /datum/objective/steal/find_target() var/loop=50 @@ -346,7 +352,9 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(O.flags & 2) continue steal_target=O - explanation_text = "Steal [O]." + explanation_text = "Steal [steal_target]. One was last seen in [get_location()]. " + if(islist(O.protected_jobs) && O.protected_jobs.len) + explanation_text += "It may also be in the possession of the [jointext(O.protected_jobs, ", ")]." return explanation_text = "Free Objective." diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index d3f29734815..3d20040f128 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -11,6 +11,7 @@ var/list/protected_jobs = list() var/list/altitems = list() var/flags = 0 + var/location_override /datum/theft_objective/proc/check_completion(var/datum/mind/owner) if(!owner.current) @@ -49,6 +50,7 @@ /datum/theft_objective/ai name = "a functional AI" typepath = /obj/item/aicard + location_override = "AI Satellite. An intellicard for transportation can be found in Tech Storage, Science Department or manufactured" datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C) if(..()) @@ -91,6 +93,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C) name = "a sample of unused slime extract" typepath = /obj/item/slime_extract protected_jobs = list("Research Director","Scientist") + location_override = "Xenobiology" /datum/theft_objective/slime_extract/check_special_completion(var/obj/item/slime_extract/E) if(..()) @@ -169,6 +172,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C) min=28 max=28 protected_jobs = list("Chief Engineer", "Station Engineer", "Scientist", "Research Director", "Life Support Specialist") + location_override = "Engineering or Toxin Mixing" /datum/theft_objective/number/plasma_gas/getAmountStolen(var/obj/item/I) return I:air_contents:toxins diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 661453adfc3..79fd53e5083 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -9,6 +9,7 @@ use_power = 1 idle_power_usage = 0 var/syndicate = 0 + var/area_bypass = FALSE var/obj/item/radio/beacon/Beacon var/enabled = TRUE @@ -22,6 +23,7 @@ Beacon.invisibility = INVISIBILITY_MAXIMUM Beacon.loc = T Beacon.syndicate = syndicate + Beacon.area_bypass = area_bypass hide(T.intact) /obj/machinery/bluespace_beacon/proc/destroy_beacon() @@ -64,6 +66,7 @@ /obj/machinery/bluespace_beacon/syndicate syndicate = TRUE enabled = FALSE + area_bypass = TRUE // This enables teleports to this beacon to bypass the tele_proof flag of /area/s. Intended for depot syndi teleport computer. var/obj/machinery/computer/syndicate_depot/teleporter/mycomputer /obj/machinery/bluespace_beacon/syndicate/New() diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 6bd5eadc822..78a8a8a69ab 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -138,6 +138,7 @@ if(depotarea) depotarea.toggle_door_locks(src) to_chat(user, "Door locks toggled.") + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/doors/secondary(mob/user, subcommand) if(..()) @@ -145,6 +146,7 @@ if(depotarea) depotarea.toggle_falsewalls(src) to_chat(user, "False walls toggled.") + playsound(user, sound_yes, 50, 0) // Engineering AKA self destruct computer, no useful functions, just a trap for the people who can't resist pushing dangerous-sounding buttons. @@ -167,9 +169,9 @@ if(depotarea.used_self_destruct) playsound(user, sound_no, 50, 0) return - playsound(user, sound_click, 20, 1) if(depotarea) depotarea.activate_self_destruct("Fusion reactor containment field disengaged. All hands, evacuate. All hands, evacuate!", TRUE, user) + playsound(user, sound_click, 20, 1) // Shield computer, used to manipulate base shield, and armory shield @@ -285,6 +287,7 @@ to_chat(user, "[src] requires authentication with syndicate codewords, which you do not know.") raise_alert("Detected unauthorized access by [user] to [src]!") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/syndiecomms/secondary(mob/user, subcommand) if(..()) @@ -319,6 +322,7 @@ else to_chat(user, "ERROR: [src] is unable to uplink to depot network.") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/syndiecomms/proc/grant_syndie_faction(mob/user) user.faction += "syndicate" @@ -347,7 +351,7 @@ icon_screen = "telesci" icon_keyboard = "teleport_key" var/obj/machinery/bluespace_beacon/syndicate/mybeacon - var/obj/effect/portal/myportal + var/obj/effect/portal/redspace/myportal var/portal_enabled = FALSE var/portaldir = WEST @@ -401,10 +405,8 @@ if(!tele_target) return var/turf/portal_turf = get_step(src, portaldir) - var/obj/effect/portal/P = new(portal_turf, tele_target, src, 0) + var/obj/effect/portal/redspace/P = new(portal_turf, tele_target, src, 0) myportal = P - P.failchance = 0 - P.icon_state = "portal1" var/area/A = get_area(tele_target) P.name = "[A] portal" else if(!portal_enabled && myportal) @@ -432,6 +434,7 @@ var/bresult = mybeacon.toggle() to_chat(user, "Syndicate Teleporter Beacon: [bresult ? "ON" : "OFF"]") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/teleporter/secondary(mob/user) if(..()) @@ -444,6 +447,7 @@ toggle_portal() to_chat(user, "Outgoing Teleport Portal: [portal_enabled ? "ON" : "OFF"]") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/teleporter/proc/toggle_portal() portal_enabled = !portal_enabled @@ -507,6 +511,7 @@ if(depotarea) depotarea.reset_alert() to_chat(user, "Alert level reset.") + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/aiterminal/secondary(mob/user) if(..()) @@ -516,4 +521,5 @@ new /obj/effect/portal(get_turf(B)) to_chat(user, "[B] has been recalled.") qdel(B) - raise_alert("Sentry bot removed via emergency recall.") \ No newline at end of file + raise_alert("Sentry bot removed via emergency recall.") + playsound(user, sound_yes, 50, 0) \ No newline at end of file diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index aef8de7c306..fcf8de24ca5 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -97,6 +97,7 @@ Class Procs: name = "machinery" icon = 'icons/obj/stationobjs.dmi' pressure_resistance = 10 + layer = BELOW_OBJ_LAYER var/stat = 0 var/emagged = 0 var/use_power = 1 diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 270b2a99411..e84d0778ef3 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -140,6 +140,7 @@ //update the name and icon of the pipe item depending on the type /obj/item/pipe/rpd_act(mob/user, obj/item/rpd/our_rpd) + . = TRUE if(our_rpd.mode == RPD_ROTATE_MODE) rotate() else if(our_rpd.mode == RPD_FLIP_MODE) @@ -147,7 +148,7 @@ else if(our_rpd.mode == RPD_DELETE_MODE) our_rpd.delete_single_pipe(user, src) else - ..() + return ..() /obj/item/pipe/proc/update(var/obj/machinery/atmospherics/make_from) name = "[get_pipe_name(pipe_type, PIPETYPE_ATMOS)] fitting" diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index a148a3c40f5..9d44ac09231 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -1013,15 +1013,14 @@ var/list/turret_icons check_anomalies = 1 check_synth = 1 ailock = 1 + var/area/syndicate_depot/core/depotarea /obj/machinery/porta_turret/syndicate/die() . = ..() - var/area/syndicate_depot/core/depotarea = areaMaster if(istype(depotarea)) depotarea.turret_died() /obj/machinery/porta_turret/syndicate/shootAt(mob/living/target) - var/area/syndicate_depot/core/depotarea = areaMaster if(istype(depotarea)) depotarea.list_add(target, depotarea.hostile_list) depotarea.declare_started() diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 29c43304b38..fe46d2746c8 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -132,6 +132,7 @@ playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) flick("qpad-beam", linked_pad) playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + var/tele_success = TRUE for(var/atom/movable/ROI in get_turf(src)) // if is anchored, don't let through if(ROI.anchored) @@ -145,4 +146,6 @@ continue else if(!isobserver(ROI)) continue - do_teleport(ROI, get_turf(linked_pad)) + tele_success = do_teleport(ROI, get_turf(linked_pad)) + if(!tele_success) + to_chat(user, "Teleport failed due to bluespace interference.") diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 6d79a65dcbd..f1e27be33fa 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -541,6 +541,8 @@ /obj/machinery/shieldwall/attack_hand(mob/user as mob) return +/obj/machinery/shieldwall/rpd_blocksusage() + return TRUE /obj/machinery/shieldwall/process() if(needs_power) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 72fd23dde66..994e27194f0 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -49,7 +49,7 @@ return if(!account || account.money < 10) return - if(!account.charge(10, transaction_purpose = "Bet", dest_name = name)) + if(!account.charge(10, null, "Bet", "Slot Machine", "Slot Machine")) return plays += 1 working = 1 @@ -89,7 +89,7 @@ result = "You win fifty credits!" resultlvl = "good" win_money(50) - else if(roll > 300 && roll <= 600) + else if(roll > 300 && roll <= 1000) visible_message("[src] says, 'Winner! [usr.name] has won ten credits!'") result = "You win ten credits!" resultlvl = "good" @@ -106,12 +106,5 @@ if(!account) return - account.money += amt - var/datum/transaction/T = new() - T.target_name = account.owner_name - T.purpose = "Slot Winnings" - T.amount = "[amt]" - T.date = current_date_string - T.time = station_time_timestamp() - account.transaction_log.Add(T) + account.credit(amt, "Slot Winnings", "Slot Machine", account.owner_name) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 46671a9f4fa..702d1eee8a2 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -11,6 +11,7 @@ var/calibrating var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.) //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. + var/area_bypass = FALSE /obj/machinery/computer/teleporter/New() src.id = "[rand(1000, 9999)]" @@ -87,7 +88,7 @@ data["accurate"] = null data["regime"] = regime_set var/area/targetarea = get_area(target) - data["target"] = (!target) ? "None" : sanitize(targetarea.name) + data["target"] = (!target || !targetarea) ? "None" : sanitize(targetarea.name) data["calibrating"] = calibrating data["locked"] = locked return data @@ -172,6 +173,7 @@ locked = null /obj/machinery/computer/teleporter/proc/set_target(mob/user) + area_bypass = FALSE if(regime_set == "Teleporter") var/list/L = list() var/list/areaindex = list() @@ -211,7 +213,10 @@ var/desc = input("Please select a location to lock in.", "Locking Computer") in L target = L[desc] - + if(istype(target, /obj/item/radio/beacon)) + var/obj/item/radio/beacon/B = target + if(B.area_bypass) + area_bypass = TRUE else var/list/L = list() var/list/areaindex = list() @@ -335,7 +340,11 @@ to_chat(T, "[pick(TPError)]") return else - teleport(M) + if(!teleport(M) && isliving(M)) // the isliving(M) is needed to avoid triggering errors if a spark bumps the telehub + visible_message("[src] emits a loud buzz, as its teleport portal flickers and fails!") + playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + power_station.toggle() // turn off the portal. + use_power(5000) //--FalseIncarnate return @@ -353,6 +362,7 @@ return ..() /obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T) + . = TRUE var/obj/machinery/computer/teleporter/com = power_station.teleporter_console if(!com) return @@ -361,11 +371,10 @@ return if(istype(M, /atom/movable)) if(!calibrated && prob(25 - ((accurate) * 10))) //oh dear a problem - do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), 3), 2) + . = do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), 3), 2, bypass_area_flag = com.area_bypass) else - do_teleport(M, com.target) + . = do_teleport(M, com.target, bypass_area_flag = com.area_bypass) calibrated = 0 - return /obj/machinery/teleport/hub/update_icon() if(panel_open) @@ -574,8 +583,8 @@ visible_message("No target detected.") src.engaged = 0 teleporter_hub.update_icon() - src.add_fingerprint(user) - return + if(istype(user)) + add_fingerprint(user) /obj/machinery/teleport/station/power_change() ..() diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 42eeafd338c..d7c1465fbb9 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -399,11 +399,9 @@ return 0 else // Okay to move the money at this point - var/paid = customer_account.charge(currently_vending.price, - transaction_purpose = "Purchase of [currently_vending.product_name]", - terminal_name = name, - terminal_id = name, - dest_name = vendor_account.owner_name) + var/paid = customer_account.charge(currently_vending.price, vendor_account, + "Purchase of [currently_vending.product_name]", name, vendor_account.owner_name, + "Sale of [currently_vending.product_name]", customer_account.owner_name) if(paid) // Give the vendor the money. We use the account owner name, which means @@ -419,15 +417,8 @@ */ /obj/machinery/vending/proc/credit_purchase(var/target as text) vendor_account.money += currently_vending.price - - var/datum/transaction/T = new() - T.target_name = target - T.purpose = "Purchase of [currently_vending.product_name]" - T.amount = "[currently_vending.price]" - T.source_terminal = src.name - T.date = current_date_string - T.time = station_time_timestamp() - vendor_account.transaction_log.Add(T) + vendor_account.credit(currently_vending.price, "Sale of [currently_vending.product_name]", + name, target) /obj/machinery/vending/attack_ai(mob/user) return attack_hand(user) @@ -907,8 +898,8 @@ /obj/machinery/vending/chinese name = "\improper Mr. Chang" desc = "A self-serving Chinese food machine, for all your Chinese food needs." - product_slogans = "Taste 5000 years of culture!" - icon_state = "snack" + product_slogans = "Taste 5000 years of culture!;Mr. Chang, approved for safe consumption in over 10 sectors!;Chinese food is great for a date night, or a lonely night!;You can't go wrong with Mr. Chang's authentic Chinese food!" + icon_state = "chang" products = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 6, /obj/item/reagent_containers/food/snacks/chinese/newdles = 6, /obj/item/reagent_containers/food/snacks/chinese/rice = 6) prices = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 50, /obj/item/reagent_containers/food/snacks/chinese/newdles = 50, @@ -1205,7 +1196,8 @@ /obj/item/clothing/suit/snowman = 1,/obj/item/clothing/head/snowman = 1, /obj/item/clothing/head/cueball = 1,/obj/item/clothing/under/scratch = 1, /obj/item/clothing/under/victdress = 1, /obj/item/clothing/under/victdress/red = 1, /obj/item/clothing/suit/victcoat = 1, /obj/item/clothing/suit/victcoat/red = 1, - /obj/item/clothing/under/victsuit = 1, /obj/item/clothing/under/victsuit/redblk = 1, /obj/item/clothing/under/victsuit/red = 1, /obj/item/clothing/suit/tailcoat = 1) + /obj/item/clothing/under/victsuit = 1, /obj/item/clothing/under/victsuit/redblk = 1, /obj/item/clothing/under/victsuit/red = 1, /obj/item/clothing/suit/tailcoat = 1, + /obj/item/clothing/suit/draculacoat = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2) premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/shield/riot/roman = 1) refill_canister = /obj/item/vending_refill/autodrobe diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 1244f151be7..2feaea2a149 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -108,6 +108,9 @@ qdel(src) /obj/structure/sign/poster/proc/roll_and_drop(loc) + if(ruined) + qdel(src) + return pixel_x = 0 pixel_y = 0 var/obj/item/poster/P = new(loc, src) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 18506a5c882..2ca9182c912 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -14,14 +14,12 @@ /obj/effect/mine/Crossed(AM as mob|obj) if(!isliving(AM)) return - if(isanimal(AM)) - var/mob/living/simple_animal/SA = AM - if(faction && (faction in SA.faction)) - return - if(!SA.flying) - triggermine(SA) - else - triggermine(AM) + var/mob/living/M = AM + if(faction && (faction in M.faction)) + return + if(M.flying) + return + triggermine(M) /obj/effect/mine/proc/triggermine(mob/living/victim) if(triggered) @@ -34,6 +32,11 @@ triggered = 1 qdel(src) +/obj/effect/mine/ex_act(severity) + // Necessary because, as effects, they have infinite health, and wouldn't be destroyed otherwise. + // Also, they're pressure-sensitive mines, it makes sense that an explosion (wave of pressure) triggers/destroys them. + qdel(src) + /obj/effect/mine/explosive name = "explosive mine" var/range_devastation = 0 @@ -169,7 +172,7 @@ if(!victim.client || !istype(victim)) return to_chat(victim, "You feel fast!") - victim.status_flags |= GOTTAGOREALLYFAST + victim.status_flags |= GOTTAGOFAST spawn(duration) - victim.status_flags &= ~GOTTAGOREALLYFAST + victim.status_flags &= ~GOTTAGOFAST to_chat(victim, "You slow down.") \ No newline at end of file diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 8692e65dc9d..a048ca1ebff 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -11,6 +11,7 @@ anchored = 1 var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent var/can_multitool_to_remove = 0 + var/ignore_tele_proof_area_setting = FALSE /obj/effect/portal/Bumped(mob/M as mob|obj) teleport(M) @@ -42,12 +43,29 @@ qdel(src) return if(istype(M, /atom/movable)) - if(prob(failchance)) //oh dear a problem, put em in deep space + if(prob(failchance)) src.icon_state = "portal1" - do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0) + if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space. + invalid_teleport() else - do_teleport(M, target, precision) ///You will appear adjacent to the beacon + if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target. + invalid_teleport() /obj/effect/portal/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/multitool) && can_multitool_to_remove) - qdel(src) \ No newline at end of file + qdel(src) + +/obj/effect/portal/proc/invalid_teleport() + visible_message("[src] flickers and fails due to bluespace interference!") + var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(5, 0, loc) + spark_system.start() + qdel(src) + + +/obj/effect/portal/redspace + name = "redspace portal" + desc = "A portal capable of bypassing bluespace interference." + icon_state = "portal1" + failchance = 0 + ignore_tele_proof_area_setting = TRUE \ No newline at end of file diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 668bb52b467..1619eba14c4 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -264,6 +264,7 @@ /obj/effect/spawner/random_spawners/syndicate/loot/level4 name = "armory loot" + spawn_inside = /obj/structure/closet/secure_closet/syndicate/depot/armory // Loot schema: high-power weapons (m90, esword, ebow, revolver), devices that negate depot challenges (thermal glasses, chameleon device), explosives result = list(/obj/item/gun/projectile/automatic/c20r = 1, /obj/item/gun/projectile/automatic/m90 = 1, @@ -299,10 +300,9 @@ /obj/structure/falsewall/reinforced = 1) /obj/effect/spawner/random_spawners/syndicate/layout/door/vault - name = "60pc vaultdoor 20pc falsewall 20pc wall" - result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 6, - /turf/simulated/wall/r_wall = 2, - /obj/structure/falsewall/reinforced = 2) + name = "80pc vaultdoor 20pc wall" + result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4, + /turf/simulated/wall/r_wall = 1) /obj/effect/spawner/random_spawners/syndicate/layout/spacepod diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 29abbef2d76..f6f42554b08 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -29,16 +29,33 @@ visible_message("[user] has [pick(W.attack_verb)] [src] with [W]!") else visible_message("[user] has attacked [src] with [W]!") - var/damage = W.force / 4 - if(iswelder(W)) var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) damage = 15 playsound(loc, WT.usesound, 100, 1) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + health -= damage + healthcheck() +/obj/structure/spider/attack_animal(mob/living/simple_animal/M) + if(M.melee_damage_upper == 0) + return + var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + visible_message("\The [M] [M.attacktext] [src]!") + health -= damage + healthcheck() + +/obj/structure/spider/attack_alien(mob/living/carbon/alien/humanoid/M) + playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) + visible_message("[M] has slashed at [src]!", "[M] has slashed at [src]!") + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + var/damage = rand(10, 20) health -= damage healthcheck() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 5fa97f07d62..9cde3e9aa6d 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -10,6 +10,7 @@ var/spamcheck = 0 var/emagged = 0 var/insults = 0 + var/span = "" var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!") /obj/item/megaphone/attack_self(mob/living/user as mob) @@ -32,6 +33,10 @@ if(H && H.mind && H.mind.miming) to_chat(user, "Your vow of silence prevents you from speaking.") return + if(H.mind) + span = H.mind.speech_span + if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) + span = "sans" if(spamcheck) to_chat(user, "\The [src] needs to recharge!") return @@ -51,6 +56,8 @@ else to_chat(user, "*BZZZZzzzzzt*") else + if(span) + message = "[message]" saymsg(user, message) spamcheck = 1 diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index ff7fd6504d1..19e26f06bf5 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -7,6 +7,7 @@ origin_tech = "bluespace=1" var/emagged = 0 var/syndicate = 0 + var/area_bypass = FALSE /obj/item/radio/beacon/New() ..() diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index cc3320489f6..1c3124a74cb 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -12,7 +12,7 @@ var/list/world_uplinks = list() var/welcome // Welcoming menu message var/uses // Numbers of crystals var/hidden_crystals = 0 - var/list/ItemsCategory // List of categories with lists of items + var/list/uplink_items // List of categories with lists of items var/list/ItemsReference // List of references with an associated item var/list/nanoui_items // List of items for NanoUI use var/nanoui_menu = 0 // The current menu we are in @@ -32,7 +32,7 @@ var/list/world_uplinks = list() ..() welcome = ticker.mode.uplink_welcome uses = ticker.mode.uplink_uses - ItemsCategory = get_uplink_items() + uplink_items = get_uplink_items() world_uplinks += src @@ -57,14 +57,14 @@ var/list/world_uplinks = list() dat += "Each item costs a number of telecrystals as indicated by the number following its name.
" var/category_items = 1 - for(var/category in ItemsCategory) + for(var/category in uplink_items) if(category_items < 1) dat += "We apologize, as you could not afford anything from this category.
" dat += "
" dat += "[category]
" category_items = 0 - for(var/datum/uplink_item/I in ItemsCategory[category]) + for(var/datum/uplink_item/I in uplink_items[category]) if(I.cost > uses) continue if(I.job && I.job.len) @@ -87,9 +87,9 @@ var/list/world_uplinks = list() var/list/nano = new var/list/reference = new - for(var/category in ItemsCategory) + for(var/category in uplink_items) nano[++nano.len] = list("Category" = category, "items" = list()) - for(var/datum/uplink_item/I in ItemsCategory[category]) + for(var/datum/uplink_item/I in uplink_items[category]) if(I.job && I.job.len) if(!(I.job.Find(job))) continue @@ -117,6 +117,9 @@ var/list/world_uplinks = list() if(..()) return 1 + if(href_list["refund"]) + refund(usr) + if(href_list["buy_item"] == "random") var/datum/uplink_item/UI = chooseRandomItem() href_list["buy_item"] = UI.reference @@ -142,6 +145,22 @@ var/list/world_uplinks = list() return 1 +/obj/item/uplink/proc/refund(mob/user as mob) + var/obj/item/I = user.get_active_hand() + if(I) // Make sure there's actually something in the hand before even bothering to check + for(var/category in uplink_items) + for(var/item in uplink_items[category]) + var/datum/uplink_item/UI = item + var/path = UI.refund_path || UI.item + var/cost = UI.refund_amount || UI.cost + if(I.type == path && UI.refundable && I.check_uplink_validity()) + uses += cost + used_TC -= cost + to_chat(user, "[I] refunded.") + qdel(I) + return + ..() + // HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. /* How to create an uplink in 3 easy steps! @@ -287,17 +306,6 @@ var/list/world_uplinks = list() return 1 return 0 -//Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it) -/obj/item/radio/uplink/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/antag_spawner/borg_tele)) - var/obj/item/antag_spawner/borg_tele/S = W - if(!S.used && !S.checking) - hidden_uplink.uses += S.TC_cost - qdel(S) - to_chat(user, "Teleporter refunded.") - else - to_chat(user, "This teleporter is already used, or is currently being used.") - // PRESET UPLINKS // A collection of preset uplinks. // diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 622b0b230c9..45059d3e80b 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -205,6 +205,7 @@ icon = 'icons/obj/hydroponics/harvest.dmi' icon_state = "tea_aspera_leaves" color = "#378C61" + stop_bleeding = 0 heal_brute = 12 diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index d5719261ec8..212f32e0121 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -68,12 +68,12 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \ ) var/global/list/datum/stack_recipe/plasma_recipes = list ( \ - new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe/dangerous("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ null, \ - new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \ + new/datum/stack_recipe/dangerous("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \ null, \ - new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe/dangerous("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe/dangerous("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \ ) var/global/list/datum/stack_recipe/bananium_recipes = list ( \ diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm index 10d06e9741d..2a2e91ef599 100644 --- a/code/game/objects/items/stacks/stack_recipe.dm +++ b/code/game/objects/items/stacks/stack_recipe.dm @@ -35,6 +35,14 @@ result.color = S.color ..() + +/datum/stack_recipe/dangerous +/datum/stack_recipe/dangerous/post_build(/obj/item/stack/S, /obj/result) + var/turf/targ = get_turf(usr) + message_admins("[title] made by [key_name_admin(usr)](?) in [get_area(usr)] [ADMIN_COORDJMP(targ)]!",0,1) + log_game("[title] made by [key_name_admin(usr)] at [get_area(usr)] [targ.x], [targ.y], [targ.z].") + ..() + /datum/stack_recipe/rods /datum/stack_recipe/rods/post_build(var/obj/item/stack/S, var/obj/result) if(istype(result, /obj/item/stack/rods)) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 5325fb06b77..aa3f23f99b7 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -39,6 +39,9 @@ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5) user.visible_message("[user.name] sets the plasma tiles on fire!", \ "You set the plasma tiles on fire!") + message_admins("Plasma tiles ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) + log_game("Plasma tiles ignited by [key_name(user)] in ([x],[y],[z])") + investigate_log("was ignited by [key_name(user)]","atmos") qdel(src) return diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index b1fc3398af0..c37c1cce2c8 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -293,6 +293,10 @@ update_icon() return unwield(user) +/obj/item/twohanded/shockpaddles/on_mob_move(dir, mob/user) + if(defib && !(defib.Adjacent(user))) + defib.remove_paddles(user) + /obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O) if(!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns M.unEquip(O) diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index db8f9f549d5..ad53a49d084 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -16,7 +16,7 @@ if(imp) icon_state = "implantcase-[imp.item_color]" origin_tech = imp.origin_tech - flags = imp.flags + flags = imp.flags & ~DROPDEL reagents = imp.reagents else icon_state = "implantcase-0" diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 047a75bd634..c705374f7a9 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -160,7 +160,7 @@ if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort var/mob/living/carbon/C = hit_atom - if(!C.legcuffed) + if(!C.legcuffed && C.get_num_legs() >= 2) visible_message("[src] ensnares [C]!") C.legcuffed = src forceMove(C) diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index e130c3ed606..c139155b57c 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -192,7 +192,27 @@ var/list/pipemenu = list( return if(world.time < lastused + spawndelay) return - target.rpd_act(user, src) //Handle RPD effects in separate procs + + + var/turf/T = get_turf(target) + if(target != T) + // We only check the rpd_act of the target if it isn't the turf, because otherwise + // (A) blocked turfs can be acted on, and (B) unblocked turfs get acted on twice. + if(target.rpd_act(user, src) == TRUE) + // If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else. + // Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile. + return + + // If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile. + // This is done by calling rpd_blocksusage on every /obj in the tile. If any block usage, fail at this point. + + for(var/obj/O in T) + if(O.rpd_blocksusage() == TRUE) + to_chat(user, "[O] blocks the [src]!") + return + + // If we get here, then we're effectively acting on the turf, probably placing a pipe. + T.rpd_act(user, src) #undef RPD_COOLDOWN_TIME #undef RPD_WALLBUILD_TIME diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 9d4481952f5..65524fec445 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -127,12 +127,48 @@ /obj/item/flashlight/pen, /obj/item/clothing/mask/surgical, /obj/item/clothing/gloves/color/latex, - /obj/item/reagent_containers/hypospray/autoinjector, - /obj/item/rad_laser, + /obj/item/reagent_containers/hypospray/autoinjector, + /obj/item/reagent_containers/hypospray/CMO, + /obj/item/reagent_containers/hypospray/safety, + /obj/item/rad_laser, /obj/item/sensor_device, /obj/item/wrench/medical, ) +/obj/item/storage/belt/medical/surgery + max_w_class = WEIGHT_CLASS_NORMAL + max_combined_w_class = 17 + use_to_pickup = 1 + name = "Surgical Belt" + desc = "Can hold various surgical tools." + storage_slots = 9 + use_item_overlays = 1 + can_hold = list( + /obj/item/scalpel, + /obj/item/hemostat, + /obj/item/retractor, + /obj/item/circular_saw, + /obj/item/bonegel, + /obj/item/bonesetter, + /obj/item/FixOVein, + /obj/item/surgicaldrill, + /obj/item/cautery, + ) + +/obj/item/storage/belt/medical/surgery/loaded + +/obj/item/storage/belt/medical/surgery/loaded/New() + ..() + new /obj/item/scalpel(src) + new /obj/item/hemostat(src) + new /obj/item/retractor(src) + new /obj/item/circular_saw(src) + new /obj/item/bonegel(src) + new /obj/item/bonesetter(src) + new /obj/item/FixOVein(src) + new /obj/item/surgicaldrill(src) + new /obj/item/cautery(src) + /obj/item/storage/belt/medical/response_team /obj/item/storage/belt/medical/response_team/New() @@ -203,7 +239,7 @@ /obj/item/storage/belt/security/response_team/New() ..() - new /obj/item/kitchen/knife/combat(src) + new /obj/item/reagent_containers/spray/pepper(src) new /obj/item/melee/baton/loaded(src) new /obj/item/flash(src) new /obj/item/melee/classic_baton/telescopic(src) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index ddc8b79012f..3bed8e15333 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -231,6 +231,15 @@ ..() base_name = name +/obj/item/storage/pill_bottle/ert/New() + ..() + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + /obj/item/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri if(ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ var/mob/M = usr diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 66316b6f7ef..5d4ae050073 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -352,6 +352,10 @@ W.fire_act() return 1 +/obj/item/storage/Exited(atom/A, loc) + remove_from_storage(A, loc) //worry not, comrade; this only gets called once + ..() + /obj/item/storage/empty_object_contents(burn, loc) for(var/obj/item/Item in contents) remove_from_storage(Item, loc, burn) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 4620388a84b..47b0beb51f7 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -1,3 +1,5 @@ +#define HEALPERWELD 15 + /* Tools! * Note: Multitools are in devices * @@ -408,25 +410,47 @@ to_chat(user, "Turn on [src] before attempting repairs!") return 1 - if(S.brute_dam) - if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP) - if(get_fuel() >= 1) - if(H == user) - if(!do_mob(user, H, 10)) - return 1 - if(remove_fuel(1,null)) - playsound(src.loc, usesound, 50, 1) - S.heal_damage(15,0,0,1) - user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") + if(S.brute_dam > ROBOLIMB_SELF_REPAIR_CAP) + to_chat(user, "The damage is far too severe to patch over externally.") + return - else if(S.open != 2) - to_chat(user, "Need more welding fuel!") - return 1 - else - to_chat(user, "The damage is far too severe to patch over externally.") - return 1 - else if(S.open != 2) + if(!S.brute_dam) to_chat(user, "Nothing to fix!") + return + + if(get_fuel() >= 1) + if(H == user) + if(!do_mob(user, H, 10)) + return 1 + if(!remove_fuel(1,null)) + to_chat(user, "Need more welding fuel!") + var/rembrute = HEALPERWELD + var/nrembrute = 0 + var/childlist + if(!isnull(S.children)) + childlist = S.children.Copy() + var/parenthealed = FALSE + while(rembrute > 0) + var/obj/item/organ/external/E + if(S.brute_dam) + E = S + else if(LAZYLEN(childlist)) + E = pick_n_take(childlist) + if(!E.brute_dam || !E.is_robotic()) + continue + else if(S.parent && !parenthealed) + E = S.parent + parenthealed = TRUE + if(!E.brute_dam || !E.is_robotic()) + break + else + break + playsound(src.loc, usesound, 50, 1) + nrembrute = max(rembrute - E.brute_dam, 0) + E.heal_damage(rembrute,0,0,1) + rembrute = nrembrute + user.visible_message("\The [user] patches some dents on \the [M]'s [E.name] with \the [src].") + return 1 else return ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a7e57ce5a52..29d3f2663bc 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -71,10 +71,6 @@ SSnanoui.close_uis(src) return ..() -/obj/rpd_act(mob/user, obj/item/rpd/our_rpd) - var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs - T.rpd_act(user, our_rpd) - /obj/proc/process() set waitfor = 0 processing_objects.Remove(src) @@ -307,3 +303,6 @@ a { .["Make speed process"] = "?_src_=vars;makespeedy=[UID()]" else .["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]" + +/obj/proc/check_uplink_validity() + return 1 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 76f0bab19d5..64eddc7739e 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -7,9 +7,9 @@ armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0) var/icon_closed = "closed" var/icon_opened = "open" - var/opened = 0 - var/welded = 0 - var/locked = 0 + var/opened = FALSE + var/welded = FALSE + var/locked = FALSE var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 var/lastbang @@ -34,19 +34,20 @@ return ..() /obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0 || wall_mounted) return 1 + if(height==0 || wall_mounted) + return TRUE return (!density) /obj/structure/closet/proc/can_open() if(welded) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/closet/proc/can_close() for(var/obj/structure/closet/closet in get_turf(src)) if(closet != src && closet.anchored != 1) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/closet/proc/dump_contents() var/turf/T = get_turf(src) @@ -59,27 +60,27 @@ /obj/structure/closet/proc/open() if(opened) - return 0 + return FALSE if(!can_open()) - return 0 + return FALSE dump_contents() icon_state = icon_opened - opened = 1 + opened = TRUE if(sound) playsound(loc, sound, 15, 1, -3) else playsound(loc, 'sound/machines/click.ogg', 15, 1, -3) density = 0 - return 1 + return TRUE /obj/structure/closet/proc/close() if(!opened) - return 0 + return FALSE if(!can_close()) - return 0 + return FALSE var/itemcount = 0 @@ -109,13 +110,13 @@ itemcount++ icon_state = icon_closed - opened = 0 + opened = FALSE if(sound) playsound(loc, sound, 15, 1, -3) else playsound(loc, 'sound/machines/click.ogg', 15, 1, -3) density = 1 - return 1 + return TRUE /obj/structure/closet/proc/toggle(mob/user) if(!(opened ? close() : open())) @@ -246,7 +247,7 @@ if(istype(W, /obj/item/grab)) MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet if(istype(W,/obj/item/tk_grab)) - return 0 + return FALSE if(istype(W, cutting_tool)) if(istype(W, /obj/item/weldingtool)) var/obj/item/weldingtool/WT = W @@ -264,7 +265,7 @@ var/turf/T = get_turf(src) new material_drop(T, material_drop_amount) qdel(src) - return + return if(isrobot(user)) return if(!user.drop_item()) //couldn't drop the item @@ -371,8 +372,9 @@ // should be independently resolved, but this is also an interesting twist. /obj/structure/closet/Exit(atom/movable/AM) open() - if(AM.loc == src) return 0 - return 1 + if(AM.loc == src) + return FALSE + return TRUE /obj/structure/closet/container_resist(var/mob/living/L) var/breakout_time = 2 //2 minutes by default @@ -404,7 +406,7 @@ return //Well then break it! - welded = 0 + welded = FALSE update_icon() to_chat(usr, "You successfully break out!") for(var/mob/O in viewers(L.loc)) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm index 1d52dbcdf1b..be67d79272f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm @@ -6,6 +6,8 @@ anchored = 1 health = 200 req_access = list() + var/is_armory = FALSE + var/ignore_use = FALSE /obj/structure/closet/secure_closet/syndicate/depot/New() @@ -26,9 +28,12 @@ . = ..() /obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup() - var/area/syndicate_depot/core/depotarea = areaMaster - if(depotarea) - depotarea.locker_looted() + if(!ignore_use) + var/area/syndicate_depot/core/depotarea = areaMaster + if(istype(depotarea)) + depotarea.locker_looted() + if(is_armory) + depotarea.armory_locker_looted() /obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M) if(isanimal(M) && "syndicate" in M.faction) @@ -36,10 +41,26 @@ return return ..(M) +/obj/structure/closet/secure_closet/syndicate/depot/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/rcs)) + to_chat(user, "Bluespace interference prevents the [W] from locking onto [src]!") + return + return ..() + /obj/structure/closet/secure_closet/syndicate/depot/emp_act(severity) return /obj/structure/closet/secure_closet/syndicate/depot/togglelock(mob/user) . = ..() if(!locked) - loot_pickup() \ No newline at end of file + loot_pickup() + +/obj/structure/closet/secure_closet/syndicate/depot/attack_ghost(mob/user) + if(user.can_advanced_admin_interact()) + ignore_use = TRUE + toggle(user) + ignore_use = FALSE + +/obj/structure/closet/secure_closet/syndicate/depot/armory + req_access = list(access_syndicate) + is_armory = TRUE \ No newline at end of file diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index 9dfe256ce38..b655d010aa7 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -7,15 +7,24 @@ anchored = 1 max_integrity = 50 var/area/syndicate_depot/core/depotarea + var/has_overloaded = FALSE /obj/structure/fusionreactor/Initialize() - . = ..() + ..() depotarea = areaMaster - if(depotarea) + if(istype(depotarea)) depotarea.reactor = src + return INITIALIZE_HINT_LATELOAD + +/obj/structure/fusionreactor/LateInitialize() + for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc)) + if(!istype(T.depotarea)) + T.depotarea = depotarea /obj/structure/fusionreactor/Destroy() - if(depotarea) + if(istype(depotarea)) + if(!has_overloaded) + overload(TRUE, TRUE) depotarea.reactor = null ..() @@ -30,7 +39,7 @@ healthcheck() /obj/structure/fusionreactor/proc/healthcheck() - if(obj_integrity <= 0) + if(obj_integrity <= 0 && istype(depotarea)) overload(TRUE) /obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params) @@ -47,13 +56,20 @@ else return ..() -/obj/structure/fusionreactor/proc/overload(containment_failure) +/obj/structure/fusionreactor/proc/overload(containment_failure = FALSE, skip_qdel = FALSE) + if(has_overloaded) + return + has_overloaded = TRUE + if(istype(depotarea) && !depotarea.used_self_destruct) + depotarea.activate_self_destruct("Fusion reactor cracked open. Core loose!", TRUE) var/obj/effect/overload/O = new /obj/effect/overload(get_turf(src)) if(containment_failure) playsound(loc, 'sound/machines/Alarm.ogg', 100, 0, 0) O.deliberate = TRUE O.max_cycles = 6 - qdel(src) + if(!skip_qdel) + qdel(src) + /obj/effect/overload icon = 'icons/obj/tesla_engine/energy_ball.dmi' diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 4ef1978cffb..cb7350f5b34 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -47,6 +47,11 @@ new /obj/item/stack/sheet/metal(get_turf(src)) qdel(src) +/obj/structure/girder/temperature_expose(datum/gas_mixture/air, exposed_temperature) + var/temp_check = exposed_temperature + if(temp_check >= GIRDER_MELTING_TEMP) + take_damage(10) + /obj/structure/girder/attackby(obj/item/W, mob/user, params) add_fingerprint(user) if(isscrewdriver(W)) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 7d7c9628d63..0f85d0bb8eb 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -54,6 +54,7 @@ /obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) + user.changeNext_move(CLICK_CD_MELEE) if(isscrewdriver(I)) user.visible_message("[user] begins to unfasten [src].", "You begin to unfasten [src].") if(do_after(user, 30 * I.toolspeed, target = src)) @@ -80,6 +81,7 @@ /obj/structure/mirror/attack_alien(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) if(islarva(user)) return user.do_attack_animation(src) @@ -91,6 +93,7 @@ /obj/structure/mirror/attack_animal(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) if(!isanimal(user)) return var/mob/living/simple_animal/M = user @@ -105,6 +108,7 @@ /obj/structure/mirror/attack_slime(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) var/mob/living/carbon/slime/S = user if(!S.is_adult) return @@ -125,4 +129,4 @@ /obj/item/mounted/mirror/do_build(turf/on_wall, mob/user) var/obj/structure/mirror/M = new /obj/structure/mirror(get_turf(user), get_dir(on_wall, user), 1) transfer_prints_to(M, TRUE) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 646adfa2038..d7aa9e88504 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -410,13 +410,17 @@ var/ert_request_answered = 0 shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/commander - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - + glasses = /obj/item/clothing/glasses/sunglasses + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/eyes/hud/security, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) belt = /obj/item/gun/energy/gun/nuclear backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1, /obj/item/clothing/mask/gas/sechailer/swat = 1, + /obj/item/gun/energy/ionrifle/carbine = 1, /obj/item/restraints/handcuffs = 1, /obj/item/clothing/shoes/magboots = 1, /obj/item/storage/lockbox/mindshield = 1 @@ -449,15 +453,6 @@ var/ert_request_answered = 0 id = /obj/item/card/id/ert/security var/has_grenades = FALSE -/datum/outfit/job/centcom/response_team/security/pre_equip() - . = ..() - if(has_grenades) - var/grenadebox = /obj/item/storage/box/flashbangs - if(prob(50)) - grenadebox = /obj/item/storage/box/teargas - backpack_contents.Insert(1, grenadebox) - backpack_contents[grenadebox] = 1 - /datum/outfit/job/centcom/response_team/security/amber name = "RT Security (Amber)" shoes = /obj/item/clothing/shoes/combat @@ -471,7 +466,9 @@ var/ert_request_answered = 0 backpack_contents = list( /obj/item/clothing/head/helmet/ert/security = 1, /obj/item/clothing/mask/gas/sechailer = 1, - /obj/item/storage/box/zipties = 1 + /obj/item/storage/box/zipties = 1, + /obj/item/storage/box/teargas = 1, + /obj/item/flashlight/seclite = 1 ) /datum/outfit/job/centcom/response_team/security/red @@ -481,17 +478,22 @@ var/ert_request_answered = 0 shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/color/black suit = /obj/item/clothing/suit/space/hardsuit/ert/security - suit_store = /obj/item/gun/energy/gun/advtaser + suit_store = /obj/item/gun/energy/gun/blueshield glasses = /obj/item/clothing/glasses/hud/security/sunglasses - - r_hand = /obj/item/gun/energy/lasercannon + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/arm/flash, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) + r_hand = /obj/item/gun/projectile/automatic/lasercarbine backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1, /obj/item/clothing/mask/gas/sechailer = 1, /obj/item/clothing/shoes/magboots = 1, /obj/item/storage/box/handcuffs = 1, - /obj/item/gun/energy/ionrifle/carbine = 1 + /obj/item/storage/box/teargas = 1, + /obj/item/grenade/flashbang = 1, + /obj/item/ammo_box/magazine/laser = 2 ) /datum/outfit/job/centcom/response_team/security/gamma @@ -530,12 +532,13 @@ var/ert_request_answered = 0 suit_store = /obj/item/tank/emergency_oxygen/engi glasses = /obj/item/clothing/glasses/meson - l_pocket = /obj/item/t_scanner + l_pocket = /obj/item/gun/energy/gun/mini r_pocket = /obj/item/melee/classic_baton/telescopic backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1, /obj/item/clothing/mask/gas = 1, + /obj/item/t_scanner = 1, /obj/item/stack/sheet/glass/fifty = 1, /obj/item/stack/sheet/metal/fifty = 1 ) @@ -544,10 +547,14 @@ var/ert_request_answered = 0 name = "RT Engineer (Red)" shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/color/yellow + belt = /obj/item/storage/belt/utility/chief/full suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer suit_store = /obj/item/tank/emergency_oxygen/engi glasses = /obj/item/clothing/glasses/meson - + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/eyes/shield, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) l_pocket = /obj/item/t_scanner/extended_range r_pocket = /obj/item/melee/classic_baton/telescopic @@ -586,28 +593,28 @@ var/ert_request_answered = 0 pda = /obj/item/pda/heads/ert/medical id = /obj/item/card/id/ert/medic - l_pocket = /obj/item/reagent_containers/hypospray/CMO - r_pocket = /obj/item/melee/classic_baton/telescopic - /datum/outfit/job/centcom/response_team/medic/amber name = "RT Medic (Amber)" shoes = /obj/item/clothing/shoes/white gloves = /obj/item/clothing/gloves/color/latex suit = /obj/item/clothing/suit/armor/vest/ert/medical + suit_store = /obj/item/gun/energy/gun/mini glasses = /obj/item/clothing/glasses/hud/health - belt = /obj/item/storage/belt/medical/response_team + belt = /obj/item/storage/belt/medical/surgery/loaded - l_pocket = /obj/item/reagent_containers/hypospray/CMO + l_pocket = /obj/item/reagent_containers/hypospray/safety/ert r_pocket = /obj/item/melee/classic_baton/telescopic backpack_contents = list( /obj/item/clothing/head/helmet/ert/medical = 1, /obj/item/clothing/mask/surgical = 1, - /obj/item/storage/firstaid/o2 = 1, - /obj/item/storage/firstaid/brute = 1, /obj/item/storage/firstaid/adv = 1, + /obj/item/storage/firstaid/regular = 1, + /obj/item/storage/box/autoinjectors = 1, + /obj/item/roller = 1, + /obj/item/storage/pill_bottle/ert = 1 ) /datum/outfit/job/centcom/response_team/medic/red @@ -616,18 +623,24 @@ var/ert_request_answered = 0 gloves = /obj/item/clothing/gloves/color/latex/nitrile suit = /obj/item/clothing/suit/space/hardsuit/ert/medical glasses = /obj/item/clothing/glasses/hud/health/health_advanced - + suit_store = /obj/item/gun/energy/gun + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/arm/surgery, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) belt = /obj/item/defibrillator/compact/loaded + l_pocket = /obj/item/reagent_containers/hypospray/safety/ert + r_pocket = /obj/item/melee/classic_baton/telescopic backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/medical = 1, /obj/item/clothing/mask/surgical = 1, - /obj/item/storage/firstaid/o2 = 1, /obj/item/storage/firstaid/toxin = 1, - /obj/item/storage/firstaid/adv = 1, - /obj/item/storage/firstaid/surgery = 1, - /obj/item/gun/energy/gun = 1, + /obj/item/storage/firstaid/brute = 1, + /obj/item/storage/firstaid/fire = 1, + /obj/item/storage/box/autoinjectors = 1, + /obj/item/roller = 1, /obj/item/clothing/shoes/magboots = 1 ) @@ -637,6 +650,9 @@ var/ert_request_answered = 0 gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/medical glasses = /obj/item/clothing/glasses/hud/health/night + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/arm/surgery + ) belt = /obj/item/defibrillator/compact/loaded @@ -711,15 +727,22 @@ var/ert_request_answered = 0 /datum/outfit/job/centcom/response_team/janitorial/amber name = "RT Janitor (Amber)" + suit = /obj/item/clothing/suit/armor/vest/ert/janitor + head = /obj/item/clothing/head/helmet/ert/janitor glasses = /obj/item/clothing/glasses/sunglasses + r_hand = /obj/item/gun/energy/disabler + /datum/outfit/job/centcom/response_team/janitorial/red name = "RT Janitor (Red)" suit = /obj/item/clothing/suit/space/hardsuit/ert/janitor head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor glasses = /obj/item/clothing/glasses/hud/security/sunglasses - suit_store = /obj/item/gun/energy/gun + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/chest/nutriment + ) r_pocket = /obj/item/scythe/tele + l_pocket = /obj/item/gun/energy/gun/mini /datum/outfit/job/centcom/response_team/janitorial/gamma name = "RT Janitor (Gamma)" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 84120c2c669..6ffc2608414 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -60,9 +60,9 @@ var/global/nologevent = 0 body += "TP - " body += "PM - " body += "SM - " - body += "[admin_jump_link(M)]\]
" if(ishuman(M) && M.mind) - body += "HM" + body += "HM -" + body += "[admin_jump_link(M)]\]
" body += "Mob type: [M.type]
" if(M.client) if(M.client.related_accounts_cid.len) diff --git a/code/modules/admin/tickets/adminticketsUI.dm b/code/modules/admin/tickets/adminticketsUI.dm index 750fa13e6cb..b063c5cb673 100644 --- a/code/modules/admin/tickets/adminticketsUI.dm +++ b/code/modules/admin/tickets/adminticketsUI.dm @@ -44,14 +44,14 @@ return dat -/datum/adminTicketHolder/proc/showUI(var/client/user, var/tab) +/datum/adminTicketHolder/proc/showUI(mob/user, var/tab) var/dat = null dat = returnUI(tab) var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600) popup.set_content(dat) popup.open() -/datum/adminTicketHolder/proc/showDetailUI(var/client/user, var/ticketID) +/datum/adminTicketHolder/proc/showDetailUI(mob/user, var/ticketID) var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID] var/status = "[T.state2text()]" @@ -91,9 +91,9 @@ popup.set_content(dat) popup.open() -/datum/adminTicketHolder/proc/userDetailUI(var/client/user) +/datum/adminTicketHolder/proc/userDetailUI(mob/user) //dat - var/tickets = checkForTicket(user) + var/tickets = checkForTicket(user.client) var/dat dat += "

Your open tickets

" dat += "" @@ -130,7 +130,7 @@ if(href_list["details"]) var/indexNum = text2num(href_list["details"]) - showDetailUI(usr.client, indexNum) + showDetailUI(usr, indexNum) return if(href_list["resolve"]) @@ -169,4 +169,4 @@ if(globAdminTicketHolder.assignAdminToTicket(usr.client, indexNum)) message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]") to_chat(returnClient(indexNum), "Your ticket is being handled by [usr.client].") - showDetailUI(usr, indexNum) \ No newline at end of file + showDetailUI(usr, indexNum) diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm index a0431cd8e23..0cf22c5d24c 100644 --- a/code/modules/admin/tickets/adminticketsverbs.dm +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -48,4 +48,4 @@ if(!holder && !check_rights(R_ADMIN)) return - globAdminTicketHolder.userDetailUI(usr.client) + globAdminTicketHolder.userDetailUI(usr) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 749341b92b1..194b1d49035 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1216,8 +1216,7 @@ //strip their stuff and stick it in the crate for(var/obj/item/I in M) - M.unEquip(I) - if(I) + if(M.unEquip(I)) I.loc = locker I.layer = initial(I.layer) I.plane = initial(I.plane) @@ -2033,26 +2032,6 @@ log_admin("[key_name(src.owner)] sent [key_name(H)] a standard '[stype]' fax") message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)] with a standard '[stype]' fax") - else if(href_list["SyndicateReply"]) - if(!check_rights(R_ADMIN)) - return - var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"]) - if(!istype(H)) - to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return - if(H.stat != 0) - to_chat(usr, "The person you are trying to contact is not conscious.") - return - if(!istype(H.l_ear, /obj/item/radio/headset) && !istype(H.r_ear, /obj/item/radio/headset)) - to_chat(usr, "The person you are trying to contact is not wearing a headset") - return - var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via [H.p_their()] headset.","Outgoing message from The Syndicate", "") - if(!input) - return - to_chat(src.owner, "You sent [input] to [H] via a secure channel.") - log_admin("[src.owner] replied to [key_name(H)]'s Syndicate message with the message [input].") - to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. [input]. Message ends.\"") - else if(href_list["HONKReply"]) var/mob/living/carbon/human/H = locate(href_list["HONKReply"]) if(!istype(H)) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index bd771ea8c0c..0fd53b8b62a 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -28,6 +28,7 @@ prayer_type = "CULTIST PRAYER" deity = ticker.cultdat.entity_name + log_say("(PRAYER) [msg]", usr) msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]:[key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SC) (BLESS) (SMITE): [msg]" for(var/client/X in admins) @@ -36,11 +37,10 @@ to_chat(usr, "Your prayers have been received by the gods.") feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - //log_admin("HELP: [key_name(src)]: [msg]") /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "CENTCOMM: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) (RPLY): [msg]" + msg = "CENTCOMM: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) [ADMIN_CENTCOM_REPLY(Sender)]): [msg]" for(var/client/X in admins) if(R_EVENT & X.holder.rights) to_chat(X, msg) @@ -49,7 +49,7 @@ /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) (REPLY): [msg]" + msg = "SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) [ADMIN_SYNDICATE_REPLY(Sender)]: [msg]" for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) @@ -79,10 +79,10 @@ /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)]) (CA) (BSA) (RPLY): [msg]" + msg = "NUKE CODE REQUEST: [key_name(Sender)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) [ADMIN_CENTCOM_REPLY(Sender)]: [msg]" for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) to_chat(X, "The nuke code is [nuke_code].") if(X.prefs.sound & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' \ No newline at end of file + X << 'sound/effects/adminhelp.ogg' diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index c81f30efc83..ecf8c336118 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -45,7 +45,7 @@ spawn_antag(C, get_turf(src.loc), "syndieborg") else checking = FALSE - to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") + to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.") return /obj/item/antag_spawner/borg_tele/spawn_antag(client/C, turf/T, type = "") diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index 9b925e2f2ac..12927895030 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -118,22 +118,7 @@ else // Okay to move the money at this point - // debit money from the purchaser's account - customer_account.money -= token_price - - // create entry in the purchaser's account log - var/datum/transaction/T = new() - T.target_name = "[src.name]" - T.purpose = "Purchase of [src.name] credit" - if(token_price > 0) - T.amount = "([token_price])" - else - T.amount = "[token_price]" - T.source_terminal = src.name - T.date = current_date_string - T.time = station_time_timestamp() - customer_account.transaction_log.Add(T) - return 1 + customer_account.charge(token_price, null, "Purchase of [name] credit", name, name) /obj/machinery/arcade/proc/start_play(mob/user as mob) user.set_machine(src) @@ -159,4 +144,4 @@ /obj/machinery/arcade/Destroy() src.close_game() - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index df7206a7914..8228e490a38 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -10,46 +10,67 @@ bomb_name = "voice-activated bomb" - describe() - if(recorded || listening) - return "A meter on [src] flickers with every nearby sound." - else - return "[src] is deactivated." +/obj/item/assembly/voice/describe() + if(recorded || listening) + return "A meter on [src] flickers with every nearby sound." + else + return "[src] is deactivated." - hear_talk(mob/living/M as mob, msg) - hear_input(M, msg, 0) +/obj/item/assembly/voice/hear_talk(mob/living/M as mob, msg) + hear_input(M, msg, 0) - hear_message(mob/living/M as mob, msg) +/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg) hear_input(M, msg, 1) - proc/hear_input(mob/living/M as mob, msg, type) - if(!istype(M,/mob/living)) - return - if(listening) - recorded = msg - recorded_type = type - listening = 0 - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"") - else - if(findtext(msg, recorded) && type == recorded_type) - pulse(0) - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("[bicon(src)] beeps!") +/obj/item/assembly/voice/proc/hear_input(mob/living/M as mob, msg, type) + if(!istype(M,/mob/living)) + return + if(listening) + recorded = msg + recorded_type = type + listening = 0 + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"") + else if(findtext(msg, recorded) && type == recorded_type) + pulse(0) + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("[bicon(src)] beeps!") - activate() - return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way. +/obj/item/assembly/voice/activate() + return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way. - attack_self(mob/user) - if(!user || !secured) return 0 +/obj/item/assembly/voice/attack_self(mob/user) + if(!user || !secured) return 0 - listening = !listening - var/turf/T = get_turf(src) - T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") - return 1 + listening = !listening + var/turf/T = get_turf(src) + T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") + return 1 - toggle_secure() - . = ..() - listening = 0 \ No newline at end of file +/obj/item/assembly/voice/toggle_secure() + . = ..() + listening = 0 + +/obj/item/assembly/voice/noise + name = "noise sensor" + desc = "A simple noise sensor that triggers on vocalizations other then speech." + icon_state = "voice" + materials = list(MAT_METAL=100, MAT_GLASS=10) + origin_tech = "magnets=1;engineering=1" + bomb_name = "noise-activated bomb" + +/obj/item/assembly/voice/noise/attack_self(mob/user) + return + +/obj/item/assembly/voice/noise/describe() + return "[src] does not appear to have any controls." + +/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, msg) + return + +/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg) + pulse(0) + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("[bicon(src)] beeps!") \ No newline at end of file diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm deleted file mode 100644 index bdb15581b61..00000000000 --- a/code/modules/awaymissions/maploader/swapmaps.dm +++ /dev/null @@ -1,677 +0,0 @@ -/* - SwapMaps library by Lummox JR - developed for digitalBYOND - http://www.digitalbyond.org - - Version 2.1 - - The purpose of this library is to make it easy for authors to swap maps - in and out of their game using savefiles. Swapped-out maps can be - transferred between worlds for an MMORPG, sent to the client, etc. - This is facilitated by the use of a special datum and a global list. - - Uses of swapmaps: - - - Temporary battle arenas - - House interiors - - Individual custom player houses - - Virtually unlimited terrain - - Sharing maps between servers running different instances of the same - game - - Loading and saving pieces of maps for reusable room templates - */ - -/* - User Interface: - - VARS: - - swapmaps_iconcache - An associative list of icon files with names, like - 'player.dmi' = "player" - swapmaps_mode - This must be set at runtime, like in world/New(). - - SWAPMAPS_SAV 0 (default) - Uses .sav files for raw /savefile output. - SWAPMAPS_TEXT 1 - Uses .txt files via ExportText() and ImportText(). These maps - are easily editable and appear to take up less space in the - current version of BYOND. - - PROCS: - - SwapMaps_Find(id) - Find a map by its id - SwapMaps_Load(id) - Load a map by its id - SwapMaps_Save(id) - Save a map by its id (calls swapmap.Save()) - SwapMaps_Unload(id) - Save and unload a map by its id (calls swapmap.Unload()) - SwapMaps_Save_All() - Save all maps - SwapMaps_DeleteFile(id) - Delete a map file - SwapMaps_CreateFromTemplate(id) - Create a new map by loading another map to use as a template. - This map has id==src and will not be saved. To make it savable, - change id with swapmap.SetID(newid). - SwapMaps_LoadChunk(id,turf/locorner) - Load a swapmap as a "chunk", at a specific place. A new datum is - created but it's not added to the list of maps to save or unload. - The new datum can be safely deleted without affecting the turfs - it loaded. The purpose of this is to load a map file onto part of - another swapmap or an existing part of the world. - locorner is the corner turf with the lowest x,y,z values. - SwapMaps_SaveChunk(id,turf/corner1,turf/corner2) - Save a piece of the world as a "chunk". A new datum is created - for the chunk, but it can be deleted without destroying any turfs. - The chunk file can be reloaded as a swapmap all its own, or loaded - via SwapMaps_LoadChunk() to become part of another map. - SwapMaps_GetSize(id) - Return a list corresponding to the x,y,z sizes of a map file, - without loading the map. - Returns null if the map is not found. - SwapMaps_AddIconToCache(name,icon) - Cache an icon file by name for space-saving storage - - swapmap.New(id,x,y,z) - Create a new map; specify id, width (x), height (y), and - depth (z) - Default size is world.maxx,world.maxy,1 - swapmap.New(id,turf1,turf2) - Create a new map; specify id and 2 corners - This becomes a /swapmap for one of the compiled-in maps, for - easy saving. - swapmap.New() - Create a new map datum, but does not allocate space or assign an - ID (used for loading). - swapmap.Del() - Deletes a map but does not save - swapmap.Save() - Saves to map_[id].sav - Maps with id==src are not saved. - swapmap.Unload() - Saves the map and then deletes it - Maps with id==src are not saved. - swapmap.SetID(id) - Change the map's id and make changes to the lookup list - swapmap.AllTurfs(z) - Returns a block of turfs encompassing the entire map, or on just - one z-level - z is in world coordinates; it is optional - swapmap.Contains(turf/T) - Returns nonzero if T is inside the map's boundaries. - Also works for objs and mobs, but the proc is not area-safe. - swapmap.InUse() - Returns nonzero if a mob with a key is within the map's - boundaries. - swapmap.LoCorner(z=z1) - Returns locate(x1,y1,z), where z=z1 if none is specified. - swapmap.HiCorner(z=z2) - Returns locate(x2,y2,z), where z=z2 if none is specified. - swapmap.BuildFilledRectangle(turf/corner1,turf/corner2,item) - Builds a filled rectangle of item from one corner turf to the - other, on multiple z-levels if necessary. The corners may be - specified in any order. - item is a type path like /turf/wall or /obj/barrel{full=1}. - swapmap.BuildRectangle(turf/corner1,turf/corner2,item) - Builds an unfilled rectangle of item from one corner turf to - the other, on multiple z-levels if necessary. - swapmap.BuildInTurfs(list/turfs,item) - Builds item on all of the turfs listed. The list need not - contain only turfs, or even only atoms. - */ - -swapmap - var/id // a string identifying this map uniquely - var/x1 // minimum x,y,z coords - var/y1 - var/z1 - var/x2 // maximum x,y,z coords (also used as width,height,depth until positioned) - var/y2 - var/z2 - var/tmp/locked // don't move anyone to this map; it's saving or loading - var/tmp/mode // save as text-mode - var/ischunk // tells the load routine to load to the specified location - - New(_id,x,y,z) - if(isnull(_id)) return - id=_id - mode=swapmaps_mode - if(isturf(x) && isturf(y)) - /* - Special format: Defines a map as an existing set of turfs; - this is useful for saving a compiled map in swapmap format. - Because this is a compiled-in map, its turfs are not deleted - when the datum is deleted. - */ - x1=min(x:x,y:x);x2=max(x:x,y:x) - y1=min(x:y,y:y);y2=max(x:y,y:y) - z1=min(x:z,y:z);z2=max(x:z,y:z) - InitializeSwapMaps() - if(z2>swapmaps_compiled_maxz ||\ - y2>swapmaps_compiled_maxy ||\ - x2>swapmaps_compiled_maxx) - qdel(src) - return - x2=x?(x):world.maxx - y2=y?(y):world.maxy - z2=z?(z):1 - AllocateSwapMap() - - Destroy() - // a temporary datum for a chunk can be deleted outright - // for others, some cleanup is necessary - if(!ischunk) - swapmaps_loaded-=src - swapmaps_byname-=id - if(z2>swapmaps_compiled_maxz ||\ - y2>swapmaps_compiled_maxy ||\ - x2>swapmaps_compiled_maxx) - var/list/areas=new - for(var/atom/A in block(locate(x1,y1,z1),locate(x2,y2,z2))) - for(var/obj/O in A) qdel(O) - for(var/mob/M in A) - if(!M.key) qdel(M) - else M.loc=null - areas[A.loc]=null - qdel(A) - // delete areas that belong only to this map - for(var/area/a in areas) - if(a && !a.contents.len) qdel(a) - if(x2>=world.maxx || y2>=world.maxy || z2>=world.maxz) CutXYZ() - qdel(areas) - ..() - return QDEL_HINT_HARDDEL_NOW - - /* - Savefile format: - map - id - x // size, not coords - y - z - areas // list of areas, not including default - [each z; 1 to depth] - [each y; 1 to height] - [each x; 1 to width] - type // of turf - AREA // if non-default; saved as a number (index into areas list) - vars // all other changed vars - */ - Write(savefile/S) - var/x - var/y - var/z - var/n - var/list/areas - var/area/defarea=locate(world.area) - if(!defarea) defarea=new world.area - areas=list() - for(var/turf/T in block(locate(x1,y1,z1),locate(x2,y2,z2))) - areas[T.loc]=null - for(n in areas) // quickly eliminate associations for smaller storage - areas-=n - areas+=n - areas-=defarea - InitializeSwapMaps() - locked=1 - S["id"] << id - S["z"] << z2-z1+1 - S["y"] << y2-y1+1 - S["x"] << x2-x1+1 - S["areas"] << areas - for(n in 1 to areas.len) areas[areas[n]]=n - var/oldcd=S.cd - for(z in z1 to z2) - S.cd="[z-z1+1]" - for(y in y1 to y2) - S.cd="[y-y1+1]" - for(x in x1 to x2) - S.cd="[x-x1+1]" - var/turf/T=locate(x,y,z) - S["type"] << T.type - if(T.loc!=defarea) S["AREA"] << areas[T.loc] - T.Write(S) - S.cd=".." - S.cd=".." - sleep() - S.cd=oldcd - locked=0 - qdel(areas) - - Read(savefile/S,_id,turf/locorner) - var/x - var/y - var/z - var/n - var/list/areas - var/area/defarea=locate(world.area) - id=_id - if(locorner) - ischunk=1 - x1=locorner.x - y1=locorner.y - z1=locorner.z - if(!defarea) defarea=new world.area - if(!_id) - S["id"] >> id - else - var/dummy - S["id"] >> dummy - S["z"] >> z2 // these are depth, - S["y"] >> y2 // height, - S["x"] >> x2 // width - S["areas"] >> areas - locked=1 - AllocateSwapMap() // adjust x1,y1,z1 - x2,y2,z2 coords - var/oldcd=S.cd - for(z in z1 to z2) - S.cd="[z-z1+1]" - for(y in y1 to y2) - S.cd="[y-y1+1]" - for(x in x1 to x2) - S.cd="[x-x1+1]" - var/tp - S["type"]>>tp - var/turf/T=locate(x,y,z) - T.loc.contents-=T - T=new tp(locate(x,y,z)) - if("AREA" in S.dir) - S["AREA"]>>n - var/area/A=areas[n] - A.contents+=T - else defarea.contents+=T - // clear the turf - for(var/obj/O in T) qdel(O) - for(var/mob/M in T) - if(!M.key) qdel(M) - else M.loc=null - // finish the read - T.Read(S) - S.cd=".." - S.cd=".." - sleep() - S.cd=oldcd - locked=0 - qdel(areas) - - /* - Find an empty block on the world map in which to load this map. - If no space is found, increase world.maxz as necessary. (If the - map is greater in x,y size than the current world, expand - world.maxx and world.maxy too.) - - Ignore certain operations if loading a map as a chunk. Use the - x1,y1,z1 position for it, and *don't* count it as a loaded map. - */ - proc/AllocateSwapMap() - InitializeSwapMaps() - world.maxx=max(x2,world.maxx) // stretch x/y if necessary - world.maxy=max(y2,world.maxy) - if(!ischunk) - if(world.maxz<=swapmaps_compiled_maxz) - z1=swapmaps_compiled_maxz+1 - x1=1;y1=1 - else - var/list/l=ConsiderRegion(1,1,world.maxx,world.maxy,swapmaps_compiled_maxz+1) - x1=l[1] - y1=l[2] - z1=l[3] - qdel(l) - x2+=x1-1 - y2+=y1-1 - z2+=z1-1 - space_manager.increase_max_zlevel_to(z2) // stretch z if necessary - if(!ischunk) - swapmaps_loaded[src]=null - swapmaps_byname[id]=src - - proc/ConsiderRegion(X1,Y1,X2,Y2,Z1,Z2) - while(1) - var/nextz=0 - var/swapmap/M - for(M in swapmaps_loaded) - if(M.z2Z2) || M.z1>=Z1+z2 ||\ - M.x1>X2 || M.x2=X1+x2 ||\ - M.y1>Y2 || M.y2=Y1+y2) continue - // look for sub-regions with a defined ceiling - var/nz2=Z2?(Z2):Z1+z2-1+M.z2-M.z1 - if(M.x1>=X1+x2) - .=ConsiderRegion(X1,Y1,M.x1-1,Y2,Z1,nz2) - if(.) return - else if(M.x2<=X2-x2) - .=ConsiderRegion(M.x2+1,Y1,X2,Y2,Z1,nz2) - if(.) return - if(M.y1>=Y1+y2) - .=ConsiderRegion(X1,Y1,X2,M.y1-1,Z1,nz2) - if(.) return - else if(M.y2<=Y2-y2) - .=ConsiderRegion(X1,M.y2+1,X2,Y2,Z1,nz2) - if(.) return - nextz=nextz?min(nextz,M.z2+1):(M.z2+1) - if(!M) - /* If nextz is not 0, then at some point there was an overlap that - could not be resolved by using an area to the side */ - if(nextz) Z1=nextz - if(!nextz || (Z2 && Z2-Z1+1=z2)?list(X1,Y1,Z1):null - X1=1;X2=world.maxx - Y1=1;Y2=world.maxy - - proc/CutXYZ() - var/mx=swapmaps_compiled_maxx - var/my=swapmaps_compiled_maxy - var/mz=swapmaps_compiled_maxz - for(var/swapmap/M in swapmaps_loaded) // may not include src - mx=max(mx,M.x2) - my=max(my,M.y2) - mz=max(mz,M.z2) - world.maxx=mx - world.maxy=my - space_manager.cut_levels_downto(mz) - - // save and delete - proc/Unload() - Save() - qdel(src) - - proc/Save() - if(id==src) return 0 - var/savefile/S=mode?(new):new("map_[id].sav") - S << src - while(locked) sleep(1) - if(mode) - fdel("map_[id].txt") - S.ExportText("/","map_[id].txt") - return 1 - - // this will not delete existing savefiles for this map - proc/SetID(newid) - swapmaps_byname-=id - id=newid - swapmaps_byname[id]=src - - proc/AllTurfs(z) - if(isnum(z) && (zz2)) return null - return block(LoCorner(z),HiCorner(z)) - - // this could be safely called for an obj or mob as well, but - // probably not an area - proc/Contains(turf/T) - return (T && T.x>=x1 && T.x<=x2\ - && T.y>=y1 && T.y<=y2\ - && T.z>=z1 && T.z<=z2) - - proc/InUse() - for(var/turf/T in AllTurfs()) - for(var/mob/M in T) if(M.key) return 1 - - proc/LoCorner(z=z1) - return locate(x1,y1,z) - proc/HiCorner(z=z2) - return locate(x2,y2,z) - - /* - Build procs: Take 2 turfs as corners, plus an item type. - An item may be like: - - /turf/wall - /obj/fence{icon_state="iron"} - */ - proc/BuildFilledRectangle(turf/T1,turf/T2,item) - if(!Contains(T1) || !Contains(T2)) return - var/turf/T=T1 - // pick new corners in a block()-friendly form - T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) - T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) - for(T in block(T1,T2)) new item(T) - - proc/BuildRectangle(turf/T1,turf/T2,item) - if(!Contains(T1) || !Contains(T2)) return - var/turf/T=T1 - // pick new corners in a block()-friendly form - T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) - T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) - if(T2.x-T1.x<2 || T2.y-T1.y<2) BuildFilledRectangle(T1,T2,item) - else - //for(T in block(T1,T2)-block(locate(T1.x+1,T1.y+1,T1.z),locate(T2.x-1,T2.y-1,T2.z))) - for(T in block(T1,locate(T2.x,T1.y,T2.z))) new item(T) - for(T in block(locate(T1.x,T2.y,T1.z),T2)) new item(T) - for(T in block(locate(T1.x,T1.y+1,T1.z),locate(T1.x,T2.y-1,T2.z))) new item(T) - for(T in block(locate(T2.x,T1.y+1,T1.z),locate(T2.x,T2.y-1,T2.z))) new item(T) - - /* - Supplementary build proc: Takes a list of turfs, plus an item - type. Actually the list doesn't have to be just turfs. - */ - proc/BuildInTurfs(list/turfs,item) - for(var/T in turfs) new item(T) - -atom - Write(savefile/S) - for(var/V in vars-"x"-"y"-"z"-"contents"-"icon"-"overlays"-"underlays") - if(issaved(vars[V])) - if(vars[V]!=initial(vars[V])) S[V]<>ic - if(istext(ic)) icon=swapmaps_iconcache[ic] - if(l && contents!=l) - contents+=l - qdel(l) - - -// set this up (at runtime) as follows: -// list(\ -// 'player.dmi'="player",\ -// 'monster.dmi'="monster",\ -// ... -// 'item.dmi'="item") -var/list/swapmaps_iconcache - -// preferred mode; sav or text -var/const/SWAPMAPS_SAV=0 -var/const/SWAPMAPS_TEXT=1 -var/swapmaps_mode=SWAPMAPS_SAV - -var/swapmaps_compiled_maxx -var/swapmaps_compiled_maxy -var/swapmaps_compiled_maxz -var/swapmaps_initialized -var/swapmaps_loaded -var/swapmaps_byname - -proc/InitializeSwapMaps() - if(swapmaps_initialized) return - swapmaps_initialized=1 - swapmaps_compiled_maxx=world.maxx - swapmaps_compiled_maxy=world.maxy - swapmaps_compiled_maxz=world.maxz - swapmaps_loaded=list() - swapmaps_byname=list() - if(swapmaps_iconcache) - for(var/V in swapmaps_iconcache) - // reverse-associate everything - // so you can look up an icon file by name or vice-versa - swapmaps_iconcache[swapmaps_iconcache[V]]=V - -proc/SwapMaps_AddIconToCache(name,icon) - if(!swapmaps_iconcache) swapmaps_iconcache=list() - swapmaps_iconcache[name]=icon - swapmaps_iconcache[icon]=name - -proc/SwapMaps_Find(id) - InitializeSwapMaps() - return swapmaps_byname[id] - -proc/SwapMaps_Load(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(!M) - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else if(fexists("map_[id].sav")) - S=new("map_[id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else return // no file found - if(text) - S=new - S.ImportText("/",file("map_[id].txt")) - S >> M - while(M.locked) sleep(1) - M.mode=text - return M - -proc/SwapMaps_Save(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(M) M.Save() - return M - -proc/SwapMaps_Save_All() - InitializeSwapMaps() - for(var/swapmap/M in swapmaps_loaded) - if(M) M.Save() - -proc/SwapMaps_Unload(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(!M) return // return silently from an error - M.Unload() - return 1 - -proc/SwapMaps_DeleteFile(id) - fdel("map_[id].sav") - fdel("map_[id].txt") - -proc/SwapMaps_CreateFromTemplate(template_id) - var/swapmap/M=new - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[template_id].txt")) - text=1 - else if(fexists("map_[template_id].sav")) - S=new("map_[template_id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt")) - text=1 - else - log_world("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.") - return - if(text) - S=new - S.ImportText("/",file("map_[template_id].txt")) - /* - This hacky workaround is needed because S >> M will create a brand new - M to fill with data. There's no way to control the Read() process - properly otherwise. The //.0 path should always match the map, however. - */ - S.cd="//.0" - M.Read(S,M) - M.mode=text - while(M.locked) sleep(1) - return M - -proc/SwapMaps_LoadChunk(chunk_id,turf/locorner) - var/swapmap/M=new - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) - text=1 - else if(fexists("map_[chunk_id].sav")) - S=new("map_[chunk_id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) - text=1 - else - log_world("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.") - return - if(text) - S=new - S.ImportText("/",file("map_[chunk_id].txt")) - /* - This hacky workaround is needed because S >> M will create a brand new - M to fill with data. There's no way to control the Read() process - properly otherwise. The //.0 path should always match the map, however. - */ - S.cd="//.0" - M.Read(S,M,locorner) - while(M.locked) sleep(1) - qdel(M) - return 1 - -proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2) - if(!corner1 || !corner2) - log_world("SwapMaps error in SwapMaps_SaveChunk():") - if(!corner1) log_world(" corner1 turf is null") - if(!corner2) log_world(" corner2 turf is null") - return - var/swapmap/M=new - M.id=chunk_id - M.ischunk=1 // this is a chunk - M.x1=min(corner1.x,corner2.x) - M.y1=min(corner1.y,corner2.y) - M.z1=min(corner1.z,corner2.z) - M.x2=max(corner1.x,corner2.x) - M.y2=max(corner1.y,corner2.y) - M.z2=max(corner1.z,corner2.z) - M.mode=swapmaps_mode - M.Save() - while(M.locked) sleep(1) - qdel(M) - return 1 - -proc/SwapMaps_GetSize(id) - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else if(fexists("map_[id].sav")) - S=new("map_[id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else - log_world("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.") - return - if(text) - S=new - S.ImportText("/",file("map_[id].txt")) - /* - The //.0 path should always be the map. There's no other way to - read this data. - */ - S.cd="//.0" - var/x - var/y - var/z - S["x"] >> x - S["y"] >> y - S["z"] >> z - return list(x,y,z) diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm index 8b578fdd1f7..e74da2a6628 100644 --- a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm +++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm @@ -181,7 +181,7 @@ /obj/item/paper/terrorspiders9 name = "paper - 'Research Notes'" - info = "The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them." + info = "The notes appear gibberish to you. Perhaps a destructive analyzer in R&D could make sense of them." origin_tech = "combat=4;materials=4;engineering=4;biotech=4" /obj/item/gun/energy/laser/awaymission_aeg @@ -257,5 +257,3 @@ else to_chat(user, "Your ID card already has all the access this machine can give.") . = 1 - - diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index 468863f3026..c2d10d7c97d 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -19,4 +19,9 @@ /area/awaymission/BMPship/Fore name = "\improper Fore Block" icon_state = "away3" + requires_power = 1 + +/area/awaymission/BMPship/Gate + name = "\improper Gateway Block" + icon_state = "away4" requires_power = 1 \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index 81d21df5dcf..00609b7a218 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -234,7 +234,7 @@ D.account = get_card_account(id, occupant) if(!D.account) return null - if(!D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name)) + if(!D.account.charge(100, null, "10 minutes hotel stay", "Biesel GalaxyNet Terminal [rand(111,1111)]", "[name]")) return null D.occupant = occupant @@ -251,7 +251,7 @@ if(!D || !D.occupant) return - if(D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name)) + if(D.account.charge(100, null, "10 minutes hotel stay extension", "Biesel GalaxyNet Terminal [rand(111,1111)]", "[name]")) D.roomtimer = addtimer(CALLBACK(src, .proc/process_room, roomid), PAY_INTERVAL, TIMER_STOPPABLE) else force_checkout(roomid) @@ -299,4 +299,4 @@ return S.retal_target = target - S.retal = 1 \ No newline at end of file + S.retal = 1 diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index c7f8504f13e..0fe05e8ff92 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -200,6 +200,7 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) "large_stamp-law.png" = 'icons/paper_icons/large_stamp-law.png', "large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png', "large_stamp-syndicate.png" = 'icons/paper_icons/large_stamp-syndicate.png', + "large_stamp-rep.png" = 'icons/paper_icons/large_stamp-rep.png', "talisman.png" = 'icons/paper_icons/talisman.png', "ntlogo.png" = 'icons/paper_icons/ntlogo.png' ) @@ -348,4 +349,4 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) register_asset(asset_name, assets[asset_name]) /datum/asset/mob_hunt/send(client) - send_asset_list(client, assets, verify) \ No newline at end of file + send_asset_list(client, assets, verify) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 4936256484e..3c0d57dfff9 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -202,7 +202,27 @@ var/aggressiveness = 1 var/safety = 1 actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase) - + var/phrase_list = list( + + "halt" = "HALT! HALT! HALT! HALT!", + "bobby" = "Stop in the name of the Law.", + "compliance" = "Compliance is in your best ineterest.", + "justice" = "Prepare for justice!", + "running" = "Running will only increase your sentence", + "dontmove" = "Don't move, Creep!", + "floor" = "Down on the floor, Creep!", + "robocop" = "Dead or alive you're coming with me.", + "god" = "God made today for the crooks we could not catch yesterday.", + "freeze" = "Freeze, Scum Bag!", + "imperial" = "Stop right there, criminal scum!", + "bash" = "Stop or I'll bash you.", + "harry" = "Go ahead, make my day", + "asshole" = "Stop breaking the law, asshole.", + "stfu" = "You have the right to shut the fuck up", + "shutup" = "Shut up crime!", + "super" = "Face the wrath of the golden bolt.", + "dredd" = "I am, the LAW!" + ) /obj/item/clothing/mask/gas/sechailer/hos name = "\improper HOS SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." @@ -250,133 +270,34 @@ else if(actiontype == /datum/action/item_action/adjust) adjustmask(user) else if(actiontype == /datum/action/item_action/selectphrase) + var/key = phrase_list[phrase] + var/message = phrase_list[key] + + if (!safety) + to_chat(user, "You set the restrictor to: FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT.") + return + switch(aggressiveness) if(1) - switch(phrase) - if(1) - to_chat(user, "You set the restrictor to: Stop in the name of the Law.") - phrase = 2 - if(2) - to_chat(user, "You set the restrictor to: Compliance is in your best interest.") - phrase = 3 - if(3) - to_chat(user, "You set the restrictor to: Prepare for justice.") - phrase = 4 - if(4) - to_chat(user, "You set the restrictor to: Running will only increase your sentence.") - phrase = 5 - if(5) - to_chat(user, "You set the restrictor to: Don't move, Creep!") - phrase = 6 - if(6) - to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!") - phrase = 1 - else - to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!") - phrase = 1 + phrase = (phrase < 6) ? (phrase + 1) : 1 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") if(2) - switch(phrase) - if(7) - to_chat(user, "You set the restrictor to: Dead or alive you're coming with me.") - phrase = 8 - if(8) - to_chat(user, "You set the restrictor to: God made today for the crooks we could not catch yesterday.") - phrase = 9 - if(9) - to_chat(user, "You set the restrictor to: Freeze, Scum Bag!") - phrase = 10 - if(10) - to_chat(user, "You set the restrictor to: Stop right there, criminal scum!") - phrase = 11 - if(11) - to_chat(user, "You set the restrictor to: Down on the floor, Creep!") - phrase = 7 - else - to_chat(user, "You set the restrictor to: Down on the floor, Creep!") - phrase = 7 + phrase = (phrase < 11 && phrase >= 7) ? (phrase + 1) : 7 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") if(3) - switch(phrase) - if(12) - to_chat(user, "You set the restrictor to: Go ahead, make my day.") - phrase = 13 - if(13) - to_chat(user, "You set the restrictor to: Stop breaking the law, ass hole.") - phrase = 14 - if(14) - to_chat(user, "You set the restrictor to: You have the right to shut the fuck up.") - phrase = 15 - if(15) - to_chat(user, "You set the restrictor to: Shut up crime!") - phrase = 16 - if(16) - to_chat(user, "You set the restrictor to: Face the wrath of the golden bolt.") - phrase = 17 - if(17) - to_chat(user, "You set the restrictor to: I am, the LAW!") - phrase = 18 - if(18) - to_chat(user, "You set the restrictor to: Stop or I'll bash you.") - phrase = 12 - else - to_chat(user, "You set the restrictor to: Go ahead, make my day.") - phrase = 13 - + phrase = (phrase < 18 && phrase >= 12 ) ? (phrase + 1) : 12 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") if(4) - switch(phrase) - if(1) - to_chat(user, "You set the restrictor to: Stop in the name of the Law.") - phrase = 2 - if(2) - to_chat(user, "You set the restrictor to: Compliance is in your best interest.") - phrase = 3 - if(3) - to_chat(user, "You set the restrictor to: Prepare for justice.") - phrase = 4 - if(4) - to_chat(user, "You set the restrictor to: Running will only increase your sentence.") - phrase = 5 - if(5) - to_chat(user, "You set the restrictor to: Don't move, Creep!") - phrase = 6 - if(6) - to_chat(user, "You set the restrictor to: Down on the floor, Creep!") - phrase = 7 - if(7) - to_chat(user, "You set the restrictor to: Dead or alive you're coming with me.") - phrase = 8 - if(8) - to_chat(user, "You set the restrictor to: God made today for the crooks we could not catch yesterday.") - phrase = 9 - if(9) - to_chat(user, "You set the restrictor to: Freeze, Scum Bag!") - phrase = 10 - if(10) - to_chat(user, "You set the restrictor to: Stop right there, criminal scum!") - phrase = 11 - if(11) - to_chat(user, "You set the restrictor to: Stop or I'll bash you.") - phrase = 12 - if(12) - to_chat(user, "You set the restrictor to: Go ahead, make my day.") - phrase = 13 - if(13) - to_chat(user, "You set the restrictor to: Stop breaking the law, ass hole.") - phrase = 14 - if(14) - to_chat(user, "You set the restrictor to: You have the right to shut the fuck up.") - phrase = 15 - if(15) - to_chat(user, "You set the restrictor to: Shut up crime!") - phrase = 16 - if(16) - to_chat(user, "You set the restrictor to: Face the wrath of the golden bolt.") - phrase = 17 - if(17) - to_chat(user, "You set the restrictor to: I am, the LAW!") - phrase = 18 - if(18) - to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!") - phrase = 1 + phrase = (phrase < 18 && phrase >= 1 ) ? (phrase + 1) : 1 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") else to_chat(user, "It's broken.") @@ -419,77 +340,20 @@ return /obj/item/clothing/mask/gas/sechailer/proc/halt() - var/phrase_text = null - var/phrase_sound = null + var/key = phrase_list[phrase] + var/message = phrase_list[key] if(cooldown < world.time - 35) // A cooldown, to stop people being jerks if(!safety) - phrase_text = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT." - usr.visible_message("[usr]'s Compli-o-Nator: [phrase_text]") + message = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT." + usr.visible_message("[usr]'s Compli-o-Nator: [message]") playsound(src.loc, 'sound/voice/binsult.ogg', 100, 0, 4) cooldown = world.time return - - switch(phrase) //sets the properties of the chosen phrase - if(1) // good cop - phrase_text = "HALT! HALT! HALT! HALT!" - phrase_sound = "halt" - if(2) - phrase_text = "Stop in the name of the Law." - phrase_sound = "bobby" - if(3) - phrase_text = "Compliance is in your best interest." - phrase_sound = "compliance" - if(4) - phrase_text = "Prepare for justice!" - phrase_sound = "justice" - if(5) - phrase_text = "Running will only increase your sentence." - phrase_sound = "running" - if(6) // bad cop - phrase_text = "Don't move, Creep!" - phrase_sound = "dontmove" - if(7) - phrase_text = "Down on the floor, Creep!" - phrase_sound = "floor" - if(8) - phrase_text = "Dead or alive you're coming with me." - phrase_sound = "robocop" - if(9) - phrase_text = "God made today for the crooks we could not catch yesterday." - phrase_sound = "god" - if(10) - phrase_text = "Freeze, Scum Bag!" - phrase_sound = "freeze" - if(11) - phrase_text = "Stop right there, criminal scum!" - phrase_sound = "imperial" - if(12) // LA-PD - phrase_text = "Stop or I'll bash you." - phrase_sound = "bash" - if(13) - phrase_text = "Go ahead, make my day." - phrase_sound = "harry" - if(14) - phrase_text = "Stop breaking the law, ass hole." - phrase_sound = "asshole" - if(15) - phrase_text = "You have the right to shut the fuck up." - phrase_sound = "stfu" - if(16) - phrase_text = "Shut up crime!" - phrase_sound = "shutup" - if(17) - phrase_text = "Face the wrath of the golden bolt." - phrase_sound = "super" - if(18) - phrase_text = "I am, the LAW!" - phrase_sound = "dredd" - - usr.visible_message("[usr]'s Compli-o-Nator: [phrase_text]") - playsound(src.loc, "sound/voice/complionator/[phrase_sound].ogg", 100, 0, 4) + usr.visible_message("[usr]'s Compli-o-Nator: [message]") + playsound(src.loc, "sound/voice/complionator/[key].ogg", 100, 0, 4) cooldown = world.time diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 22f293aedfc..fba251f71f8 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -120,6 +120,78 @@ mute = MUZZLE_MUTE_NONE security_lock = TRUE locked = FALSE + materials = list(MAT_METAL=500, MAT_GLASS=50) + +/obj/item/clothing/mask/muzzle/safety/shock + name = "shock muzzle" + desc = "A muzzle designed to prevent biting. This one is fitted with a behavior correction system." + var/obj/item/assembly/trigger = null + origin_tech = "materials=1;engineering=1" + materials = list(MAT_METAL=500, MAT_GLASS=50) + +/obj/item/clothing/mask/muzzle/safety/shock/attackby(obj/item/W, mob/user, params) + if(isscrewdriver(W) && trigger) + to_chat(user, "You disassemble [src].") + trigger.forceMove(get_turf(user)) + trigger.master = null + trigger.holder = null + trigger = null + return TRUE + else if(istype(W, /obj/item/assembly/signaler) || istype(W, /obj/item/assembly/voice)) + if(istype(trigger, /obj/item/assembly/signaler) || istype(trigger, /obj/item/assembly/voice)) + to_chat(user, "Something is already attached to [src].") + return FALSE + if(!user.drop_item()) + to_chat(user, "You are unable to insert [W] into [src].") + return FALSE + trigger = W + trigger.forceMove(src) + trigger.master = src + trigger.holder = src + to_chat(user, "You attach the [W] to [src].") + return TRUE + else if(istype(W, /obj/item/assembly)) + to_chat(user, "That won't fit in [src]. Perhaps a signaler or voice analyzer would?") + return FALSE + + return ..() + + +/obj/item/clothing/mask/muzzle/safety/shock/proc/can_shock(obj/item/clothing/C) + if(istype(C)) + if(isliving(C.loc)) + return C.loc + else if(isliving(loc)) + return loc + return FALSE + +/obj/item/clothing/mask/muzzle/safety/shock/proc/process_activation(var/obj/D, var/normal = 1, var/special = 1) + visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + var/mob/M = can_shock(loc) + if(M) + to_chat(M, "You feel a sharp shock!") + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(3, 1, M) + s.start() + + M.Weaken(5) + M.Stuttering(1) + M.Jitter(20) + return + +/obj/item/clothing/mask/muzzle/safety/shock/HasProximity(atom/movable/AM as mob|obj) + if(trigger) + trigger.HasProximity(AM) + + +/obj/item/clothing/mask/muzzle/safety/shock/hear_talk(mob/living/M as mob, msg) + if(trigger) + trigger.hear_talk(M, msg) + +/obj/item/clothing/mask/muzzle/safety/shock/hear_message(mob/living/M as mob, msg) + if(trigger) + trigger.hear_message(M, msg) + /obj/item/clothing/mask/surgical diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 91884eeba2d..2597b3cdde7 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -40,7 +40,7 @@ allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/t_scanner, /obj/item/rcd, /obj/item/crowbar, \ /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/multitool, \ /obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \ - /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun) + /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun, /obj/item/gun/projectile/automatic/lasercarbine, /obj/item/gun/energy/gun/blueshield) strip_delay = 130 species_fit = list("Drask", "Vox") sprite_sheets = list( diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 75614d56312..a89c9fb5929 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -313,7 +313,7 @@ on = 1 actions_types = list(/datum/action/item_action/toggle_helmet_mode) flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL - visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE + visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDETAIL /obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon() icon_state = "hardsuit[on]-[item_color]" @@ -379,7 +379,7 @@ desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." slowdown = 1 flags = STOPSPRESSUREDMAGE | THICKMATERIAL - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS else to_chat(user, "You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.") diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 1e874772478..532522747ed 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -110,7 +110,7 @@ slowdown = 0 flags = STOPSPRESSUREDMAGE flags_size = ONESIZEFITSALL - allowed = list(/obj/item) //for stuffing exta special presents + allowed = list(/obj/item) //for stuffing extra special presents //Space pirate outfit /obj/item/clothing/head/helmet/space/pirate @@ -139,13 +139,20 @@ //Paramedic EVA suit /obj/item/clothing/head/helmet/space/eva/paramedic name = "Paramedic EVA helmet" - desc = "A paramedic EVA helmet. Used in the recovery of bodies from space." + desc = "A brand new paramedic EVA helmet. It seems to mold to your head shape. Used for retrieving bodies in space." icon_state = "paramedic-eva-helmet" item_state = "paramedic-eva-helmet" - species_fit = list("Vox", "Grey") + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) + species_restricted = list("exclude", "Diona", "Wryn") + species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Grey" = 'icons/mob/species/grey/helmet.dmi' + "Grey" = 'icons/mob/species/grey/helmet.dmi', + "Skrell" = 'icons/mob/species/skrell/helmet.dmi', + "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', + "Drask" = 'icons/mob/species/drask/helmet.dmi', + "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/hats.dmi' @@ -155,10 +162,18 @@ name = "Paramedic EVA suit" icon_state = "paramedic-eva" item_state = "paramedic-eva" - desc = "A paramedic EVA suit. Used in the recovery of bodies from space." - species_fit = list("Vox") + desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space." + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) + species_restricted = list("exclude", "Diona", "Wryn") + species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' + "Vox" = 'icons/mob/species/vox/suit.dmi', + "Grey" = 'icons/mob/species/grey/suit.dmi', + "Skrell" = 'icons/mob/species/skrell/suit.dmi', + "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + "Drask" = 'icons/mob/species/drask/suit.dmi', + "Unathi" = 'icons/mob/species/unathi/suit.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi', ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/suits.dmi' diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 9fd827070d7..968d12d9baf 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -331,6 +331,12 @@ item_state = "lingspacesuit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS +/obj/item/clothing/suit/draculacoat // Bleh! + name = "transylvanian coat" + desc = "What is a spessman? A miserable little pile of secrets." + icon_state = "draculacoat" + item_state = "draculacoat" + /* * Winter Coats */ diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 6306fa5a83e..52494728155 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -97,18 +97,9 @@ log transactions if(!powered()) return var/obj/item/stack/spacecash/C = I - authenticated_account.money += C.amount playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1) - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Credit deposit" - T.amount = C.amount - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - authenticated_account.transaction_log.Add(T) + authenticated_account.credit(C.amount, "Credit deposit", machine_id, authenticated_account.owner_name) to_chat(user, "You insert [C] into [src].") SSnanoui.update_uis(src) @@ -175,19 +166,8 @@ log transactions else if(transfer_amount <= authenticated_account.money) var/target_account_number = text2num(href_list["target_acc_number"]) var/transfer_purpose = href_list["purpose"] - if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount)) + if(linked_db.charge_to_account(target_account_number, authenticated_account, transfer_purpose, machine_id, transfer_amount)) to_chat(usr, "[bicon(src)]Funds transfer successful.") - authenticated_account.money -= transfer_amount - - //create an entry in the account transaction log - var/datum/transaction/T = new() - T.target_name = "Account #[target_account_number]" - T.purpose = transfer_purpose - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - T.amount = "([transfer_amount])" - authenticated_account.transaction_log.Add(T) else to_chat(usr, "[bicon(src)]Funds transfer failed.") @@ -263,15 +243,7 @@ log transactions authenticated_account.money -= amount withdraw_arbitrary_sum(amount) - //create an entry in the account transaction log - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Credit withdrawal" - T.amount = "([amount])" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - authenticated_account.transaction_log.Add(T) + authenticated_account.charge(amount, null, "Credit withdrawal", machine_id, authenticated_account.owner_name) else to_chat(usr, "[bicon(src)]You don't have enough funds to do that!") if("balance_statement") diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 23b51fd2aea..f1f283fe56a 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -1,4 +1,9 @@ -var/global/current_date_string +#define STATION_CREATION_DATE "2 April, 2555" +#define STATION_CREATION_TIME "11:24:30" +#define STATION_START_CASH 75000 +#define STATION_SOURCE_TERMINAL "Biesel GalaxyNet Terminal #227" +#define DEPARTMENT_START_CASH 5000 + var/global/num_financial_terminals = 1 var/global/datum/money_account/station_account var/global/list/datum/money_account/department_accounts = list() @@ -15,19 +20,13 @@ var/global/list/all_money_accounts = list() station_account.owner_name = "[station_name()] Station Account" station_account.account_number = rand(111111, 999999) station_account.remote_access_pin = rand(1111, 111111) - station_account.money = 75000 + station_account.money = STATION_START_CASH //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = station_account.owner_name - T.purpose = "Account creation" - T.amount = 75000 - T.date = "2nd April, 2555" - T.time = "11:24" - T.source_terminal = "Biesel GalaxyNet Terminal #277" + station_account.makeTransactionLog(STATION_START_CASH, "Account Creation", STATION_SOURCE_TERMINAL, station_account.owner_name, FALSE, + STATION_CREATION_DATE, STATION_CREATION_TIME) //add the account - station_account.transaction_log.Add(T) all_money_accounts.Add(station_account) /proc/create_department_account(department) @@ -37,19 +36,13 @@ var/global/list/all_money_accounts = list() department_account.owner_name = "[department] Account" department_account.account_number = rand(111111, 999999) department_account.remote_access_pin = rand(1111, 111111) - department_account.money = 5000 + department_account.money = DEPARTMENT_START_CASH //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = department_account.owner_name - T.purpose = "Account creation" - T.amount = department_account.money - T.date = "2nd April, 2555" - T.time = "11:24" - T.source_terminal = "Biesel GalaxyNet Terminal #277" + department_account.makeTransactionLog(DEPARTMENT_START_CASH, "Account Creation", STATION_SOURCE_TERMINAL, department_account.owner_name, FALSE, + STATION_CREATION_DATE, STATION_CREATION_TIME) //add the account - department_account.transaction_log.Add(T) all_money_accounts.Add(department_account) department_accounts[department] = department_account @@ -73,7 +66,7 @@ var/global/list/all_money_accounts = list() if(!source_db) //set a random date, time and location some time over the past few decades T.date = "[num2text(rand(1,31))] [pick(month_names)], [rand(game_year - 20,game_year - 1)]" - T.time = "[rand(0,23)]:[rand(0,59)]" + T.time = "[rand(0,23)]:[rand(0,59)]:[rand(0,59)]" T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]" M.account_number = rand(111111, 999999) @@ -104,7 +97,7 @@ var/global/list/all_money_accounts = list() Date and time: [station_time_timestamp()], [current_date_string]

Creation terminal ID: [source_db.machine_id]
Authorised NT officer overseeing creation: [overseer]
"} - // END AUTOFIX + //stamp the paper var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') stampoverlay.icon_state = "paper_stamp-cent" @@ -133,7 +126,6 @@ var/global/list/all_money_accounts = list() /datum/money_account/New() ..() - //security_level = pick (0,1) //Stealing is now slightly viable /datum/transaction var/target_name = "" @@ -142,222 +134,14 @@ var/global/list/all_money_accounts = list() var/date = "" var/time = "" var/source_terminal = "" -/* -/obj/machinery/account_database - name = "Accounts database" - desc = "Holds transaction logs, account data and all kinds of other financial records." - icon = 'icons/obj/virology.dmi' - icon_state = "analyser" - density = 1 - req_one_access = list(access_hop, access_captain) - var/receipt_num - var/machine_id = "" - var/obj/item/card/id/held_card - var/access_level = 0 - var/datum/money_account/detailed_account_view - var/creating_new_account = 0 - var/activated = 1 -/obj/machinery/account_database/New() - ..() - if(!station_account) - create_station_account() - - if(department_accounts.len == 0) - for(var/department in station_departments) - create_department_account(department) - if(!vendor_account) - create_department_account("Vendor") - vendor_account = department_accounts["Vendor"] - - if(!current_date_string) - current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557" - - machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" - -/obj/machinery/account_database/attack_hand(mob/user as mob) - if(ishuman(user) && !user.stat && get_dist(src,user) <= 1) - var/dat = "Accounts Database
" - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:171: dat += "[machine_id]
" - dat += {"[machine_id]
- Confirm identity: [held_card ? held_card : "-----"]
"} - // END AUTOFIX - if(access_level > 0) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:175: dat += "[activated ? "Disable" : "Enable"] remote access
" - dat += {"[activated ? "Disable" : "Enable"] remote access
- You may not edit accounts at this terminal, only create and view them.
"} - // END AUTOFIX - if(creating_new_account) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:178: dat += "
" - dat += {"
- Return to accounts list -
- - - Holder name:
- Initial funds: (subtracted from station account)
- New accounts are automatically assigned a secret number and pin, which are printed separately in a sealed package.
-
- "} - // END AUTOFIX - else - if(detailed_account_view) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:190: dat += "
" - dat += {"
- Return to accounts list
- Account number: #[detailed_account_view.account_number]
- Account holder: [detailed_account_view.owner_name]
- Account balance: $[detailed_account_view.money]
-
- - - - - - - - "} - // END AUTOFIX - for(var/datum/transaction/T in detailed_account_view.transaction_log) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:205: dat += "" - dat += {" - - - - - - - "} - // END AUTOFIX - dat += "
DateTimeTargetPurposeValueSource terminal ID
[T.date][T.time][T.target_name][T.purpose]$[T.amount][T.source_terminal]
" - else - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:215: dat += "Create new account

" - dat += {"Create new account

- "} - // END AUTOFIX - for(var/i=1, i<=all_money_accounts.len, i++) - var/datum/money_account/D = all_money_accounts[i] - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:219: dat += "" - dat += {" - - - - "} - // END AUTOFIX - dat += "
#[D.account_number][D.owner_name]View in detail
" - - user << browse(dat,"window=account_db;size=700x650") - else - user << browse(null,"window=account_db") - -/obj/machinery/account_database/attackby(O as obj, user as mob)//TODO:SANITY - if(istype(O, /obj/item/card)) - var/obj/item/card/id/idcard = O - if(!held_card) - usr.drop_item() - idcard.loc = src - held_card = idcard - - if(access_cent_captain in idcard.access) - access_level = 2 - else if(access_hop in idcard.access || access_captain in idcard.access) - access_level = 1 - else - ..() - -/obj/machinery/account_database/Topic(var/href, var/href_list) - ..() - if(href_list["toggle_activated"]) - activated = !activated - - if(href_list["choice"]) - switch(href_list["choice"]) - if("create_account") - creating_new_account = 1 - if("finalise_create_account") - var/account_name = href_list["holder_name"] - var/starting_funds = max(text2num(href_list["starting_funds"]), 0) - create_account(account_name, starting_funds, src) - if(starting_funds > 0) - //subtract the money - station_account.money -= starting_funds - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = account_name - T.purpose = "New account funds initialisation" - T.amount = "([starting_funds])" - T.date = current_date_string - T.time = station_time_timestamp() - T.source_terminal = machine_id - station_account.transaction_log.Add(T) - - 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 - access_level = 0 - - else - var/obj/item/I = usr.get_active_hand() - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/C = I - usr.drop_item() - C.loc = src - held_card = C - - if(access_cent_captain in C.access) - access_level = 2 - else if(access_hop in C.access || access_captain in C.access) - access_level = 1 - if("view_account_detail") - var/index = text2num(href_list["account_index"]) - if(index && index <= all_money_accounts.len) - detailed_account_view = all_money_accounts[index] - if("view_accounts_list") - detailed_account_view = null - creating_new_account = 0 - - src.attack_hand(usr) -*/ -/obj/machinery/computer/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(attempt_account_number, datum/money_account/source, purpose, terminal_id, amount) if(!activated) return 0 for(var/datum/money_account/D in all_money_accounts) if(D.account_number == attempt_account_number && !D.suspended) - D.money += amount - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = source_name - T.purpose = purpose - if(amount < 0) - T.amount = "([amount])" - else - T.amount = "[amount]" - T.date = current_date_string - T.time = station_time_timestamp() - T.source_terminal = terminal_id - D.transaction_log.Add(T) - + source.charge(amount, D, purpose, terminal_id, "Account #[D.account_number]", "Transfer from [source.owner_name]", + "[D.owner_name]") return 1 return 0 @@ -378,3 +162,9 @@ var/global/list/all_money_accounts = list() for(var/datum/money_account/D in all_money_accounts) if(D.account_number == attempt_account_number) return D + +#undef STATION_CREATION_DATE +#undef STATION_CREATION_TIME +#undef STATION_START_CASH +#undef STATION_SOURCE_TERMINAL +#undef DEPARTMENT_START_CASH diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 3ea778671a1..e99367cb8fd 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -1,3 +1,4 @@ +var/global/current_date_string /obj/machinery/computer/account_database name = "Accounts Uplink Terminal" @@ -15,34 +16,6 @@ light_color = LIGHT_COLOR_GREEN -/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user) - if(user.can_admin_interact()) - 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 - -/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 = station_time_timestamp() - T.source_terminal = machine_id - return T - -/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/computer/account_database/New() if(!station_account) create_station_account() @@ -55,11 +28,29 @@ vendor_account = department_accounts["Vendor"] if(!current_date_string) - current_date_string = "[time2text(world.timeofday, "DD MM")], [game_year]" + current_date_string = "[time2text(world.timeofday, "DD Month")], [game_year]" machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" ..() +/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user) + if(user.can_admin_interact()) + 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 + +/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/computer/account_database/attackby(obj/O, mob/user, params) if(!istype(O, /obj/item/card/id)) return ..() @@ -160,16 +151,6 @@ if("create_account") creating_new_account = 1 - if("add_funds") - var/amount = input("Enter the amount you wish to add", "Silently add funds") as num - if(detailed_account_view) - detailed_account_view.money += amount - - if("remove_funds") - var/amount = input("Enter the amount you wish to remove", "Silently remove funds") as num - if(detailed_account_view) - detailed_account_view.money -= amount - if("toggle_suspension") if(detailed_account_view) detailed_account_view.suspended = !detailed_account_view.suspended @@ -182,14 +163,10 @@ starting_funds = Clamp(starting_funds, 0, station_account.money) // Not authorized to put the station in debt. starting_funds = min(starting_funds, fund_cap) // Not authorized to give more than the fund cap. - create_account(account_name, starting_funds, src) + var/datum/money_account/M = create_account(account_name, starting_funds, src) if(starting_funds > 0) - //subtract the money - station_account.money -= starting_funds - - //create a transaction log entry - var/trx = create_transation(account_name, "New account activation", "([starting_funds])") - station_account.transaction_log.Add(trx) + station_account.charge(starting_funds, null, "New account activation", + "", "New account activation", M.owner_name) creating_new_account = 0 ui.close() @@ -205,19 +182,6 @@ detailed_account_view = null creating_new_account = 0 - if("revoke_payroll") - var/funds = detailed_account_view.money - var/account_trx = create_transation(station_account.owner_name, "Revoke payroll", "([funds])") - var/station_trx = create_transation(detailed_account_view.owner_name, "Revoke payroll", funds) - - station_account.money += funds - detailed_account_view.money = 0 - - detailed_account_view.transaction_log.Add(account_trx) - station_account.transaction_log.Add(station_trx) - - callHook("revoke_payroll", list(detailed_account_view)) - if("print") var/text playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index f305c43ad9d..b636a96e2aa 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -3,8 +3,7 @@ desc = "Swipe your ID card to make purchases electronically." icon = 'icons/obj/device.dmi' icon_state = "eftpos" - var/machine_id = "" - var/eftpos_name = "Default EFTPOS scanner" + var/machine_name = "" var/transaction_locked = 0 var/transaction_paid = 0 var/transaction_amount = 0 @@ -15,7 +14,7 @@ /obj/item/eftpos/New() ..() - machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]" + machine_name = "[station_name()] EFTPOS #[num_financial_terminals++]" access_code = rand(1111,111111) reconnect_database() spawn(0) @@ -28,14 +27,10 @@ /obj/item/eftpos/proc/print_reference() playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) var/obj/item/paper/R = new(loc) - R.name = "Reference: [eftpos_name]" - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:31: R.info = "[eftpos_name] reference

" - R.info = {"[eftpos_name] reference

+ R.name = "Reference: [machine_name]" + R.info = {"[machine_name] reference

Access code: [access_code]

Do not lose or misplace this code.
"} - // END AUTOFIX //stamp the paper var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') stampoverlay.icon_state = "paper_stamp-cent" @@ -86,8 +81,7 @@ /obj/item/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] - data["eftpos_name"] = eftpos_name - data["machine_id"] = machine_id + data["machine_name"] = machine_name data["transaction_locked"] = transaction_locked data["transaction_paid"] = transaction_paid data["transaction_purpose"] = transaction_purpose @@ -112,15 +106,6 @@ print_reference() else to_chat(usr, "[bicon(src)]Incorrect code entered.") - if("change_id") - var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code")) - if(attempt_code == access_code) - var/name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null - if(name) - eftpos_name = "[name] EFTPOS scanner" - print_reference() - else - to_chat(usr, "[bicon(src)]Incorrect code entered.") if("link_account") if(!linked_db) reconnect_database() @@ -179,48 +164,34 @@ if(istype(I, /obj/item/card/id)) var/obj/item/card/id/C = I visible_message("[user] swipes a card through [src].") - if(transaction_locked && !transaction_paid) - if(linked_account) - var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - if(transaction_amount <= D.money) - playsound(src, 'sound/machines/chime.ogg', 50, 1) - visible_message("[bicon(src)] The [src] chimes.") - transaction_paid = 1 - //transfer the money - D.money -= transaction_amount - linked_account.money += transaction_amount + if(!transaction_locked || transaction_paid) + return + + if(!linked_account) + to_chat(user, "[bicon(src)]EFTPOS is not connected to an account.") + return + + var/confirm = alert("Are you sure you want to pay $[transaction_amount] to Account: [linked_account.owner_name] ", "Confirm transaction", "Yes", "No") + if(confirm == "No") + return + var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num + var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) + + if(!D) + to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again.") + + if(transaction_amount > D.money) + to_chat(user, "[bicon(src)]You don't have that much money!") + return + + var/transSuccess = D.charge(transaction_amount, linked_account, transaction_purpose, machine_name, D.owner_name) + if(transSuccess == TRUE) + playsound(src, 'sound/machines/chime.ogg', 50, 1) + visible_message("[bicon(src)] The [src] chimes.") + transaction_paid = 1 - //create entries in the two account transaction logs - var/datum/transaction/T = new() - T.target_name = "[linked_account.owner_name] (via [eftpos_name])" - T.purpose = transaction_purpose - if(transaction_amount > 0) - T.amount = "([transaction_amount])" - else - T.amount = "[transaction_amount]" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - D.transaction_log.Add(T) - // - T = new() - T.target_name = D.owner_name - T.purpose = transaction_purpose - T.amount = "[transaction_amount]" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - linked_account.transaction_log.Add(T) - else - to_chat(user, "[bicon(src)]You don't have that much money!") - else - to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again.") - else - to_chat(user, "[bicon(src)]EFTPOS is not connected to an account.") else ..() - //emag? \ No newline at end of file + //emag? diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm index 60361ad3f77..30d570bac92 100644 --- a/code/modules/economy/utils.dm +++ b/code/modules/economy/utils.dm @@ -46,47 +46,69 @@ /datum/money_account/proc/fmtBalance() return "$[num2septext(money)]" -/datum/money_account/proc/charge(var/transaction_amount,var/datum/money_account/dest,var/transaction_purpose, var/terminal_name="", var/terminal_id=0, var/dest_name = "UNKNOWN") +// Seperated from charge so they can reuse the code and also because there's many instances where a log will be made without actually making a transaction +/datum/money_account/proc/makeTransactionLog(transaction_amount = 0, transaction_purpose, terminal_name = "", + dest_name = "UNKNOWN", charging = TRUE, date = current_date_string, time = "") + var/datum/transaction/T = new() + T.target_name = dest_name + T.purpose = transaction_purpose + if(!charging || transaction_amount == 0) + T.amount = "[transaction_amount]" + else + T.amount = "([transaction_amount])" + + T.source_terminal = terminal_name + T.date = date + if(time == "") + T.time = station_time_timestamp() + else + T.time = time + transaction_log.Add(T) + + // Charge is for transferring money from an account to another. The destination account can possibly not exist (Magical money sink) +/datum/money_account/proc/charge(transaction_amount = 0, datum/money_account/dest, transaction_purpose, + terminal_name = "", dest_name = "UNKNOWN", dest_purpose, dest_target_name) if(suspended) to_chat(usr, "Unable to access source account: account suspended.") return 0 - + + if(transaction_amount <= money) + //transfer the money + money -= transaction_amount + makeTransactionLog(transaction_amount, transaction_purpose, terminal_name, dest_name) + if(dest) + dest.money += transaction_amount + dest.makeTransactionLog(transaction_amount, + dest_purpose ? dest_purpose : transaction_purpose, terminal_name, dest_target_name ? dest_target_name : dest_name, FALSE) + return 1 + else + to_chat(usr, "Insufficient funds in account.") + return 0 + +// phantom_charge is for when you want to charge an account, without making any corresponding log (e.g. you make it yourself with custom date +// or there won't be any log for some IC reasons (hacking) +/datum/money_account/proc/phantom_charge(transaction_amount = 0, datum/money_account/dest, suspensionbypass = 0) + if(suspended && !suspensionbypass) + return 0 + if(transaction_amount <= money) //transfer the money money -= transaction_amount if(dest) dest.money += transaction_amount - - //create entries in the two account transaction logs - var/datum/transaction/T - if(dest) - T = new() - T.target_name = owner_name - if(terminal_name!="") - T.target_name += " (via [terminal_name])" - T.purpose = transaction_purpose - if(transaction_amount > 0) - T.amount = "([transaction_amount])" - else - T.amount = "[transaction_amount]" - if(terminal_id) - T.source_terminal = terminal_id - T.date = current_date_string - T.time = station_time_timestamp() - dest.transaction_log.Add(T) - // - T = new() - T.target_name = (!dest) ? dest_name : dest.owner_name - if(terminal_name!="") - T.target_name += " (via [terminal_name])" - T.purpose = transaction_purpose - T.amount = "[transaction_amount]" - if(terminal_id) - T.source_terminal = terminal_id - T.date = current_date_string - T.time = station_time_timestamp() - transaction_log.Add(T) return 1 else - to_chat(usr, "Insufficient funds in account.") - return 0 \ No newline at end of file + return 0 + +// Credit is for giving money to an account out of thin air. Suspension does not matter. +/datum/money_account/proc/credit(transaction_amount = 0, transaction_purpose, + terminal_name = "", dest_name = "UNKNOWN", date = current_date_string, time = "") + + money += transaction_amount + makeTransactionLog(transaction_amount, transaction_purpose, terminal_name, dest_name, FALSE, date, time) + return 1 + +//phantom_credit is like the above without any log +/datum/money_account/proc/phantom_credit(transaction_amount = 0) + money += transaction_amount + return 1 diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index ef5a816d2ff..e58b2a861bd 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -11,14 +11,20 @@ if(!T) return kill() var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1) - var/mob/C - if(candidates.len) - C = pick(candidates) - Blob = new /obj/structure/blob/core(T, new_overmind=C.client) - for(var/i in 1 to 5) - Blob.process() - else + if(!candidates.len) return kill() + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in all_vent_pumps) + if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) + if(temp_vent.parent.other_atmosmch.len > 50) + vents += temp_vent + var/obj/vent = pick(vents) + var/mob/living/simple_animal/mouse/blobinfected/B = new(vent.loc) + var/mob/M = pick(candidates) + B.key = M.key + to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") + var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob") + notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) /datum/event/blob/tick() if(!Blob) diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 9ca4e878050..c0b16ab43a6 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -17,12 +17,12 @@ if(announce) event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg') - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot) + var/list/skipped_areas = list(/area/turret_protected/ai) + var/list/skipped_areas_apc = list(/area/engine/engineering) for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) - if(current_area.type in skipped_areas || !is_station_level(S.z)) + if((current_area.type in skipped_areas) || !is_station_level(S.z)) continue S.last_charge = S.charge S.last_output_attempt = S.output_attempt @@ -35,26 +35,26 @@ for(var/obj/machinery/power/apc/C in apcs) var/area/current_area = get_area(C) - if(current_area.type in skipped_areas_apc || !is_station_level(C.z)) + if((current_area.type in skipped_areas_apc) || !is_station_level(C.z)) continue if(C.cell) C.cell.charge = 0 /proc/power_restore(var/announce = 1) - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot) + var/list/skipped_areas = list(/area/turret_protected/ai) + var/list/skipped_areas_apc = list(/area/engine/engineering) if(announce) event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') for(var/obj/machinery/power/apc/C in apcs) var/area/current_area = get_area(C) - if(current_area.type in skipped_areas_apc || !is_station_level(C.z)) + if((current_area.type in skipped_areas_apc) || !is_station_level(C.z)) continue if(C.cell) C.cell.charge = C.cell.maxcharge for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) - if(current_area.type in skipped_areas || !is_station_level(S.z)) + if((current_area.type in skipped_areas) || !is_station_level(S.z)) continue S.charge = S.last_charge S.output_attempt = S.last_output_attempt diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 641fec1405e..4ba4a14a315 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -1,3 +1,6 @@ +#define MINIMUM_PERCENTAGE_LOSS 0.5 +#define VARIABLE_LOSS 2 // Invariant: 1 - VARIABLE_LOSS/10 >= MINIMUM_PERCENTAGE_LOSS + /var/global/account_hack_attempted = 0 /datum/event/money_hacker @@ -16,7 +19,7 @@ /datum/event/money_hacker/announce() var/message = "A brute force hack has been detected (in progress since [station_time_timestamp()]). The target of the attack is: Financial account #[affected_account.account_number], \ - without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \ + without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected account until the attack has ceased. \ Notifications will be sent as updates occur.
" var/my_department = "[station_name()] firewall subroutines" @@ -32,35 +35,38 @@ /datum/event/money_hacker/end() var/message - if(affected_account && !affected_account) - //hacker wins + if(!isnull(affected_account) && !affected_account.suspended) message = "The hack attempt has succeeded." - //subtract the money - var/lost = affected_account.money * 0.8 + (rand(2,4) - 2) / 10 - affected_account.money -= lost + var/lost = affected_account.money * (MINIMUM_PERCENTAGE_LOSS + rand(0,VARIABLE_LOSS) / 10); + + affected_account.phantom_charge(lost) + //create a taunting log entry - var/datum/transaction/T = new() - T.target_name = pick("","yo brotha from anotha motha","el Presidente","chieF smackDowN") - T.purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez") - T.amount = pick("","([rand(0,99999)])","alla money","9001$","HOLLA HOLLA GET DOLLA","([lost])") + var/dest_name = pick("","yo brotha from anotha motha","el Presidente","chieF smackDowN") + var/amount = pick("","([rand(0,99999)])","alla money","9001$","HOLLA HOLLA GET DOLLA","([lost])") + var/purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez") var/date1 = "31 December, 1999" var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]" - T.date = pick("", current_date_string, date1, date2) + var/date = pick("", current_date_string, date1, date2) var/time1 = rand(0, 99999999) var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" - T.time = pick("", station_time_timestamp(), time2) - T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD") + var/time = pick("", station_time_timestamp(), time2) + var/source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD") + + affected_account.makeTransactionLog(amount, purpose, source_terminal, dest_name, TRUE, date, time) - affected_account.transaction_log.Add(T) else //crew wins - message = "The attack has ceased, the affected accounts can now be brought online." + message = "The attack has ceased, the affected account can now be brought online." var/my_department = "[station_name()] firewall subroutines" for(var/obj/machinery/message_server/MS in world) if(!MS.active) continue MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) + +#undef MINIMUM_PERCENTAGE_LOSS +#undef VARIABLE_LOSS diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index b95278b441b..9339ee6a626 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -8,19 +8,9 @@ if(all_money_accounts.len) var/datum/money_account/D = pick(all_money_accounts) winner_name = D.owner_name - if(!D.suspended) - D.money += winner_sum - var/datum/transaction/T = new() - T.target_name = "Nyx Daily Grand Slam -Stellar- Lottery" - T.purpose = "Winner!" - T.amount = winner_sum - T.date = current_date_string - T.time = worldtime2text() - T.source_terminal = "Biesel TCD Terminal #[rand(111,333)]" - D.transaction_log.Add(T) - - deposit_success = 1 + D.credit(winner_sum, "Winner!", "Biesel TCD Terminal #[rand(111,333)]", "Nyx Daily Grand Slam -Stellar- Lottery") + deposit_success = 1 /datum/event/money_lotto/announce() var/datum/feed_message/newMsg = new /datum/feed_message diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index fd4aa5aa340..e3ca42425db 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -226,9 +226,8 @@ if(load(O, user)) user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") - SSnanoui.update_uis(src) - + else if(istype(O, /obj/item/storage/bag)) var/obj/item/storage/bag/P = O var/plants_loaded = 0 @@ -242,7 +241,7 @@ SSnanoui.update_uis(src) - else + else if(!istype(O, /obj/item/card/emag)) to_chat(user, "\The [src] smartly refuses [O].") return 1 @@ -308,11 +307,6 @@ to_chat(user, "Some items are refused.") SSnanoui.update_uis(src) -/obj/machinery/smartfridge/secure/emag_act(mob/user) - emagged = 1 - locked = -1 - to_chat(user, "You short out the product lock on [src].") - /******************* * SmartFridge Menu ********************/ @@ -539,6 +533,16 @@ /************************ * Secure SmartFridges *************************/ +/obj/machinery/smartfridge/secure/emag_act(mob/user) + emagged = 1 + locked = -1 + to_chat(user, "You short out the product lock on [src].") + +/obj/machinery/smartfridge/secure/emp_act(severity) + if(prob(40/severity) && (!emagged) && (locked != -1)) + playsound(loc, 'sound/effects/sparks4.ogg', 60, 1) + emagged = 1 + locked = -1 /obj/machinery/smartfridge/secure/Topic(href, href_list) if(stat & (NOPOWER|BROKEN)) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index e14aaa09ba7..7efb6460b75 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -221,6 +221,8 @@ return if(over_object == M) + if(!remove_item_from_storage(M)) + M.unEquip(src) M.put_in_hands(src) else if(istype(over_object, /obj/screen)) @@ -374,10 +376,11 @@ H.parentdeck = parentdeck H.concealed = concealed H.update_icon() - update_icon() if(!cards.len) qdel(src) + return + update_icon() /obj/item/cardhand/verb/discard(var/mob/user as mob) @@ -410,7 +413,7 @@ if(cards.len) update_icon() if(H.cards.len) - usr.visible_message("The [user] plays the [discarding].", "You play the [discarding].") + usr.visible_message("The [usr] plays the [discarding].", "You play the [discarding].") H.loc = get_step(usr,usr.dir) if(!cards.len) @@ -419,7 +422,6 @@ /obj/item/cardhand/update_icon(var/direction = 0) if(!cards.len) - qdel(src) return else if(cards.len > 1) name = "hand of cards" diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 5b4a35262d7..84db02cb89c 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -315,12 +315,16 @@ /datum/plant_gene/trait/teleport/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C) var/teleport_radius = max(round(G.seed.potency / 10), 1) var/turf/T = get_turf(C) - to_chat(C, "You slip through spacetime!") - do_teleport(C, T, teleport_radius) - if(prob(50)) - do_teleport(G, T, teleport_radius) + if(do_teleport(C, T, teleport_radius)) + to_chat(C, "You slip through spacetime!") + if(prob(50)) + do_teleport(G, T, teleport_radius) + else + new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect... + qdel(G) else - new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect... + to_chat(C, "[src] sparks, and burns up!") + new /obj/effect/decal/cleanable/molten_object(T) qdel(G) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index bf9c5a67783..852bcd3edf3 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -664,6 +664,9 @@ var/turf/T = get_turf(H) T.add_vomit_floor(H) playsound(H, 'sound/effects/splat.ogg', 50, 1) + else + visible_message("[src] flickers and fails, due to bluespace interference!") + qdel(src) /**********************Resonator**********************/ diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 623f5b6b353..6c4e847fe32 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -24,15 +24,20 @@ return target // All mobs should have custom emote, really.. -/mob/proc/custom_emote(var/m_type=1,var/message = null) +/mob/proc/custom_emote(var/m_type=EMOTE_VISUAL,var/message = null) if(stat || !use_me && usr == src) if(usr) to_chat(usr, "You are unable to emote.") return - var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) - if(m_type == 2 && muzzled) return + var/muzzled = is_muzzled() + if(muzzled) + var/obj/item/clothing/mask/muzzle/M = wear_mask + if(m_type == EMOTE_SOUND && M.mute >= MUZZLE_MUTE_MUFFLE) + return //Not all muzzles block sound + if(m_type == EMOTE_SOUND && !can_speak()) + return var/input if(!message) @@ -63,7 +68,7 @@ // Type 1 (Visual) emotes are sent to anyone in view of the item - if(m_type & 1) + if(m_type & EMOTE_VISUAL) var/list/can_see = get_mobs_in_view(1,src) //Allows silicon & mmi mobs carried around to see the emotes of the person carrying them around. can_see |= viewers(src,null) for(var/mob/O in can_see) @@ -80,7 +85,7 @@ // Type 2 (Audible) emotes are sent to anyone in hear range // of the *LOCATION* -- this is important for pAIs to be heard - else if(m_type & 2) + else if(m_type & EMOTE_SOUND) for(var/mob/O in get_mobs_in_view(7,src)) if(O.status_flags & PASSEMOTES) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index c1eb8641820..69653dfe1e8 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -10,6 +10,10 @@ act = copytext(act, 1, t1) var/muzzled = is_muzzled() + if(muzzled) + var/obj/item/clothing/mask/muzzle/M = wear_mask + if(M.mute == MUZZLE_MUTE_NONE) + muzzled = 0 //Not all muzzles block sound if(!can_speak()) muzzled = 1 //var/m_type = 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3f36b8b6d55..bce245addc0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1328,7 +1328,7 @@ dna.species.create_organs(src) for(var/thing in kept_items) - equip_to_slot_or_del(thing, kept_items[thing]) + equip_to_slot_if_possible(thing, kept_items[thing], redraw_mob = 0) //Handle default hair/head accessories for created mobs. var/obj/item/organ/external/head/H = get_organ("head") diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index ebbf8f67726..fbdbb8071c9 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -253,8 +253,8 @@ if(H.status_flags & GOTTAGOFAST) . -= 1 - if(H.status_flags & GOTTAGOREALLYFAST) - . -= 2 + if(H.status_flags & GOTTAGOFAST_METH) + . -= 1 return . /datum/species/proc/on_species_gain(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index 3bf442b60d0..82a6c321b8c 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -133,8 +133,13 @@ hair += i var/new_style = input(H, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair + var/new_color = input("Please select hair color.", "Monitor Color", head_organ.hair_colour) as null|color + if(H.incapacitated()) - to_chat(src, "You were interrupted while changing your monitor display.") + to_chat(H, "You were interrupted while changing your monitor display.") return + if(new_style) - H.change_hair(new_style) \ No newline at end of file + H.change_hair(new_style) + if(new_color) + H.change_hair_color(new_color) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index efc55db9117..6becb2e4630 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -163,7 +163,7 @@ icon_state = "radio" // -//Robotic Component Analyser, basically a health analyser for robots +//Robotic Component Analyzer, basically a health analyzer for robots // /obj/item/robotanalyzer name = "cyborg analyzer" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 755b874667a..4b127de9af7 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -290,7 +290,7 @@ var/list/robot_verbs_default = list( if(N.kickoff) modules = list("Nations") if(mmi != null && mmi.alien) - modules = "Hunter" + modules = list("Hunter") modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules if(!modtype) return @@ -394,7 +394,6 @@ var/list/robot_verbs_default = list( if("Hunter") module = new /obj/item/robot_module/alien/hunter(src) - icon = "icons/mob/alien.dmi" icon_state = "xenoborg-state-a" modtype = "Xeno-Hu" feedback_inc("xeborg_hunter",1) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 0a3ed47b933..a66a9f30de0 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -7,6 +7,7 @@ if(..()) return 1 if(message_mode) + used_radios += radio if(!is_component_functioning("radio")) to_chat(src, "Your radio isn't functional at this time.") return 0 @@ -18,8 +19,10 @@ if(..()) return 1 if(message_mode == "department") + used_radios += aiRadio return holopad_talk(message, verb, speaking) else if(message_mode) + used_radios += aiRadio if(aiRadio.disabledAi || aiRestorePowerRoutine || stat) to_chat(src, "System Error - Transceiver Disabled.") return 0 @@ -36,6 +39,7 @@ else if(message_mode) if(message_mode == "general") message_mode = null + used_radios += radio return radio.talk_into(src,message,message_mode,verb,speaking) /mob/living/silicon/say_quote(var/text) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index a7a62c74c0b..079ec7df1d2 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -146,3 +146,57 @@ response_disarm = "gently pushes aside" response_harm = "splats" gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + + +/mob/living/simple_animal/mouse/blobinfected + maxHealth = 100 + health = 100 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + var/cycles_alive = 0 + var/cycles_limit = 30 + var/has_burst = FALSE + +/mob/living/simple_animal/mouse/blobinfected/Life() + cycles_alive++ + var/timeleft = (cycles_limit - cycles_alive) * 2 + if(ismob(loc)) // if someone ate it, burst immediately + burst(FALSE) + else if(timeleft < 1) // if timer expired, burst. + burst(FALSE) + else if(cycles_alive % 2 == 0) // give the mouse/player a countdown reminder every 2 cycles + to_chat(src, "[timeleft] seconds until you burst, and become a blob...") + return ..() + +/mob/living/simple_animal/mouse/blobinfected/death(gibbed) + burst(gibbed) + return ..(gibbed) + +/mob/living/simple_animal/mouse/blobinfected/proc/burst(gibbed) + if(has_burst) + return FALSE + var/turf/T = get_turf(src) + if(!is_station_level(T.z) || isspaceturf(T)) + to_chat(src, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!") + return FALSE + has_burst = TRUE + var/datum/mind/blobmind = mind + var/client/C = client + if(istype(blobmind) && istype(C)) + blobmind.special_role = SPECIAL_ROLE_BLOB + var/obj/structure/blob/core/core = new(T, 200, C, 3) + if(core.overmind && core.overmind.mind) + //core.overmind.mind.name = blob.name + core.overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + else + new /obj/structure/blob/core(T) // Ghosts will be prompted to control it. + if(ismob(loc)) // in case some taj/etc ate the mouse. + var/mob/M = loc + M.gib() + if(!gibbed) + gib() + +/mob/living/simple_animal/mouse/blobinfected/get_scooped(mob/living/carbon/grabber) + to_chat(grabber, "You try to pick up [src], but they slip out of your grasp!") + to_chat(src, "[src] tries to pick you up, but you wriggle free of their grasp!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index 3063c5a8ce1..9e4bae870cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -65,10 +65,12 @@ addtimer(CALLBACK(src, .proc/inert_check), 2400) /obj/item/organ/internal/hivelord_core/proc/inert_check() - if(!owner && !preserved) - go_inert() - else + if(owner) preserved(implanted = 1) + else if(preserved) + preserved() + else + go_inert() /obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0) inert = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 894c039b3f4..875af3da359 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -51,7 +51,10 @@ var/damage = O.force if(O.damtype == STAMINA) damage = 0 - health -= damage + if(force_threshold && damage < force_threshold) + visible_message("[src] is unharmed by [O]!") + return + adjustHealth(damage) visible_message("[src] has been attacked with the [O] by [user]. ") playsound(loc, O.hitsound, 25, 1, -1) else @@ -125,6 +128,9 @@ seen_revived_enemy = TRUE raise_alert("[name] reports intruder [target] has returned from death!") depotarea.list_remove(target, depotarea.dead_list) + if(!atoms_share_level(src, target) && prob(20)) + // This prevents someone from aggroing a depot mob, then hiding in a locker, perfectly safe, while the mob stands there getting killed by their friends. + LoseTarget() /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_action() if(seen_enemy) @@ -134,6 +140,14 @@ if(scan_cycles >= 15 && istype(depotarea)) scan_cycles = 0 if(!atoms_share_level(src, spawn_turf)) + if(istype(loc, /obj/structure/closet)) + var/obj/structure/closet/O = loc + forceMove(get_turf(src)) + visible_message("[src] smashes their way out of [O]!") + qdel(O) + raise_alert("[src] reported being trapped in a locker.") + raised_alert = FALSE + return if(alert_on_spacing) raise_alert("[src] lost in space.") death() @@ -196,19 +210,14 @@ alert_on_timeout = TRUE alert_on_shield_breach = TRUE -/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/death() - if(depotarea) - depotarea.declare_finished() - return ..() - - /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize() - . = ..() + ..() + return INITIALIZE_HINT_LATELOAD + +/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/LateInitialize() if(istype(depotarea)) var/list/key_candidates = list() for(var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O in living_mob_list) - if(O == src) - continue key_candidates += O if(key_candidates.len) var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O = pick(key_candidates) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 693ca724ac6..b5d0a100ae3 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -171,8 +171,8 @@ var/global/list/ts_spiderling_list = list() visible_message("[src] harmlessly nuzzles [target].") T.CheckFaction() CheckFaction() - else if(istype(target, /obj/structure/spider/cocoon)) - to_chat(src, "Destroying our own cocoons would not help us.") + else if(istype(target, /obj/structure/spider)) // Prevents destroying coccoons (exploit), eggs (horrible misclick), etc + to_chat(src, "Destroying things created by fellow spiders would not help us.") else if(istype(target, /obj/machinery/door/firedoor)) var/obj/machinery/door/firedoor/F = target if(F.density) diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index f7498392c02..c7f9bdd0d96 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -49,7 +49,14 @@ // Whether the mob is capable of talking /mob/living/can_speak() - return !(silent || (disabilities & MUTE) || is_muzzled()) + if(!(silent || (disabilities & MUTE))) + if(is_muzzled()) + var/obj/item/clothing/mask/muzzle/M = wear_mask + if(M.mute >= MUZZLE_MUTE_MUFFLE) + return FALSE + return TRUE + else + return FALSE // Whether the mob is capable of standing or not /mob/living/proc/can_stand() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fc09105e948..841c17a248e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -857,7 +857,7 @@ var/list/slot_equipment_priority = list( \ if(machine && in_range(src, usr)) show_inv(machine) - if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) + if(!usr.incapacitated() && in_range(src, usr)) if(href_list["item"]) var/slot = text2num(href_list["item"]) var/obj/item/what = get_item_by_slot(slot) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 83bb2ae1322..9655a9c9e17 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1292,6 +1292,11 @@ name = "Rough-Cropped Mane" icon_state = "rough" +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_raine + name = "Raine" + icon_state = "vulp_hair_raine" + gender = FEMALE + /datum/sprite_accessory/hair/vox species_allowed = list("Vox") glasses_over = 1 @@ -1410,6 +1415,42 @@ name = "Wildflowers" icon_state = "diona_wildflower" +//Kidan Hairstyles, sprites by Travelling Merchant + +/datum/sprite_accessory/hair/kidan + species_allowed = list("Kidan") + glasses_over = 1 + do_colouration = 0 + +/datum/sprite_accessory/hair/kidan/hollow_horns + name = "Hollow Horns" + icon_state = "kidan_hollow_horns" + +/datum/sprite_accessory/hair/kidan/wide_horns + name = "Wide Horns" + icon_state = "kidan_wide_horns" + +/datum/sprite_accessory/hair/kidan/curled_horns + name = "Curled Horns" + icon_state = "kidan_curled_horns" + +/datum/sprite_accessory/hair/kidan/hawk_horn + name = "Hawk Horn" + icon_state = "kidan_hawk_horn" + +/datum/sprite_accessory/hair/kidan/kidan_bull_horns + name = "Bull Horns" + icon_state = "kidan_bull_horns" + +/datum/sprite_accessory/hair/kidan/kidan_broken_bull_horns + name = "Broken Bull Horns" + icon_state = "kidan_broken_bull_horns" + +/datum/sprite_accessory/hair/kidan/kidan_tall_horns + name = "Tall Horns" + icon_state = "kidan_tall_horns" + + // Apollo-specific /datum/sprite_accessory/hair/wryn @@ -2517,6 +2558,17 @@ name = "Moth Antennae" icon_state = "kidan_moth" +/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Long + name = "Mantie Long" + icon_state = "kidan_Mantie_Long" + +/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Curled + name = "Mantie Curled" + icon_state = "kidan_Mantie_Curled" + +/datum/sprite_accessory/head_accessory/kidan/kidan_very_short + name = "Very Short" + icon_state = "kidan_very_short" /* BODY MARKINGS */ diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 7ba6ba5751a..4fe833e08ae 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -282,21 +282,9 @@ obj/machinery/lapvend/attackby(obj/item/I, mob/user) atom_say("Insufficient funds in account.") return 0 else - var/paid = customer_account.charge(total_price, - transaction_purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].", - terminal_name = name, - terminal_id = name, - dest_name = vendor_account.owner_name) + customer_account.charge(total_price, vendor_account, + "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].", + name, customer_account.owner_name, "Sale of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].", + customer_account.owner_name) - if(paid) - vendor_account.money += total_price - var/datum/transaction/T = new() - T.target_name = customer_account.owner_name - T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]" - T.amount = "[total_price]" - T.source_terminal = name - T.date = current_date_string - T.time = station_time_timestamp() - vendor_account.transaction_log.Add(T) - return 1 - return 0 + return 1 diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 7677530ee2e..201455f7a9e 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -316,7 +316,7 @@ var/list/alldepartments = list() /obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#9A04D1") - var/msg = "[faxname]: [key_name_admin(sender)] | REPLY: (RADIO) (FAX) (SM) | REJECT: (TEMPLATE) (BSA) (EVILFAX) : Receiving '[sent.name]' via secure connection... view message" + var/msg = "[faxname]: [key_name_admin(sender)] | REPLY: (RADIO) (FAX) (SM) | REJECT: (TEMPLATE) (BSA) (EVILFAX) : Receiving '[sent.name]' via secure connection... view message" for(var/client/C in admins) if(check_rights(R_EVENT, 0, C.mob)) to_chat(C, msg) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 831b496bab7..586138f1845 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -32,6 +32,8 @@ return if(over_object == M) + if(!remove_item_from_storage(M)) + M.unEquip(src) M.put_in_hands(src) else if(istype(over_object, /obj/screen)) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index ed5b7c1cfd4..b096c768ee0 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -207,7 +207,7 @@ var/image/img //and puts a matching for(var/j = 1, j <= temp_overlays.len, j++) //gray overlay onto the copy if(copy.ico.len) - if(findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent")) + if(findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent") || findtext(copy.ico[j], "rep")) img = image('icons/obj/bureaucracy.dmi', "paper_stamp-circle") else if(findtext(copy.ico[j], "deny")) img = image('icons/obj/bureaucracy.dmi', "paper_stamp-x") diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 5a101629c94..3aa21c5a5d0 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -72,8 +72,13 @@ icon_state = "stamp-clown" item_color = "clown" -/obj/item/stamp/centcom +/obj/item/stamp/rep name = "Nanotrasen Representative's rubber stamp" + icon_state = "stamp-rep" + item_color = "rep" + +/obj/item/stamp/centcom + name = "Central Command rubber stamp" icon_state = "stamp-cent" item_color = "centcom" diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ae64d5d4d6e..ed1458c1cae 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -1,3 +1,5 @@ +#define HEALPERCABLE 3 +#define MAXCABLEPERHEAL 8 /////////////////////////////// //CABLE STRUCTURE /////////////////////////////// @@ -149,7 +151,7 @@ By design, d1 is the smallest direction and d2 is the highest if(c.d1 == 12 || c.d2 == 12) c.qdel()*/ ///// Z-Level Stuff - investigate_log("was cut by [key_name(usr, usr.client)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires") + investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires") qdel(src) // qdel return @@ -531,23 +533,44 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(!S.is_robotic() || user.a_intent != INTENT_HELP || S.open == 2) return ..() - if(S.burn_dam) - if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP) - if(H == user) - if(!do_mob(user, H, 10)) - return 1 - var/cable_to_use = 0 - for(cable_to_use in 1 to 5) - if(cable_to_use == amount || (cable_to_use * 3) >= S.burn_dam) - break - use(cable_to_use) - S.heal_damage(0, (cable_to_use * 3), 0, 1) - user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") - else if(S.open != 2) - to_chat(user, "The damage is far too severe to patch over externally.") - return 1 - else if(S.open != 2) + if(S.burn_dam > ROBOLIMB_SELF_REPAIR_CAP) + to_chat(user, "The damage is far too severe to patch over externally.") + return + + if(!S.burn_dam) to_chat(user, "Nothing to fix!") + return + + if(H == user) + if(!do_mob(user, H, 10)) + return 0 + var/cable_used = 0 + var/childlist + if(!isnull(S.children)) + childlist = S.children.Copy() + var/parenthealed = FALSE + while(cable_used <= MAXCABLEPERHEAL && amount >= 1) + var/obj/item/organ/external/E + if(S.burn_dam) + E = S + else if(LAZYLEN(childlist)) + E = pick_n_take(childlist) + if(!E.burn_dam || !E.is_robotic()) + continue + else if(S.parent && !parenthealed) + E = S.parent + parenthealed = TRUE + if(!E.burn_dam || !E.is_robotic()) + break + else + break + while(cable_used <= MAXCABLEPERHEAL && E.burn_dam && amount >= 1) + use(1) + cable_used += 1 + E.heal_damage(0, HEALPERCABLE, 0, 1) + user.visible_message("\The [user] repairs some burn damage on \the [M]'s [E.name] with \the [src].") + return 1 + else return ..() @@ -820,3 +843,6 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white") color = cablecolor update_icon() + +#undef MAXCABLEPERHEAL +#undef HEALPERCABLE diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index a154691d0a8..0cd3a2ce0b2 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -172,7 +172,6 @@ damage_type = BRUTE flag = "bomb" range = 3 - log_override = TRUE var/pressure_decrease = 0.25 var/turf_aoe = FALSE @@ -218,7 +217,9 @@ for(var/mob/living/L in range(1, target_turf) - firer - target) var/armor = L.run_armor_check(def_zone, flag, "", "", armour_penetration) L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor) - to_chat(L, "You're struck by a [name]!") + L.visible_message("[L] is hit by \a [src]!", + "You are hit by \a [src]!") + add_attack_logs(firer, L, "Shot with a [type]") //Modkits diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index a4578d9c1e3..90f9ed47eec 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -202,6 +202,9 @@ return name = reject_bad_text(name) while(count--) + if(reagents.total_volume <= 0) + to_chat(usr, "Not enough reagents to create these pills!") + return var/obj/item/reagent_containers/food/pill/P = new/obj/item/reagent_containers/food/pill(loc) if(!name) name = reagents.get_master_reagent_name() P.name = "[name] pill" diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm index a2bd35ae75a..77c4b08f359 100644 --- a/code/modules/reagents/chemistry/reagents/drugs.dm +++ b/code/modules/reagents/chemistry/reagents/drugs.dm @@ -302,13 +302,13 @@ M.AdjustWeakened(-2.5) M.adjustStaminaLoss(-2) M.SetSleeping(0) - M.status_flags |= GOTTAGOREALLYFAST + M.status_flags |= GOTTAGOFAST_METH if(prob(50)) M.adjustBrainLoss(1.0) ..() /datum/reagent/methamphetamine/on_mob_delete(mob/living/M) - M.status_flags &= ~GOTTAGOREALLYFAST + M.status_flags &= ~GOTTAGOFAST_METH ..() /datum/reagent/methamphetamine/overdose_process(mob/living/M, severity) @@ -590,7 +590,7 @@ M.AdjustStunned(-2) M.AdjustWeakened(-2) M.adjustStaminaLoss(-2) - M.status_flags |= GOTTAGOREALLYFAST + M.status_flags |= GOTTAGOFAST_METH M.Jitter(3) M.adjustBrainLoss(0.5) if(prob(5)) @@ -598,7 +598,7 @@ ..() /datum/reagent/lube/ultra/on_mob_delete(mob/living/M) - M.status_flags &= ~GOTTAGOREALLYFAST + M.status_flags &= ~GOTTAGOFAST_METH ..() /datum/reagent/lube/ultra/overdose_process(mob/living/M, severity) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 771d627b421..ced02f2e48f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -69,10 +69,13 @@ /obj/item/reagent_containers/hypospray/safety name = "medical hypospray" - desc = "A modified hypospray for quickly injecting safe medicinal chemicals." - icon_state = "combat_hypo" + desc = "A general use medical hypospray for quick injection of chemicals. There is a safety button by the trigger." + icon_state = "medivend_hypo" safety_hypo = TRUE +/obj/item/reagent_containers/hypospray/safety/ert + list_reagents = list("omnizine" = 30) + /obj/item/reagent_containers/hypospray/CMO list_reagents = list("omnizine" = 30) @@ -158,4 +161,4 @@ /obj/item/reagent_containers/hypospray/autoinjector/nanocalcium/attack(mob/living/M, mob/user) if(..()) - playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1) \ No newline at end of file + playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index c7e276cae17..3bb3c237d07 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -258,6 +258,7 @@ return /obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd) + . = TRUE if(our_rpd.mode == RPD_ROTATE_MODE) rotate() else if(our_rpd.mode == RPD_FLIP_MODE) @@ -265,4 +266,4 @@ else if(our_rpd.mode == RPD_DELETE_MODE) our_rpd.delete_single_pipe(user, src) else - ..() + return ..() diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index bba85a5ff00..cbc6ad98582 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -543,14 +543,22 @@ build_path = /obj/item/assembly/timer category = list("initial", "Miscellaneous") -/datum/design/voice_analyser - name = "Voice Analyser" - id = "voice_analyser" +/datum/design/voice_analyzer + name = "Voice Analyzer" + id = "voice_analyzer" build_type = AUTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 50) build_path = /obj/item/assembly/voice category = list("initial", "Miscellaneous") +/datum/design/noise_analyser + name = "Noise Analyser" + id = "Noise_analyser" + build_type = AUTOLATHE + materials = list(MAT_METAL = 100, MAT_GLASS = 10) + build_path = /obj/item/assembly/voice/noise + category = list("initial", "Miscellaneous") + /datum/design/light_tube name = "Light Tube" id = "light_tube" @@ -904,4 +912,4 @@ build_type = AUTOLATHE materials = list(MAT_GLASS = 2500) //1.25 glass sheets, broken mirrors will return a shard (1 sheet) build_path = /obj/item/mounted/mirror - category = list("initial", "Miscellaneous") \ No newline at end of file + category = list("initial", "Miscellaneous") diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index a7fe42063ff..b5840d82265 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -323,6 +323,17 @@ build_path = /obj/item/organ/internal/cyberimp/arm/toolset category = list("Misc", "Medical") +/datum/design/cyberimp_diagnostic_hud + name = "Diagnostic HUD implant" + desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see. Wiggle eyes to control." + id = "ci-diaghud" + req_tech = list("materials" = 5, "engineering" = 4, "programming" = 4, "biotech" = 4) + build_type = PROTOLATHE | MECHFAB + construction_time = 50 + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500) + build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic + category = list("Misc", "Medical") + /datum/design/cyberimp_medical_hud name = "Medical HUD implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." @@ -345,6 +356,17 @@ build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security category = list("Misc", "Medical") +/datum/design/cyberimp_meson + name = "Meson scanner implant" + desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else." + id = "ci-mesonhud" + req_tech = list("materials" = 4, "biotech" = 4, "engineering" = 4) + build_type = PROTOLATHE | MECHFAB + construction_time = 50 + materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500, MAT_GOLD = 300) + build_path = /obj/item/organ/internal/cyberimp/eyes/meson + category = list("Misc", "Medical") + /datum/design/cyberimp_xray name = "X-Ray implant" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." @@ -537,4 +559,4 @@ build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500) build_path = /obj/item/organ/internal/lungs/cybernetic/upgraded - category = list("Medical") \ No newline at end of file + category = list("Medical") diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 8bdf6771df1..1036bb6e188 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -60,3 +60,23 @@ materials = list(MAT_METAL = 500, MAT_GLASS = 300) build_path = /obj/item/camera/digital category = list("Miscellaneous") + +/datum/design/safety_muzzle + name = "Safety Muzzle" + desc = "Produce a lockable muzzle keyed to security ID cards" + id = "safetymuzzle" + req_tech = list("materials" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL=500, MAT_GLASS=50) + build_path = /obj/item/clothing/mask/muzzle/safety + category = list("Miscellaneous") + +/datum/design/shock_muzzle + name = "Shock Muzzle" + desc = "Produce a modified safety muzzle that includes an electric shock pack and a slot for a trigger assembly." + id = "shockmuzzle" + req_tech = list("materials" = 1, "engineering" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL=500, MAT_GLASS=50) + build_path = /obj/item/clothing/mask/muzzle/safety/shock + category = list("Miscellaneous") diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 8d18df1ee07..aebbeb4bb9c 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -426,7 +426,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/key = usr.key //so we don't lose the info during the spawn delay if(!(being_built.build_type & PROTOLATHE)) g2g = 0 - message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!") + message_admins("Protolathe exploit attempted by [key_name(usr, TRUE)]!") if(g2g) //If input is incorrect, nothing happens var/new_coeff = coeff * being_built.lathe_time_factor @@ -502,7 +502,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, power = max(2000, power) if(!(being_built.build_type & IMPRINTER)) g2g = 0 - message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!") + message_admins("Circuit imprinter exploit attempted by [key_name(usr, TRUE)]!") if(g2g) //Again, if input is wrong, do nothing add_wait_message("Imprinting Circuit. Please Wait...", IMPRINTER_DELAY) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index fe1adce42fb..da559d38d5f 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -47,6 +47,16 @@ to_chat(owner, "Static obfuscates your vision!") owner.flash_eyes(visual = 1) +/obj/item/organ/internal/cyberimp/eyes/meson + name = "Meson scanner implant" + desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else." + eye_colour = "#199900" + implant_color = "#AEFF00" + origin_tech = "materials=4;engineering=4;biotech=4;magnets=4" + vision_flags = SEE_TURFS + see_invisible = SEE_INVISIBLE_MINIMUM + aug_message = "Suddenly, you realize how much of a mess the station really is..." + /obj/item/organ/internal/cyberimp/eyes/xray name = "X-ray implant" desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." @@ -96,6 +106,15 @@ aug_message = "You suddenly see health bars floating above people's heads..." HUD_type = DATA_HUD_MEDICAL_ADVANCED +/obj/item/organ/internal/cyberimp/eyes/hud/diagnostic + name = "Diagnostic HUD implant" + desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see." + eye_colour = "#723E02" + implant_color = "#ff9000" + origin_tech = "materials=4;engineering=4;biotech=4" + aug_message = "You see the diagnostic information of the synthetics around you..." + HUD_type = DATA_HUD_DIAGNOSTIC + /obj/item/organ/internal/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index b7cf78e5ed2..f0f1654ac30 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -311,7 +311,10 @@ return if(teles_left > 0) - doteleport(user) + if(!doteleport(user)) + telefail() + temp_msg = "ERROR! Target destination unreachable due to interference." + return else telefail() temp_msg = "ERROR!
Calibration required." diff --git a/html/changelog.html b/html/changelog.html index 28b7dfa242d..45ae9623573 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,223 @@ -->
+

05 September 2018

+

IrkallaEpsilon updated:

+ +

variableundefined updated:

+ + +

04 September 2018

+

Flatty updated:

+ +

FreeStylaLT updated:

+ +

IrkallaEpsilon updated:

+ +

Kyep updated:

+ +

Shazbot updated:

+ +

TDSSS updated:

+ +

Tails2091 updated:

+ +

Ty-Omaha updated:

+ +

datlo updated:

+ +

nicetoolbox updated:

+ +

variableundefined updated:

+ + +

31 August 2018

+

variableundefined updated:

+ + +

30 August 2018

+

Alffd updated:

+ +

Kyep updated:

+ +

Ty-Omaha updated:

+ + +

29 August 2018

+

Agameofscones updated:

+ +

Flatty updated:

+ +

Kyep updated:

+ +

Superhats updated:

+ +

Triiodine (Agameofscones) updated:

+ +

Ty-Omaha updated:

+ +

variableundefined updated:

+ + +

28 August 2018

+

Alffd updated:

+ +

Birdtalon updated:

+ +

Flatty updated:

+ +

Ty-Omaha updated:

+ +

taukausanake updated:

+ +

variableundefined updated:

+ + +

26 August 2018

+

Agameofscones updated:

+ + +

23 August 2018

+

Aurorablade updated:

+ +

Birdtalon updated:

+ +

Kyep updated:

+ +

alex-gh updated:

+ +

variableundefined updated:

+ + +

18 August 2018

+

Crazylemon64 updated:

+ + +

16 August 2018

+

AffectedArc07 updated:

+ +

Birdtalon updated:

+ + +

15 August 2018

+

tlc2013 updated:

+ +

variableundefined updated:

+ +

09 August 2018

variableundefined updated:

- {{/if}} {{/if}}
-

Operations

-
- {{:helper.link('Modify U.I.', 'link', {'selectMenuKey' : 'ui'}, data.selectedMenuKey == 'ui' ? 'selected' : null)}} - {{:helper.link('Modify S.E.', 'link', {'selectMenuKey' : 'se'}, data.selectedMenuKey == 'se' ? 'selected' : null)}} - {{:helper.link('Transfer Buffers', 'floppy-o', {'selectMenuKey' : 'buffer'}, data.selectedMenuKey == 'buffer' ? 'selected' : null)}} - {{:helper.link('Rejuvenators', 'plus', {'selectMenuKey' : 'rejuvenators'}, data.selectedMenuKey == 'rejuvenators' ? 'selected' : null)}} -
- -
 
- -{{if !data.selectedMenuKey || data.selectedMenuKey == 'ui'}} -

Modify Unique Identifier

- {{:helper.displayDNABlocks(data.occupant.uniqueIdentity, data.selectedUIBlock, data.selectedUISubBlock, data.dnaBlockSize, 'UI')}} -
+

Operations

+ {{if !data.occupant.isViableSubject || !data.occupant.uniqueIdentity || !data.occupant.structuralEnzymes}} +
+ No operation possible on this subject +
+ {{else}}
-
- Target: -
-
- {{:helper.link('-', null, {'changeUITarget' : 0}, (data.selectedUITarget > 0) ? null : 'disabled')}} -
 {{:data.selectedUITargetHex}} 
- {{:helper.link('+', null, {'changeUITarget' : 1}, (data.selectedUITarget < 15) ? null : 'disabled')}} -
+ {{:helper.link('Modify U.I.', 'link', {'selectMenuKey' : 'ui'}, data.selectedMenuKey == 'ui' ? 'selected' : null)}} + {{:helper.link('Modify S.E.', 'link', {'selectMenuKey' : 'se'}, data.selectedMenuKey == 'se' ? 'selected' : null)}} + {{:helper.link('Transfer Buffers', 'floppy-o', {'selectMenuKey' : 'buffer'}, data.selectedMenuKey == 'buffer' ? 'selected' : null)}} + {{:helper.link('Rejuvenators', 'plus', {'selectMenuKey' : 'rejuvenators'}, data.selectedMenuKey == 'rejuvenators' ? 'selected' : null)}}
-
-
- {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseUIRadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} + +
 
+ + {{if !data.selectedMenuKey || data.selectedMenuKey == 'ui'}} +

Modify Unique Identifier

+ {{:helper.displayDNABlocks(data.occupant.uniqueIdentity, data.selectedUIBlock, data.selectedUISubBlock, data.dnaBlockSize, 'UI')}} +
+
+
+ Target: +
+
+ {{:helper.link('-', null, {'changeUITarget' : 0}, (data.selectedUITarget > 0) ? null : 'disabled')}} +
 {{:data.selectedUITargetHex}} 
+ {{:helper.link('+', null, {'changeUITarget' : 1}, (data.selectedUITarget < 15) ? null : 'disabled')}} +
-
-{{else data.selectedMenuKey == 'se'}} -

Modify Structural Enzymes

- {{:helper.displayDNABlocks(data.occupant.structuralEnzymes, data.selectedSEBlock, data.selectedSESubBlock, data.dnaBlockSize, 'SE')}} -
-
-
- {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseSERadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} +
+
+ {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseUIRadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} +
-
-{{else data.selectedMenuKey == 'buffer'}} -

Transfer Buffers

- {{for data.buffers}} -

Buffer {{:(index + 1)}}

-
-
-
- Load Data: + {{else data.selectedMenuKey == 'se'}} +

Modify Structural Enzymes

+ {{:helper.displayDNABlocks(data.occupant.structuralEnzymes, data.selectedSEBlock, data.selectedSESubBlock, data.dnaBlockSize, 'SE')}} +
+
+
+ {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseSERadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} +
+
+ {{else data.selectedMenuKey == 'buffer'}} +

Transfer Buffers

+ {{for data.buffers}} +

Buffer {{:(index + 1)}}

+
+
+
+ Load Data: +
+
+ {{:helper.link('Subject U.I.', 'link', {'bufferOption' : 'saveUI', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} + {{:helper.link('Subject U.I. + U.E.', 'link', {'bufferOption' : 'saveUIAndUE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} + {{:helper.link('Subject S.E.', 'link', {'bufferOption' : 'saveSE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} + {{:helper.link('From Disk', 'floppy-o', {'bufferOption' : 'loadDisk', 'bufferId' : (index + 1)}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} +
-
- {{:helper.link('Subject U.I.', 'link', {'bufferOption' : 'saveUI', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} - {{:helper.link('Subject U.I. + U.E.', 'link', {'bufferOption' : 'saveUIAndUE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} - {{:helper.link('Subject S.E.', 'link', {'bufferOption' : 'saveSE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} - {{:helper.link('From Disk', 'floppy-o', {'bufferOption' : 'loadDisk', 'bufferId' : (index + 1)}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} + {{if value.data}} +
+
+ Label: +
+
+ {{:helper.link(value.label, 'file', {'bufferOption' : 'changeLabel', 'bufferId' : (index + 1)})}} +
+
+
+
+ Subject: +
+
+ {{:value.owner ? value.owner : 'Unknown'}} +
+
+
+
+ Stored Data: +
+
+ {{:value.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} + {{:value.ue ? ' + Unique Enzymes' : ''}} +
+
+ {{else}} +
+
+ This buffer is empty. +
+
+ {{/if}} +
+
+ Options: +
+
+ {{:helper.link('Clear', 'trash', {'bufferOption' : 'clear', 'bufferId' : (index + 1)}, !value.data ? 'disabled' : null)}} + {{:helper.link('Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1)}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} + {{:helper.link('Block Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1), 'createBlockInjector' : 1}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} + {{:helper.link('Transfer', 'exclamation-circle', {'bufferOption' : 'transfer', 'bufferId' : (index + 1)}, (!data.hasOccupant || !value.data) ? 'disabled' : null)}} + {{:helper.link('Save To Disk', 'floppy-o', {'bufferOption' : 'saveDisk', 'bufferId' : (index + 1)}, (!value.data || !data.hasDisk) ? 'disabled' : null)}} +
- {{if value.data}} -
-
- Label: + {{/for}} + +

Data Disk

+
+ {{if data.hasDisk}} + {{if data.disk.data}} +
+
+ Label: +
+
+ {{:data.disk.label ? data.disk.label : 'No Label'}} +
-
- {{:helper.link(value.label, 'file', {'bufferOption' : 'changeLabel', 'bufferId' : (index + 1)})}} +
+
+ Subject: +
+
+ {{:data.disk.owner ? data.disk.owner : 'Unknown'}} +
-
-
-
- Subject: +
+
+ Stored Data: +
+
+ {{:data.disk.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} + {{:data.disk.ue ? ' + Unique Enzymes' : ''}} +
-
- {{:value.owner ? value.owner : 'Unknown'}} + {{else}} +
+
+ Disk is blank. +
-
-
-
- Stored Data: -
-
- {{:value.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} - {{:value.ue ? ' + Unique Enzymes' : ''}} -
-
+ {{/if}} {{else}}
- This buffer is empty. + No disk inserted.
{{/if}} @@ -151,140 +205,82 @@ Used In File(s): D:\Development\SS13-BS12\code\game\dna\dna_modifier.dm Options:
- {{:helper.link('Clear', 'trash', {'bufferOption' : 'clear', 'bufferId' : (index + 1)}, !value.data ? 'disabled' : null)}} - {{:helper.link('Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1)}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} - {{:helper.link('Block Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1), 'createBlockInjector' : 1}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} - {{:helper.link('Transfer', 'exclamation-circle', {'bufferOption' : 'transfer', 'bufferId' : (index + 1)}, (!data.hasOccupant || !value.data) ? 'disabled' : null)}} - {{:helper.link('Save To Disk', 'floppy-o', {'bufferOption' : 'saveDisk', 'bufferId' : (index + 1)}, (!value.data || !data.hasDisk) ? 'disabled' : null)}} + {{:helper.link('Wipe Disk', 'trash', {'bufferOption' : 'wipeDisk'}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} + {{:helper.link('Eject Disk', 'eject', {'bufferOption' : 'ejectDisk'}, !data.hasDisk ? 'disabled' : null)}}
- {{/for}} - -

Data Disk

-
- {{if data.hasDisk}} - {{if data.disk.data}} -
-
- Label: -
-
- {{:data.disk.label ? data.disk.label : 'No Label'}} -
-
-
-
- Subject: -
-
- {{:data.disk.owner ? data.disk.owner : 'Unknown'}} -
-
-
-
- Stored Data: -
-
- {{:data.disk.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} - {{:data.disk.ue ? ' + Unique Enzymes' : ''}} -
-
- {{else}} -
-
- Disk is blank. -
-
- {{/if}} - {{else}} -
-
- No disk inserted. -
-
- {{/if}} + {{else data.selectedMenuKey == 'rejuvenators'}} +

Rejuvenators

- Options: + Inject:
- {{:helper.link('Wipe Disk', 'trash', {'bufferOption' : 'wipeDisk'}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} - {{:helper.link('Eject Disk', 'eject', {'bufferOption' : 'ejectDisk'}, !data.hasDisk ? 'disabled' : null)}} + {{:helper.link('5', 'pencil', {'injectRejuvenators' : 5}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('10', 'pencil', {'injectRejuvenators' : 10}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('20', 'pencil', {'injectRejuvenators' : 20}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('30', 'pencil', {'injectRejuvenators' : 30}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('50', 'pencil', {'injectRejuvenators' : 50}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}}
-
-{{else data.selectedMenuKey == 'rejuvenators'}} -

Rejuvenators

-
-
- Inject: -
-
- {{:helper.link('5', 'pencil', {'injectRejuvenators' : 5}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('10', 'pencil', {'injectRejuvenators' : 10}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('20', 'pencil', {'injectRejuvenators' : 20}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('30', 'pencil', {'injectRejuvenators' : 30}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('50', 'pencil', {'injectRejuvenators' : 50}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} -
-
-
 
-
-
- Beaker: -
-
- {{if data.isBeakerLoaded}} - {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
- {{if data.beakerVolume}} - {{:data.beakerVolume}} units remaining
+
 
+
+
+ Beaker: +
+
+ {{if data.isBeakerLoaded}} + {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
+ {{if data.beakerVolume}} + {{:data.beakerVolume}} units remaining
+ {{else}} + Beaker is empty + {{/if}} {{else}} - Beaker is empty + No beaker loaded {{/if}} - {{else}} - No beaker loaded - {{/if}} +
+
+ {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
-
- {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{/if}} + +
 
+ + {{if !data.selectedMenuKey || data.selectedMenuKey == 'ui' || data.selectedMenuKey == 'se'}} +

Radiation Emitter Settings

+
+
+ Intensity: +
+
+ {{:helper.link('-', null, {'radiationIntensity' : 0}, (data.radiationIntensity > 1) ? null : 'disabled')}} +
 {{:data.radiationIntensity}} 
+ {{:helper.link('+', null, {'radiationIntensity' : 1}, (data.radiationIntensity < 10) ? null : 'disabled')}} +
-
+
+
+ Duration: +
+
+ {{:helper.link('-', null, {'radiationDuration' : 0}, (data.radiationDuration > 2) ? null : 'disabled')}} +
 {{:data.radiationDuration}} 
+ {{:helper.link('+', null, {'radiationDuration' : 1}, (data.radiationDuration < 20) ? null : 'disabled')}} +
+
+
+
+   +
+
+ {{:helper.link('Pulse Radiation', 'exclamation-circle', {'pulseRadiation' : 1}, !data.hasOccupant ? 'disabled' : null)}} +
+
+ {{/if}} {{/if}} - -
 
- -{{if !data.selectedMenuKey || data.selectedMenuKey == 'ui' || data.selectedMenuKey == 'se'}} -

Radiation Emitter Settings

-
-
- Intensity: -
-
- {{:helper.link('-', null, {'radiationIntensity' : 0}, (data.radiationIntensity > 1) ? null : 'disabled')}} -
 {{:data.radiationIntensity}} 
- {{:helper.link('+', null, {'radiationIntensity' : 1}, (data.radiationIntensity < 10) ? null : 'disabled')}} -
-
-
-
- Duration: -
-
- {{:helper.link('-', null, {'radiationDuration' : 0}, (data.radiationDuration > 2) ? null : 'disabled')}} -
 {{:data.radiationDuration}} 
- {{:helper.link('+', null, {'radiationDuration' : 1}, (data.radiationDuration < 20) ? null : 'disabled')}} -
-
-
-
-   -
-
- {{:helper.link('Pulse Radiation', 'exclamation-circle', {'pulseRadiation' : 1}, !data.hasOccupant ? 'disabled' : null)}} -
-
-{{/if}} -
 

@@ -315,4 +311,3 @@ Used In File(s): D:\Development\SS13-BS12\code\game\dna\dna_modifier.dm
{{/if}} - diff --git a/nano/templates/eftpos.tmpl b/nano/templates/eftpos.tmpl index 663f665d7f9..15f6aae465e 100644 --- a/nano/templates/eftpos.tmpl +++ b/nano/templates/eftpos.tmpl @@ -1,23 +1,22 @@ - -

{{:data.eftpos_name}}

-This terminal is {{:data.machine_id}}. Report this code when contacting Nanotrasen IT Support
+This terminal is {{:data.machine_name}}. Report this code when contacting Nanotrasen IT Support
{{if data.transaction_locked == 1}}
{{:helper.link(data.transaction_paid ? 'Reset' : 'Reset (authentication required)', 'unlock', {'choice' : 'toggle_lock'})}}

-
Transaction purpose:
+
Transaction purpose:
{{:data.transaction_purpose}}
- +
-
Value:
+
Value:
{{:data.transaction_amount}}
- +
Linked account:
{{:data.linked_account ? data.linked_account : 'None'}}
@@ -33,15 +32,15 @@ Used In File(s): /code/modules/economy/EFTPOS.dm
{{:helper.link('Lock in new transaction', 'lock', {'choice' : 'toggle_lock'})}}

-
Transaction purpose:
+
Transaction purpose:
{{:helper.link(data.transaction_purpose, 'info', {'choice' : 'trans_purpose'})}}
- +
-
Value:
+
Value:
{{:helper.link(data.transaction_amount, 'usd', {'choice' : 'trans_value'})}}
- +
Linked account:
{{:helper.link(data.linked_account ? data.linked_account : 'None', data.linked_account ? 'user' : 'user-times', {'choice' : 'link_account'})}}
@@ -49,7 +48,6 @@ Used In File(s): /code/modules/economy/EFTPOS.dm
{{:helper.link('Change access code', 'key', {'choice' : 'change_code'})}}
-
{{:helper.link('Change EFTPOS ID', 'pencil', {'choice' : 'change_id'})}}
{{:helper.link('Scan card to reset acess code', 'refresh', {'choice' : 'reset'})}}
-{{/if}} \ No newline at end of file +{{/if}} diff --git a/nano/templates/secure_data.tmpl b/nano/templates/secure_data.tmpl index bba32023a7f..e3e285013c5 100644 --- a/nano/templates/secure_data.tmpl +++ b/nano/templates/secure_data.tmpl @@ -93,7 +93,7 @@ Used In File(s): \code\game\machinery\computer\security.dm {{:helper.link('ID', null, {'sort' : 'id'}, null, 'infoButton')}} {{:helper.link('Rank', null, {'sort' : 'rank'}, null, 'infoButton')}} {{:helper.link('Fingerprints', null, {'sort' : 'fingerprint'}, null, 'infoButton')}} - {{:helper.link('Criminal Status', null, {'sort' : 'name'}, null, 'infoButton')}} + {{:helper.link('Criminal Status', null, {'sort' : 'crimstat'}, null, 'infoButton')}} @@ -231,4 +231,4 @@ Used In File(s): \code\game\machinery\computer\security.dm
-{{/if}} \ No newline at end of file +{{/if}} diff --git a/nano/templates/uplink.tmpl b/nano/templates/uplink.tmpl index d6dcec8d05f..6177ab016a7 100644 --- a/nano/templates/uplink.tmpl +++ b/nano/templates/uplink.tmpl @@ -1,5 +1,5 @@ - @@ -40,7 +40,7 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
{{:helper.link( itemValue.Name, 'gear', {'buy_item' : itemValue.obj_path, 'cost' : itemValue.Cost}, itemValue.Cost > data.crystals ? 'disabled' : null, null)}} - {{:itemValue.Cost}}
- + {{if itemValue.Cost <= data.crystals && data.descriptions}}
{{:itemValue.Description}} @@ -53,7 +53,11 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
{{:helper.link('Buy Random (??)' , 'gear', {'buy_item' : 'random'}, data.crystals <= 0 ? 'disabled' : null, null)}}
- + +
+ {{:helper.link('Refund item in active hand' , 'gear', {refund : 1}, null, null)}} +
+ {{else data.menu == 1}}

Information Record List:


@@ -66,7 +70,7 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm {{:helper.link(value.Name, 'gear', {'menu' : 11, 'id' : value.id}, null, null)}}
{{/for}} - + {{else data.menu == 11}}

Information Record:


diff --git a/paradise.dme b/paradise.dme index 70eaa50867a..7c4deb70dd2 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1193,7 +1193,6 @@ #include "code\modules\awaymissions\zvis.dm" #include "code\modules\awaymissions\maploader\dmm_suite.dm" #include "code\modules\awaymissions\maploader\reader.dm" -#include "code\modules\awaymissions\maploader\swapmaps.dm" #include "code\modules\awaymissions\maploader\writer.dm" #include "code\modules\awaymissions\mission_code\academy.dm" #include "code\modules\awaymissions\mission_code\beach.dm" diff --git a/tools/icon_merge_tool/icon_merge_tool.py b/tools/icon_merge_tool/icon_merge_tool.py index 8cfd701d8bb..aa8931c30e4 100644 --- a/tools/icon_merge_tool/icon_merge_tool.py +++ b/tools/icon_merge_tool/icon_merge_tool.py @@ -60,7 +60,7 @@ def main(relative_root): path = icon_conflicts[i] print("{}: {}".format("Merging", path)) - common_ancestor_hash = run_shell_command("git merge-base ORIG_HEAD master").strip() + common_ancestor_hash = run_shell_command("git merge-base MERGE_HEAD HEAD").strip() ours_icon = NamedTemporaryFile(delete=False) theirs_icon = NamedTemporaryFile(delete=False)