diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index badefaf8999..dd54aea2e92 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -82,6 +82,7 @@ CREATE TABLE `characters` ( `speciesprefs` int(1) NOT NULL, `socks` mediumtext NOT NULL, `body_accessory` mediumtext NOT NULL, + `gear` mediumtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 4f184355e5e..453554f5c69 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -82,6 +82,7 @@ CREATE TABLE `SS13_characters` ( `speciesprefs` int(1) NOT NULL, `socks` mediumtext NOT NULL, `body_accessory` mediumtext NOT NULL, + `gear` mediumtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index e168c1ccb19..d3c520a6696 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -1,325 +1,718 @@ -"aa" = (/turf/space,/area/space) -"ab" = (/turf/unsimulated/wall,/area/space) -"ac" = (/turf/unsimulated/wall,/area/awaymission) -"ad" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/wall,/area/awaymission) -"ae" = (/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/awaymission) -"af" = (/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 32},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission) -"ag" = (/mob/living/simple_animal/hostile/alien/queen,/turf/simulated/floor/carpet,/area/awaymission) -"ah" = (/obj/item/stack/cable_coil/random,/obj/effect/decal/remains/human,/turf/simulated/floor/plating,/area/awaymission) -"ai" = (/turf/simulated/floor/plating,/area/awaymission) -"aj" = (/obj/machinery/power/smes/magical,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission) -"ak" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/organ/internal/body_egg/alien_embryo,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"al" = (/obj/machinery/shower{dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"am" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/awaymission) -"an" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission) -"ao" = (/turf/simulated/wall,/area/awaymission) -"ap" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/plating,/area/awaymission) -"aq" = (/turf/unsimulated/beach/water,/area/awaymission) -"ar" = (/obj/structure/window{dir = 4},/obj/machinery/shower,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission) -"as" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/wizrobe/marisa/fake,/obj/effect/decal/cleanable/greenglow,/turf/simulated/floor/carpet,/area/awaymission) -"at" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/wizard/marisa/fake,/obj/machinery/camera{c_tag = "Gold Suite"; c_tag_order = 999; network = list("Hotel")},/obj/item/clothing/mask/gas/sexyclown,/turf/simulated/floor/carpet,/area/awaymission) -"au" = (/obj/structure/rack,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/head/kitty,/obj/item/clothing/head/rabbitears,/obj/item/clothing/mask/muzzle,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/carpet,/area/awaymission) -"av" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaymission) -"aw" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/awaymission) -"ax" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/wizrobe/marisa/fake,/turf/simulated/floor/carpet,/area/awaymission) -"ay" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/xenos,/obj/item/clothing/head/wizard/marisa/fake,/obj/machinery/camera{c_tag = "Silver Suite"; c_tag_order = 999; network = list("Hotel")},/obj/item/clothing/mask/gas/sexyclown,/turf/simulated/floor/carpet,/area/awaymission) -"az" = (/turf/simulated/floor/wood,/area/awaymission) -"aA" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom1"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aB" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom2"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aC" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aD" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/camera{c_tag = "Locker Room"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aE" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom3"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aF" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom4"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aG" = (/obj/structure/window{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission) -"aH" = (/turf/simulated/floor/carpet,/area/awaymission) -"aI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/turf/simulated/floor/carpet,/area/awaymission) -"aJ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/hop,/turf/simulated/floor/carpet,/area/awaymission) -"aK" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/wood,/area/awaymission) -"aL" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/wood,/area/awaymission) -"aM" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/wood,/area/awaymission) -"aN" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aO" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aP" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aQ" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/awaymission) -"aR" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/awaymission) -"aS" = (/obj/structure/window{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/awaymission) -"aT" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/wood,/area/awaymission) -"aU" = (/obj/machinery/gateway/centeraway,/turf/simulated/floor/wood,/area/awaymission) -"aV" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/wood,/area/awaymission) -"aW" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aY" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"aZ" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"ba" = (/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"bb" = (/obj/machinery/door_control{id = "Gold Suite"; name = "Gold Suite Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission) -"bc" = (/obj/machinery/door_control{id = "Silver Suite"; name = "Silver Suite Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission) -"bd" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/wood,/area/awaymission) -"be" = (/obj/machinery/gateway,/turf/simulated/floor/wood,/area/awaymission) -"bf" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/wood,/area/awaymission) -"bg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"bh" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"bi" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"bj" = (/obj/structure/mirror,/obj/structure/sink{icon_state = "sink"; dir = 4; pixel_x = -12; pixel_y = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"bk" = (/obj/machinery/door/airlock/gold{id_tag = "Gold Suite"; name = "Gold Suite"},/turf/simulated/floor/carpet,/area/awaymission) -"bl" = (/obj/machinery/door/airlock/silver{id_tag = "Silver Suite"; name = "Silver Suite"},/turf/simulated/floor/carpet,/area/awaymission) -"bm" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/space) -"bn" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/awaymission) -"bo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/space) -"bp" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/awaymission) -"bq" = (/obj/machinery/light,/turf/simulated/floor/carpet,/area/awaymission) -"br" = (/obj/structure/stool/bed/chair/comfy,/turf/simulated/floor/carpet,/area/awaymission) -"bs" = (/turf/unsimulated/wall/fakeglass,/area/space) -"bt" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission) -"bu" = (/obj/machinery/light{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission) -"bv" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet,/area/awaymission) -"bw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/awaymission) -"bx" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/awaymission) -"by" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/awaymission) -"bz" = (/obj/machinery/door/airlock{id_tag = "Room301"; name = "Room301"},/turf/simulated/floor/plasteel,/area/awaymission) -"bA" = (/obj/machinery/door/airlock{id_tag = "Room302"; name = "Room302"},/turf/simulated/floor/plasteel,/area/awaymission) -"bB" = (/obj/machinery/door/airlock{id_tag = "Room303"; name = "Room303"},/turf/simulated/floor/plasteel,/area/awaymission) -"bC" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/awaymission) -"bD" = (/turf/simulated/shuttle/floor,/area/awaymission) -"bE" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission) -"bF" = (/obj/machinery/camera{c_tag = "Room 301"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"bG" = (/obj/machinery/door_control{name = "Room301 Bolt Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; id = "Room301"; normaldoorcontrol = 1; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"bH" = (/obj/machinery/camera{c_tag = "Room 302"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"bI" = (/obj/machinery/door_control{id = "Room302"; name = "Room302 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"bJ" = (/obj/structure/dresser,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/floor/carpet,/area/awaymission) -"bK" = (/obj/machinery/camera{c_tag = "Room 303"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"bL" = (/obj/machinery/door_control{id = "Room303"; name = "Room303 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"bM" = (/obj/machinery/light{dir = 1},/turf/unsimulated/beach/water,/area/awaymission) -"bN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission) -"bO" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission) -"bP" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/carpet,/area/awaymission) -"bQ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/carpet,/area/awaymission) -"bR" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/space) -"bS" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) -"bT" = (/obj/structure/window,/turf/simulated/floor/carpet,/area/awaymission) -"bU" = (/obj/machinery/door/window/southright,/turf/simulated/floor/carpet,/area/awaymission) -"bV" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission) -"bW" = (/obj/structure/mirror,/turf/simulated/wall,/area/awaymission) -"bX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"bY" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"bZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"ca" = (/obj/structure/toilet{dir = 1},/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"cb" = (/obj/machinery/light{dir = 8},/turf/unsimulated/beach/water,/area/awaymission) -"cc" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water,/area/awaymission) -"cd" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) -"ce" = (/obj/machinery/door/airlock{id_tag = "Room201"; name = "Room201"},/turf/simulated/floor/plasteel,/area/awaymission) -"cf" = (/obj/machinery/door/airlock{id_tag = "Room202"; name = "Room202"},/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/plasteel,/area/awaymission) -"cg" = (/obj/machinery/door/airlock{id_tag = "Room203"; name = "Room203"},/turf/simulated/floor/plasteel,/area/awaymission) -"ch" = (/obj/machinery/camera{c_tag = "Room 201"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"ci" = (/obj/machinery/door_control{id = "Room201"; name = "Room201 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"cj" = (/obj/structure/dresser,/obj/item/weapon/lipstick/jade,/turf/simulated/floor/carpet,/area/awaymission) -"ck" = (/obj/machinery/camera{c_tag = "Room 202"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"cl" = (/obj/machinery/door_control{id = "Room202"; name = "Room202 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"cm" = (/obj/machinery/camera{c_tag = "Room 203"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"cn" = (/obj/machinery/door_control{id = "Room203"; name = "Room203 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"co" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/simulated/floor/carpet,/area/awaymission) -"cp" = (/obj/machinery/light,/turf/unsimulated/beach/water,/area/awaymission) -"cq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor/carpet,/area/awaymission) -"cr" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) -"cs" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) -"ct" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/carpet,/area/awaymission) -"cu" = (/obj/item/weapon/beach_ball,/turf/simulated/shuttle/floor,/area/awaymission) -"cv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/flour{desc = "Rather caked in there."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) -"cw" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/awaymission) -"cx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/awaymission) -"cy" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) -"cz" = (/obj/structure/window,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) -"cA" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/awaymission) -"cB" = (/obj/structure/table,/turf/simulated/floor/carpet,/area/awaymission) -"cC" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"cD" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaymission) -"cE" = (/obj/machinery/door/airlock{id_tag = "Room101"; name = "Room101"},/turf/simulated/floor/plasteel,/area/awaymission) -"cF" = (/obj/machinery/door/airlock{id_tag = "Room102"; name = "Room102"},/turf/simulated/floor/plasteel,/area/awaymission) -"cG" = (/obj/machinery/door/airlock{id_tag = "Room103"; name = "Room103"},/turf/simulated/floor/plasteel,/area/awaymission) -"cH" = (/obj/machinery/camera{c_tag = "Room 101"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"cI" = (/obj/machinery/door_control{id = "Room101"; name = "Room101 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"cJ" = (/obj/structure/dresser,/obj/item/clothing/head/xenos,/turf/simulated/floor/carpet,/area/awaymission) -"cK" = (/obj/machinery/camera{c_tag = "Room 102"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"cL" = (/obj/machinery/door_control{id = "Room102"; name = "Room102 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"cM" = (/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission) -"cN" = (/obj/machinery/camera{c_tag = "Room 103"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) -"cO" = (/obj/machinery/door_control{id = "Room103"; name = "Room103 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"cP" = (/turf/simulated/floor/plasteel,/area/awaymission) -"cQ" = (/mob/living/simple_animal/hostile/retaliate/goat,/turf/simulated/floor/plasteel,/area/awaymission) -"cR" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission) -"cS" = (/obj/structure/stool/bed/nest,/turf/simulated/floor/carpet,/area/awaymission) -"cT" = (/obj/structure/stool/bed/alien,/obj/item/xenos_claw,/turf/simulated/floor/carpet,/area/awaymission) -"cU" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/carpet,/area/awaymission) -"cV" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) -"cW" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) -"cX" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/carpet,/area/awaymission) -"cY" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel,/area/awaymission) -"cZ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor/plasteel,/area/awaymission) -"da" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/awaymission) -"db" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/table,/turf/simulated/floor/plasteel,/area/awaymission) -"dc" = (/obj/effect/gibspawner/xeno,/turf/simulated/floor/carpet,/area/awaymission) -"dd" = (/obj/effect/decal/remains/human,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"de" = (/obj/structure/stool/bed/alien,/obj/item/clothing/suit/xenos,/turf/simulated/floor/carpet,/area/awaymission) -"df" = (/obj/machinery/optable,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) -"dg" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission) -"dh" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/plasteel,/area/awaymission) -"di" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/simulated/floor/plasteel,/area/awaymission) -"dj" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel,/area/awaymission) -"dk" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel,/area/awaymission) -"dl" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/plasteel,/area/awaymission) -"dm" = (/obj/structure/window,/obj/structure/alien/weeds/node,/turf/simulated/floor/carpet,/area/awaymission) -"dn" = (/obj/structure/window,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/carpet,/area/awaymission) -"do" = (/obj/machinery/door/window/southright,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/carpet,/area/awaymission) -"dp" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/black,/turf/simulated/floor/carpet,/area/awaymission) -"dq" = (/obj/structure/window,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission) -"dr" = (/obj/structure/window,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) -"ds" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) -"dt" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel,/area/awaymission) -"du" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"dv" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission) -"dw" = (/obj/machinery/door/window/eastleft,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission) -"dx" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission) -"dy" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/awaymission) -"dz" = (/obj/machinery/processor,/turf/simulated/floor/plasteel,/area/awaymission) -"dA" = (/obj/machinery/chem_master/condimaster,/turf/simulated/floor/plasteel,/area/awaymission) -"dB" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel,/area/awaymission) -"dC" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/plasteel,/area/awaymission) -"dD" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/plasteel,/area/awaymission) -"dE" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/plasteel,/area/awaymission) -"dF" = (/obj/structure/kitchenspike,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission) -"dG" = (/obj/machinery/door/airlock,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/plasteel,/area/awaymission) -"dH" = (/obj/item/weapon/bananapeel,/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission) -"dI" = (/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission) -"dJ" = (/obj/item/target/syndicate,/turf/simulated/floor/carpet,/area/awaymission) -"dK" = (/obj/item/trash/candy,/turf/simulated/floor/carpet,/area/awaymission) -"dL" = (/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission) -"dM" = (/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission) -"dN" = (/obj/structure/barricade/wooden,/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission) -"dO" = (/obj/machinery/door/airlock,/turf/simulated/floor/carpet,/area/awaymission) -"dP" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/wall,/area/awaymission) -"dQ" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/soft/red,/turf/simulated/floor/carpet,/area/awaymission) -"dR" = (/obj/item/toy/prize/honk,/turf/simulated/floor/carpet,/area/awaymission) -"dS" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/carpet,/area/awaymission) -"dT" = (/obj/machinery/vending/sovietsoda,/turf/simulated/floor/carpet,/area/awaymission) -"dU" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 4; network = "Hotel"; use_power = 1},/turf/simulated/floor/carpet,/area/awaymission) -"dV" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"dW" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; network = "Hotel"; use_power = 0},/turf/simulated/floor/carpet,/area/awaymission) -"dX" = (/turf/simulated/wall/cult,/area/awaymission) -"dY" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) -"dZ" = (/obj/effect/decal/remains/human,/turf/simulated/floor/carpet,/area/awaymission) -"ea" = (/obj/item/trash/candle,/obj/item/trash/candle,/obj/item/trash/candle,/turf/simulated/floor/carpet,/area/awaymission) -"eb" = (/obj/machinery/vending/snack,/turf/simulated/floor/carpet,/area/awaymission) -"ec" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) -"ed" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/carpet,/area/awaymission) -"ee" = (/turf/simulated/floor/engine/cult,/area/awaymission) -"ef" = (/obj/effect/gibspawner/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) -"eg" = (/obj/item/toy/sword,/turf/simulated/floor/carpet,/area/awaymission) -"eh" = (/obj/machinery/vending/cola,/turf/simulated/floor/carpet,/area/awaymission) -"ei" = (/obj/item/candle,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) -"ej" = (/obj/effect/rune,/obj/item/organ/brain,/turf/simulated/floor/engine/cult,/area/awaymission) -"ek" = (/obj/item/candle,/turf/simulated/floor/engine/cult,/area/awaymission) -"el" = (/obj/item/weapon/tome,/turf/simulated/floor/engine/cult,/area/awaymission) -"em" = (/obj/effect/rune,/turf/simulated/floor/engine/cult,/area/awaymission) -"en" = (/obj/structure/stool/bed/chair/comfy,/obj/item/device/soulstone,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/turf/simulated/floor/engine/cult,/area/awaymission) -"eo" = (/obj/effect/gibspawner/human,/turf/simulated/floor/engine/cult,/area/awaymission) -"ep" = (/obj/item/trash/sosjerky,/turf/simulated/floor/carpet,/area/awaymission) -"eq" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/carpet,/area/awaymission) -"er" = (/obj/item/latexballon,/obj/item/latexballon,/turf/simulated/floor/carpet,/area/awaymission) -"es" = (/obj/structure/rack,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/turf/simulated/floor/carpet,/area/awaymission) -"et" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) -"eu" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) -"ev" = (/obj/item/weapon/restraints/legcuffs,/turf/simulated/floor/engine/cult,/area/awaymission) -"ew" = (/obj/machinery/space_heater,/turf/simulated/floor/carpet,/area/awaymission) -"ex" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission) -"ey" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; network = "Hotel"; use_power = 0},/turf/simulated/floor/carpet,/area/awaymission) -"ez" = (/obj/item/weapon/melee/cultblade,/turf/simulated/floor/engine/cult,/area/awaymission) -"eA" = (/obj/item/weapon/kitchen/knife/butcher{blood_DNA = 1e+009},/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) -"eB" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/awaymission) -"eC" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) -"eD" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard,/obj/item/weapon/paper,/turf/simulated/floor/carpet,/area/awaymission) -"eE" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/carpet,/area/awaymission) -"eF" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/carpet,/area/awaymission) -"eG" = (/turf/unsimulated/wall/fakeglass{dir = 10; icon_state = "fakewindows"},/area/space) -"eH" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/space) -"eI" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/space) -"eJ" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/awaymission) -"eK" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission) -"eL" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission) -"eM" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/space) -"eN" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission) -"eO" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/awaymission) -"eQ" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/awaymission) -"eR" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission) -"eS" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission) -"eT" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission) -"eU" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission) -"eV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/awaymission) -"eW" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) -"eX" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/awaymission) -"eY" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) -"fa" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/awaymission) -"fb" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission) -"fc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) +"aa" = (/turf/unsimulated/wall{icon = 'icons/turf/mining.dmi'; icon_state = "rock"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"ab" = (/turf/unsimulated/wall/metal,/area/awaymission/undersea{requires_power = 0}) +"ac" = (/turf/unsimulated/wall{icon = 'icons/turf/mining.dmi'; icon_state = "rock"},/area/awaymission/beach) +"ad" = (/turf/unsimulated/floor/lava/dense,/area/awaymission) +"ae" = (/turf/unsimulated/wall/metal,/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"af" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ag" = (/turf/template_noop,/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ah" = (/turf/template_noop,/area/template_noop) +"ai" = (/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"aj" = (/obj/machinery/light{dir = 1},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"ak" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"al" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"am" = (/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"an" = (/obj/effect/view_portal{id = "mazeland_111"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ao" = (/obj/effect/view_portal/visual{dir = 4; dist = 2; id = "mazeland_121"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ap" = (/obj/effect/view_portal/visual{dir = 1; dist = 2; id = "mazeland_332"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aq" = (/obj/effect/view_portal/visual{dir = 1; dist = 5; frustrum = 1; id = "mazeland_room"; radius = 0},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ar" = (/obj/effect/view_portal/visual{dir = 1; dist = 2; id = "mazeland_331"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"as" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"at" = (/turf/unsimulated/beach/sand,/area/awaymission/beach) +"au" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"av" = (/obj/effect/view_portal{id = "mazeland_211"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aw" = (/obj/effect/view_portal{id = "mazeland"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ax" = (/obj/effect/view_portal{id = "mazeland_411"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ay" = (/mob/living/simple_animal/hostile/retaliate/carp,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"az" = (/obj/effect/view_portal{id = "mazeland_112"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aA" = (/obj/effect/view_portal/visual{dir = 4; dist = 2; id = "mazeland_122"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aB" = (/obj/effect/view_portal{id = "mazeland_31"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aC" = (/turf/unsimulated/wall/metal,/area/awaymission{name = "Snowland"; requires_power = 0}) +"aD" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aE" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"aF" = (/obj/item/weapon/paper/hotel_scrap_5,/turf/unsimulated/beach/sand,/area/awaymission/beach) +"aG" = (/mob/living/simple_animal/hostile/pirate,/turf/unsimulated/beach/sand,/area/awaymission/beach) +"aH" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"aI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aJ" = (/obj/effect/view_portal/visual{dir = 1; dist = 3; id = "snowland_room"; radius = 3},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"aK" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/mob/living/simple_animal/hostile/bear,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aL" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"aM" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"aN" = (/obj/effect/view_portal/visual{dir = 8; dist = 2; id = "mazeland_111"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aO" = (/obj/effect/view_portal{id = "mazeland_121"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aP" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aQ" = (/obj/effect/view_portal/visual{dir = 8; dist = 2; id = "mazeland_31"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"aR" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 1},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aS" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aT" = (/obj/effect/view_portal{id = "snowland"},/obj/effect/decal/snow/sand/surround{icon_state = "gravsnow_surround"; dir = 1},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"aU" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aV" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aW" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aX" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"aY" = (/obj/machinery/light{dir = 8},/mob/living/simple_animal/hostile/retaliate/carp,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"aZ" = (/obj/structure/ladder/dive_point/anchor{id = "weirddive"; layer = 4.5},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"ba" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"bb" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/obj/structure/closet/athletic_mixed,/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bc" = (/turf/unsimulated/wall{icon_state = "sandstone6"},/area/awaymission/beach) +"bd" = (/turf/unsimulated/wall{icon_state = "sandstone12"},/area/awaymission/beach) +"be" = (/turf/unsimulated/wall{icon_state = "sandstone10"},/area/awaymission/beach) +"bf" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 8},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bg" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bh" = (/obj/effect/decal/snow/sand/edge{icon_state = "gravsnow_corner"; dir = 1},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/machinery/light{dir = 8},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bi" = (/obj/effect/decal/snow/sand/edge{icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bj" = (/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bk" = (/obj/effect/decal/snow/sand/edge{icon_state = "gravsnow_corner"; dir = 1},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bl" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal/snow/clean/edge,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"bm" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal/snow/clean/edge{icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"bn" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/obj/item/clothing/shoes/sandal,/obj/item/clothing/shoes/sandal,/obj/item/clothing/shoes/sandal,/obj/structure/closet/crate,/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bo" = (/turf/unsimulated/wall{icon_state = "sandstone3"},/area/awaymission/beach) +"bp" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission/beach) +"bq" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/awaymission/beach) +"br" = (/obj/effect/view_portal/visual{dir = 8; dist = 2; id = "mazeland_212"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bs" = (/obj/effect/view_portal{id = "mazeland_122"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bt" = (/obj/effect/view_portal{id = "mazeland_212"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bu" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bv" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bw" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bx" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"by" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bz" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bA" = (/turf/unsimulated/wall{icon_state = "sandstone1"},/area/awaymission/beach) +"bB" = (/obj/effect/view_portal/visual{dir = 1; dist = 3; id = "beach_room"; radius = 2},/turf/unsimulated/floor,/area/awaymission/beach) +"bC" = (/mob/living/simple_animal/crab{faction = list("neutral","pirate")},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bD" = (/turf/unsimulated/floor/lava,/area/awaymission) +"bE" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/structure/closet/crate/secure/loot,/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"bF" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"bG" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bH" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bI" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bJ" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bK" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/obj/effect/view_portal{id = "beach"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"bL" = (/obj/effect/decal/snow/sand/edge{dir = 9; icon_state = "gravsnow_corner"; name = "rough sand"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"bM" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"bN" = (/obj/effect/decal/snow/sand/edge{dir = 5; icon_state = "gravsnow_corner"; name = "rough sand"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"bO" = (/obj/effect/view_portal{id = "mazeland_213"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bP" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bQ" = (/obj/effect/view_portal{id = "mazeland_413"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bR" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal/snow/clean/edge{icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"bS" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bT" = (/obj/structure/flora/bush,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bU" = (/obj/structure/flora/grass/green,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"bV" = (/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"bW" = (/obj/effect/view_portal/visual{dir = 1; dist = 7; id = "mazeland_213"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bX" = (/obj/effect/view_portal/visual{dir = 1; dist = 7; id = "mazeland_413"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bY" = (/obj/effect/view_portal/visual{dist = 2; id = "mazeland_131"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"bZ" = (/obj/effect/view_portal{id = "mazeland_331"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ca" = (/obj/effect/view_portal{id = "mazeland_332"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"cb" = (/obj/effect/view_portal/visual{dist = 2; id = "mazeland_132"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"cc" = (/obj/structure/window/reinforced/tinted,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"cd" = (/obj/machinery/door/window/southright,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"ce" = (/obj/structure/window/reinforced/tinted,/obj/machinery/light,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"cf" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"cg" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"ch" = (/obj/effect/view_portal{id = "mazeland_131"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ci" = (/obj/effect/view_portal{id = "mazeland_132"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"cj" = (/obj/effect/view_portal/visual{dir = 2; dist = 7; id = "mazeland_411"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ck" = (/obj/effect/view_portal/visual{dir = 2; dist = 7; id = "mazeland_211"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"cl" = (/turf/unsimulated/wall/metal,/area/awaymission/spacehotel) +"cm" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"cn" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"co" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"cp" = (/obj/machinery/shower{dir = 8},/obj/structure/curtain/open/shower{anchored = 1; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; opacity = 1},/area/awaymission/spacehotel) +"cq" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 8},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"cr" = (/obj/item/candle/eternal,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"cs" = (/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ct" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"cu" = (/obj/structure/mirror{dir = 4; pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"cv" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/structure/closet/crate/secure/loot,/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"cw" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"cx" = (/obj/effect/view_portal{id = "poolland"},/obj/machinery/light/small,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"cy" = (/turf/unsimulated/floor,/area/awaymission/undersea{requires_power = 0}) +"cz" = (/obj/effect/levelref{id = "lavaland"; name = "lavaland"},/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/obj/effect/rune,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"cA" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/mob/living/simple_animal/hostile/bear,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"cB" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"cC" = (/obj/structure/flora/grass/both,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"cD" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach) +"cE" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 10},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"cF" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"cG" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal/snow/clean/edge,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"cH" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/coastline,/area/awaymission/beach) +"cI" = (/obj/effect/waterfall{dir = 1; water_frequency = 104},/turf/unsimulated/beach/coastline,/area/awaymission/beach) +"cJ" = (/turf/unsimulated/beach/coastline,/area/awaymission/beach) +"cK" = (/obj/effect/waterfall{dir = 1; water_frequency = 97},/turf/unsimulated/beach/coastline,/area/awaymission/beach) +"cL" = (/obj/effect/waterfall{dir = 1; water_frequency = 94},/turf/unsimulated/beach/coastline,/area/awaymission/beach) +"cM" = (/obj/effect/waterfall{dir = 1; water_frequency = 192},/turf/unsimulated/beach/coastline,/area/awaymission/beach) +"cN" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/coastline/dense,/area/awaymission/beach) +"cO" = (/turf/unsimulated/floor/chasm,/area/awaymission) +"cP" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"cQ" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal/snow/clean/edge{icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0}) +"cR" = (/obj/machinery/poolcontroller/seacontroller,/turf/unsimulated/wall/metal,/area/awaymission/undersea{requires_power = 0}) +"cS" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water,/area/awaymission/beach) +"cT" = (/turf/unsimulated/beach/water,/area/awaymission/beach) +"cU" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/dense,/area/awaymission/beach) +"cV" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"cW" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"cX" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"cY" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water,/area/awaymission/beach) +"cZ" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water,/area/awaymission/beach) +"da" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water,/area/awaymission/beach) +"db" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water,/area/awaymission/beach) +"dc" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water,/area/awaymission/beach) +"dd" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 8},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"de" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"df" = (/obj/item/weapon/mop,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"dg" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water,/area/awaymission/beach) +"dh" = (/obj/effect/decal/snow/sand/edge,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"di" = (/obj/structure/mopbucket,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"dj" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 6},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dk" = (/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dl" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 10},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dm" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water/edge_drop,/area/awaymission/beach) +"dn" = (/turf/unsimulated/beach/water/drop,/area/awaymission/beach) +"do" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water/edge_drop,/area/awaymission/beach) +"dp" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dq" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dr" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0}) +"ds" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach) +"dt" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach) +"du" = (/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach) +"dv" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach) +"dw" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dx" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dy" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dz" = (/obj/machinery/light{dir = 8},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"dA" = (/obj/structure/ladder/dive_point/anchor{layer = 4.5},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"dB" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach) +"dC" = (/turf/unsimulated/beach/water/drop/dense,/area/awaymission/beach) +"dD" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach) +"dE" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission) +"dF" = (/turf/unsimulated/floor/lava,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dG" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water/drop/dense,/area/awaymission/beach) +"dH" = (/turf/unsimulated/floor/lava/dense,/area/awaymission{name = "Snowland"; requires_power = 0}) +"dI" = (/obj/machinery/light,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0}) +"dJ" = (/turf/unsimulated/wall{icon_state = "sandstone2"},/area/awaymission) +"dK" = (/obj/effect/view_portal/visual{dist = 3; id = "cultroom"},/turf/template_noop,/area/awaymission) +"dL" = (/turf/unsimulated/wall{icon_state = "sandstone5"},/area/awaymission) +"dM" = (/turf/unsimulated/wall{icon_state = "sandstone12"},/area/awaymission) +"dN" = (/turf/unsimulated/wall{icon_state = "sandstone9"},/area/awaymission) +"dO" = (/turf/space,/area/space) +"dP" = (/obj/effect/view_portal{id = "turbinespace"},/turf/space,/area/space) +"dQ" = (/turf/unsimulated/wall,/area/space) +"dR" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/space) +"dS" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/space) +"dT" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/space) +"dU" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/awaymission/spacehotel) +"dV" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/awaymission/spacehotel) +"dW" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/awaymission/spacehotel) +"dX" = (/turf/template_noop,/area/awaymission/spacehotel) +"dY" = (/obj/machinery/camera{c_tag = "Room 110"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"dZ" = (/obj/machinery/camera{c_tag = "Room 111"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"ea" = (/obj/machinery/camera{c_tag = "Room 112"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"eb" = (/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ec" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"ed" = (/obj/structure/closet/secure_closet/personal,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"ee" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/camera{c_tag = "Room X"; c_tag_order = 999; network = list("Hotel")},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"ef" = (/obj/machinery/camera{c_tag = "Room 210"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"eg" = (/obj/machinery/camera{c_tag = "Room 211"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"eh" = (/obj/machinery/camera{c_tag = "Room 212"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"ei" = (/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"ej" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/paper/hotel_scrap_2,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"ek" = (/obj/machinery/light/small{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"el" = (/obj/machinery/light/small{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"em" = (/obj/effect/landmark/map_loader/hotel_room,/turf/template_noop,/area/awaymission/spacehotel) +"en" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"eo" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"ep" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"eq" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"er" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"es" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"et" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour{desc = "Probably."},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"eu" = (/obj/machinery/light{dir = 1},/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel) +"ev" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 110},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ew" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 111},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ex" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 112},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ey" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 210},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ez" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 211},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eA" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 212},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eB" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/space) +"eC" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eD" = (/obj/machinery/light,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eE" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/space) +"eF" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eG" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eH" = (/obj/machinery/light{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eI" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eJ" = (/obj/structure/stool/bed/chair/comfy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eK" = (/obj/structure/window/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eL" = (/turf/unsimulated/wall/fakeglass,/area/space) +"eM" = (/turf/unsimulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/awaymission/spacehotel) +"eN" = (/turf/unsimulated/floor{dir = 2; icon_state = "whiteblue"},/area/awaymission/spacehotel) +"eO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/awaymission/spacehotel) +"eP" = (/obj/machinery/light{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eQ" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eR" = (/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel) +"eS" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel) +"eT" = (/obj/machinery/door/unpowered/hotel_door{id = 107},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eU" = (/obj/machinery/door/unpowered/hotel_door{id = 108},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eV" = (/obj/machinery/door/unpowered/hotel_door{id = 109},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"eW" = (/obj/effect/decal{icon = 'icons/turf/floors.dmi'; icon_state = "wood_siding13"; name = "wood siding"},/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"eX" = (/turf/unsimulated/floor{dir = 4; icon_state = "whiteblue"},/area/awaymission/spacehotel) +"eY" = (/turf/simulated/shuttle/floor,/area/awaymission/spacehotel) +"eZ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission/spacehotel) +"fa" = (/obj/machinery/door/unpowered/hotel_door{id = 207},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fb" = (/obj/machinery/door/unpowered/hotel_door{id = 208},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fc" = (/obj/machinery/door/unpowered/hotel_door{id = 209},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fd" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fe" = (/obj/machinery/camera{c_tag = "Room 107"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"ff" = (/obj/machinery/camera{c_tag = "Room 108"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fg" = (/obj/machinery/camera{c_tag = "Room 109"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fh" = (/obj/effect/decal{icon = 'icons/turf/floors.dmi'; icon_state = "wood_siding12"; name = "wood siding"},/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"fi" = (/obj/structure/window/plasmabasic,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fj" = (/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel) +"fk" = (/obj/machinery/light{dir = 1},/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel) +"fl" = (/turf/unsimulated/beach/water/deep,/area/awaymission/spacehotel) +"fm" = (/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission/spacehotel) +"fn" = (/obj/machinery/camera{c_tag = "Room 207"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fo" = (/obj/machinery/camera{c_tag = "Room 208"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fp" = (/obj/machinery/camera{c_tag = "Room 209"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fq" = (/obj/structure/window/plasmabasic{icon_state = "plasmawindow"; dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fr" = (/turf/unsimulated/beach/water{icon = 'icons/turf/floors.dmi'; icon_state = "light_on"},/area/awaymission/spacehotel) +"fs" = (/obj/structure/window/plasmabasic{icon_state = "plasmawindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ft" = (/turf/unsimulated/beach/water,/area/awaymission/spacehotel) +"fu" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows3"},/area/space) +"fv" = (/obj/effect/landmark/map_loader/hotel_room{dir = 1},/turf/template_noop,/area/awaymission/spacehotel) +"fw" = (/mob/living/simple_animal/hostile/retaliate/carp,/turf/unsimulated/beach/water{icon = 'icons/turf/floors.dmi'; icon_state = "light_on"},/area/awaymission/spacehotel) +"fx" = (/obj/effect/landmark{name = "awaystart"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fy" = (/obj/structure/window/plasmabasic{icon_state = "plasmawindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fz" = (/obj/structure/mirror,/turf/unsimulated/wall/metal,/area/awaymission/spacehotel) +"fA" = (/obj/effect/decal{icon = 'icons/turf/floors.dmi'; icon_state = "wood_siding14"; name = "wood siding"},/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"fB" = (/obj/machinery/light{dir = 8},/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel) +"fC" = (/obj/structure/ladder/dive_point/buoy,/obj/structure/ladder/dive_point/buoy{id = "weirddive"; invisibility = 101},/turf/unsimulated/beach/water/deep,/area/awaymission/spacehotel) +"fD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water/deep,/area/awaymission/spacehotel) +"fE" = (/obj/machinery/light,/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fF" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fG" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_1,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fH" = (/obj/effect/landmark{name = "awaystart"},/turf/unsimulated/beach/water,/area/awaymission/spacehotel) +"fI" = (/obj/machinery/door/unpowered/hotel_door{id = 104},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fJ" = (/obj/machinery/door/unpowered/hotel_door{id = 105},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fK" = (/obj/machinery/door/unpowered/hotel_door{id = 106},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fL" = (/obj/machinery/door/unpowered/hotel_door{id = 204},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fM" = (/obj/machinery/door/unpowered/hotel_door{id = 205},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fN" = (/obj/machinery/door/unpowered/hotel_door{id = 206},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"fO" = (/obj/machinery/camera{c_tag = "Room 104"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fP" = (/obj/machinery/camera{c_tag = "Room 105"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fQ" = (/obj/machinery/camera{c_tag = "Room 106"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fR" = (/obj/machinery/light,/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel) +"fS" = (/obj/machinery/camera{c_tag = "Room 204"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fT" = (/obj/machinery/camera{c_tag = "Room 205"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fU" = (/obj/machinery/camera{c_tag = "Room 206"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"fV" = (/obj/item/weapon/beach_ball,/turf/simulated/shuttle/floor,/area/awaymission/spacehotel) +"fW" = (/turf/unsimulated/wall/metal,/area/awaymission) +"fX" = (/obj/effect/levelref{id = "hotel"; name = "hotel level 1"},/turf/unsimulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/awaymission/spacehotel) +"fY" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/awaymission/spacehotel) +"fZ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/awaymission/spacehotel) +"ga" = (/obj/effect/levelref{id = "hotel"; name = "hotel level 2"},/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel) +"gb" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gc" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 4},/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gd" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ge" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/stool/bed/chair/sofa/right{icon_state = "sofaend_right"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gf" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/obj/item/weapon/paper/hotel_scrap_3,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gg" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gh" = (/obj/structure/table,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gi" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gj" = (/obj/structure/stool/bed/chair/sofa{icon_state = "sofamiddle"; dir = 4},/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gk" = (/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gl" = (/obj/structure/stool/bed/chair/sofa{icon_state = "sofamiddle"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gm" = (/obj/structure/stool/bed/chair/sofa/right{icon_state = "sofaend_right"; dir = 4},/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gn" = (/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"go" = (/obj/machinery/light{dir = 8},/turf/template_noop,/area/awaymission/spacehotel) +"gp" = (/obj/structure/stool,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/crate/bin,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gr" = (/obj/effect/landmark/map_loader/random{template_list = "light_floor_1.dmm;light_floor_2.dmm;light_floor_3.dmm"},/turf/template_noop,/area/awaymission/spacehotel) +"gs" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/template_noop,/area/awaymission/spacehotel) +"gt" = (/obj/machinery/door/unpowered/hotel_door{id = 101},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gu" = (/obj/machinery/door/unpowered/hotel_door{id = 102},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gv" = (/obj/machinery/door/unpowered/hotel_door{id = 103},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gw" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gx" = (/obj/machinery/door/unpowered/hotel_door{id = 201},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gy" = (/obj/machinery/door/unpowered/hotel_door{id = 202},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gz" = (/obj/machinery/door/unpowered/hotel_door{id = 203},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"gA" = (/obj/machinery/camera{c_tag = "Room 101"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"gB" = (/obj/machinery/camera{c_tag = "Room 102"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"gC" = (/obj/machinery/camera{c_tag = "Room 103"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"gD" = (/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gE" = (/mob/living/carbon/human/interactive/away/hotel/chef,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gF" = (/obj/machinery/camera{c_tag = "Room 201"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"gG" = (/obj/machinery/camera{c_tag = "Room 202"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"gH" = (/obj/machinery/camera{c_tag = "Room 203"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel) +"gI" = (/obj/structure/stool,/turf/template_noop,/area/awaymission/spacehotel) +"gJ" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_6,/turf/template_noop,/area/awaymission/spacehotel) +"gK" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/awaymission/spacehotel) +"gL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gM" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/dough,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gN" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/rawsticks,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gP" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"gQ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/awaymission/spacehotel) +"gR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gS" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gU" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/salmonmeat,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gW" = (/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"gX" = (/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"gY" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"gZ" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"ha" = (/mob/living/carbon/human/interactive/away/hotel/bartender,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hb" = (/turf/unsimulated/wall/fakeglass,/area/awaymission/spacehotel) +"hc" = (/obj/machinery/vending/dinnerware,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hd" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"he" = (/obj/machinery/processor,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hf" = (/obj/machinery/chem_master/condimaster,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hg" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hh" = (/obj/structure/table,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hi" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hj" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hk" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hl" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen) +"hm" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hn" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"ho" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hp" = (/obj/structure/table,/obj/machinery/chem_dispenser/soda,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hq" = (/obj/structure/table,/obj/machinery/chem_dispenser/beer,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hr" = (/obj/machinery/light,/obj/structure/table,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hs" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"ht" = (/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "150"},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor,/area/awaymission/spacehotel) +"hu" = (/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "150"},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel) +"hv" = (/turf/unsimulated/floor,/area/awaymission/spacehotel) +"hw" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission/spacehotel) +"hx" = (/obj/effect/view_portal/visual{dir = 8; dist = 0; id = "hotel_11"; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel) +"hy" = (/obj/effect/view_portal{id = "hotel_21"},/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel) +"hz" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel) +"hA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows3"},/area/awaymission/spacehotel) +"hB" = (/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel) +"hC" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel) +"hD" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"; dir = 1},/area/awaymission/spacehotel) +"hE" = (/turf/unsimulated/floor{icon_state = "white"},/area/awaymission/spacehotel) +"hF" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"; dir = 4},/area/awaymission/spacehotel) +"hG" = (/obj/structure/ladder{height = 1; icon_state = "ladder10"; id = "service"},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 5},/area/awaymission/spacehotel) +"hH" = (/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel) +"hI" = (/obj/effect/view_portal{id = "hotel_11"},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel) +"hJ" = (/obj/effect/view_portal/visual{dir = 4; dist = 0; id = "hotel_21"; opacity = 0; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel) +"hK" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel) +"hL" = (/obj/machinery/light/built{icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel) +"hM" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel) +"hN" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/ladder{height = 2; icon_state = "ladder01"; id = "service"},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 5},/area/awaymission/spacehotel) +"hO" = (/obj/effect/view_portal/visual{dir = 8; dist = 7; id = "hotel_12"; radius = 2},/turf/unsimulated/floor,/area/awaymission/spacehotel) +"hP" = (/obj/effect/view_portal{id = "hotel_22"},/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel) +"hQ" = (/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel) +"hR" = (/obj/machinery/door/airlock/glass{name = "Employees Only"; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "whitered"},/area/awaymission/spacehotel) +"hS" = (/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 4},/area/awaymission/spacehotel) +"hT" = (/obj/effect/view_portal{id = "hotel_12"},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel) +"hU" = (/obj/effect/view_portal/visual{dir = 4; dist = 0; id = "hotel_22"; opacity = 0; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel) +"hV" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Employees Only"; req_access_txt = "150"},/obj/item/tape/police{icon_state = "police_door"; layer = 3.2},/turf/unsimulated/floor{dir = 8; icon_state = "whitered"},/area/awaymission/spacehotel) +"hW" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "white"},/area/awaymission/spacehotel) +"hX" = (/obj/effect/view_portal/visual{dir = 8; dist = 0; id = "hotel_13"; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel) +"hY" = (/obj/effect/view_portal{id = "hotel_23"},/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel) +"hZ" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel) +"ia" = (/turf/unsimulated/floor{icon_state = "whiteyellow"},/area/awaymission/spacehotel) +"ib" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"; dir = 8},/area/awaymission/spacehotel) +"ic" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"},/area/awaymission/spacehotel) +"id" = (/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 6},/area/awaymission/spacehotel) +"ie" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows2"},/area/space) +"if" = (/obj/effect/view_portal{id = "hotel_13"},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel) +"ig" = (/obj/effect/view_portal/visual{dir = 4; dist = 0; id = "hotel_23"; opacity = 0; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel) +"ih" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "whiteyellow"},/area/awaymission/spacehotel) +"ii" = (/obj/machinery/door/airlock{name = "Supply"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"ij" = (/obj/machinery/door/airlock/glass{name = "Mail Room"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ik" = (/obj/machinery/door/airlock{name = "Security"; req_access_txt = "150"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"il" = (/obj/machinery/door/airlock{name = "Electrical Room"; req_access_txt = "150"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/unsimulated/floor,/area/awaymission/spacehotel) +"im" = (/obj/machinery/door/airlock{name = "Employees Only"; req_access_txt = "150"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"in" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/wall/metal,/area/awaymission/spacehotel) +"io" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/falsewall,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"ip" = (/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"iq" = (/obj/structure/closet/crate/secure/loot,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"ir" = (/turf/unsimulated/floor{icon_state = "warning"; dir = 8},/area/awaymission/spacehotel) +"is" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"it" = (/obj/machinery/vending/sovietsoda,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iu" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 4; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iv" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iw" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ix" = (/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iy" = (/obj/item/stack/cable_coil/random,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iz" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iA" = (/obj/machinery/computer/account_database,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iB" = (/turf/unsimulated/floor/wood,/area/awaymission/spacehotel) +"iC" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"iD" = (/turf/unsimulated/wall{icon = 'icons/turf/walls/cult_wall.dmi'; icon_state = "cult"; desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick"},/area/awaymission/spacehotel) +"iE" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"iF" = (/obj/structure/closet/crate/plastic,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"iG" = (/obj/machinery/vending/snack,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iH" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iI" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iJ" = (/obj/structure{desc = "It appears to be similar to a SMES."; icon = 'icons/obj/power.dmi'; icon_state = "smes"; name = "WaffeCo PSU"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iK" = (/obj/structure{desc = "It appears to be some sort of generator."; icon = 'icons/obj/power.dmi'; icon_state = "teg"; name = "WaffeCo PGU"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iL" = (/obj/machinery/power/supermatter_shard,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iM" = (/obj/machinery/gateway{dir = 9},/turf/unsimulated/floor{icon_state = "warning"; dir = 9},/area/awaymission/spacehotel) +"iN" = (/obj/machinery/gateway{dir = 1},/turf/unsimulated/floor{icon_state = "warning"; dir = 1},/area/awaymission/spacehotel) +"iO" = (/obj/machinery/gateway{dir = 5},/turf/unsimulated/floor{icon_state = "warning"; dir = 5},/area/awaymission/spacehotel) +"iP" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/grass/both,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"iQ" = (/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"iR" = (/obj/effect/gibspawner/human,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"iS" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor/shutters/preopen,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iT" = (/obj/machinery/vending/cola,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iU" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 4; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"iV" = (/obj/machinery/light/small{dir = 8},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iW" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/heavyduty{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iX" = (/obj/structure/cable/heavyduty{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iY" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"iZ" = (/obj/structure/cable/heavyduty{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/unsimulated/floor/plating{icon_state = "platingdmg1"},/area/awaymission/spacehotel) +"ja" = (/obj/structure/cable/heavyduty{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"jb" = (/obj/machinery/light/small{dir = 4},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"jc" = (/obj/machinery/gateway{dir = 8},/turf/unsimulated/floor{icon_state = "warning"; dir = 8},/area/awaymission/spacehotel) +"jd" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"je" = (/obj/machinery/gateway{dir = 4},/turf/unsimulated/floor{icon_state = "warning"; dir = 4},/area/awaymission/spacehotel) +"jf" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/rock,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"jg" = (/obj/item/candle,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jh" = (/obj/effect/rune,/obj/item/organ/brain,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"ji" = (/obj/item/candle,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jj" = (/obj/item/weapon/tome,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jk" = (/obj/structure/closet/crate/critter,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"jl" = (/obj/machinery/door/airlock/glass{name = "Lobby"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jm" = (/obj/effect/spawner/snpc_squad{squad_type = /mob/living/carbon/human/interactive/away/hotel/guard},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jn" = (/obj/structure{desc = "It appears to be similar to a SMES."; icon = 'icons/obj/power.dmi'; icon_state = "smes"; name = "WaffeCo PSU"},/turf/unsimulated/floor/plating{icon_state = "platingdmg1"},/area/awaymission/spacehotel) +"jo" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/soft/red,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jp" = (/obj/item/toy/prize/honk,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jq" = (/obj/item/toy/spinningtoy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jr" = (/obj/item/weapon/bananapeel,/obj/item/toy/spinningtoy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"js" = (/obj/structure/barricade/wooden,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jt" = (/obj/machinery/door/airlock/glass,/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 3.2},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ju" = (/obj/machinery/gateway{dir = 10},/turf/unsimulated/floor{icon_state = "warning"; dir = 10},/area/awaymission/spacehotel) +"jv" = (/obj/machinery/gateway,/turf/unsimulated/floor{icon_state = "warning"},/area/awaymission/spacehotel) +"jw" = (/obj/machinery/gateway{dir = 6},/turf/unsimulated/floor{icon_state = "warning"; dir = 6},/area/awaymission/spacehotel) +"jx" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/ausbushes/palebush,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"jy" = (/obj/item/device/flashlight/lantern{on = 1},/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jz" = (/obj/effect/rune,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jA" = (/obj/structure/stool/bed/chair/comfy,/obj/item/device/soulstone,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/obj/effect/view_portal{id = "cultroom"},/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jB" = (/obj/effect/gibspawner/human,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jC" = (/obj/machinery/atm{pixel_y = 32},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jD" = (/obj/effect/decal/warning_stripes/white/hollow,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jE" = (/obj/item/weapon/paper/pamphlet{pixel_x = -8; pixel_y = 4},/obj/structure/table/reinforced,/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = 8},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = 4},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = -4},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = -8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"jF" = (/obj/item/latexballon,/obj/item/latexballon,/obj/structure/table/glass,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"jG" = (/obj/structure/rack,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"jH" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jI" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jJ" = (/obj/structure/cable/heavyduty{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"jK" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"jL" = (/obj/structure/cable/heavyduty{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"jM" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jN" = (/obj/item/trash/candle,/obj/item/trash/candle,/obj/item/trash/candle,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jO" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/bush,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel) +"jP" = (/obj/item/weapon/restraints/legcuffs,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"jQ" = (/obj/structure/closet/crate/secure/unknownchemicals,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"jR" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_7,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel) +"jS" = (/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"jT" = (/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"jU" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/obj/machinery/light,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jV" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jW" = (/obj/machinery/light/small,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"jX" = (/obj/item/toy/sword,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jY" = (/obj/item/target/syndicate,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"jZ" = (/obj/item/trash/sosjerky,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ka" = (/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"kb" = (/obj/machinery/space_heater,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"kc" = (/obj/machinery/door/airlock{name = "Supply Closet"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"kd" = (/obj/machinery/door/airlock/glass{name = "Gateway"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ke" = (/obj/item/weapon/melee/cultblade,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"kf" = (/obj/item/weapon/kitchen/knife/butcher{blood_DNA = 1e+009},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) +"kg" = (/obj/machinery/light{dir = 8},/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"kh" = (/obj/effect/hotel_controller,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ki" = (/obj/item/weapon/pen,/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kj" = (/obj/structure/stool/bed/chair{dir = 8},/mob/living/carbon/human/interactive/away/hotel/concierge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kk" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kl" = (/obj/structure/stool/bed/chair/sofa{icon_state = "sofamiddle"; dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"km" = (/obj/item/weapon/clipboard,/obj/item/weapon/paper,/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kn" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"ko" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kp" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kq" = (/obj/structure/stool/bed/chair/sofa/corner{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"kr" = (/obj/structure/stool/bed/chair/sofa{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ks" = (/obj/machinery/light,/obj/structure/stool/bed/chair/sofa/left{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"kt" = (/obj/machinery/light,/obj/structure/stool/bed/chair/sofa/right{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"ku" = (/obj/structure/stool/bed/chair/sofa/left{dir = 1},/obj/effect/decal/warning_stripes/white/hollow,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel) +"kv" = (/obj/item/weapon/paper_bin,/obj/structure/table/glass,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kw" = (/obj/structure/table/glass,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception) +"kx" = (/turf/unsimulated/wall/fakeglass{dir = 10; icon_state = "fakewindows"},/area/space) +"ky" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/space) +"kz" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel) +"kA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/space) +"kB" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 6},/area/space) +"kC" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/awaymission) +"kD" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission) +"kE" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/awaymission) +"kF" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/awaymission) +"kG" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/awaymission) +"kH" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission) +"kI" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/awaymission) +"kJ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/awaymission) +"kK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/space) +"kL" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/space) +"kM" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/space) +"kN" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows3"},/area/awaymission) +"kO" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/awaymission) +"kP" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission) +"kQ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission) +"kR" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/weapon/paper/hotel_scrap_4,/turf/simulated/shuttle/floor,/area/awaymission) +"kS" = (/turf/simulated/shuttle/floor,/area/awaymission) +"kT" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission) +"kU" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/unsimulated/floor/plating/airless,/area/awaymission) +"kV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/awaymission) +"kW" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/space) +"kX" = (/turf/simulated/shuttle/wall/interior,/area/space) +"kY" = (/turf/simulated/shuttle/wall{icon_state = "swall3"},/area/space) +"kZ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/space) +"la" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) +"lb" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/awaymission) +"lc" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) +"ld" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/awaymission) +"le" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/awaymission) +"lf" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission) +"lg" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) +"lh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/space) +"li" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/space) +"lj" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/awaymission) +"lk" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/space) +"ll" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"lm" = (/obj/structure/curtain/open/shower,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission{name = "Amazing Place"; requires_power = 0}) +"ln" = (/obj/item/weapon/paper/hotel_scrap_8,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacadacacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeaiahaiaiaiafaiaiaiaiaiaiacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaabababababababababababababababababababacajamamamamamanaiaiaiaiaiaiacababababababababababababababababababaaaaaaaaaa -aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoabaaaaaaaaaa -aaaaaaabaoaqaqarasatauavawaoaqaqaraxayauavawaoazazazazazazazazazazazazazaoaAaoaBaoaCaCaCaDaCaCaCaoaEaoaFaoaoabaaaaaaaaaa -aaaaaaabaoaqaqaGaHaHaHaHaIaoaqaqaGaHaHaHaHaJaoaHazazazazaKaLaMazazazazaoaoaNaoaNaoaOaNaNaNaNaNaPaoaNaoaNaoaoabaaaaaaaaaa -aaaaaaabaoaQaRaSaHaHaHaHaIaoaQaRaSaHaHaHaHaJaoaHaHazazazaTaUaVazazazaHaoaoaWaoaWaoaoaoaoaWaoaoaoaoaWaoaWaoaoabaaaaaaaaaa -aaaaaaabaoaXaYaZaHaHbaaHbbaoaXaYaZaHaHbaaHbcaoaHaHaHazazbdbebfazazaHaHaobgaNaNaNaNaNbhaNaNaNbhaNaNbibiaNbjaoababaaaaaaaa -aaaaaaabaoaoaoaobkbkaoaoaoaoaoaoaoblblaoaoaoaoaHaHaHaHazazazazazazaHaHaoaoaoaoaoaoaoaoaNaNaNaoaoaoaoaoaoaoaoaoabaaaaaaaa -aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHazazazazaHaHaHaHbnaHaHaHaHaHaHbnaHaHaHbnaHaHaHaHaHaHbnaoabaaaaaaaa -aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHaHbqaHbqaHaHaHaHaHaHaHbraHaHbraHaHbraHaHbraHaHbraHaHaHaoabaaaaaaaa -aaaaaaaabsaHaHaHaHaHbqaHaHaHaHaHbqaHaHaHaHaHaHaHaHaHaHbtaobuaobvaHaHaHbwbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbyaoabaaaaaaaa -aaaaaaabaoaoaobzaoaoaoaoaobAaoaoaoaoaobBaoaoaoaHaHaHaHaHbnaHbnaHaHaHaHbCbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbEaoabaaaaaaaa -aaaaaaabaoaHbFbGaHavaoaHbHbIaHbJaoaHbKbLaHavaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqbMaqaqaqaqaqaqaqbDbNbmaaaaaaaaaa -aaaaaaabaobvaHbaaHbOaobvaHaHaHbPaobvaHaHaHbQaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaaabRaHaHaHaHbSaoaHaHaHaHbPaoaHaHaHaHbQaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaabaobTbTbUbTbVaobTbTbUbTbVaobTbTbUbTbVaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaabbWbXaYaZbYaobWbXaYaZbYaobWbZcaaZbYaoaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDcbaqaqaqaqaqaqaqaqaqaqaqaqaqccbDbNboaaaaaaaaaa -aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbqaHbqaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHbtaobuaobvaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaaabsaHaHaHaHaHbqaHaHcdcdaHbqaHaHaHaHaHaHaHaHaHaHaHbnaHbnaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaabaoaoaoceaoaoaoaoaocfaoaoaoaoaocgaoaoaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa -aaaaaaabaoaHchciaHcjaoaHckclaHavaoaHcmcnaHcoaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqcpaqaqaqaqaqaqaqbDbNbsaaaaaaaaaa -aaaaaaabaobvaHaHaHcqaocrcrcrcrcsaobvaHaHaHctaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDbDbDcubDbDbDbDbDbDbDbDbDbDbDbDbDbEaoabaaaaaaaa -aaaaaaaabRaHaHaHaHcqaoaHcrcrcrcvaoaHaHaHaHctaoaHaHaHaHaHaHaHaHaHaHaHaHcwaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRcxaoabaaaaaaaa -aaaaaaabaobTbTbUbTbVaobTbTcyczbVaobTbTbUbTbVaoaHaHaHaHaHbpaHbpaHaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbmaaaaaaaaaa -aaaaaaabbWbXaYaZbYaobWbXaYaZbYaobWbXaYaZbYaoaoaHaHaHaHaHaHaHaHaHaHaHaHaHcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCboaaaaaaaaaa -aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHaHaHaHaHaHaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHboaaaaaaaaaa -aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbqaHbqaHaHaHaHaHcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCboaaaaaaaaaa -aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHbtaobuaobvaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbsaaaaaaaaaa -aaaaaaaabsaHaHaHaHaHbqaHaHaHaHaHbqaHaHaHaHaHaHaHaHaHaHaHbnaHbnaHaHaHaHaHcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDbtaoabaaaaaaaa -aaaaaaabaoaoaocEaoaoaoaoaocFaoaoaoaoaocGaoaoaoaHaHaHaHaHbpaHbpaHaHaHaHcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBaoabaaaaaaaa -aaaaaaabaoaHcHcIaHcJaoaHcKcLaHavaocMcNcOaHavaoaHaHaHaHaHaHaHaHaHaHaHaHcBcPcPcPcQcPcPcPcPcPcPcPcPcPcPcPcQcPcPaoabaaaaaaaa -aaaaaaabaoaHaHagcScTaobvaHaHaHcUaocVcWcWaHcXaoaHaHaHaHaHaHaHaHaHaHaHaHaocYcPcZdadbdbcPcPcPcPcPdadadadadacPcYaoabaaaaaaaa -aaaaaaaabRaHdcddcSdeaoaHaHaHaHcUaocWdfcWaHdgaoaHaHaHaHaHbpaHbpaHaHaHaHaodhcPdadidjdkcPcPcPcQcPdadadldadacPdhaoabaaaaaaaa -aaaaaaabaodmdndodndpaobTbTbUbTbVaodqdrdsdrbVaoaHaHaHaHaHaHaHaHaHaHaHaHaodtcPcQcPcPcPcPcPcPcPcPcPcPcPcPcPcPdtaoabaaaaaaaa -aaaaaaabbWduakdwalaobWbXaYaZbYaobWbXaYaZbYaoaoaHaHaHaHaHbqaHbqaHaHaHaHaocPdydzdAdBdCcQdycPdycPcPdDdEdFcPdycQaoabaaaaaaaa -aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHbtaobuaobvaHaHaHaoaoaoaoaoaoaoaoaodGaoaoaoaoaoaoaoaoaoaoabaaaaaaaa -aaaaaaabaoaHaHaHaHaHaHaHaHaHdHaHaHaHaHaHdIdIdIaHaHaHaHaHbnaHbnaHaHaHaHaHaHaHaHbnaHaHaHaHaHaHaHaHaHaHcWaHaHcWbmaaaaaaaaaa -aaaaaaabaodJaHdKaHaHaHaHaHaHaHdHaHaHaHaHdIdIdIaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHcWcWcWcWaHboaaaaaaaaaa -aaaaaaabaoaHaHaHaHaHaHdHaHaHaHaHaHdLaHaHaHdIdIdIaHaHaHaHbpaHbpaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHcWcWaHcWaHaHbsaaaaaaaaaa -aaaaaaabaodMaHdJaHaHaHaHaHaHaHdLaHaHaHaHaHaHdNaoaHaHaHaHaHaHaHaHaHaHaHaoaoaoaodOaoaoaoaoaoaodPdPdPaoaoaoaoaoaoabaaaaaaaa -aaaaaaabaodQdRaHaHaHaHdLaHaHaHaHaHaHdLaHaHaHaHaodSaHaHaHaHaHaHaHaHaHdTaodUdVaHaHaHdWdWdWaodXdXdYdXdXdXdXdXdXaoabaaaaaaaa -aaaaaaabaoaodZeaaHdHaHaHaHdHaHaHdHaHaHaHaHaHaHaodSaHaHaHbpaHbpaHaHaHebaodUcCaHaHaHecededaodXeeefeedXdXdXdXeeaoabaaaaaaaa -aaaaaaababaoegdJaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaodSaHaHaHaHaHaHaHaHaHehaodUdVaHaHaHaHaHaHaodXeeeeeiejekeeeeelaoabaaaaaaaa -aaaaaaaaabaoaHaHaHaHaHdLaHaHaHaHaHdHaHaHaHdIdIaoaoaoaoaodOaodOaoaoaoaoaodUcCaHaHaHaHaHaHaoeeeeeeemenemeeeoeeaoabaaaaaaaa -aaaaaaaaabaoaHepaHaHaHaHaHaHaHaHdHaHaHaHaHdIdIaoaHaHaHaHaHbnaHaHeqeresaobvaHaHbretbreuetaodXeeeeekemekeeeveeaoabaaaaaaaa -aaaaaaaaabaoewewaHaHaHaHaHaHaHaHaHaHaHaHaHdIdIdOaHaHaHaHbpaHbpaHexaHaHdOaHaHaHeyeyeyeyeyaodXezeoeeeeeAeedXdXaoabaaaaaaaa -aaaaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaobvaHaHaHaHaHaHaHeBeCaHdPaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoabaaaaaaaa -aaaaaaaaabababababababababababababababababababbmaHaHaHaHaHaHaHaHeDcCeEaoababababababababababababababababababababaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboaHaHaHaHbpaHbpaHexaHeEaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboaHaHaHaHaHaHaHbqexeFexaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeGeHeHeIaoeJaoeJaoaoaoaoaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeJaoeJababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacReLeMeHeIeNeOeNeOeNeMeHeIeNdvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacRbReQeReSeSeSbDbDbDbDbDeSeSeSeTeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabReWeXbDbDbDbDbDeSeSeSbDbDbDbDeYeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxbRfabDeSeWeSbDbDeRbDbDfbfceSeTeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxeNeMeHeIeNeLeLeLeNeMeHeIeNeKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababacacacacacacacacacacacacacacacacacacacacacacacacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeafaeafaeagagagagagaeafaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaiaiaiajaiaiaiabacacacacacacacacacacacacacakalacacacacacacacacacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeamamanaoafaeapaeaqaeagagagagagaearaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacacacacacacacacacacacakasatatasasasasalacacacacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeauaeaeaeaeaeavaeawaeaeaeaeaeaeaeaxaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaiaiaiaiayaiaiabacacacacacacacakasasasatatatatatatatatatasasalacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeamamazaAafaeamaeamamaBaAafaeamamamaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaCaDaDaDaDaDaCaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacaEasasasasasatatatatatatatatataFatataGatataHacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaIaeaeaeaeaeaeaeaPaeamaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaCaDaDaJaDaDaCaaaaaaaaaKaaaaaaabaiaiaiaiaiaiaiabacacaLatatatatatatataMaMaMatatatatatatatatatatalacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafaNaOamamaeaPamamaeafaQamamamaeauaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaCaRaSaTaUaVaCaaaaaaaWaXaaaaaaabaYaiaiaiaiaZbaabacacaLatatatatatatbbbcbdbebfatatatatatatatatatbgacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaPaeamaeauaeaeaeaeaeaeaeamaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaabhbibjbibkaaaaaablbmaaaaaaaaabaiaiaiaiaiaiaiabacacaLatatatatatatbnbobpbobfatatatatbqatatataHacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafbrbsamamaeamaeamambtaAafaellaeamaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaabubjbjbjbjbjbvaaaabwbxaaaaaaaaabaiaiaiaiaiaiaiabacacbyatatatatatatbzbAbBbAbfatbCatatatatatataHacacadadadadadadadadbDbDbDbDbDbDbDbDbDbDbDbDbDadadadadadadadadaeaeaeaeaeaeaeamaeaeaeaeaeaeaelmamamaeahahahahahahahahahahahahahahahahahahahahahahah +aabEbFaabGbHbHbHbjbjbjbjbjbjbjbHbHbjbjbIaaaaaaabaiaiaiaiaiaiaiabacacacaLatatatatatatbJbKbJatatatatatatatatataHacacadadadadadadadadbDbDbDbLbMbMbNbDbDbDbDbDbDadadadadadadadadaeagaeafaeafaebOaeambPamaeagaeaeaebQaeahahahahahahahahahahahahahahahahahahahahahahah +aaaabRbSbjbjbTbjbjbUbjbjbjbjbjbjbTbjbjbjbvaaaaabaiaiaiaiaiaiaiabacacacaLatatbCatatatatatatatatatatatatatatataHacacadadadadadadadadbDbDbLbVbVbVbVbMbMbMbNbDbDadadadadadadadadaeagaebWaebXaebYaebZaecaaeagagagaecbaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaabwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbUbxaaaaabcccccdceaiaiaiabacacacaLatatatatatatatatatatatatatatatatatataHacacadadadadadadadadbDbLbVbVcfbVbVbVcfbVcgbDbDadadadadadadadadaeagaechaeciaeafaecjaeckaeagagagaeafaeahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaabwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbxaaaaclcmcncocpclabababacacacaLatatatatatatatatatbqatatatatatatatataHacacadadadadadadadadbDcqbVbVbVbVcrbVbVbVcgbDbDadadadadadadadadaeagaecsctcuaeagaeafaeafaeagagagagagagahahahahahahahahahahahahahahahahahahahahahahah +aaaacvaabwbjbjcwbjbjbjbUbjbjbjbjbjbjbjbjbxaaaaclclclclcxclcycycyacacakatatatatatatatatatatatatatatatatatatatatalacadadadadadadadadbDcqbVbVbVcrczcrbVbVbVbNbDadadadadadadadadaeagaeaeaeaeaeagagagagagagagagagagagagahahahahahahahahahahahahahahahahahahahahahahah +aacAcBaabwbjbjbjbjbjbjbjbjcCbjbjcwbjbjbjbxaaaacycycyclclclcycycyacacbycDatatatatatatatatatatatatatatatatatatatbgacadadadadadadadadbDcEbVbVbVbVcrbVbVbVbVcgbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aacFcGaabwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbxaaaacycycycycycycycycyacacacaccHcIcJcJcJcJcJcKcJcJcLcJcJcKcJcMcJcJcNacacadadadadadadadadbDcOcqbVcfbVbVbVcfbVbVcPbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aacQbjbHbjbjbjbjbjcwbjbjbjbjbjbjbjbjbjbjbjbvaaabcRabababababababacacacaccScTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcUacacadadadadadadadadbDbDcEcVbVbVbVbVbVcVcPcObDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aacWcXbjbjbjbjbjbjbjbjbjbjbjbUbjbjbjbjcCbjbxaaabababababababababacacacaccYcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcZdaacacacadadadadadadadadbDbDcOcOcEcVbVcVcPcOcObDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aaaaaacWbjbjcwbjbjbjbjbjbjbjbjbjbjcwbjbjbjbxaaabaiaiaiajaiaiaiabacacacacacdbcZcTcTcTcTcTcTcTcTcTcTcTcTdcacacacacacadadadadadadadadbDbDbDbDcOcOddcOcObDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaabwbjcCbjbjbjbUbjbjbjbjbjbjbjcXcXcXdeaaabaiaiaidfaiaiaiabacacacacacacaccScTcTcTcTcTcTcTcTcTcTcTdgacacacacacadadadadadadadadbDbDbDbDbDbDddbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaacWcXcXcXcXbjdhdhbjcXcXcXcXdeaaaaaaaaaaabaidiaiaiaiaiaiabacacacacacacaccYcZcTcTcTcTcTcTcTcTcZdaacacacacacacadadadadadadadadbDbDbDbDbDbLcPbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaadjdkdkdlaaaaaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacacacacacacacacacdmdndndndndndndoacacacacacacacacadadadadadadadadbDbDbDbDbDddcObDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +aaaaaaaaaaaaaaaaaadpdqdqdraaaaaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacacacacacacacacacdsdtdudududududvacacacacacacacacadadadadadadadadbDbDbDbDbDddbDbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dwdwdwdxaaaaaadydwdkdkdkdkdwdwdwdxaaaaaaaaaaaaabdzaiaiaiaidAbaabacacacacacacacacacacacdBdududCdtdDacacacacacacacacadadadadadadadadbDbDbDbDbDcEdEbNbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dkdkdkdkdwdwdwdkdkdkdFdFdkdkdkdkdkdwdwdwdwdwdwabaiaiaiaiaiaiaiabacacacacacacacacacacacdsdCdudvacacacacacacacacacacadadadadadadadadbDbDbDbDbDcOcOddbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dkdkdkdkdkdkdkdkdkdFdFdFdFdkdkdkdkdkdkdkdkdkdkabaiaiaiaiaiaiaiabacacacacacacacacacacacacdGdudDacacacacacacacacacacadadadadadadadadbDbDbDbDbDbDbLcPbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdkdkdkdFdFdFdFdFdFdFdFdFdFdkdkdkdkdkdkabaiaiaiaiaiaiaiabacacacacacacacacacacacacdBdvacacacacacacacacacacacadadadadadadadadadadadadbDbDddcObDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHabaiaiaiaiaiaiaiabacacacacacacacacacacacacdBdvacacacacacacacacacacacadadadadadadadadadadadadbDbDddbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHabaiaiaidIaiaiaiabacacacacacacacacacacacacdBdvacacacacacacacacacacacadadadadadadadadadadadadaddJdKdJadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHabababababababababahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadaddLdMdNadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadcOcOcOadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdPdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdOdOdOdOdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclcldRdSdTclclclclclclcldRdSdTclclclclclclcldRdSdTclclclclclclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdOdOdOdOdQclclclcldRdSdTclclclclclclcldRdSdTclclclclclclcldUdVdWclclclclclclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdYdXdXdXdXcldXdXdXdXdZdXdXdXdXcldXdXdXdXeadXdXdXdXclebebcleccleccledededeeedededclecclecclcldQdOdOdOdOdOdOdOdOdOdQcldXdXdXdXefdXdXdXdXcldXdXdXdXegdXdXdXdXcldXdXdXdXehdXdXdXdXclebebcleccleccledededeeedededclecclecclcldQdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebclcleicleiclejeieieieieiekcleicleiclcldQdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebclcleicleicleleieieieieiekcleicleiclcldQdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXclebclclenclenclclclclenclclclclenclenclcldQdOdOdOdOdOdOdOdOdOdQcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXclebclclenclenclclclclenclclclclenclenclcldQdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebcleoeieieieieiepeieieiepeieieqeqeiercldQdQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebcleoeieieseteiepeieieiepeieieieieieucldQdQdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclclclevclclclclclclclclclewclclclclclclclclclexclclclclclclclclclclclclclcleieieiclclclclclclclclcldQdOdOdOdOdOdOdOdOdQclclclclcleyclclclclclclclclclezclclclclclclclclcleAclclclclclclclclclclclclclcleieieiclclclclclclclclcldQdOdOdOdOdOdO +dOdOdOdOdOdOdOeBebebebebebeCebebebebebeCebebebebebebebebebebebeDebeDebebebebebeCebebebebebebeCebebebeCebebebebebebeCcldQdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebeDebeDebebebebebeCebebebebebebeCebebebeCebebebebebebeCcldQdOdOdOdOdOdO +dOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebebebebebeJebebeJebebeJebebeJebebeJebebebcldQdOdOdOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebebeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKcldQdOdOdOdOdOdO +dOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebeCebeCebebebebebeMeNeNeNeNeNeNeNeNeNeNeNeNeNeNeNeNeNeOcldQdOdOdOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebePeKePebebebebeQeReReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclclcleTclclclclcleUclclclclcleVclclclebebeWebebebebebebebeWebebeXeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeZcldQdOdOdOdOdOdOdOdOdQclclclfaclclclclclfbclclclclclfcclclclebebeWebeQeReReRfdebeWebeQeReReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXfedXdXdXcldXffdXdXdXcldXfgdXdXdXclebebfhebebfififiebebfhebebeXeYfjfjfjfjfjfjfjfkflflflflflflfleYfmeBdOdOdOdOdOdOdOdOdOdQcldXfndXdXdXcldXfodXdXdXcldXfpdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReBdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebfqfrfwfrfsebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebfxfhebebfyfyfyebebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQfzdXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebebebebebebebfAebebeXeYfBftftftftftftfjflflflflflfCfDeYfmeEdOdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebeQeReReRfdebfAebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebeDebeDebebebebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebfEfFfEebebebebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeEfGebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebebeXeYfjftftftfHftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebeCebeCebebebebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebePeKePebebebebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclfIclclclclclfJclclclclclfKclclclebebeWebebebebebebebeWebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQclclclfLclclclclclfMclclclclclfNclclclebebeWebeQeReReRfdebeWebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXfOdXdXdXcldXfPdXdXdXcldXfQdXdXdXclebebfhebebfififiebebfhebebeXeYfjfjfjfjfjfjfjfRflflflflflflfleYfmeLdOdOdOdOdOdOdOdOdOdQcldXfSdXdXdXcldXfTdXdXdXcldXfUdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReLdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebeXeYeYeYfVeYeYeYeYeYeYeYeYeYeYeYeYeYeZfWdQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO +dOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebfqfrfwfrfsebfhebebfXfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfZfWdQdOdOdOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebeQeReReRfdebfhebeQgaeReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebcleIebebebebebebebebebebebebebebebebebebeBdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebclgbgcgdgegcgdgegcgdgegcgdgegcgfgegcgdgeeBdOdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebebfyfyfyebebfhebebebggghgiggghgiggghgiggghgiggghgiggghgieEdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebebgjgkglgjgkglgjgkglgjgkglgjgkglgjgkgleEdOdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebebebebebebebfAebcleIebebebebebebebebebebebebebebebebebebeEdOdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebeQeReReRfdebfAebcleIgmgkgngmgkgngmgkgngmgkgngmgkgngmgkgneEdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebeDebeDebebebebebebggghgiggghgiggghgiggghgiggghgiggghgieEdOdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebfEfFfEebebebebebdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXeEdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebcleIebebebebebebebebebebebebebebebebebebeLdOdOdOdOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebclgodXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXeLdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebeCebeCebebebebebebgpgpgpgpgpgpgpgpgpgpgpgpgpgpgpgpgpgqcldQdOdOdOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebePeKePebebebebebdXdXdXdXdXdXdXdXdXgrdXdXdXdXdXdXdXdXgscldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclgtclclclclclguclclclclclgvclclclebebeWebebebebebebebeWebebgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwcldQdOdOdOdOdOdOdOdOdQclclclgxclclclclclgyclclclclclgzclclclebebeWebeQeReReRfdebeWebclgodXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXgAdXdXdXcldXgBdXdXdXcldXgCdXdXdXclebebfhebebfififiebebfhebebgwgDgDgDgDgEgDgDgDgDgDgDgDgDgDgDgDgDgDcldQdOdOdOdOdOdOdOdOdQcldXgFdXdXdXcldXgGdXdXdXcldXgHdXdXdXclebebfhebeQeReReRfdebfhebebdXgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebgKgDgDgLgMgNgMgDgDgDgDgDgMgNgOgNgNgDgDcldQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPcldQdOdOdOdOdOdO +dOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebfqfrfwfrfsebfhebebgQgDgDgRgSgTgUgDgDgDgDgDgVgNgWgNgNgDgDcldQdOdOdOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebeQeReReRfdebfhebebgPgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgYcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhfxfqfrfrfrfsebfhebebgQgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDcldQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebgKgZgXgXgXgXgXhagXgXgXgXgXgXgXgXgXgXgZcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebebfyfyfyebebfhebebhbhchdhehfhghhgDhdgDhdgDhihjhkhlgDhdhccldQdOdOdOdOdOdOdOdOdQfzdXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebhbhmhngXgXhohphqhrgXhrhqhpgYgYhsgXhnhmcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebebebebebebebfAebebclclclclclclclclclhtclclclclclclclclclcldQdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebeQeReReRfdebfAebebclclclclclclclclclhuclclclclclclclclclcldQdOdOdOdOdOdO +dOdOdOdOdOdOdOeBhvhvhvhvhvhvhwhxhyhzebebebeCebebebeCebebebebebeDebeDebebebebebhAhBhBhBhBhChBhBhDhEhFhBhBhChBhBhBhChGeBdOdOdOdOdOdOdOdOdOdOeBebeCebebebeChHhIhJhKeReReRhKeReReRhKfdebebebebfEfFfEebebebebebhAhBhBhBhBhLhBhBhDhEhFhBhBhLhBhMhBhLhNeBdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeEhvhvhvhvhvhvhwhOhPhQebebebebebebebebebebebebeGcleHcleIebebebebhRhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhSeEdOdOdOdOdOdOdOdOdOdOeEebebebebebebhHhThUeReReReReReReReReRfdebebebeGcleHcleIebebebebhVhEhEhEhEhEhEhEhEhEhEhEhEhEhWhWhWhWhSeEdOdOdOdOdOdOdO +dOdOdOdOdOdOdOeLhvhvhvhvhvhvhwhXhYhZebebebeDebebebeDebebebebebeCebeCebebebebebhAiaiaibhEiciaiaiaiaiaiaiaiaiaiaiaiaideLdOdOdOdOdOdOdOdOdOdOieebebebebebebhHifigeReReReReReReReReRfdebebebebeCebeCebebebebebhAiaiaibhEiciaiaiaiaiaiaiaihihiaihiaideLdOdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclclclclclclclclclcliiclclclijclclebebebebebebebebebebebebebclclclclikclclclclclclclclclilclclclclcldQdOdOdOdOdOdOdOdOdOieebebebebebebfFfFfFfFfFfFfFfFfFfFfFfFebebebebebebebebebebebebebclclclclimclclclclclclinioinclclclclclcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclipipipipipipipipiqipipipirclebebebclisebebebebebebebebebebebitcliuivebebebiwiwiwclixixiyixizixixixiAcldQdOdOdOdOdOdOdOdOdOieebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebitclebiBiBiBiBiBebiCcliDiDiEiDiDiDiDiDiDcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclipipiFipipipiqipipipipipircleIebebclisebebebebebebebebebebebiGcliugiebebebiHiIiIcliJiKiJiLiziLiJiKiJcldQdOdOdOdOdOdOdOdOdOeLebeDebebebeDebebebeDebebebeDebebebeDebebebebebebebebebebebebiGclebiBiMiNiOiBebiPcliDlniRiQiDiDiDiDiQcldQdOdOdOdOdOdO +dOdOdOdOdOdOdOfuipipipipiqipipipipipipipiriSebebebclisebebebebebebebebebebebiTcliUivebebebebebeGcliViWiXiXiYiXiZjajbcldQdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclisisisebebebebebebebebebiTcleIiBjcjdjeiBeGjfcliDiQiQjgjhjiiQiQjjcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclipjkipipipipipipipipipipiriSebebebclclclclclcljlcljlclclclclclcliugiebebebebebjmcliJiKjniLiziLiJiKiJcldQdOdOdOdOdOdOdOdOdQcljojpebebebebjqebebebebebjrebebjsjsclclclclclcljtcljtclclclclclclebiBjujvjwiBebjxcliQjyiQjzjAjziQjBiQcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclipipipipiFipipiqipipipipircleIebebijebebjCebeCebebebeCjDjEjFjGclebebebeJjHeJjIjHclixjJiXiXjKiXiXjLixcldQdOdOdOdOdOdOdOdOdQclebjMjNebebjqebebebebebjrebebebjsjsclebebebebeCebebebeCebebebebclebiBiBiBiBiBebjOcliDiQiQjijzjijyjPiQcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQcljQipipipipipipipipipipjRirclebebebijebebebebebebebebebjDjSjTjTikebebebjUjVjVjVjVcliJiKiJiLjWiLiJiKiJcldQdOdOdOdOdOdOdOdOdQclebjXjYjZkaebjYebebjqebebkbkbebjsjskcebebebebebebebebebebebebebkdebebebeDebebebiCcliDkejBiQiQkfiQiDiDcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclkgebebfxfxfxebkhebjDkikjkkinclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclcleIebebebebebebebebebebebebinclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdO +dOdOdOdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQclklebebfxfxfxebebebjDkmknkocldQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQclebebebebebebebebebebebebebcldQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeBklebebebebebebebebjDjSjTkpeBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebeBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeEkqkrkrkrksebebebktkujSkvkwiedOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeEebebebebeDebebebeDebebebebiedOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkxdSdSdSkyclkzclkzclkAdSdSdSkBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkxdSdSdSkyclclclclclkAdSdSdSkBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdQkzclkzdQdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdQdQdQdQdQdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkCkDkEkFkGkHkIkHkIkHkEkFkGkHkJdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkKkLkLkLkLkLkLkLkLkLkLkLkLkLkMdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkCkNkOkPkQkRkQkSkSkSkSkSkQkQkQkTkUkVdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkKkLkWkXkXkXkXkXkXkXkXkXkXkXkXkXkYkZdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkNlalbkSkSkSkSkSkQkQkQkSkSkSkSlckUkVdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkYkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkYkZdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOldkNlekSkQlakQkSkSkPkSkSlflgkQkTkUkVdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOlhkLlikXkXkXkXkXkXkXkXkXkXkXkXkXkYkZdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOldkHkEkFkGkHkDkDkDkHkEkFkGkHljdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOlhkLkLkLkLkLkLkLkLkLkLkLkLkLlkdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO +dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO "} diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 7f5a03e58af..41715794c29 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -160,7 +160,7 @@ "dd" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) "de" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) "df" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/shard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/storage/firstaid/tactical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"dg" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/red,/obj/item/clothing/head/helmet/knight/red,/obj/item/weapon/holo/claymore/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_knightarena) +"dg" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/red,/obj/item/clothing/head/helmet/riot/knight/red,/obj/item/weapon/holo/claymore/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_knightarena) "dh" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_knightarena) "di" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_knightarena) "dj" = (/turf/simulated/floor/holofloor,/area/holodeck/source_knightarena) @@ -181,7 +181,7 @@ "dy" = (/obj/structure/holowindow{dir = 1},/turf/simulated/floor/holofloor{dir = 4; icon_state = "blue"},/area/holodeck/source_knightarena) "dz" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "blue"},/area/holodeck/source_knightarena) "dA" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "blue"},/area/holodeck/source_knightarena) -"dB" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/blue,/obj/item/clothing/head/helmet/knight/blue,/obj/item/weapon/holo/claymore/blue,/turf/simulated/floor/holofloor{dir = 2; icon_state = "blue"},/area/holodeck/source_knightarena) +"dB" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/blue,/obj/item/clothing/head/helmet/riot/knight/blue,/obj/item/weapon/holo/claymore/blue,/turf/simulated/floor/holofloor{dir = 2; icon_state = "blue"},/area/holodeck/source_knightarena) "dC" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 10; icon_state = "blue"},/area/holodeck/source_knightarena) "dD" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 6; icon_state = "blue"},/area/holodeck/source_knightarena) "dE" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source) diff --git a/_maps/map_files/templates/light_floor_1.dmm b/_maps/map_files/templates/light_floor_1.dmm new file mode 100644 index 00000000000..eedb8420201 --- /dev/null +++ b/_maps/map_files/templates/light_floor_1.dmm @@ -0,0 +1,16 @@ +"a" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-r"},/area/template_noop) +"c" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-y"},/area/template_noop) +"d" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-g"},/area/template_noop) +"e" = (/turf/unsimulated/floor{icon_state = "light_on"; luminosity = 1},/area/template_noop) +"f" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-b"},/area/template_noop) +"g" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-p"},/area/template_noop) +"h" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-w"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaa +abcdefghgfedcbcdefg +abcdefghgfedcbcdefg +abcdefghgfedcbcdefg +aaaaaaaaaaaaaaaaaaa +"} diff --git a/_maps/map_files/templates/light_floor_2.dmm b/_maps/map_files/templates/light_floor_2.dmm new file mode 100644 index 00000000000..03b6c6735b0 --- /dev/null +++ b/_maps/map_files/templates/light_floor_2.dmm @@ -0,0 +1,16 @@ +"a" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-r"},/area/template_noop) +"c" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-y"},/area/template_noop) +"d" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-g"},/area/template_noop) +"e" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on"},/area/template_noop) +"f" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-b"},/area/template_noop) +"g" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-p"},/area/template_noop) +"h" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-w"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaa +aabcdefghgfedcbcdef +abcdefghgfedcbcdefg +bcdefghgfedcbcdefga +aaaaaaaaaaaaaaaaaaa +"} diff --git a/_maps/map_files/templates/light_floor_3.dmm b/_maps/map_files/templates/light_floor_3.dmm new file mode 100644 index 00000000000..940cd14e631 --- /dev/null +++ b/_maps/map_files/templates/light_floor_3.dmm @@ -0,0 +1,16 @@ +"a" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"b" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-y"},/area/template_noop) +"c" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-b"},/area/template_noop) +"d" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-p"},/area/template_noop) +"e" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-g"},/area/template_noop) +"f" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-r"},/area/template_noop) +"g" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on"},/area/template_noop) +"h" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-w"},/area/template_noop) + +(1,1,1) = {" +aabaacaadaaeaabaaca +afbegcdhdcgebfbegcd +afbegcdhdcgebfbegcd +afbegcdhdcgebfbegcd +affffffhhhhhhgggggg +"} diff --git a/_maps/map_files/templates/spacehotel/n_01.dmm b/_maps/map_files/templates/spacehotel/n_01.dmm new file mode 100644 index 00000000000..4480512c668 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_01.dmm @@ -0,0 +1,25 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/jade,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/obj/item/toy/plushie/octopus,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accccga +ahhihja +aklmnoa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_02.dmm b/_maps/map_files/templates/spacehotel/n_02.dmm new file mode 100644 index 00000000000..9555b7a80e5 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_02.dmm @@ -0,0 +1,30 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/template_noop,/area/template_noop) +"c" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/bananapeel{layer = 2.6},/turf/template_noop,/area/template_noop) +"d" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/flour{desc = "Rather caked in there."},/obj/effect/decal/cleanable/pie_smudge,/obj/item/weapon/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"m" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/bananalamp,/turf/unsimulated/floor/carpet,/area/template_noop) +"n" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"r" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaabbaa +aaacaaa +adefega +affffha +aefffia +ajjklma +anopqra +aaaaaaa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_03.dmm b/_maps/map_files/templates/spacehotel/n_03.dmm new file mode 100644 index 00000000000..e4aa24d6899 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_03.dmm @@ -0,0 +1,24 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/obj/item/toy/random,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"k" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"l" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accccfa +agghgia +ajklmna +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_04.dmm b/_maps/map_files/templates/spacehotel/n_04.dmm new file mode 100644 index 00000000000..74a6e875b4a --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_04.dmm @@ -0,0 +1,30 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster{desc = "You can't make out anything from the poster's original print. It's ruined."; dir = 8; icon_state = "poster_ripped"; name = "ripped poster"; pixel_x = -32; ruined = 1},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/obj/item/clothing/head/xenos,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/mob/living/simple_animal/hostile/alien/queen,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed/nest,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/stool/bed/alien,/obj/item/xenos_claw,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/effect/gibspawner/xeno,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/structure/stool/bed/alien,/obj/item/clothing/suit/xenos,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/structure/alien/weeds/node,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"m" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"n" = (/obj/machinery/door/window/southright,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/unsimulated/floor/carpet,/area/template_noop) +"o" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/black,/turf/unsimulated/floor/carpet,/area/template_noop) +"p" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/alien/weeds,/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/organ/internal/body_egg/alien_embryo,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"r" = (/obj/machinery/door/window/eastleft,/obj/structure/alien/weeds,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"s" = (/obj/machinery/shower{dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"t" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecfgha +acijgka +almnmoa +apqrsta +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_05.dmm b/_maps/map_files/templates/spacehotel/n_05.dmm new file mode 100644 index 00000000000..cf60cf65327 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_05.dmm @@ -0,0 +1,25 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/obj/item/toy/plushie/girly_corgi,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/obj/item/toy/plushie/corgi,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accccga +ahhihja +aklmnoa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_06.dmm b/_maps/map_files/templates/spacehotel/n_06.dmm new file mode 100644 index 00000000000..046119cf016 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_06.dmm @@ -0,0 +1,28 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/effect/decal/cleanable/blood/gibs/old,/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/obj/item/toy/figure/cmo,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/machinery/optable,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/obj/effect/decal/cleanable/blood/gibs/old,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop) +"m" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"n" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"r" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aeffcga +afhfcia +ajklkma +anopqra +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_07.dmm b/_maps/map_files/templates/spacehotel/n_07.dmm new file mode 100644 index 00000000000..fc00baa9a45 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_07.dmm @@ -0,0 +1,25 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood/old,/obj/item/toy/carpplushie/dehy_carp,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accccga +ahhihja +aklmnoa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_08.dmm b/_maps/map_files/templates/spacehotel/n_08.dmm new file mode 100644 index 00000000000..81c8881c5e7 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_08.dmm @@ -0,0 +1,26 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/obj/structure/sign/poster{dir = 1; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/dresser,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcdcea +afdddga +addddga +ahijika +almnopa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_09.dmm b/_maps/map_files/templates/spacehotel/n_09.dmm new file mode 100644 index 00000000000..ecf873f1913 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_09.dmm @@ -0,0 +1,25 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/obj/item/toy/eight_ball,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/effect/decal/cleanable/vomit,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"l" = (/obj/structure/toilet{dir = 1},/obj/effect/decal/cleanable/vomit,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accccga +ahhihja +aklmnoa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_10.dmm b/_maps/map_files/templates/spacehotel/n_10.dmm new file mode 100644 index 00000000000..9038bbbce3d --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_10.dmm @@ -0,0 +1,24 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/deer,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/effect/decal/snow/sand/edge,/obj/effect/view_portal{id = "snowland_room"},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 1},/area/template_noop) +"j" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/template_noop) +"k" = (/obj/effect/view_portal/visual{dist = 6; frustrum = 1; id = "snowland"; radius = 2},/turf/unsimulated/floor,/area/template_noop) +"l" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/template_noop) +"m" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/template_noop) +"n" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accgcha +aijklma +annnnna +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_11.dmm b/_maps/map_files/templates/spacehotel/n_11.dmm new file mode 100644 index 00000000000..415d3f1f7c5 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_11.dmm @@ -0,0 +1,26 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/item/weapon/twohanded/toy/chainsaw,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/item/toy/figure/syndie{pixel_x = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accccga +ahijika +almnopa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_12.dmm b/_maps/map_files/templates/spacehotel/n_12.dmm new file mode 100644 index 00000000000..24d3321f4f7 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_12.dmm @@ -0,0 +1,26 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/item/weapon/bikehorn/rubberducky,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/shower{dir = 8},/obj/structure/curtain/open/shower{anchored = 1; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; opacity = 1},/area/template_noop) +"o" = (/turf/unsimulated/wall/metal,/area/template_noop) +"p" = (/obj/effect/view_portal/visual{dist = 0; id = "poolland"; radius = 0},/turf/template_noop,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +aghigja +aklmnoa +aooopoa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_13.dmm b/_maps/map_files/templates/spacehotel/n_13.dmm new file mode 100644 index 00000000000..0d10f62eba5 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_13.dmm @@ -0,0 +1,29 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/dresser,/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/machinery/light{dir = 8},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/stool/bed,/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/obj/item/weapon/bedsheet/rainbow,/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"m" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop) +"n" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/obj/structure/sign/poster/legit{pixel_y = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"r" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"s" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcdefa +agdddha +aidddha +ajklmna +aopqrsa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_14.dmm b/_maps/map_files/templates/spacehotel/n_14.dmm new file mode 100644 index 00000000000..7fe5a48cafd --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_14.dmm @@ -0,0 +1,26 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/mopbucket,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/qm,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +agcccha +aiijika +almnopa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_15.dmm b/_maps/map_files/templates/spacehotel/n_15.dmm new file mode 100644 index 00000000000..39ef7bf1334 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_15.dmm @@ -0,0 +1,23 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop) +"c" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop) +"d" = (/obj/machinery/power/compressor{dir = 1},/obj/effect/decal/warning_stripes/eastnorthwest,/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop) +"e" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop) +"f" = (/obj/machinery/power/turbine,/obj/effect/decal/warning_stripes/east,/obj/effect/decal/warning_stripes/west,/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop) +"g" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 1},/area/template_noop) +"h" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/template_noop) +"i" = (/obj/machinery/door/poddoor{opacity = 0},/turf/space,/area/template_noop) +"j" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/template_noop) +"k" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/template_noop) +"l" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop) +"m" = (/obj/effect/view_portal/visual{dist = 5; frustrum = 1; id = "turbinespace"},/turf/unsimulated/floor,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abbbbba +acbdbea +abbfbba +aghijka +allmlla +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_16.dmm b/_maps/map_files/templates/spacehotel/n_16.dmm new file mode 100644 index 00000000000..0312f2a7b33 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_16.dmm @@ -0,0 +1,25 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/wall{icon_state = "sandstone2"},/area/template_noop) +"c" = (/obj/structure/stool,/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/machinery/light/small{dir = 1},/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop) +"d" = (/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop) +"e" = (/obj/structure/stool,/obj/structure/mirror{dir = 4; pixel_x = 28},/obj/machinery/light/small{dir = 1},/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop) +"f" = (/turf/unsimulated/wall{icon_state = "sandstone3"},/area/template_noop) +"g" = (/obj/structure/stool,/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/machinery/light/small,/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop) +"h" = (/obj/structure/stool,/obj/structure/mirror{dir = 4; pixel_x = 28},/obj/machinery/light/small,/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop) +"i" = (/turf/unsimulated/wall{icon_state = "sandstone5"},/area/template_noop) +"j" = (/turf/unsimulated/wall{icon_state = "sandstone8"},/area/template_noop) +"k" = (/obj/effect/view_portal{id = "beach_room"},/obj/structure/curtain/open,/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop) +"l" = (/turf/unsimulated/wall{icon_state = "sandstone4"},/area/template_noop) +"m" = (/turf/unsimulated/wall{icon_state = "sandstone9"},/area/template_noop) +"n" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop) +"o" = (/obj/effect/view_portal/visual{dist = 6; frustrum = 1; id = "beach"; radius = 1},/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcdeba +afgdhfa +aijklma +annonna +annnnna +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_17.dmm b/_maps/map_files/templates/spacehotel/n_17.dmm new file mode 100644 index 00000000000..964a75ba8ba --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_17.dmm @@ -0,0 +1,27 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/item/pizzabox/margherita,/obj/item/pizzabox/margherita{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/obj/item/pizzabox/vegetable,/obj/item/pizzabox/vegetable{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/obj/item/toy/prize/ripley{pixel_x = 4},/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/item/pizzabox/mushroom,/obj/item/pizzabox/mushroom{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/item/pizzabox/meat,/obj/item/pizzabox/meat{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"k" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/obj/item/toy/katana,/turf/unsimulated/floor/carpet,/area/template_noop) +"m" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +agcccha +aijkjla +amnopqa +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_18.dmm b/_maps/map_files/templates/spacehotel/n_18.dmm new file mode 100644 index 00000000000..28145e1b4fb --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_18.dmm @@ -0,0 +1,24 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop) +"c" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/obj/item/toy/plushie/purple_fox,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"k" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"l" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"m" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"n" = (/turf/unsimulated/wall/metal,/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abcccda +aecccfa +accccfa +agghgia +ajklmna +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/n_19.dmm b/_maps/map_files/templates/spacehotel/n_19.dmm new file mode 100644 index 00000000000..114dabbf44b --- /dev/null +++ b/_maps/map_files/templates/spacehotel/n_19.dmm @@ -0,0 +1,15 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/wall/metal,/area/template_noop) +"c" = (/obj/effect/view_portal{id = "mazeland_room"},/obj/machinery/light{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/template_noop) +"d" = (/obj/effect/view_portal/visual{dist = 2; frustrum = 0; id = "mazeland"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/template_noop) +"e" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop) + +(1,1,1) = {" +aaaaaaa +abbcbba +abbdbba +abeeeba +abeeeba +abbbbba +aaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/s_01.dmm b/_maps/map_files/templates/spacehotel/s_01.dmm new file mode 100644 index 00000000000..11ec761615a --- /dev/null +++ b/_maps/map_files/templates/spacehotel/s_01.dmm @@ -0,0 +1,27 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/beach/water,/area/template_noop) +"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"d" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/wizrobe/marisa/fake,/obj/effect/decal/cleanable/greenglow,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/wizard/marisa/fake,/obj/item/clothing/mask/gas/sexyclown,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/rack,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/head/kitty,/obj/item/clothing/head/rabbitears,/obj/item/clothing/mask/muzzle,/obj/item/clothing/accessory/stethoscope,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"m" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"n" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop) +"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaa +abbcdefghia +abbjdddddka +almndddddka +aopqdddddda +aaaaaaaaaaa +aaaaaaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/s_02.dmm b/_maps/map_files/templates/spacehotel/s_02.dmm new file mode 100644 index 00000000000..98eaa3b377b --- /dev/null +++ b/_maps/map_files/templates/spacehotel/s_02.dmm @@ -0,0 +1,27 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/beach/water,/area/template_noop) +"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"d" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/wizrobe/marisa/fake,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/xenos,/obj/item/clothing/head/wizard/marisa/fake,/obj/item/clothing/mask/gas/sexyclown,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/rack,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/head/kitty,/obj/item/clothing/head/rabbitears,/obj/item/clothing/mask/muzzle,/obj/item/clothing/accessory/stethoscope,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/hop,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"m" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"n" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop) +"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaa +abbcdefghia +abbjdddddka +almndddddka +aopqdddddda +aaaaaaaaaaa +aaaaaaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/s_03.dmm b/_maps/map_files/templates/spacehotel/s_03.dmm new file mode 100644 index 00000000000..c82b1f84d11 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/s_03.dmm @@ -0,0 +1,28 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/floor/upperlevel,/area/awaymission/desert{name = "Sudden Drop"}) +"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"d" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/rack,/obj/item/weapon/gun/magic/wand,/obj/item/weapon/gun/magic/staff{pixel_y = -4},/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe{pixel_x = -8; pixel_y = -8},/obj/item/clothing/suit/wizrobe/black{pixel_x = -4; pixel_y = -4},/obj/item/clothing/suit/wizrobe/clown,/obj/item/clothing/suit/wizrobe/marisa{pixel_x = 4; pixel_y = 4},/obj/item/clothing/suit/wizrobe/red{pixel_x = 8; pixel_y = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/rack,/obj/item/clothing/head/wizard{pixel_x = 8; pixel_y = -8},/obj/item/clothing/head/wizard/black{pixel_x = 4; pixel_y = -4},/obj/item/clothing/head/wizard/clown,/obj/item/clothing/head/wizard/marisa{pixel_x = -4; pixel_y = 4},/obj/item/clothing/head/wizard/red{pixel_x = -8; pixel_y = 8},/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/effect/levelref{id = "lavaland"; name = "lavaland"},/turf/unsimulated/floor/upperlevel,/area/awaymission/desert{name = "Sudden Drop"}) +"k" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"l" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/unsimulated/floor/carpet,/area/template_noop) +"m" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"n" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"o" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop) +"p" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"r" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaa +abbcdefghia +abjkdddddla +amnodddddla +apqrdddddda +aaaaaaaaaaa +aaaaaaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm new file mode 100644 index 00000000000..9648a7c707c --- /dev/null +++ b/_maps/map_files/templates/spacehotel/s_04.dmm @@ -0,0 +1,29 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/beach/water,/area/template_noop) +"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"d" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"e" = (/obj/structure/rack,/obj/item/clothing/suit/syndicatefake,/obj/item/clothing/under/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"f" = (/obj/structure/rack,/obj/item/clothing/mask/gas/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"g" = (/obj/structure/rack,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/rig/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"h" = (/obj/structure/dresser,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/weapon/storage/fancy/cigarettes/syndicate{pixel_x = 8},/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"l" = (/obj/machinery/light{dir = 8},/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"m" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"n" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop) +"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"r" = (/obj/structure/sign/poster{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) +"s" = (/obj/structure/sign/poster{dir = 4; pixel_x = 32},/obj/structure/sign/poster{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaa +abbcdefghia +abbjdddddka +almndddddka +aopqrdrrrsa +aaaaaaaaaaa +aaaaaaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/s_05.dmm b/_maps/map_files/templates/spacehotel/s_05.dmm new file mode 100644 index 00000000000..1de8b749e58 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/s_05.dmm @@ -0,0 +1,26 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/beach/water,/area/template_noop) +"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whitehall"},/area/template_noop) +"d" = (/turf/unsimulated/floor{icon_state = "white"},/area/template_noop) +"e" = (/obj/structure/rack,/obj/item/device/guitar,/obj/item/device/violin{pixel_x = 8},/turf/unsimulated/floor{icon_state = "white"},/area/template_noop) +"f" = (/obj/structure/dresser,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop) +"g" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop) +"h" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whitehall"},/area/template_noop) +"i" = (/obj/structure/piano,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop) +"j" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop) +"k" = (/obj/machinery/light{dir = 8},/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/obj/item/weapon/soap,/turf/unsimulated/floor{dir = 1; icon_state = "whitehall"},/area/template_noop) +"l" = (/turf/unsimulated/floor{dir = 1; icon_state = "whitehall"},/area/template_noop) +"m" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitecorner"},/area/template_noop) +"n" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"o" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"p" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaa +abbcdddefga +abbhiddddja +aklmdddddja +anopdddddda +aaaaaaaaaaa +aaaaaaaaaaa +"} diff --git a/_maps/map_files/templates/spacehotel/s_06.dmm b/_maps/map_files/templates/spacehotel/s_06.dmm new file mode 100644 index 00000000000..e733f819c36 --- /dev/null +++ b/_maps/map_files/templates/spacehotel/s_06.dmm @@ -0,0 +1,28 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/unsimulated/beach/water,/area/template_noop) +"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"d" = (/turf/unsimulated/floor/carpet,/area/template_noop) +"e" = (/obj/structure/rack,/obj/item/weapon/twohanded/dualsaber/toy,/obj/item/weapon/twohanded/toy/chainsaw,/obj/item/toy/foamblade,/turf/unsimulated/floor/carpet,/area/template_noop) +"f" = (/obj/structure/rack,/obj/item/toy/griffin{pixel_y = 8},/obj/item/toy/snappop,/obj/item/toy/redbutton,/turf/unsimulated/floor/carpet,/area/template_noop) +"g" = (/obj/structure/rack,/obj/item/toy/cards/deck,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop) +"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop) +"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop) +"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop) +"k" = (/obj/item/toy/snappop,/turf/unsimulated/floor/carpet,/area/template_noop) +"l" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/patriot,/turf/unsimulated/floor/carpet,/area/template_noop) +"m" = (/obj/machinery/light{dir = 8},/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/obj/item/weapon/soap/nanotrasen,/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"n" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop) +"o" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop) +"p" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"q" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) +"r" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop) + +(1,1,1) = {" +aaaaaaaaaaa +abbcdefghia +abbjdddkdla +amnokddddla +apqrdddddda +aaaaaaaaaaa +aaaaaaaaaaa +"} diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index d36405db5d1..e7fd4916c5a 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -66,6 +66,7 @@ #define COLOR_YELLOW "#FFFF00" #define COLOR_ORANGE "#FF9900" #define COLOR_WHITE "#FFFFFF" +#define COLOR_GRAY "#808080" //some arbitrary defines to be used by self-pruning global lists. (see master_controller) #define PROCESS_KILL 26 //Used to trigger removal from a processing list diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a8c548bdd7a..36bb824e642 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -46,14 +46,6 @@ if(S.flags & IS_WHITELISTED) whitelisted_species += S.name - paths = subtypesof(/datum/emote) - for(var/T in paths) - var/datum/emote/E = new T - if(istype(T, /datum/emote/custom)) - continue - emotes += E - - init_subtypes(/datum/table_recipe, table_recipes) return 1 diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index 5d2427603c7..bf3a5b3ffc9 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -82,8 +82,8 @@ diary << "\[[time_stamp()]]MISC: [text][log_end]" /proc/log_to_dd(text) - world.log << text //this comes before the config check because it can't possibly runtime - if(config.log_world_output) + world.log << text + if(config && config.log_world_output) diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]" /** diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index 0511286268e..45f3a56c9b5 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -20,7 +20,8 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse "Thunderdome", "UO45", "UO45R", - "Xeno" + "Xeno", + "Hotel" ) var/list/map_templates = list() diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index e1e8b818356..b6dc1c58b8f 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -4,7 +4,6 @@ var/global/list/all_languages[0] var/global/list/language_keys[0] // Table of say codes for all languages var/global/list/all_superheroes[0] var/global/list/all_nations[0] -var/global/list/emotes[0] var/global/list/whitelisted_species = list() var/list/clients = list() //list of all clients diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 8417275d780..23d310be857 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -58,4 +58,9 @@ var/global/list/blocked_chems = list("polonium", "initropidril", "concentrated_i "reagent", "life","dragonsbreath") //List of chems/mixtures that can't grow in plants (in addition to the global random chem blacklist) -var/global/list/plant_blocked_chems = list() //filled in /datum/reagents/New() with chems that have can_grow_in_plants = 0 \ No newline at end of file +var/global/list/plant_blocked_chems = list() //filled in /datum/reagents/New() with chems that have can_grow_in_plants = 0 + +var/global/list/safe_chem_list = list("antihol", "charcoal", "epinephrine", "insulin", "teporone","silver_sulfadiazine", "salbutamol", + "omnizine", "stimulants", "synaptizine", "potass_iodide", "oculine", "mannitol", "styptic_powder", + "spaceacillin", "salglu_solution", "sal_acid", "cryoxadone", "blood", "synthflesh", "hydrocodone", + "mitocholide", "rezadone") \ No newline at end of file diff --git a/code/datums/Emote_system/emote.dm b/code/datums/Emote_system/emote.dm deleted file mode 100644 index 84f444ef5f4..00000000000 --- a/code/datums/Emote_system/emote.dm +++ /dev/null @@ -1,590 +0,0 @@ -/******************************************************************************************************* - Emotes -Remember, only 1 instance of each emote is made, and used by all mobs that can access it. As such, the -ONLY place you can safely set object variables during runtime is in New(). Otherwise override the emote. -The only exception to this is custom emotes, which are created as needed and only last until they are finished -VampyrBytes - -*******************************************************************************************************/ -#define EMOTE_COOLDOWN 20 //Time in deciseconds that the cooldown lasts -#define HEARING_RANGE 7 -#define INVALID -1 //Using -1 as I can't see how a negative number could be a valid input - -/datum/emote - var/name = "" - var/desc = "" - var/list/commands[0] // list of commands that trigger the emote. - var/text = "" - var/selfText = "" // the version of text that you should see - eg, if text is screams, you want scream here, as You screams is bad grammer - var/startText = "" // if you need to put something in before [user] - var/selfStart = 1 // whether the start text is used in what you see - - var/audible = 0 - var/mimeText = "" - var/mimeSelf = "" //self version of mimeText - var/sound // sound file - var/vol = 50 - var/muzzleAffected = 0 // whether being muzzled affects this emote - var/muzzledNoise = "" // if the emote is audible and you're muzzled, this is what type of noise you make (eg weak, loud). - var/cooldown = 0 // How long the cooldown should be on this emote. Defaults to EMOTE_COOLDOWN if not set and the emote plays a sound - - var/restrained = 0 // 1 if being restrained prevents this emote - - var/canTarget = 0 // 1 if the emote accepts a target - var/targetMob = 0 // 0 if target can be any atom, 1 if it has to be a mob, - var/mustTarget = 0 // 1 if the emote needs a target to work (won't get None as an option) - var/targetText = "at" // what goes inbetween user and target - var/takesNumber = 0 // 1 if the emote uses a number parameter - - var/emoteSpanClass = "say" - var/userSpanClass = "bold" - var/baseLevel = 1 - var/allowParent = 0 // 1 if you want the parent available as well as this one - - -/datum/emote/New() - var/pathString = "[type]" - var/count = 0 - for(var/i in 1 to lentext(pathString)) - var/char = copytext(pathString, i, i+1) - if(char == "/") - count++ - if(count == 4) - baseLevel = 0 - break - - if(sound && !cooldown) - cooldown = EMOTE_COOLDOWN - - if(targetText) - if(!findtextEx(targetText, " ", lentext(targetText))) - targetText += " " - -/datum/emote/proc/doEmote(var/mob/user, var/command = "") - if(!istype(user)) - return - if(cooldown) - if(handle_emote_CD(user)) - return - - var/message = "" - var/list/params[0] - - params = getParams(user) - - for(var/p in params) - if(params[p] == INVALID) - return - - if(text) - message = createMessage(user, params) - - if(message) - message = addExtras(user, params, message) - . = processMessage(user, params, message) - - if(!doMime(user) && (!muzzleAffected || !isMuzzled(user))) - if(playSound(user, params)) - . = 2 - - doAction(user, params) - - for(var/obj/item/weapon/implant/I in user) - if(I.implanted) - I.trigger(command, user) - - return - -// for things that the emote does that aren't text or sound based -/datum/emote/proc/doAction(var/mob/user, var/list/params) - return - -/datum/emote/proc/getParams(var/mob/user) - var/list/params[0] - - if(takesNumber) - user.set_typing_indicator(1) - user.hud_typing = 1 - params["num"] = getNumber(user) - user.hud_typing = 0 - user.set_typing_indicator(0) - - if(canTarget) - user.set_typing_indicator(1) - user.hud_typing = 1 - params["target"] = getTarget(user) - user.hud_typing = 0 - user.set_typing_indicator(0) - return params - -// return INVALID from either of these getters if you've tested the input and it's failed -/datum/emote/proc/getNumber(var/mob/user) - var/number = input("How many?", "Enter number") as null|num - return number - -/datum/emote/proc/getTarget(var/mob/user) - if(user.sdisabilities & BLIND || user.blinded || user.paralysis) - return - var/list/targets = list() - if(!mustTarget) - targets += "None" - var/target - if(targetMob) - target = getMobTarget(user, targets) - else - target = getAtomTarget(user, targets) - if(!target) - return INVALID - if(target == "None") - return - return target - -/datum/emote/proc/getMobTarget(var/mob/user, var/list/targets) - for(var/mob/M in view(getLoc(user))) - targets += M - var/mob/target = input("Select target", "Target Mob") as null|anything in targets - return target - - -/datum/emote/proc/getAtomTarget(var/mob/user, var/list/targets) - for(var/A in oview(getLoc(user))) - if(ismob(A) || isobj(A) || isturf(A)) - targets += A - var/atom/target = input("Select target", "Target") as null|anything in targets - return target - -// returns the reason the user can't currently do the emote -/datum/emote/proc/prevented(var/mob/user) - if(user.stat == DEAD) - return "you are dead" - if(user.stat == UNCONSCIOUS) - return "you are unconscious" - if(restrained && user.restrained()) - return "you are restrained" - if(isbrain(user)) - var/mob/living/carbon/brain/brain = user - if(!(brain.container && istype(brain.container, /obj/item/device/mmi))) - return "you need to be in an mmi to do this" - -// return 1 if this emote can be used by this type of user -/datum/emote/proc/available(var/mob/user) - return - -/datum/emote/proc/createMessage(var/mob/user, var/list/params) - if(!text) - return - var/message = "" - - if(doMime(user)) - message = mimeMessage(user, params) - if(message) - return message - - if(muzzleAffected && isMuzzled(user)) - message = muzzleMessage(user, params) - return message - - if(checkForParams(params)) - message = paramMessage(user, params) - return message - - message = standardMessage(user, params) - - return message - -/datum/emote/proc/isMuzzled(var/mob/user) - if(user.sdisabilities & MUTE || user.is_muzzled()) - return 1 - if(!isliving(user)) - return - var/mob/living/L = user - if(L.silent) - return 1 - -/datum/emote/proc/checkForParams(var/list/params) - for(var/p in params) - if(p == "target") - continue - return 1 - -/datum/emote/proc/addExtras(var/mob/user, var/list/params, var/message = "") - if(!message) - return - if(startText) - message = "[startText] [message]" - message = addPunc(message) - message = "[message]" - return message - -/datum/emote/proc/addPunc(var/message = "") - var/regex/endingPunc = new("\[\\.!\\?\"]$") - if(!endingPunc.Find(message)) - message += "." - return message - -/datum/emote/proc/standardMessage(var/mob/user, var/list/params) - var/message = "\The [user] [text]" - if("target" in params) - message = addTarget(user, params, message) - return message - -/datum/emote/proc/mimeMessage(var/mob/user, var/list/params) - if(!mimeText) - return - if(checkForParams(params)) - return paramMimeMessage(user, params) - var/message = "\The [user] [mimeText]" - if(message && "target" in params) - message = addTarget(user, params, message) - return message - -/datum/emote/proc/muzzleMessage(var/mob/user, var/list/params) - var/message = "\The [user] makes a " - if(muzzledNoise) - message += "[muzzledNoise] " - message += "noise" - return message - -// if the emote takes a non target parameter, set up and return the with parameter version in here -/datum/emote/proc/paramMessage(var/mob/user, var/list/params) - return - -// as above, but for mimes when there is mimeText -/datum/emote/proc/paramMimeMessage(var/mob/user, var/list/params) - return - -/datum/emote/proc/addTarget(var/mob/user, var/list/params, var/message = "") - if(!canTarget) - return message - if(!params["target"]) - return message - if(params["target"] == user) - message += " [targetText][getHimself(user)]" - return message - message += " [targetText]\the [params["target"]]" - return message - - -// What you should see when you perform the emote -/datum/emote/proc/createSelfMessage(var/mob/user, var/list/params, var/message = "") - if(!selfText) - return message - - message = replacetext(message, text, selfText) - message = changeTextMacros(user, message) - - if(mimeSelf) - message = replacetext(message, mimeText, mimeSelf) - - if(startText && !selfStart) - var/start = findtextEx(message, startText) - var/end = start + lentext(startText) + 1 - message = copytext(message, 1, start) + copytext(message, end, lentext(message) + 1) - - message = replaceMobWithYou(user, message, user) - - return message - -/datum/emote/proc/replaceMobWithYou(var/mob/M, var/message = "", var/mob/user) // user passed in in case an override needs to do something different if M != user (see johnny) VB - - message = replacetext(message, "\The [M]", "You") - message = replacetext(message, "\the [M]", "you") - - return message - -/datum/emote/proc/processMessage(var/mob/user, var/list/params, var/message = "") - var/visualOrAudible = audible + 1 - if(doMime(user)) - visualOrAudible = 1 - - log_emote("[user.name]/[user.key] : [message]") - sendToDead(user, message) - for(var/mob/M in getRecipients(getLoc(user, message), visualOrAudible)) - var/msg = "" - - if(M==user) - msg = createSelfMessage(user, params, message) - if(msg) - outputMessage(M, msg, user) - continue - - if(M.stat == UNCONSCIOUS || (M.sleeping && M.stat != DEAD)) - if(!visualOrAudible == 2) - continue - msg = "... You can almost hear someone talking ..." - outputMessage(M, msg, user) - continue - - if(M.sdisabilities & DEAF || M.ear_deaf) - if(M.sdisabilities & BLIND || M.blinded || M.paralysis) - continue - if(!(M in getRecipients(user, 1)) || M.see_invisible < user.invisibility) - continue - - msg = createDeafMessage(user, params, message) - if(!msg && visualOrAudible == 2) - continue - if(msg) - outputMessage(M, msg, user) - continue - - if(M.sdisabilities & BLIND || M.blinded || M.paralysis || (M.see_invisible < user.invisibility && visualOrAudible == 2)) - if(!(M in getRecipients(user, 2))) - continue - - msg = createBlindMessage(user, params, message) - if(!msg && visualOrAudible == 1) - continue - if(msg) - outputMessage(M, msg, user) - continue - - if(M.see_invisible < user.invisibility && visualOrAudible == 1) - continue - - msg = message - outputMessage(M, msg, user) - - if(visualOrAudible == 2) - handleListeningObjects(user, message) - - return visualOrAudible - -/datum/emote/proc/outputMessage(var/mob/M, var/msg = "", var/mob/user) - msg = replaceMobWithYou(M, msg, user) - to_chat(M, msg) - -/datum/emote/proc/getLoc(var/mob/user, var/message = "") - var/loc = checkForHolopad(user, message) - if(loc) - return loc - return user - -/datum/emote/proc/checkForHolopad(var/mob/user, var/message = "") - if(!isAI(user)) - return - var/mob/living/silicon/ai/AI = user - var/obj/machinery/hologram/holopad/T = AI.holo - if(!(T && T.hologram && T.master == AI)) - return - if(message) - to_chat(AI, "Holopad action relayed, [message]") - return T - -/datum/emote/proc/handleListeningObjects(var/mob/user, var/message = "") - // based on say code - var/omsg = replacetext(message, "[user] ", "") - var/list/listening_obj = new - for(var/atom/movable/A in view(HEARING_RANGE, user)) - if(istype(A, /mob)) - var/mob/M = A - for(var/obj/O in M.contents) - listening_obj |= O - else if(istype(A, /obj)) - var/obj/O = A - listening_obj |= O - for(var/obj/O in listening_obj) - O.hear_message(user, omsg) - -/datum/emote/proc/getRecipients(var/location, var/visualOrAudible) - if(visualOrAudible == 1) - return viewers(location) - return get_mobs_in_view(HEARING_RANGE, location) - -// set up different messages for blind people here. Empty will mean no message for -//non-audible emotes and the standard message for audible ones -/datum/emote/proc/createBlindMessage(var/mob/user, var/list/params, var/message) - if(audible && selfText) - message = "You hear someone [selfText]" - message = addExtras(message) - return message - -// set up different messages for deaf people here. Empty will mean no message for -// audible emotes and standard for non-audible ones -/datum/emote/proc/createDeafMessage(var/mob/user, var/list/params, var/message) - message = mimeMessage(user, params) - message = addExtras(message) - return message - -/datum/emote/proc/sendToDead(var/mob/user, var/message = "", var/ghostEmote) - for(var/mob/M in dead_mob_list) - if(!M.client || istype(M, /mob/new_player)) - continue //skip monkeys, leavers and new players - if(M.stat == DEAD) - if(ghostEmote && ((M.client.prefs.toggles & CHAT_GHOSTSIGHT) || (M in viewers(user)))) - M.show_message(message) - else if((M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(user))) - M.show_message(message) - -/datum/emote/proc/playSound(var/mob/user, var/list/params) - if(!sound) - return - playsound(user, sound, vol) - return 1 - -/datum/emote/proc/doMime(var/mob/user) - if(mimeText && user.mind && user.mind.miming) - return 1 - -//Emote Cooldown System (it's so simple!) -/datum/emote/proc/handle_emote_CD(var/mob/user) - if(user.emote_cd == 2) // Cooldown emotes were disabled by an admin, prevent use - return 1 - if(user.emote_cd == 1) // Already on CD, prevent use - return 1 - - user.emote_cd = 1 // Starting cooldown - - spawn(cooldown) - if(!user || user.emote_cd == 2) // Don't reset if cooldown emotes were disabled by an admin during the cooldown - return 1 - user.emote_cd = 0 // Cooldown complete, ready for more! - - return 0 // Proceed with emote -//--FalseIncarnate - -/datum/emote/proc/changeTextMacros(var/mob/user, var/message = "") - message = swapHisToYour(user, message) - message = swapHimselfToYourself(user, message) - return message - -/datum/emote/proc/getHis(var/mob/user) - var/his = "[user]\his" - his = copytext(his, lentext("[user]") + 1) - return his - -/datum/emote/proc/swapHisToYour(var/mob/user, var/message = "") - var/his = getHis(user) - message = replacetext(message, " [his] ", " your ") - return message - -/datum/emote/proc/getHimself(var/mob/user) - var/himself = "[user]\himself" - himself = copytext(himself, lentext("[user]") + 1) - return himself - -/datum/emote/proc/swapHimselfToYourself(var/mob/user, var/message) - var/himself = getHimself(user) - message = replacetext(message, "[himself]", "yourself") - return message - -/****************************************************************************************** - Emote Verbs -******************************************************************************************/ - -/datum/emote/proc/addVerbs(var/mob/user) - if(!istype(user)) - return - new /obj/emoteVerb(user, src, commands) - -// Dummy object to allow access to the verb, needed as verbs require a valid loc for setting the src -/obj/emoteVerb - var/datum/emote/emote - var/mob/owner - -/obj/emoteVerb/New(var/mob/user, var/datum/emote/toAccess) - if(!(istype(user))) - return - if(!(istype(toAccess))) - return - if(!toAccess.commands) - return - owner = user - emote = toAccess - name = "[emote]" - loc = user - user.verbs += new/obj/emoteVerb/proc/runEmote(src, emote.commands[1], emote.desc) - -/obj/emoteVerb/proc/runEmote() - set src = usr.contents - set category = "Emotes" - return usr.emoteHandler.runEmote(emote.commands[1]) - -/obj/emoteVerb/Destroy() - owner.verbs -= new/obj/emoteVerb/proc/runEmote(src, emote.commands[1]) - ..() - -/obj/emoteVerb/custom - -obj/emoteVerb/custom/New(var/mob/user) - if(!(istype(user))) - return - owner = user - name = "custom" - user.verbs += new/obj/emoteVerb/proc/runEmote(src, "custom", "Make your own emote") - -/obj/emoteVerb/custom/runEmote() - set src = usr.contents - set category = "Emotes" - return usr.emoteHandler.runEmote("me") - - - -/************************************************************************************************************************** - Custom Emotes -As these are made as needed, they aren't searched for the appropriate one. As such, you need to specify conditions for which -one is used in /datum/emote_handler/customEmote(). - -***************************************************************************************************************************/ - -/datum/emote/custom - name = "Custom emote" - baseLevel = 0 - -/datum/emote/custom/New(var/mob/user, var/message = "", var/isAudible) - if(!message) - message = getMessage(user) - text = message - audible = isAudible - -/datum/emote/custom/proc/getMessage(var/mob/user) -// user.set_typing_indicator(1) -// user.hud_typing = 1 - var/input = copytext(input(user,"What do you want to emote?", "Custom emote") as text|null,1,MAX_MESSAGE_LEN) -// user.hud_typing = 0 -// user.set_typing_indicator(0) - input = trim_strip_html_properly(input) - return input - -/datum/emote/custom/available(var/mob/user) - return 1 - -/datum/emote/custom/prevented(var/mob/user) - if(!user.use_me) - return "you are prevented from using custom emotes" - return ..() - -// Yeah, no -/datum/emote/custom/createSelfMessage(var/mob/user, var/list/params, var/message = "") - return - -/datum/emote/custom/replaceMobWithYou(var/mob/M, var/message = "", var/mob/user) - return message - -/datum/emote/custom/ghost - name = "Ghost emote" - startText = "DEAD: " - emoteSpanClass = "game deadsay" - -/datum/emote/custom/ghost/prevented(var/mob/user) - if(!user.use_me) - return "you are prevented from using custom emotes" - if(user.client.prefs.muted & MUTE_DEADCHAT) - return "you are muted from deadchat" - if(!(user.client.prefs.toggles & CHAT_DEAD)) - return "you have deadchat muted" - if(!user.client.holder) - if(!config.dsay_allowed) - return "deadchat is globally muted" - -/datum/emote/custom/ghost/getMessage(var/mob/user) - var/input = copytext(input(user,"What do you want to emote?", "Custom emote") as text|null,1,MAX_MESSAGE_LEN) - input = trim_strip_html_properly(input) - return input - -/datum/emote/custom/ghost/processMessage(var/mob/user, var/list/params, var/message = "") - if(!message) - return - log_emote("Ghost/[user.key] : [message]") - sendToDead(user, message, ghostEmote = 1) - diff --git a/code/datums/Emote_system/emote_handler.dm b/code/datums/Emote_system/emote_handler.dm deleted file mode 100644 index be962a72dc7..00000000000 --- a/code/datums/Emote_system/emote_handler.dm +++ /dev/null @@ -1,90 +0,0 @@ -/datum/emoteHandler - var/mob/owner - var/list/commands - -/datum/emoteHandler/New(var/mob/user) - owner = user - setupCommands() - -/datum/emoteHandler/proc/setupCommands(var/reset = 0) - spawn(0) // needed so at mob creation species is set before emotes are allocated - if(reset) - deleteEmoteVerbs() - commands = new/list() - for(var/e in emotes) - var/datum/emote/emote = e - if(emote.baseLevel || emote.allowParent) - var/datum/emote/found = searchTree(emote) - if(found) - for(var/command in found.commands) - commands[lowertext(command)] = found - found.addVerbs(owner) - -/datum/emoteHandler/proc/deleteEmoteVerbs() - for(var/obj/emoteVerb/E in owner.contents) - qdel(E) - -/datum/emoteHandler/proc/runEmote(var/command = "", var/message = "", var/audible = 0) // message and audible only used in custom emotes - if(!command) - return 0 - if(command == "help") - showCommands() - return 1 - - var/datum/emote/emote - - if(copytext(command, 1, 3) == "me" && !message && lentext(command) >= 4) - message = copytext(command, 4) - command = "me" - - if(command == "me") - emote = customEmote(message, audible) - if(!emote) - return 0 - - if(!commands[command] && !(command == "me")) - to_chat(owner, "Unknown emote, please check *help for emotes available to your character") - return 0 - - if(!emote) - emote = commands[command] - - if(!emote.available(owner)) // something's changed, remake the commands list, then try again to see if they've got a different version - setupCommands() - return runEmote(command, message, audible) - - var/prevented = emote.prevented(owner) - if(prevented) - to_chat(owner, "You can't do that because [prevented]!") - return 0 - return emote.doEmote(owner, command) - -/datum/emoteHandler/proc/showCommands() - var/emoteList = "Available emotes are " - var/commandAdded = 0 - for(var/c in commands) - if(commandAdded) - emoteList += ", " - emoteList += c - commandAdded = 1 - - to_chat(owner, emoteList) - -// recursive search of subtypes - starts checking at the lowest level and breaks out if it finds one that can be done -/datum/emoteHandler/proc/searchTree(var/datum/emote/emote) - var/list/subtypes = subtypesof(emote.type) - var/datum/emote/found - for(var/t in subtypes) - var/datum/emote/em = new t - if(em.allowParent) - continue - found = searchTree(em) - if(found) - return (found) - if(emote.available(owner)) - return emote - -/datum/emoteHandler/proc/customEmote(var/custom, var/audible) - if(isobserver(owner)) - return new /datum/emote/custom/ghost(owner, custom, audible) - return new /datum/emote/custom(owner, custom, audible) diff --git a/code/datums/Emote_system/emotes.dm b/code/datums/Emote_system/emotes.dm deleted file mode 100644 index 35303e84ea6..00000000000 --- a/code/datums/Emote_system/emotes.dm +++ /dev/null @@ -1,1739 +0,0 @@ - -/datum/emote/airguitar - name = "airguitar" - desc = "Makes the mob play an air guitar" - commands = list("airguitar") - text = "is strumming the air and headbanging like a safari chimp" - selfText = "are strumming the air and headbanging like a safari chimp" - restrained = 1 - -/datum/emote/airguitar/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isrobot(user)) - return 1 - -/datum/emote/alarm - name = "alarm" - desc = "makes the mob sound an alarm" - commands = list("alarm") - text = "sounds an alarm" - selfText = "sound an alarm" - audible = 1 - -/datum/emote/alarm/available(var/mob/user) - if(isbrain(user)) - return 1 - -/datum/emote/alarm/createBlindMessage(var/mob/user, var/params, var/messaage) - return "You hear an alarm" - -/datum/emote/alert - name = "alert" - desc = "Makes the mob sound an alert" - commands = list("alert") - text = "lets out a distressed noise" - selfText = "let out a distressed noise" - audible = 1 - -/datum/emote/alert/available(var/mob/user) - if(isbrain(user)) - return 1 - -/datum/emote/beep - name = "beep" - desc = "makes the mob let out a beep" - commands = list("beep") - text = "beeps" - selfText = "beep" - audible = 1 - -/datum/emote/beep/available(var/mob/user) - if(isbrain(user)) - return 1 - -/datum/emote/beep/targetted - sound = 'sound/machines/twobeep.ogg' - cooldown = 50 - canTarget = 1 - targetMob = 1 - -/datum/emote/beep/targetted/available(var/mob/user) - if(user.is_mechanical()) - return 1 - -/datum/emote/blink - name = "blink" - desc = "Makes the mob blink" - commands = list("blink", "blinks") - text = "blinks" - selfText = "blink" - -/datum/emote/blink/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isbrain(user)) - return 1 - -/datum/emote/blink/rapid - name = "rapid blink" - desc = "Makes the mob blink rapidly" - commands = list("blink_r", "blinks_r") - allowParent = 1 - -/datum/emote/blink/rapid/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/blink/rapid/standardMessage(var/mob/user) - var/message = ..() - message += " rapidly" - return message - -/datum/emote/blush - name = "blush" - desc = "Makes the mob blush" - commands = list("blush", "blushes") - text = "blushes" - selfText = "blush" - -/datum/emote/blush/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/boop - name = "boop" - desc = "Makes the mob boop" - commands = list("boop", "boops") - text = "boops" - selfText = "boop" - -/datum/emote/boop/available(var/mob/user) - if(isbrain(user)) - return 1 - -/datum/emote/bounce - name = "bounce" - desc = "Makes the mob bounce" - commands = list("bounce", "bounces") - text = "bounces in place" - selfText = "bounce in place" - -/datum/emote/bounce/available(var/mob/user) - if(isslime(user)) - return 1 - -/datum/emote/bow - name = "bow" - desc = "Makes the mob bow" - commands = list("bow", "bows") - text = "bows" - selfText = "bow" - canTarget = 1 - targetMob = 1 - targetText = "to" - -/datum/emote/bow/available(var/mob/user) - if(isrobot(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/bow/prevented(var/mob/user) - . = ..() - if(!. && user.buckled) - return "you are buckled to something" - -/datum/emote/burp - name = "burp" - desc = "Makes the mob burp" - commands = list("burp", "burps") - text = "burps" - selfText = "burp" - audible = 1 - mimeText = "opens their mouth rather obnoxiously" - mimeSelf = "open your mouth rather obnoxiously" - muzzleAffected = 1 - muzzledNoise = "peculiar" - -/datum/emote/burp/available(var/mob/user) - if(ishuman(user)) - return 1 - if(islarva(user) || isalienadult(user)) - return 1 - -/datum/emote/buzz - name = "buzz" - desc = "Makes the mob buzz" - commands = list("buzz", "buzzes", "buzzs") - text = "buzzes" - selfText = "buzz" - audible = 1 - sound = 'sound/machines/buzz-sigh.ogg' - canTarget = 1 - targetMob = 1 - -/datum/emote/buzz/available(var/mob/user) - if(user.is_mechanical()) - return 1 - -/datum/emote/buzz/buzz2 - name = "buzz 2" - desc = "makes the mob buzz in an irritated way" - commands = list("buzz2") - text = "makes an irritated buzzing sound" - selfText = "make an irritated buzzing sound" - sound = "sound/machines/buzz-two.ogg" - allowParent = 1 - -/datum/emote/chirp - name = "chirp" - desc = "Makes the mob chirp" - commands = list("chirp", "chirps") - text = "chirps" - selfText = "chirp" - audible = 1 - sound = 'sound/misc/nymphchirp.ogg' - vol = 40 - cooldown = 50 - -/datum/emote/chirp/available(var/mob/user) - if(istype(user, /mob/living/simple_animal/diona)) - return 1 - -/datum/emote/choke - name = "choke" - desc = "Makes the mob choke" - commands = list("choke", "chokes") - text = "chokes" - selfText = "choke" - audible = 1 - mimeText = "clutches" - mimeSelf = "clutch" - muzzleAffected = 1 - muzzledNoise = "strong" - -/datum/emote/choke/available(var/mob/user) - if(ishuman(user)) - return 1 - if(islarva(user) || isalienadult(user)) - return 1 - -// This has to be done here not mimeText because \his will throw a compile error -// instead of a runtime if there's not a valid target in the string *frown VB -/datum/emote/choke/mimeMessage(var/mob/user, var/list/params) - var/message = "[user] [mimeText] \his throat desperately" - return message - -/datum/emote/chuckle - name = "chuckle" - desc = "chuckle" - commands = list("chuckle", "chuckles") - text = "chuckles" - selfText = "chuckle" - audible = 1 - mimeText = "appears to chuckle" - mimeSelf = "appear to chuckle" - muzzleAffected = 1 - -/datum/emote/chuckle/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/clap - name = "clap" - desc = "clap" - commands = list("clap", "claps") - text = "claps" - selfText = "clap" - audible = 1 - mimeText = "claps silently" - restrained = 1 - -/datum/emote/clap/available(var/mob/user) - if(isrobot(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/collapse - name = "collapse" - desc = "Makes the mob collapse" - commands = list("collapse", "collapses") - text = "collapses" - selfText = "collapse" - audible = 1 - mimeText = "collapses without a sound" - -/datum/emote/collapse/available(var/mob/user) - if(islarva(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/collapse/doAction(var/mob/user, var/list/params) - user.Paralyse(2) - -/datum/emote/cough - name = "cough" - desc = "Makes the mob cough" - commands = list("cough", "coughs") - text = "coughs" - selfText = "cough" - audible = 1 - mimeText = "appears to cough" - mimeSelf = "appear to cough" - muzzleAffected = 1 - muzzledNoise = "strong" - -/datum/emote/cough/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/cry - name = "cry" - desc = "Makes the mob cry" - commands = list("cry", "cries") - text = "cries" - selfText = "cry" - audible = 1 - mimeText = "cries silently" - muzzleAffected = 1 - muzzledNoise = "weak" - -/datum/emote/cry/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/dance - name = "dance" - desc = "makes the mob dance around happily" - commands = list("dance", "dances") - text = "dances around happily" - selfText = "dance around happily" - restrained = 1 - -/datum/emote/dance/available(var/mob/user) - if(islarva(user)) - return 1 - -/datum/emote/dap - name = "dap" - desc = "Makes the mob give daps" - commands = list("dap", "daps") - text = "gives daps" - selfText = "give daps" - restrained = 1 - canTarget = 1 - targetMob = 1 - targetText = "to" - -/datum/emote/dap/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/dap/addTarget(var/mob/user, var/list/params, var/message = "") - if(!params["target"] || params["target"] == user) - message = "[user] sadly can't find anybody to give daps to, and daps \himself. Shameful" - return message - return ..() - -/datum/emote/deathgasp - name = "deathgasp" - desc = "Makes the mob let out it's final gasp" - commands = list("deathgasp", "deathgasps") - audible = 1 - -/datum/emote/deathgasp/prevented(var/mob/user) - if(user.stat == DEAD) - return "you are already dead!" - -/datum/emote/deathgasp/alien - text = "lets out a waning guttural screech, green blood bubbling from its maw..." - selfText = "let out a waning guttural screech, green blood bubbling from your maw..." - -/datum/emote/deathgasp/alien/available(var/mob/user) - if(isalienadult(user)) - return 1 - -// sorry, no selftext for humans as we'd have to add a var to species for it and that's yuk - VB -/datum/emote/deathgasp/human - text = "dummytext" - -/datum/emote/deathgasp/human/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/deathgasp/human/standardMessage(var/mob/user, var/list/params) - var/mob/living/carbon/human/U = user - var/message = "\The [user] [U.species.death_message]" - return message - -/datum/emote/deathgasp/human/createSelfMessage(var/mob/user, var/list/params, var/message) - return message - -/datum/emote/deathgasp/human/replaceMobWithYou(var/mob/user, var/message) - return message - -/datum/emote/deathgasp/robot - text = "shudders violently for a moment, then becomes motionless, its eyes slowly darkening" - selfText = "shudder violently for a moment, then become motionless, your eyes slowly darkening" - audible = 0 - -/datum/emote/deathgasp/robot/available(var/mob/user) - if(isrobot(user)) - return 1 - -/datum/emote/drone - name = "drone" - desc = "Makes the mob drone and rumble" - commands = list("drone", "drones", "rumble", "rumbles", "hum", "hums") - text = "rumbles" - selfText = "rumble" - audible = 1 - sound = 'sound/voice/DraskTalk.ogg' - canTarget = 1 - targetMob = 1 - -/datum/emote/drone/available(var/mob/user) - if(user.get_species() == "Drask") - return 1 - -/datum/emote/drone/addTarget(var/mob/user, var/list/params, var/message) - if(!params["target"]) - return message - message = replacetext(message, "rumbles", "drones") - return ..() - -/datum/emote/drone/createSelfMessage(var/mob/user, var/list/params, var/message) - message = ..() - message = replacetext(message, "drones", "drone") - return message - -/datum/emote/drool - name = "drool" - desc = "Makes the mob drool" - commands = list("drool", "drools") - text = "drools" - selfText = "drool" - -/datum/emote/drool/available(var/mob/user) - if(isalienadult(user) || islarva(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/eyebrow - name = "eyebrow" - desc = "Makes the mob raise an eyebrow" - commands = list("eyebrow") - text = "raises an eyebrow" - selfText = "raise an eyebrow" - -/datum/emote/eyebrow/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/faint - name = "faint" - desc = "makes the mob faint" - commands = list("faint", "faints") - text = "faints" - selfText = "faint" - -/datum/emote/faint/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/faint/doAction(var/mob/user, var/list/params) - if(!user.sleeping) - user.sleeping += 1 - -/datum/emote/fart - name = "fart" - desc = "makes the mob fart" - commands = list("fart", "farts") - text = "farts" - selfText = "fart" - cooldown = 50 - audible = 1 - -/datum/emote/fart/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/fart/standardMessage(var/mob/user) - var/message - - if(TOXIC_FARTS in user.mutations) - message = "\The [user] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart" - return message - message = "\The [user] [pick("passes wind","farts")]" - return message - -/datum/emote/fart/createSelfMessage(var/mob/user, var/list/params, var/message) - message = ..() - message = replacetext(message, "unleashes", "unleash") - message = replacetext(message, "passes", "pass") - return message - -/datum/emote/fart/doAction(var/mob/user) - if(TOXIC_FARTS in user.mutations) - for(var/mob/M in range(get_turf(user),2)) - if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT)) - continue - if(M == user) - continue - M.reagents.add_reagent("jenkem", 1) - - if(locate(/obj/item/weapon/storage/bible) in get_turf(user)) - to_chat(viewers(user), "[user] farted on the Bible!") - to_chat(viewers(user), "A mysterious force smites [user]!") - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(3, 1, user) - s.start() - user.gib() - -/datum/emote/flap - name = "flap" - desc = "Makes the mob flap their wings" - commands = list("flap", "flaps") - text = "flaps" - selfText = "flap" - restrained = 1 - audible = 1 - -/datum/emote/flap/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isrobot(user)) - return 1 - -/datum/emote/flap/standardMessage(var/mob/user, var/list/params) - var/message = "\The [user] [text] \his wings" - return message - -/datum/emote/flap/angry - name = "angry flap" - desc = "makes the mob flap their wings angrily" - commands = list("a_flap", "a_flaps") - allowParent = 1 - -/datum/emote/flap/angry/standardMessage(var/mob/user) - var/message = ..() - message += " angrily" - return message - -/datum/emote/flash - name = "flash" - desc = "Makes the lights on the mob flash quickly" - commands = list("flash", "flashes") - text = "flash quickly" - selfText = "flash quickly" - startText = "The lights on" - -/datum/emote/flash/available(var/mob/user) - if(isbrain(user)) - return 1 - -/datum/emote/flip - name = "flip" - desc = "Makes the mob flip, possibly in the direction of someone" - commands = list("flip", "flips") - text = "flips" - selfText = "flip" - canTarget = 1 - targetMob = 1 - targetText = "in" - -/datum/emote/flip/available(var/mob/user) - if(isrobot(user)) - return 1 - -/datum/emote/flip/prevented(var/mob/user) - . = ..() - if(!. && user.buckled) - return "you are buckled to something" - -/datum/emote/flip/createMessage(var/mob/user, var/list/params) - var/message = "" - if(user.lying || user.weakened) - message = "\The [user] flops and flails around on the floor" - else - message = ..() - return message - -/datum/emote/flip/addTarget(var/mob/user, var/list/params, var/message) - message = ..() - if(params["target"]) - message += "'s general direction" - return message - -/datum/emote/flip/createSelfMessage(var/mob/user, var/list/params, var/message) - message = ..() - message = replacetext(message, "flops", "flop") - message = replacetext(message, "flails", "flail") - return message - -/datum/emote/flip/doAction(var/mob/user, var/list/params, var/message) - if(user.lying || user.weakened) - return - user.SpinAnimation(5,1) - -/datum/emote/flip/flipOver - desc = "Makes the mob flip, possibly in the direction of, or even over someone" - -/datum/emote/flip/flipOver/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/flip/flipOver/createMessage(var/mob/user, var/params) - var/message = "" - var/obj/item/weapon/grab/G = user.get_active_hand() - if(istype(G) && G.affecting && !G.affecting.buckled) - params["target"] = G.affecting - message = "\The [user] [text] over [params["target"]]!" - return message - return ..() - -/datum/emote/flip/flipOver/doAction(var/mob/user, var/params, var/message) - var/obj/item/weapon/grab/G = user.get_active_hand() - if(istype(G) && (G.affecting == params["target"]) && !G.affecting.buckled) - var/turf/oldloc = user.loc - var/turf/newloc = G.affecting.loc - if(isturf(oldloc) && isturf(newloc)) - user.SpinAnimation(5,1) - user.forceMove(newloc) - G.affecting.forceMove(oldloc) - return - ..() - -/datum/emote/frown - name = "frown" - desc = "Makes the mob frown" - commands = list("frown", "frowns") - text = "frowns" - selfText = "frown" - -/datum/emote/frown/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/gasp - name = "gasp" - desc = "Makes the mob gasp" - commands = list("gasp", "gasps") - text = "gasps" - selfText = "gasp" - audible = 1 - mimeText = "appears to be gasping" - mimeSelf = "appear to be gasping" - muzzleAffected = 1 - muzzledNoise = "weak" - -/datum/emote/gasp/available(var/mob/user) - if(isalienadult(user) || islarva(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/giggle - name = "giggle" - desc = "Makes the mob giggle" - commands = list("giggle", "giggles") - text = "giggles" - selfText = "giggle" - audible = 1 - mimeText = "giggles silently" - muzzleAffected = 1 - -/datum/emote/giggle/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/glare - name = "glare" - desc = "Makes the mob glare" - commands = list("glare", "glares") - text = "glares" - selfText = "glare" - canTarget = 1 - targetMob = 1 - -/datum/emote/glare/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isrobot(user)) - return 1 - -/datum/emote/gnarl - name = "gnarl" - desc = "Makes the mob gnarl and show its teeth" - commands = list("gnarl", "gnarls") - text = "gnarls and shows its teeth" - selfText = "gnarl and show your teeth" - audible = 1 - muzzleAffected = 1 - -/datum/emote/gnarl/available(var/mob/user) - if(islarva(user)) - return 1 - -/datum/emote/grin - name = "grin" - desc = "Makes the mob grin" - commands = list("grin", "grins") - text = "grins" - selfText = "grin" - -/datum/emote/grin/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/groan - name = "groan" - desc = "Makes the mob groan" - commands = list("groan", "groans") - text = "groans" - selfText = "groan" - audible = 1 - mimeText = "appears to groan" - mimeSelf = "appear to groan" - muzzleAffected = 1 - -/datum/emote/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/grumble - name = "grumble" - desc = "Makes the mob grumble" - commands = list("grumble", "grumbles") - text = "grumbles" - selfText = "grumble" - audible = 1 - mimeText = "grumbles" - muzzleAffected = 1 - -/datum/emote/grumble/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/halt - name = "halt" - desc = "Makes the mob sound a halt warning. Only available with a security module" - commands = list("halt") - text = "'s speakers skreech, \"Halt! Security!\"" - selfText = " speakers skreech, \"Halt! Security!\"" - audible = 1 - sound = 'sound/voice/halt.ogg' - -/datum/emote/halt/available(var/mob/user) - if(isrobot(user)) - return 1 - -/datum/emote/halt/prevented(var/mob/user) - . = ..() - if(.) - return - var/mob/living/silicon/robot/U = user - if(!(istype(U.module, /obj/item/weapon/robot_module/security))) - return "you are not security" - -/datum/emote/handshake - name = "handshake" - desc = "Makes the mob shake hands with a target" - commands = list("handshake") - text = "shakes hands" - selfText = "shake hands" - canTarget = 1 - targetMob = 1 - mustTarget = 1 - targetText = "with" - restrained = 1 - -/datum/emote/handshake/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/handshake/prevented(var/mob/user) - . = ..() - if(!. && user.r_hand) - return "you need your right hand free" - -/datum/emote/handshake/addTarget(var/mob/user, var/list/params, var/message) - var/mob/target = params["target"] - if(target.r_hand) - message = "\The [user] holds out his hand to [params["target"]]" - return message - return ..() - -/datum/emote/hiss - name = "hiss" - desc = "Makes the mob hiss" - commands = list("hiss", "hisses") - text = "hisses" - selfText = "hiss" - audible = 1 - -/datum/emote/hiss/available(var/mob/user) - if(isalienadult(user) || islarva(user)) - return 1 - -/datum/emote/hug - name = "hug" - desc = "Makes the mob hug a target or themselves" - commands = list("hug", "hugs") - text = "hugs" - selfText = "hug" - canTarget = 1 - targetMob = 1 - targetText = "" - -/datum/emote/hug/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/hug/getTarget(var/mob/user) - var/mob/target = ..() - if(target) - return target - return user - -/datum/emote/jiggle - name = "jiggle" - desc = "Makes the mob jiggle" - commands = list("jiggle", "jiggles") - text = "jiggles" - selfText = "jiggle" - -/datum/emote/jiggle/available(var/mob/user) - if(isslime(user)) - return 1 - -/datum/emote/johnny - name = "johnny" - desc = "Yeah, just try it" - commands = list("johnny") - text = "takes a drag from a cigarette and blows their name out in smoke" - selfText = "take a drag from a cigarette and blow their name out in smoke" - audible = 1 - mimeText = "takes a drag from a cigarette and blows" - mimeSelf = "take a drag from a cigarette and blow" - canTarget = 1 - targetMob = 1 - mustTarget = 1 - targetText = "" - -/datum/emote/johnny/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/johnny/getTarget(var/mob/user) - var/mob/target = ..() - if(target != user) - return target - to_chat(user, "You need a target that isn't yourself") - return INVALID - -/datum/emote/johnny/createMessage(var/mob/user, var/params) - if(doMime(user)) - return ..() - var/message = "\The [user] says \"[params["target"]], please. They had a family.\" [user] [text]" - return message - -/datum/emote/johnny/createSelfMessage(var/mob/user, var/list/params, var/message = "") - message = ..() - message = replacetext(message, "says", "say") - return message - -/datum/emote/johnny/createDeafMessage(var/mob/user, vap/list/params, var/message) - message = "\The [user] says something, then [text]" - return message - -/datum/emote/johnny/replaceMobWithYou(var/mob/M, var/message, var/mob/user) - if(user && M != user) - return message - return ..() - -/datum/emote/johnny/createBlindMessage(var/mob/user, var/list/params, var/message) - message = "You hear someone say \"[params["target"]], please, They had a family\"" - return message - -/datum/emote/jump - name = "jump" - desc = "Makes the mob jump" - commands = list("jump", "jumps") - text = "jumps" - selfText = "jump" - -/datum/emote/jump/available(var/mob/user) - if(islarva(user) || isalienadult(user)) - return 1 - if(issmall(user)) - return 1 - -/datum/emote/laugh - name = "laugh" - desc = "Makes the mob laugh" - commands = list("laugh", "laughs") - text = "laughs" - selfText = "laugh" - audible = 1 - mimeText = "acts out a laugh" - mimeSelf = "act out a laugh" - muzzleAffected = 1 - -/datum/emote/laugh/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/law - name = "law" - desc = "Makes the mob prove it is the law" - commands = list("law") - text = "shows its legal authorization barcode" - selfText = "show your legal authorization barcode" - audible = 1 - sound = 'sound/voice/biamthelaw.ogg' - -/datum/emote/law/available(var/mob/user) - if(isrobot(user)) - return 1 - -/datum/emote/law/prevented(var/mob/user) - . = ..() - if(.) - return - var/mob/living/silicon/robot/U = user - if(!(istype(U.module, /obj/item/weapon/robot_module/security))) - return "You are not THE LAW, pal" - -/datum/emote/light - name = "light" - desc = "makes the mob light up" - commands = list("light", "lights") - text = "lights up for a bit, then stops" - selfText = "light up for a bit, then stop" - -/datum/emote/light/available(var/mob/user) - if(isslime(user)) - return 1 - -/datum/emote/look - name = "look" - desc = "Makes the mob look" - commands = list("look", "looks") - text = "looks" - selfText = "look" - canTarget = 1 - targetMob = 1 - -/datum/emote/look/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isrobot(user)) - return 1 - -/datum/emote/look/addTarget(var/mob/user, var/list/params, var/message) - if(!params["target"]) - message += " around" - return message - return ..() - -/datum/emote/moan - name = "moan" - desc = "Makes the mob moan" - commands = list("moan", "moans") - text = "moans" - selfText = "moan" - audible = 1 - -/datum/emote/moan/available(var/mob/user) - if(isslime(user)) - return 1 - if(islarva(user)) - return 1 - -/datum/emote/mumble - name = "mumble" - desc = "Makes the mob mumble" - commands = list("mumble", "mumbles") - text = "mumbles" - selfText = "mumble" - audible = 1 - mimeText = "mumbles" - -/datum/emote/mumble/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/no - name = "no" - desc = "Makes the mob let out a negative blip" - commands = list("no") - text = "emits a negative blip" - selfText = "emit a negative blip" - audible = 1 - sound = 'sound/machines/synth_no.ogg' - -/datum/emote/no/New() - ..() - commands += "no" - -/datum/emote/no/available(var/mob/user) - if(user.is_mechanical()) - return 1 - -/datum/emote/nod - name = "nod" - desc = "Makes the mob nod" - commands = list("nod", "nods") - text = "nods" - selfText = "nod" - -/datum/emote/nod/available(var/mob/user) - if(islarva(user)) - return 1 - if(isrobot(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/notice - name = "notice" - desc = "Makes the mob play a loud tone" - commands = list("notice") - text = "plays a loud tone" - selfText = "play a loud tone" - audible = 1 - -/datum/emote/notice/available(var/mob/user) - if(isbrain(user)) - return 1 - -/datum/emote/pale - name = "pale" - desc = "Makes the mob go pale" - commands = list("pale", "pales") - text = "goes pale for a second" - selfText = "go pale for a second" - -/datum/emote/pale/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/ping - name = "ping" - desc = "Makes the mob ping" - commands = list("ping", "pings") - text = "pings" - selfText = "ping" - audible = 1 - sound = 'sound/machines/ping.ogg' - canTarget = 1 - targetMob = 1 - -/datum/emote/ping/available(var/mob/user) - if(user.is_mechanical()) - return 1 - -/datum/emote/point - name = "point" - desc = "Makes the mob point" - commands = list("point", "points") - text = "points" - selfText = "point" - canTarget = 1 - -/datum/emote/point/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/point/createMessage(var/mob/user, var/list/params) - if(params["target"]) - return - return ..() - -/datum/emote/point/doAction(var/mob/user, var/list/params) - if(!params["target"]) - return - user.pointed(params["target"]) - -/datum/emote/quiver - name = "quiver" - desc = "Makes the mob quiver" - commands = list("quiver", "quivers") - text = "quivers" - selfText = "quiver" - -/datum/emote/quiver/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/raise - name = "raise" - desc = "Makes the mob raise a hand" - commands = list("raise", "raises") - text = "raises a hand" - selfText = "raise a hand" - restrained = 1 - -/datum/emote/raise/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/roar - name = "roar" - desc = "Makes the mob roar" - commands = list("roar", "roars") - text = "roars" - selfText = "roar" - audible = 1 - muzzleAffected = 1 - muzzledNoise = "loud" - -/datum/emote/roar/available(var/mob/user) - if(isalienadult(user)) - return 1 - -/datum/emote/roll - name = "roll" - desc = "Makes the mob roll" - commands = list("roll", "rolls") - text = "rolls" - selfText = "roll" - -/datum/emote/roll/available(var/mob/user) - if(islarva(user)) - return 1 - if(issmall(user)) - return 1 - -/datum/emote/salute - name = "salute" - desc = "Makes the mob salute" - commands = list("salute", "salutes") - text = "salutes" - selfText = "salute" - canTarget = 1 - targetMob = 1 - targetText = "to" - -/datum/emote/salute/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isrobot(user)) - return 1 - -/datum/emote/salute/prevented(var/mob/user) - . = ..() - if(!. && user.buckled) - return "you are buckled to something" - -/datum/emote/salute/getMobTarget(var/mob/user, var/list/targets) - var/mob/target = ..() - if(target != user) - return target - -/datum/emote/scratch - name = "scratch" - desc = "Makes the mob scratch" - commands = list("scratch", "scratches") - text = "scratches" - selfText = "scratch" - restrained = 1 - -/datum/emote/scratch/available(var/mob/user) - if(islarva(user) || isalienadult(user)) - return 1 - if(issmall(user)) - return 1 - -/datum/emote/scream - name = "scream" - desc = "makes the mob scream" - commands = list("scream", "screams") - text = "screams!" - selfText = "scream!" - audible = 1 - mimeText = "acts out a scream" - muzzledNoise = "very loud" - cooldown = 50 - vol = 80 - -/datum/emote/scream/createMessage(var/mob/user, var/list/params) - var/mob/living/carbon/human/H = user - - if(istype(H)) - return "\The [user] [H.species.scream_verb]!" - else - return ..() - -/datum/emote/scream/replaceMobWithYou(var/mob/M, var/message = "", var/mob/user) - var/mob/living/carbon/human/H = user - - if(istype(H) && (H.species.scream_verb != "screams")) - return message - return ..() - -/datum/emote/scream/machine - name = "machine scream" - sound = 'sound/goonstation/voice/robot_scream.ogg' - -/datum/emote/scream/machine/available(var/mob/user) - if(user.is_mechanical()) - return 1 - -/datum/emote/scream/human - name = "human scream" - -/datum/emote/scream/human/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/scream/human/playSound(var/mob/user) - var/mob/living/carbon/human/H = user - - if(H.gender == FEMALE) - playsound(H, "[H.species.female_scream_sound]", vol, 1, 0, pitch = H.get_age_pitch()) - else - playsound(H, "[H.species.male_scream_sound]", vol, 1, 0, pitch = H.get_age_pitch()) - return 1 - -/datum/emote/scretch - name = "scretch" - desc = "makes the mob scretch" //whatever that is! - commands = list("scretch", "scretches") - text = "scretches" - selfText = "scretch" - audible = 1 - muzzleAffected = 1 - -/datum/emote/scretch/available(var/mob/user) - if(isalienadult(user) || islarva(user)) - return 1 - -/datum/emote/shake - name = "shake" - desc = "Makes the mob shake its head" - commands = list("shake", "shakes") - text = "shakes" - selfText = "shake" - -/datum/emote/shake/available(var/mob/user) - if(islarva(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/shake/standardMessage(var/mob/user) - var/message = ..() - message += " [getHis(user)] head" - return message - -/datum/emote/shiver - name = "shiver" - desc = "Makes the mob shiver" - commands = list("shiver", "shivers") - text = "shivers" - selfText = "shiver" - audible = 1 - mimeText = "shivers" - -/datum/emote/shiver/available(var/mob/user) - if(isalienadult(user) || islarva(user)) - return 1 - if(isslime(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/shiver/createBlindMessage(var/mob/user, var/list/params, var/message) - message = "you hear someone's teeth chattering together" - -/datum/emote/shrug - name = "shrug" - desc = "Makes the mob shrug" - commands = list("shrug", "shrugs") - text = "shrugs" - selfText = "shrug" - -/datum/emote/shrug/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/sigh - name = "sigh" - desc = "Makes the mob sigh" - commands = list("sigh", "sighs") - text = "sighs" - selfText = "sigh" - audible = 1 - mimeText = "sighs" - muzzleAffected = 1 - muzzledNoise = "weak" - -/datum/emote/sigh/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/sign - name = "sign" - desc = "Makes the mob sign a number" - commands = list("sign", "signs") - text = "signs" - selfText = "sign" - restrained = 1 - takesNumber = 1 - -/datum/emote/sign/available(var/mob/user) - if(isalienadult(user) || islarva(user)) - return 1 - -/datum/emote/sign/getNumber(var/mob/user) - var/number = ..() - if(number == null) - to_chat(user, "You need a number to sign") - return INVALID - return number - -/datum/emote/sign/paramMessage(var/mob/user, var/list/params) - var/message = "\The [user] [text] [params["num"]]" - return message - -/datum/emote/sign/fingers - desc = "Makes the mob raise a number of fingers" - text = "raises" - selfText = "raise" - -/datum/emote/sign/fingers/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/sign/fingers/getNumber(var/mob/user) - var/number = ..() - if(number == INVALID) - return INVALID - var/fingersAvailable = 0 - if(!user.r_hand) - fingersAvailable += 5 - if(!user.l_hand) - fingersAvailable += 5 - if(fingersAvailable < number) - to_chat(user, "You don't have enough fingers free") - return INVALID - return number - -/datum/emote/sign/fingers/paramMessage(var/mob/user, var/list/params) - var/message = "\The [user] [text] [params["num"]] finger\s" // no, we can't just add " finger\s" to the parent version because the text macro won't work then :( VB - return message - -/datum/emote/slap - name = "slap" - desc = "makes the mob slap someone" - commands = list("slap", "slaps") - text = "slaps" - selfText = "slap" - audible = 1 - sound = 'sound/effects/snap.ogg' - canTarget = 1 - targetMob = 1 - targetText = "" - -/datum/emote/slap/New() - ..() - cooldown = 0 - -/datum/emote/slap/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/slap/getMobTarget(var/mob/user, var/list/targets) - for(var/mob/M in view(getLoc(user), 1)) - targets += M - var/mob/target = input("Select target", "Target Mob") as null|anything in targets - if(target == "None") - target = user - return target - -/datum/emote/slap/createBlindMessage(var/mob/user, var/list/params, var/message) - message = ..() - message = replacetext(message, "someone", "a") - return message - -/datum/emote/slap/doAction(var/mob/user, var/list/params) - if(user == params["target"]) - var/mob/living/U = user - U.adjustFireLoss(4) - -/datum/emote/smile - name = "smile" - desc = "Makes the mob smile" - commands = list("smile", "smiles") - text = "smiles" - selfText = "smile" - -/datum/emote/smile/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/snap - name = "snap" - desc = "Makes the mob snap it's fingers" - commands = list("snap", "snaps") - text = "snaps" - selfText = "snap" - audible = 1 - sound = 'sound/effects/fingersnap.ogg' - -/datum/emote/snap/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/snap/prevented(var/mob/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/L = H.get_organ("l_hand") - var/obj/item/organ/external/R = H.get_organ("r_hand") - var/left_hand_good = 0 - var/right_hand_good = 0 - if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN))) - left_hand_good = 1 - if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN))) - right_hand_good = 1 - - if(!left_hand_good && !right_hand_good) - return "You need at least one hand in good working order to snap your fingers" - -/datum/emote/snap/standardMessage(var/mob/user, var/list/params) - var/message = ..() - message += " [getHis(user)] fingers" - params["prob"] = prob(5) - if(!params["prob"]) - return message - message += " right off!" - return message - -/datum/emote/snap/playSound(var/mob/user, var/list/params) - if(params["prob"]) - playsound(user.loc, 'sound/effects/snap.ogg', 50, 1) - return 1 - return ..() - -/datum/emote/snap/createBlindMessage(var/mob/user, var/list/params, var/message) - message = ..() - message += " their fingers" - return message - -/datum/emote/snap/createDeafMessage(var/mob/user, var/list/params, var/message) - return message - -/datum/emote/sneeze - name = "sneeze" - desc = "Makes the mob sneeze" - commands = list("sneeze", "sneezes") - text = "sneezes" - selfText = "sneeze" - audible = 1 - mimeText = "sneeze" - muzzleAffected = 1 - muzzledNoise = "strange" - -/datum/emote/sneeze/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/sniff - name = "sniff" - desc = "Makes the mob sniff" - commands = list("sniff", "sniffs") - text = "sniffs" - selfText = "sniff" - audible = 1 - mimeText = "sniffs" - -/datum/emote/sniff/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/snore - name = "snore" - desc = "Makes the mob snore" - commands = list("snore", "snores") - text = "snores" - selfText = "snore" - audible = 1 - mimeText = "sleeps soundly" - mimeSelf = "sleep soundly" - muzzleAffected = 1 - -/datum/emote/snore/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/squish - name = "squish" - desc = "Makes the mob squish" - commands = list("squish", "squishes") - text = "squishes" - selfText = "squish" - audible = 1 - sound = 'sound/effects/slime_squish.ogg' - canTarget = 1 - targetMob = 1 - -/datum/emote/squish/available(var/mob/user) - if(isslime(user)) - return 1 - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.species.name == "Slime People") //Only Slime People can squish - return 1 - for(var/obj/item/organ/external/L in H.organs) // if your limbs are squishy you can squish too! - if(L.dna.species =="Slime People") - return 1 - -/datum/emote/stare - name = "stare" - desc = "Makes the mob stare" - commands = list("stare", "stares") - text = "stares" - selfText = "stare" - canTarget = 1 - targetMob = 1 - -/datum/emote/stare/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isrobot(user)) - return 1 - -/datum/emote/sulk - name = "sulk" - desc = "Makes the mob sulk" - commands = list("sulk", "sulks") - text = "sulks down sadly" - selfText = "sulk down sadly" - -/datum/emote/sulk/available(var/mob/user) - if(islarva(user)) - return 1 - -/datum/emote/sway - name = "sway" - desc = "Makes the mob sway" - commands = list("sway", "sways") - text = "sways around dizzily" - selfText = "sway around dizzily" - -/datum/emote/sway/available(var/mob/user) - if(islarva(user)) - return 1 - if(isslime(user)) - return 1 - -/datum/emote/tail - name = "tail" - desc = "Makes the mob wave it's tail" - commands = list("tail") - text = "waves it's tail" - selfText = "wave your tail" - -/datum/emote/tail/available(var/mob/user) - if(islarva(user) || isalienadult(user)) - return 1 - if(issmall(user)) - return 1 - -/datum/emote/tail/wag - name = "wag" - desc = "Makes the mob start wagging its tail" - commands = list("wag", "wags") - text = "starts" - selfText = "start" - -/datum/emote/tail/wag/available(var/mob/user) - if(issmall(user)) - return - if(ishuman(user)) - return 1 - -/datum/emote/tail/wag/prevented(var/mob/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user - if(H.species.bodyflags & TAIL_WAGGING) - if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAIL || istype(H.wear_suit, /obj/item/clothing/suit/space))) - return "your clothing is stopping you wag your tail" - return - if(!H.body_accessory) - return "you have no tail to wag!" - if(!H.body_accessory.try_restrictions()) - return "your clothing is stopping you wag your tail" - -/datum/emote/tail/wag/standardMessage(var/mob/user, var/list/params) - var/message = ..() - message += " wagging [getHis(user)] tail" - return message - -/datum/emote/tail/wag/doAction(var/mob/user, var/list/params) - var/mob/living/carbon/human/H = user - H.start_tail_wagging(1) - -/datum/emote/tail/wag/stop - name = "swag" - desc = "Makes the mob stop wagging its tail" - commands = list("swag", "swags") - text = "stops" - selfText = "stop" - allowParent = 1 - -// seemingly no way to tell if a mob is wagging it's tail! VB -/datum/emote/tail/wag/stop/prevented(var/mob/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user - if(!(H.species.bodyflags & TAIL_WAGGING) && !H.body_accessory) - return "you can't stop wagging a tail you don't have!" - -/datum/emote/tail/wag/stop/doAction(var/mob/user, var/list/params) - var/mob/living/carbon/human/H = user - H.stop_tail_wagging(1) - -/datum/emote/tremble - name = "tremble" - desc = "Makes the mob tremble" - commands = list("tremble", "trembles") - text = "trembles" - selfText = "tremble" - -/datum/emote/tremble/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/twitch_s - name = "twitch_s" - desc = "Makes the mob twitch" - commands = list("twitch_s", "twitches_s") - text = "twitches" - selfText = "twitch" - -/datum/emote/twitch_s/available(var/mob/user) - if(ishuman(user)) - return 1 - if(isrobot(user)) - return 1 - -/datum/emote/twitch_s/twitch - name = "twitch" - desc = "Makes the mob twitch violently" - commands = list("twitch", "twitches") - allowParent = 1 - -/datum/emote/twitch_s/twitch/available(var/mob/user) - if(isslime(user)) - return 1 - if(islarva(user)) - return 1 - return ..() - -/datum/emote/twitch_s/twitch/standardMessage(var/mob/user, var/list/params) - var/message = ..() - message += " violently" - return message - -/datum/emote/vibrate - name = "vibrate" - desc = "Makes the mob vibrate" - commands = list("vibrate", "vibrates") - text = "vibrates" - selfText = "vibrate" - -/datum/emote/vibrate/available(var/mob/user) - if(isslime(user)) - return 1 - -/datum/emote/wave - name = "wave" - desc = "Makes the mob wave" - commands = list ("wave", "waves") - text = "waves" - selfText = "wave" - -/datum/emote/wave/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/whimper - name = "whimper" - desc = "Makes the mob whimper" - commands = list("whimper", "whimpers") - text = "whimpers" - selfText = "whimper" - audible = 1 - mimeText = "appears hurt" - mimeSelf = "appear hurt" - muzzleAffected = 1 - -/datum/emote/whimper/available(var/mob/user) - if(islarva(user) || isalienadult(user)) - return 1 - if(ishuman(user)) - return 1 - -/datum/emote/whistle - name = "whistle" - desc = "Makes the mob whistle" - commands = list("whistle", "whistles") - text = "whistles" - selfText = "whistle" - audible = 1 - -/datum/emote/whistle/available(var/mob/user) - if(isbrain(user)) - return 1 - -/datum/emote/wink - name = "wink" - desc = "Makes the mob wink" - commands = list("wink", "winks") - text = "winks" - selfText = "wink" - -/datum/emote/wink/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/yawn - name = "yawn" - desc = "makes the mob yawn" - commands = list("yawn", "yawns") - text = "yawns" - selfText = "yawn" - audible = 1 - mimeText = "yawns" - muzzleAffected = 1 - -/datum/emote/yawn/available(var/mob/user) - if(ishuman(user)) - return 1 - -/datum/emote/yes - name = "yes" - desc = "Makes the mob let out an affirmative beep" - commands = list("yes") - text = "lets out an affirmative beep" - selfText = "let out an affirmative beep" - audible = 1 - sound = 'sound/machines/synth_yes.ogg' - canTarget = 1 - targetMob = 1 - -/datum/emote/yes/available(var/mob/user) - if(user.is_mechanical()) - return 1 \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index a3d9dbd8442..52f6c13784f 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -150,9 +150,9 @@ if (istype(current, /mob/living/carbon/human)) /** Impanted**/ if(isloyal(H)) - text = "Loyalty Implant:Remove|Implanted
" + text = "Mindshield Implant:Remove|Implanted
" else - text = "Loyalty Implant:No Implant|Implant him!
" + text = "Mindshield Implant:No Implant|Implant him!
" sections["implant"] = text /** REVOLUTION ***/ text = "revolution" @@ -653,27 +653,27 @@ if(I && I.implanted) I.removed(H) qdel(I) - to_chat(H, "\blue Your loyalty implant has been deactivated.") - log_admin("[key_name(usr)] has deactivated [key_name(current)]'s loyalty implant") - message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s loyalty implant") + to_chat(H, "\blue Your mindshield implant has been deactivated.") + log_admin("[key_name(usr)] has deactivated [key_name(current)]'s mindshield implant") + message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s mindshield implant") if("add") var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) L.imp_in = H L.implanted = 1 H.sec_hud_set_implants() - log_admin("[key_name(usr)] has given [key_name(current)] a loyalty implant") - message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a loyalty implant") + log_admin("[key_name(usr)] has given [key_name(current)] a mindshield implant") + message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a mindshield implant") - to_chat(H, "\red You somehow have become the recepient of a loyalty transplant, and it just activated!") + to_chat(H, "\red You somehow have become the recepient of a mindshield transplant, and it just activated!") if(src in ticker.mode.revolutionaries) special_role = null ticker.mode.revolutionaries -= src - to_chat(src, "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!") + to_chat(src, "\red The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") if(src in ticker.mode.head_revolutionaries) special_role = null ticker.mode.head_revolutionaries -=src - to_chat(src, "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!") + to_chat(src, "\red The nanobots in the mindshield implant remove all thoughts about being a revolutionary. Get back to work!") if(src in ticker.mode.cult) ticker.mode.cult -= src ticker.mode.update_cult_icons_removed(src) @@ -681,7 +681,7 @@ var/datum/game_mode/cult/cult = ticker.mode if (istype(cult)) cult.memorize_cult_objectives(src) - to_chat(current, "\red The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!") + to_chat(current, "\red The nanobots in the mindshield implant remove all thoughts about being in a cult. Have a productive day!") memory = "" else if (href_list["revolution"]) @@ -1516,6 +1516,19 @@ spell.action.Grant(new_character) return +/datum/mind/proc/get_ghost(even_if_they_cant_reenter) + for(var/mob/dead/observer/G in dead_mob_list) + if(G.mind == src) + if(G.can_reenter_corpse || even_if_they_cant_reenter) + return G + break + +/datum/mind/proc/grab_ghost(force) + var/mob/dead/observer/G = get_ghost(even_if_they_cant_reenter = force) + . = G + if(G) + G.reenter_corpse() + //Initialisation procs /mob/proc/mind_initialize() if(mind) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index be25ea14f1f..fe65e44ddec 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -375,10 +375,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /////// Implants & etc /datum/supply_packs/security/armory/loyalty - name = "Loyalty Implants Crate" + name = "Mindshield Implants Crate" contains = list (/obj/item/weapon/storage/lockbox/loyalty) cost = 40 - containername = "loyalty implant crate" + containername = "mindshield implant crate" /datum/supply_packs/security/armory/trackingimp name = "Tracking Implants Crate" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index ad13d541d96..d9bcc547a72 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -378,6 +378,15 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 0 +/datum/uplink_item/dangerous/sniper + name = "Sniper Rifle" + desc = "Ranged fury, Syndicate style. guaranteed to cause shock and awe or your TC back!" + reference = "SSR" + item = /obj/item/weapon/gun/projectile/automatic/sniper_rifle/syndicate + cost = 16 + surplus = 25 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/dangerous/crossbow name = "Energy Crossbow" desc = "A miniature energy crossbow that is small enough both to fit into a pocket and to slip into a backpack unnoticed by observers. Fires bolts tipped with toxin, a poisonous substance that is the product of a living organism. Stuns enemies for a short period of time. Recharges automatically." @@ -620,6 +629,38 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 0 +/datum/uplink_item/ammo/sniper + cost = 4 + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/sniper/basic + name = ".50 Magazine" + desc = "An additional standard 6-round magazine for use with .50 sniper rifles." + reference = "50M" + item = /obj/item/ammo_box/magazine/sniper_rounds + +/datum/uplink_item/ammo/sniper/soporific + name = ".50 Soporific Magazine" + desc = "A 3-round magazine of soporific ammo designed for use with .50 sniper rifles. Put your enemies to sleep today!" + reference = "50S" + item = /obj/item/ammo_box/magazine/sniper_rounds/soporific + cost = 6 + +/datum/uplink_item/ammo/sniper/haemorrhage + name = ".50 Haemorrhage Magazine" + desc = "A 5-round magazine of haemorrhage ammo designed for use with .50 sniper rifles; causes heavy bleeding \ + in the target." + reference = "50B" + item = /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage + +/datum/uplink_item/ammo/sniper/penetrator + name = ".50 Penetrator Magazine" + desc = "A 5-round magazine of penetrator ammo designed for use with .50 sniper rifles. \ + Can pierce walls and multiple enemies." + reference = "50P" + item = /obj/item/ammo_box/magazine/sniper_rounds/penetrator + cost = 5 + // STEALTHY WEAPONS /datum/uplink_item/stealthy_weapons diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 42d82639129..2e462a49ea5 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -72,6 +72,12 @@ desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures." icon = 'icons/obj/wizard.dmi' icon_state = "vial" + var/shatter_msg = "You shatter the bottle, no \ + turning back now!" + var/veil_msg = "You sense a dark presence lurking \ + just beyond the veil..." + var/objective_verb = "Kill" + var/mob/living/demon_type = /mob/living/simple_animal/slaughter /obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob) if(user.z == ZLEVEL_CENTCOMM)//this is to make sure the wizard does NOT summon a demon from the Den.. @@ -88,9 +94,9 @@ if(candidates.len > 0) var/mob/C = pick(candidates) - spawn_antag(C, get_turf(src.loc), "Slaughter Demon", user) - to_chat(user, "You shatter the bottle, no turning back now!") - to_chat(user, "You sense a dark presence lurking just beyond the veil...") + spawn_antag(C, get_turf(src.loc), initial(demon_type.name), user) + to_chat(user, "[shatter_msg]") + to_chat(user, "[veil_msg]") playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1) qdel(src) else @@ -99,22 +105,34 @@ /obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(var/client/C, var/turf/T, var/type = "", mob/user as mob) var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) - var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder) + var/mob/living/simple_animal/slaughter/S = new demon_type(holder) S.vialspawned = TRUE S.holder = holder S.key = C.key - S.mind.assigned_role = "Slaughter Demon" - S.mind.special_role = "Slaughter Demon" + S.mind.assigned_role = S.name + S.mind.special_role = S.name ticker.mode.traitors += S.mind var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate KillDaWiz.owner = S.mind KillDaWiz.target = user.mind - KillDaWiz.explanation_text = "Kill [user.real_name], the one who was foolish enough to summon you." + KillDaWiz.explanation_text = "[objective_verb] [user.real_name], the one who was foolish enough to summon you." S.mind.objectives += KillDaWiz var/datum/objective/KillDaCrew = new /datum/objective KillDaCrew.owner = S.mind - KillDaCrew.explanation_text = "Kill everyone else while you're at it." + KillDaCrew.explanation_text = "[objective_verb] everyone else while you're at it." S.mind.objectives += KillDaCrew S.mind.objectives += KillDaCrew to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]") to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]") + + +/obj/item/weapon/antag_spawner/slaughter_demon/laughter + name = "vial of tickles" + desc = "A magically infused bottle of clown love, distilled from \ + countless hugging attacks. Used in funny rituals to attract \ + adorable creatures." + color = "#FF69B4" // HOT PINK + veil_msg = "You sense an adorable presence \ + lurking just beyond the veil..." + objective_verb = "Hug and Tickle" + demon_type = /mob/living/simple_animal/slaughter/laughter \ No newline at end of file diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 4f785ca99aa..f6ff3bc083c 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -88,7 +88,7 @@ for(var/job in restricted_jobs) if(player.assigned_role == job) possible_traitors -= player - if(player.current) // Remove loyalty implanted mobs from the list + if(player.current) // Remove mindshield-implanted mobs from the list if(ishuman(player.current)) var/mob/living/carbon/human/H = player.current for(var/obj/item/weapon/implant/loyalty/I in H.contents) diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 069edaa6ecf..1238adebcf5 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -103,6 +103,9 @@ if(isovermind(M) || isobserver(M)) M.show_message(rendered, 2) +/mob/camera/blob/emote(var/act,var/m_type=1,var/message = null) + return + /mob/camera/blob/blob_act() return diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 5500daf8aae..f4d628deebd 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -256,7 +256,7 @@ desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." flags = STOPSPRESSUREDMAGE | NODROP allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen) - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all. + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all. /obj/item/clothing/suit/space/changeling/New() ..() @@ -277,7 +277,7 @@ icon_state = "lingspacehelmet" desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | NODROP - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/head/helmet/space/changeling/dropped() qdel(src) @@ -308,8 +308,7 @@ icon_state = "lingarmor" flags = NODROP body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - slowdown = 2 - armor = list(melee = 65, bullet = 20, laser = 10, energy = 15, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0) flags_inv = HIDEJUMPSUIT cold_protection = 0 heat_protection = 0 @@ -329,7 +328,7 @@ desc = "A tough, hard covering of black chitin with transparent chitin in front." icon_state = "lingarmorhelmet" flags = HEADCOVERSEYES | BLOCKHAIR | NODROP - armor = list(melee = 65, bullet = 20, laser = 10,energy = 15, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 30, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0) flags_inv = HIDEEARS /obj/item/clothing/head/helmet/changeling/dropped() diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 60803346b26..f6d87a1b60c 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -34,7 +34,7 @@ desc = "A hood worn by the followers of Nar-Sie." flags_inv = HIDEFACE flags = HEADCOVERSEYES - armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT @@ -54,7 +54,7 @@ item_state = "cultrobes" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) - armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) + armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEJUMPSUIT /obj/item/clothing/head/magus @@ -64,7 +64,7 @@ desc = "A helm worn by the followers of Nar-Sie." flags_inv = HIDEFACE flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR - armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 30, laser = 30, energy = 20, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/suit/magusred name = "magus robes" @@ -73,7 +73,7 @@ item_state = "magusred" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) - armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) + armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/head/helmet/space/cult @@ -81,7 +81,7 @@ desc = "A space worthy helmet used by the followers of Nar-Sie" icon_state = "cult_helmet" item_state = "cult_helmet" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) /obj/item/clothing/suit/space/cult name = "cult armour" @@ -90,5 +90,4 @@ desc = "A bulky suit of armour, bristling with spikes. It looks space proof." w_class = 3 allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank) - slowdown = 1 - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) \ No newline at end of file + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 7ef6ba386d2..8690ee8047f 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -411,6 +411,12 @@ Congratulations! You are now trained for xenobiology research!"} user.do_attack_animation(L) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.check_shields(0, "[user]'s [name]")) + playsound(L, 'sound/weapons/Genhit.ogg', 50, 1) + return 0 + switch (mode) if(BATON_STUN) StunAttack(L,user) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 91c2bddb74c..4998aaeca48 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -33,6 +33,9 @@ return 0 return B.host.say_understands(other, speaking) +/mob/living/captive_brain/emote(var/message) + return + /mob/living/captive_brain/resist() var/mob/living/simple_animal/borer/B = loc diff --git a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm index bab7c597a69..a0a1f9f30d1 100644 --- a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm +++ b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm @@ -59,8 +59,15 @@ sleep(6) if(animation) qdel(animation) - for(var/i = 3; i > 0; i--) - playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1) + var/sound + if(istype(src, /mob/living/simple_animal/slaughter)) + var/mob/living/simple_animal/slaughter/SD = src + sound = SD.feast_sound + else + sound = 'sound/misc/Demon_consume.ogg' + + for(var/i in 1 to 3) + playsound(get_turf(src), sound, 100, 1) sleep(30) if(kidnapped) to_chat(src, "You devour [kidnapped]. Your health is fully restored.") diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index e255394e7af..ac32105229a 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -18,6 +18,8 @@ stop_automated_movement = 1 status_flags = CANPUSH attack_sound = 'sound/misc/demon_attack1.ogg' + var/feast_sound = 'sound/misc/Demon_consume.ogg' + var/death_sound = 'sound/misc/demon_dies.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY @@ -47,6 +49,7 @@ You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \ Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \ You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " + var/deathmessage = "screams in anger as it collapses into a puddle of viscera!" /mob/living/simple_animal/slaughter/New() @@ -88,8 +91,8 @@ /mob/living/simple_animal/slaughter/death() ..() - playsound(get_turf(src),'sound/misc/demon_dies.ogg', 200, 1) - visible_message("[src] screams in anger as it collapses into a puddle of viscera, its most recent meals spilling out of it.") + playsound(get_turf(src), death_sound, 200, 1) + visible_message("[src] [deathmessage].") for(var/mob/living/M in consumed_mobs) M.forceMove(get_turf(src)) ghostize() @@ -181,6 +184,36 @@ /obj/item/organ/internal/heart/demon/Stop() return 0 // Always beating. + +/mob/living/simple_animal/slaughter/laughter + // The laughter demon! It's everyone's best friend! It just wants to hug + // them so much, it wants to hug everyone at once! + name = "laughter demon" + real_name = "laughter demon" + desc = "A large, adorable creature covered in armor with pink bows." + speak_emote = list("giggles", "titters", "chuckles") + emote_hear = list("gaffaws", "laughs") + response_help = "hugs" + attacktext = "wildly tickles" + + attack_sound = 'sound/items/bikehorn.ogg' + feast_sound = 'sound/spookoween/scary_horn2.ogg' + death_sound = 'sound/misc/sadtrombone.ogg' + + icon_state = "bowmon" + icon_living = "bowmon" + deathmessage = "fades out, as all of its friends are released from its prison of hugs." + loot = list(/mob/living/simple_animal/pet/cat/kitten{name = "Laughter"}) + +/mob/living/simple_animal/slaughter/laughter/death() + for(var/mob/living/M in consumed_mobs) + if(M.revive()) + M.grab_ghost(force = TRUE) + playsound(get_turf(src), feast_sound, 50, 1, -1) + to_chat(M, "You leave the [src]'s warm embrace, and feel ready to take on the world.") + ..() + + //Objectives and helpers. //Objective info, Based on Reverent mini Atang diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 0acd5bb5336..d35dd1534f7 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -147,7 +147,7 @@ if (!where2) to_chat(mob, "The Syndicate were unfortunately unable to get you a chameleon security HUD.") else - to_chat(mob, "The chameleon security HUD in your [where2] will help you keep track of who is loyalty-implanted, and unable to be recruited.") + to_chat(mob, "The chameleon security HUD in your [where2] will help you keep track of who is mindshield-implanted, and unable to be recruited.") if (!where) to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.") diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index b350a0556d3..b22ccbf3a01 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -342,21 +342,21 @@ target.Weaken(12) sleep(20) if(isloyal(target)) - to_chat(usr, "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time.") + to_chat(usr, "They have a mindshield implant. You begin to deactivate it - this will take some time.") usr.visible_message("[usr] pauses, then dips their head in concentration!") - to_chat(target, "You feel your loyalties begin to weaken!") + to_chat(target, "Your mindshield implant becomes hot as it comes under attack!") sleep(100) //10 seconds - not spawn() so the enthralling takes longer - to_chat(usr, "The nanobots composing the loyalty implant have been rendered inert. Now to continue.") + to_chat(usr, "The nanobots composing the mindshield implant have been rendered inert. Now to continue.") usr.visible_message("[usr] relaxes again.") for(var/obj/item/weapon/implant/loyalty/L in target) if(L && L.implanted) qdel(L) - to_chat(target, "Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies.") + to_chat(target, "Your mental protection implant unexpectedly falters, dims, dies.") if(3) to_chat(usr, "You begin planting the tumor that will control the new thrall...") usr.visible_message("A strange energy passes from [usr]'s hands into [target]'s head!") to_chat(target, "You feel your memories twisting, morphing. A sense of horror dominates your mind.") - if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a loyalty implant + if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant to_chat(usr, "The enthralling has been interrupted - your target's mind returns to its previous state.") to_chat(target, "You wrest yourself away from [usr]'s hands and compose yourself") enthralling = 0 diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index c05ee09a882..977889a5341 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -371,7 +371,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(T.density) return - vamp_burn() + vamp_burn(1) /datum/vampire/proc/handle_vampire() if(owner.hud_used) @@ -388,7 +388,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(istype(owner.loc, /turf/space)) check_sun() if(istype(owner.loc.loc, /area/chapel) && !get_ability(/datum/vampire_passive/full)) - vamp_burn() + vamp_burn(0) nullified = max(0, nullified - 1) /datum/vampire/proc/handle_vampire_cloak() @@ -415,27 +415,23 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha else owner.alpha = round((255 * 0.80)) -/datum/vampire/proc/vamp_burn() - if(prob(35)) +/datum/vampire/proc/vamp_burn(severe_burn) + var/burn_chance = severe_burn ? 35 : 8 + if(prob(burn_chance) && owner.health >= 50) switch(owner.health) - if(80 to 100) + if(75 to 100) to_chat(owner, "Your skin flakes away...") - if(60 to 80) + if(50 to 75) to_chat(owner, "Your skin sizzles!") - if((-INFINITY) to 60) - if(!owner.on_fire) - to_chat(owner, "Your skin catches fire!") - else - to_chat(owner, "You continue to burn!") - owner.fire_stacks += 5 - owner.IgniteMob() - owner.emote("scream") - else - switch(owner.health) - if((-INFINITY) to 60) - owner.fire_stacks++ - owner.IgniteMob() - owner.adjustFireLoss(3) + owner.adjustFireLoss(3) + else if(owner.health < 50) + if(!owner.on_fire) + to_chat(owner, "Your skin catches fire!") + owner.emote("scream") + else + to_chat(owner, "You continue to burn!") + owner.adjust_fire_stacks(5) + owner.IgniteMob() return /datum/hud/proc/remove_vampire_hud() @@ -445,4 +441,4 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha static_inventory -= vampire_blood_display qdel(vampire_blood_display) vampire_blood_display = null - show_hud(hud_version) \ No newline at end of file + show_hud(hud_version) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 8d3d7cc4278..ac487a8e703 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -363,6 +363,21 @@ limit = 3 category = "Assistance" +/datum/spellbook_entry/item/hugbottle + name = "Bottle of Tickles" + desc = "A bottle of magically infused fun, the smell of which will \ + attract adorable extradimensional beings when broken. These beings \ + are similar to slaughter demons, but they do not permamently kill \ + their victims, instead putting them in an extradimensional hugspace, \ + to be released on the demon's death. Chaotic, but not ultimately \ + damaging. The crew's reaction to the other hand could be very \ + destructive." + item_path = /obj/item/weapon/antag_spawner/slaughter_demon/laughter + cost = 1 //non-destructive; it's just a jape, sibling! + log_name = "HB" + limit = 3 + category = "Assistance" + /datum/spellbook_entry/item/tarotdeck name = "Tarot Deck" desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard." diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 31c82b2a203..b3d1ab1e67f 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -123,7 +123,7 @@ H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/noir(H),slot_glasses) H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves) if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician") - H.equip_or_collect(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit) + H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit/forensics/blue(H), slot_wear_suit) else H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit) H.equip_or_collect(new /obj/item/clothing/head/det_hat(H), slot_head) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 851cb4d0921..ca41aee35a7 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -382,9 +382,60 @@ var/global/datum/controller/occupations/job_master proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) if(!H) return null var/datum/job/job = GetJob(rank) + var/list/spawn_in_storage = list() + if(job) + + //Equip custom gear loadout. + var/list/custom_equip_slots = list() //If more than one item takes the same slot, all after the first one spawn in storage. + var/list/custom_equip_leftovers = list() + if(H.client.prefs.gear && H.client.prefs.gear.len && job.title != "Cyborg" && job.title != "AI") + for(var/thing in H.client.prefs.gear) + var/datum/gear/G = gear_datums[thing] + if(G) + var/permitted + if(G.allowed_roles) + for(var/job_name in G.allowed_roles) + if(job.title == job_name) + permitted = 1 + else + permitted = 1 + + if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted))) + permitted = 0 + + if(!permitted) + to_chat(H, "Your current job or whitelist status does not permit you to spawn with [thing]!") + continue + + if(G.slot && !(G.slot in custom_equip_slots)) + // This is a miserable way to fix the loadout overwrite bug, but the alternative requires + // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z + if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head) + custom_equip_leftovers += thing + else if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot)) + to_chat(H, "Equipping you with \the [thing]!") + custom_equip_slots.Add(G.slot) + else + custom_equip_leftovers.Add(thing) + else + spawn_in_storage += thing + job.equip(H) job.apply_fingerprints(H) + + //If some custom items could not be equipped before, try again now. + for(var/thing in custom_equip_leftovers) + var/datum/gear/G = gear_datums[thing] + if(G.slot in custom_equip_slots) + spawn_in_storage += thing + else + var/metadata = H.client.prefs.gear[G.display_name] + if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot)) + to_chat(H, "Equipping you with \the [thing]!") + custom_equip_slots.Add(G.slot) + else + spawn_in_storage += thing else to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.") @@ -467,6 +518,26 @@ var/global/datum/controller/occupations/job_master H.equip_to_slot_or_del(BPK, slot_back,1) H.species.equip(H) + //Deferred item spawning. + for(var/thing in spawn_in_storage) + var/datum/gear/G = gear_datums[thing] + var/metadata = H.client.prefs.gear[G.display_name] + var/item = G.spawn_item(null, metadata) + + var/atom/placed_in = H.equip_or_collect(item) + if(placed_in) + to_chat(H, "Placing \the [item] in your [placed_in.name]!") + continue + if(H.equip_to_appropriate_slot(item)) + to_chat(H, "Placing \the [item] in your inventory!") + continue + if(H.put_in_hands(item)) + to_chat(H, "Placing \the [item] in your hands!") + continue + to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.") + qdel(item) + + to_chat(H, "You are the [alt_title ? alt_title : rank].") to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") if(job.req_admin_notify) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 809ac579454..b29d178efec 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -444,6 +444,7 @@ throwforce = 0 w_class = 2.0 flags = NOSHIELD + armour_penetration = 50 var/active = 0 /obj/item/weapon/holo/esword/green/New() diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index f0b6ce34ef7..a41adfc1278 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -236,7 +236,6 @@ A = new /obj/item/projectile/beam/lasertag/bluetag(loc) if(6) A = new /obj/item/projectile/beam/lasertag/redtag(loc) - A.original = target use_power(500) else A = new /obj/item/projectile/energy/electrode( loc ) @@ -245,11 +244,12 @@ playsound(get_turf(src), 'sound/weapons/Laser.ogg', 60, 1) else playsound(get_turf(src), 'sound/weapons/Taser.ogg', 60, 1) + A.original = target A.current = T A.yo = U.y - T.y A.xo = U.x - T.x A.fire() - return + return A /obj/machinery/turret/proc/isDown() @@ -548,11 +548,11 @@ return playsound(get_turf(src), firing_sound, 60, 1) var/obj/item/projectile/A = new bullet_type(curloc) + A.original = target A.current = curloc A.yo = targloc.y - curloc.y A.xo = targloc.x - curloc.x - spawn(0) - A.process() + A.fire() return diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2a3fe4a2a03..8a0c44b78ca 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -44,7 +44,7 @@ var/permeability_coefficient = 1 // for chemicals/diseases var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit) var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up - var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + var/armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) var/armour_penetration = 0 //percentage of armour effectiveness to remove var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 67b52da31ec..4bac1168518 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -5,7 +5,7 @@ action_button_custom_type = /datum/action/item_action/hands_free origin_tech = "materials=2;biotech=3;programming=2" - var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like loyalty implants + var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants var/implanted = null var/mob/living/imp_in = null item_color = "b" diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm similarity index 84% rename from code/game/objects/items/weapons/implants/implant_loyality.dm rename to code/game/objects/items/weapons/implants/implant_mindshield.dm index 0c4b5c44648..a6efb21661f 100644 --- a/code/game/objects/items/weapons/implants/implant_loyality.dm +++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm @@ -1,6 +1,6 @@ /obj/item/weapon/implant/loyalty - name = "loyalty implant" - desc = "Makes you loyal or such." + name = "mindshield implant" + desc = "Stops people messing with your mind." origin_tech = "materials=2;biotech=4;programming=4" activated = 0 @@ -8,7 +8,7 @@ var/dat = {"Implant Specifications:
Name: Nanotrasen Employee Management Implant
Life: Ten years.
- Important Notes: Personnel injected with this device tend to be much more loyal to the company.
+ Important Notes: Personnel injected with this device can better resist mental compulsions.

Implant Details:
Function: Contains a small pod of nanobots that manipulate the host's mental functions.
@@ -29,7 +29,7 @@ if(target.mind in ticker.mode.cult) to_chat(target, "You feel the corporate tendrils of Nanotrasen try to invade your mind!") else - to_chat(target, "You feel a surge of loyalty towards Nanotrasen.") + to_chat(target, "Your mind feels hardened - more resistant to brainwashing.") return 1 return 0 @@ -42,7 +42,7 @@ /obj/item/weapon/implanter/loyalty - name = "implanter (loyalty)" + name = "implanter (mindshield)" /obj/item/weapon/implanter/loyalty/New() imp = new /obj/item/weapon/implant/loyalty(src) @@ -51,8 +51,8 @@ /obj/item/weapon/implantcase/loyalty - name = "implant case - 'Loyalty'" - desc = "A glass case containing a loyalty implant." + name = "implant case - 'mindshield'" + desc = "A glass case containing a mindshield implant." /obj/item/weapon/implantcase/loyalty/New() imp = new /obj/item/weapon/implant/loyalty(src) diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 0820cc097c9..35d98f179a2 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -1,8 +1,8 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 /obj/machinery/implantchair - name = "loyalty implanter" - desc = "Used to implant occupants with loyalty implants." + name = "mindshield implanter" + desc = "Used to implant occupants with mindshield implants." icon = 'icons/obj/machines/implantchair.dmi' icon_state = "implantchair" density = 1 diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index b580a024b91..6a7e0c15575 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -809,7 +809,7 @@ "} - + /obj/item/weapon/book/manual/security_space_law/black name = "Space Law - Limited Edition" desc = "A leather-bound, immaculately-written copy of JUSTICE." @@ -1483,7 +1483,7 @@
  • Attending Surgeon is to keep the Operating Room in an hygienic condition at all times, again, to prevent infection;
  • Attending Surgeon is to wash his/her hands between different patients, again, to prevent infection;
  • Attending Surgeon is to use either Anesthetics or Sedatives (for species that cannot breathe Anesthetics) during Surgical Procedures. Exception is made if the patient requests otherwise;
  • -
  • Attending Surgeon is not to remove any legal Implants (such as Loyalty or Tracking Implants) from the patient, unless requested by Security;
  • +
  • Attending Surgeon is not to remove any legal Implants (such as Mindshield or Tracking Implants) from the patient, unless requested by Security;
  • If a patient requests that a lost limb be replaced with an organic, rather than mechanical, substitute, said limb must be harvested from a compatible humanized Test Animal (such as Monkeys for Humans, or Farwas for Tajarans). Exception is made if the patient deliberately requests otherwise;
  • Attending Surgeon is not to bring any of the Surgical Tools outside of their respective Operating Room, and must in fact ensure the Operating Room maintains its proper inventory. This includes ensuring that the Anesthetics Equipment be kept inside the OR
  • @@ -2141,7 +2141,7 @@
  • Prisoner must then be borged, fired into space via mass driver, cremated, or placed in the morgue with a DNR Notice, at the discretion of the Magistrate, Captain or Head of Security.


  • - +

    Execution: Lethal Injection


    1. Prisoner must be bucklecuffed to the electric chair or bed.
    2. @@ -2150,7 +2150,7 @@
    3. Prisoner must then be borged, fired into space via mass driver, cremated, or placed in the morgue with a DNR Notice, at the discretion of the Magistrate, Captain or Head of Security.


    - +

    Execution: Firing Squad


    1. Prisoner must be brought to the Firing Range.
    2. @@ -2164,7 +2164,7 @@ "} - + /obj/item/weapon/book/manual/sop_general name = "Standard Operating Procedures" desc = "A set of guidelines aiming at the safe conduct of all station activities." @@ -2212,7 +2212,7 @@

      Code Green


      All clear.
      - Default operating level. No immediate or clear threat to the station. All departments may carry out work as normal. + Default operating level. No immediate or clear threat to the station. All departments may carry out work as normal. This alert level can be set at the Communications Console with a Captain level ID.
      All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.

      @@ -2230,10 +2230,10 @@ Crew:


      - +

      Code Blue


      There is a suspected threat.
      Raised alert level. Suspected threat to the station. Issued by Central Command, the Captain, or a Head of Staff vote. This alert level can be set at the Communications Console with a Captain level ID.
      @@ -2255,10 +2255,10 @@ Crew:


      - +

      Code Red


      There is a confirmed threat.
      Maximum alert level. Confirmed threat to the station or severe damage. Issued by Central Command, the Captain, or a Head of Staff vote. This alert level can only be set via the Keycard Authentication Devices in each Heads of Staff office and by swiping two Heads of Staff ID cards simultaneously.
      @@ -2279,12 +2279,12 @@ Crew:


      - +

      Code Gamma


      Extremely hostile threat onboard the station.
      GAMMA Security level has been set by Centcom.
      @@ -2306,21 +2306,21 @@ Crew:


      - +

      Hiring Policies




      - +

      Firing Policies




      - +

      Causes for Demotion and Dismissal




      - +

      Situational SoP


      The following situations have specific SoP. Failure to follow these may result in demotion/dismissal, or detaining by security if failure to follow them presents a significant risk.

      - +

      Evacuation




      - +

      Viral Outbreak Procedures


      Definition: A Viral Outbreak is defined as a situation where a Viral Pathogen has infected a significant portion of the crew (>10%)
        @@ -2376,7 +2376,7 @@
      1. Once the Viral Outbreak is over, all personnel are to return to regular duties.


      - +

      Evacuation




      - +

      Meteor Storm




      - +

      Singularity Containment Failure


      - \[Done\] - \[Reset\] - "} - // END AUTOFIX - user << browse(null, "window=preferences") - user << browse(HTML, "window=disabil;size=350x300") - return - -/datum/preferences/proc/SetRecords(mob/user) - var/HTML = "" - HTML += "
      " - HTML += "Set Character Records
      " - - HTML += "Medical Records
      " - - if(lentext(med_record) <= 40) - HTML += "[med_record]" - else - HTML += "[copytext(med_record, 1, 37)]..." - - HTML += "

      Employment Records
      " - - if(lentext(gen_record) <= 40) - HTML += "[gen_record]" - else - HTML += "[copytext(gen_record, 1, 37)]..." - - HTML += "

      Security Records
      " - - if(lentext(sec_record) <= 40) - HTML += "[sec_record]
      " - else - HTML += "[copytext(sec_record, 1, 37)]...
      " - - HTML += "
      " - HTML += "\[Done\]" - HTML += "
      " - - user << browse(null, "window=preferences") - user << browse(HTML, "window=records;size=350x300") - return - -/datum/preferences/proc/GetPlayerAltTitle(datum/job/job) - return player_alt_titles.Find(job.title) > 0 \ - ? player_alt_titles[job.title] \ - : job.title - -/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title) - // remove existing entry - if(player_alt_titles.Find(job.title)) - player_alt_titles -= job.title - // add one if it's not default - if(job.title != new_title) - player_alt_titles[job.title] = new_title - -/datum/preferences/proc/SetJob(mob/user, role) - var/datum/job/job = job_master.GetJob(role) - if(!job) - user << browse(null, "window=mob_occupation") - ShowChoices(user) - return - - if(role == "Civilian") - if(job_support_low & job.flag) - job_support_low &= ~job.flag - else - job_support_low |= job.flag - SetChoices(user) - return 1 - - if(GetJobDepartment(job, 1) & job.flag) - SetJobDepartment(job, 1) - else if(GetJobDepartment(job, 2) & job.flag) - SetJobDepartment(job, 2) - else if(GetJobDepartment(job, 3) & job.flag) - SetJobDepartment(job, 3) - else//job = Never - SetJobDepartment(job, 4) - - SetChoices(user) - return 1 - -/datum/preferences/proc/ResetJobs() - job_support_high = 0 - job_support_med = 0 - job_support_low = 0 - - job_medsci_high = 0 - job_medsci_med = 0 - job_medsci_low = 0 - - job_engsec_high = 0 - job_engsec_med = 0 - job_engsec_low = 0 - - job_karma_high = 0 - job_karma_med = 0 - job_karma_low = 0 - - -/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(job.department_flag) - if(SUPPORT) - switch(level) - if(1) - return job_support_high - if(2) - return job_support_med - if(3) - return job_support_low - if(MEDSCI) - switch(level) - if(1) - return job_medsci_high - if(2) - return job_medsci_med - if(3) - return job_medsci_low - if(ENGSEC) - switch(level) - if(1) - return job_engsec_high - if(2) - return job_engsec_med - if(3) - return job_engsec_low - if(KARMA) - switch(level) - if(1) - return job_karma_high - if(2) - return job_karma_med - if(3) - return job_karma_low - return 0 - -/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(level) - if(1)//Only one of these should ever be active at once so clear them all here - job_support_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - job_karma_high = 0 - return 1 - if(2)//Set current highs to med, then reset them - job_support_med |= job_support_high - job_medsci_med |= job_medsci_high - job_engsec_med |= job_engsec_high - job_karma_med |= job_karma_high - job_support_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - job_karma_high = 0 - - switch(job.department_flag) - if(SUPPORT) - switch(level) - if(2) - job_support_high = job.flag - job_support_med &= ~job.flag - if(3) - job_support_med |= job.flag - job_support_low &= ~job.flag - else - job_support_low |= job.flag - if(MEDSCI) - switch(level) - if(2) - job_medsci_high = job.flag - job_medsci_med &= ~job.flag - if(3) - job_medsci_med |= job.flag - job_medsci_low &= ~job.flag - else - job_medsci_low |= job.flag - if(ENGSEC) - switch(level) - if(2) - job_engsec_high = job.flag - job_engsec_med &= ~job.flag - if(3) - job_engsec_med |= job.flag - job_engsec_low &= ~job.flag - else - job_engsec_low |= job.flag - if(KARMA) - switch(level) - if(2) - job_karma_high = job.flag - job_karma_med &= ~job.flag - if(3) - job_karma_med |= job.flag - job_karma_low &= ~job.flag - else - job_karma_low |= job.flag - return 1 - -/datum/preferences/proc/process_link(mob/user, list/href_list) - if(!user) return - - if(href_list["preference"] == "job") - switch(href_list["task"]) - if("close") - user << browse(null, "window=mob_occupation") - ShowChoices(user) - if("reset") - ResetJobs() - SetChoices(user) - if("random") - if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN) - alternate_option += 1 - else if(alternate_option == RETURN_TO_LOBBY) - alternate_option = 0 - else - return 0 - SetChoices(user) - if ("alt_title") - var/datum/job/job = locate(href_list["job"]) - if (job) - var/choices = list(job.title) + job.alt_titles - var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null - if(choice) - SetPlayerAltTitle(job, choice) - SetChoices(user) - if("input") - SetJob(user, href_list["text"]) - if("setJobLevel") - UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) - else - SetChoices(user) - return 1 - else if(href_list["preference"] == "disabilities") - - switch(href_list["task"]) - if("close") - user << browse(null, "window=disabil") - ShowChoices(user) - if("reset") - disabilities=0 - SetDisabilities(user) - if("input") - var/dflag=text2num(href_list["disability"]) - if(dflag >= 0) - if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))) - disabilities ^= text2num(href_list["disability"]) //MAGIC - SetDisabilities(user) - else - SetDisabilities(user) - return 1 - - else if(href_list["preference"] == "records") - if(text2num(href_list["record"]) >= 1) - SetRecords(user) - return - else - user << browse(null, "window=records") - if(href_list["task"] == "med_record") - var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message - - if(medmsg != null) - medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) - medmsg = html_encode(medmsg) - - med_record = medmsg - SetRecords(user) - - if(href_list["task"] == "sec_record") - var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message - - if(secmsg != null) - secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) - secmsg = html_encode(secmsg) - - sec_record = secmsg - SetRecords(user) - if(href_list["task"] == "gen_record") - var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message - - if(genmsg != null) - genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN) - genmsg = html_encode(genmsg) - - gen_record = genmsg - SetRecords(user) - - switch(href_list["task"]) - if("random") - switch(href_list["preference"]) - if("name") - real_name = random_name(gender,species) - if("age") - age = rand(AGE_MIN, AGE_MAX) - if("hair") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) - r_hair = rand(0,255) - g_hair = rand(0,255) - b_hair = rand(0,255) - if("h_style") - h_style = random_hair_style(gender, species) - if("facial") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) - r_facial = rand(0,255) - g_facial = rand(0,255) - b_facial = rand(0,255) - if("f_style") - f_style = random_facial_hair_style(gender, species) - if("underwear") - underwear = random_underwear(gender) - ShowChoices(user) - if("undershirt") - undershirt = random_undershirt(gender) - ShowChoices(user) - if("socks") - socks = random_socks(gender) - ShowChoices(user) - if("eyes") - r_eyes = rand(0,255) - g_eyes = rand(0,255) - b_eyes = rand(0,255) - if("s_tone") - if(species in list("Human", "Drask", "Vox")) - s_tone = random_skin_tone(species) - if("s_color") - if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine")) - r_skin = rand(0,255) - g_skin = rand(0,255) - b_skin = rand(0,255) - if("bag") - backbag = rand(1,4) - /*if("skin_style") - h_style = random_skin_style(gender)*/ - if("all") - random_character() - if("input") - switch(href_list["preference"]) - if("name") - var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null - if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) - var/new_name = reject_bad_name(raw_name) - if(new_name) - real_name = new_name - else - to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .") - - if("age") - var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null - if(new_age) - age = max(min(round(text2num(new_age)), AGE_MAX),AGE_MIN) - if("species") - - var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") - var/prev_species = species -// var/whitelisted = 0 - - if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! - for(var/S in whitelisted_species) - if(is_alien_whitelisted(user,S)) - new_species += S -// whitelisted = 1 -// if(!whitelisted) -// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.") - else //Not using the whitelist? Aliens for everyone! - new_species += whitelisted_species - - species = input("Please select a species", "Character Generation", null) in new_species - - if(prev_species != species) - //grab one of the valid hair styles for the newly chosen species - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if(!(species in S.species_allowed)) - continue - - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - - if(valid_hairstyles.len) - h_style = pick(valid_hairstyles) - else - //this shouldn't happen - h_style = hair_styles_list["Bald"] - - //grab one of the valid facial hair styles for the newly chosen species - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if(!(species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - if(valid_facialhairstyles.len) - f_style = pick(valid_facialhairstyles) - else - //this shouldn't happen - f_style = facial_hair_styles_list["Shaved"] - - // Don't wear another species' underwear! - var/datum/sprite_accessory/S = underwear_list[underwear] - if(!(species in S.species_allowed)) - underwear = random_underwear(gender, species) - - S = undershirt_list[undershirt] - if(!(species in S.species_allowed)) - undershirt = random_undershirt(gender, species) - - S = socks_list[socks] - if(!(species in S.species_allowed)) - socks = random_socks(gender, species) - - //reset hair colour and skin colour - r_hair = 0//hex2num(copytext(new_hair, 2, 4)) - g_hair = 0//hex2num(copytext(new_hair, 4, 6)) - b_hair = 0//hex2num(copytext(new_hair, 6, 8)) - - s_tone = 0 - - if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine"))) - r_skin = 0 - g_skin = 0 - b_skin = 0 - - ha_style = "None" // No Vulp ears on Unathi - m_style = "None" // No Unathi markings on Tajara - - body_accessory = null //no vulptail on humans damnit - - //Reset prosthetics. - organ_data = list() - rlimb_data = list() - if("speciesprefs")//oldvox code - speciesprefs = !speciesprefs - - if("language") -// var/languages_available - var/list/new_languages = list("None") -/* - if(config.usealienwhitelist) - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED )))) - new_languages += lang - languages_available = 1 - - if(!(languages_available)) - alert(user, "There are not currently any available secondary languages.") - else -*/ - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if(!(lang.flags & RESTRICTED)) - new_languages += lang.name - - language = input("Please select a secondary language", "Character Generation", null) in new_languages - - if("metadata") - var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null - if(new_metadata) - metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) - - if("b_type") - var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" ) - if(new_b_type) - b_type = new_b_type - - if("hair") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) - var/input = "Choose your character's hair colour:" - var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null - if(new_hair) - r_hair = hex2num(copytext(new_hair, 2, 4)) - g_hair = hex2num(copytext(new_hair, 4, 6)) - b_hair = hex2num(copytext(new_hair, 6, 8)) - - if("h_style") - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(species == "Machine") //Species that can use prosthetic heads. - var/obj/item/organ/external/head/H = new() - if(S.name == "Bald") - valid_hairstyles[hairstyle] = S - if(!rlimb_data["head"]) //Handle situations where the head is default. - H.model = "Morpheus Cyberkinetics" - else - H.model = rlimb_data["head"] - var/datum/robolimb/robohead = all_robolimbs[H.model] - if(species in S.species_allowed) - if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head - //and said head is in the hair style's allowed models list... - valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle. - continue - else - if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles). - continue - else if(!robohead.is_monitor && ("Human" in S.species_allowed)) - valid_hairstyles[hairstyle] = S - continue - else - if(!(species in S.species_allowed)) - continue - - valid_hairstyles[hairstyle] = S - - var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles - if(new_h_style) - h_style = new_h_style - - if("headaccessory") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories. - var/input = "Choose the colour of your your character's head accessory:" - var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null - if(new_head_accessory) - r_headacc = hex2num(copytext(new_head_accessory, 2, 4)) - g_headacc = hex2num(copytext(new_head_accessory, 4, 6)) - b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) - - if("ha_style") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories. - var/list/valid_head_accessory_styles = list() - for(var/head_accessory_style in head_accessory_styles_list) - var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style] - if(!(species in H.species_allowed)) - continue - - valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style] - - var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles - if(new_head_accessory_style) - ha_style = new_head_accessory_style - - if("markings") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings. - var/input = "Choose the colour of your your character's markings:" - var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null - if(new_markings) - r_markings = hex2num(copytext(new_markings, 2, 4)) - g_markings = hex2num(copytext(new_markings, 4, 6)) - b_markings = hex2num(copytext(new_markings, 6, 8)) - - if("m_style") - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings. - var/list/valid_markings = list() - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/M = marking_styles_list[markingstyle] - if(!(species in M.species_allowed)) - continue - - if(species == "Machine") //Species that can use prosthetic heads. - var/obj/item/organ/external/head/H = new() - if(!rlimb_data["head"]) //Handle situations where the head is default. - H.model = "Morpheus Cyberkinetics" - else - H.model = rlimb_data["head"] - var/datum/robolimb/robohead = all_robolimbs[H.model] - if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings. - continue - else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip. - if(!(robohead.company in M.models_allowed)) - continue - - valid_markings[markingstyle] = marking_styles_list[markingstyle] - - var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings - if(new_marking_style) - m_style = new_marking_style - - if("body_accessory") - var/list/possible_body_accessories = list() - if(check_rights(R_ADMIN, 1, user)) - possible_body_accessories = body_accessory_by_name.Copy() - else - for(var/B in body_accessory_by_name) - var/datum/body_accessory/accessory = body_accessory_by_name[B] - if(!istype(accessory)) - possible_body_accessories += "None" //the only null entry should be the "None" option - continue - if(species in accessory.allowed_species) - possible_body_accessories += B - - var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories - if(new_body_accessory) - body_accessory = (new_body_accessory == "None") ? null : new_body_accessory - - if("facial") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) - var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null - if(new_facial) - r_facial = hex2num(copytext(new_facial, 2, 4)) - g_facial = hex2num(copytext(new_facial, 4, 6)) - b_facial = hex2num(copytext(new_facial, 6, 8)) - - if("f_style") - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(S.name == "Shaved") - valid_facialhairstyles[facialhairstyle] = S - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if(species == "Machine") //Species that can use prosthetic heads. - var/obj/item/organ/external/head/H = new() - if(!rlimb_data["head"]) //Handle situations where the head is default. - H.model = "Morpheus Cyberkinetics" - else - H.model = rlimb_data["head"] - var/datum/robolimb/robohead = all_robolimbs[H.model] - if(species in S.species_allowed) - if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it. - valid_facialhairstyles[facialhairstyle] = S - continue - else - if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles). - continue - else if(!robohead.is_monitor && ("Human" in S.species_allowed)) - valid_facialhairstyles[facialhairstyle] = S - continue - else - if(!(species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles - if(new_f_style) - f_style = new_f_style - - if("underwear") - var/list/underwear_options - if(gender == MALE) - underwear_options = underwear_m - else - underwear_options = underwear_f - - var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options - if(new_underwear) - underwear = new_underwear - ShowChoices(user) - - if("undershirt") - var/new_undershirt - if(gender == MALE) - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m - else - new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f - if(new_undershirt) - undershirt = new_undershirt - ShowChoices(user) - - if("socks") - var/list/valid_sockstyles = list() - for(var/sockstyle in socks_list) - var/datum/sprite_accessory/S = socks_list[sockstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if(!(species in S.species_allowed)) - continue - valid_sockstyles[sockstyle] = socks_list[sockstyle] - var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles - ShowChoices(user) - if(new_socks) - socks = new_socks - - if("eyes") - var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null - if(new_eyes) - r_eyes = hex2num(copytext(new_eyes, 2, 4)) - g_eyes = hex2num(copytext(new_eyes, 4, 6)) - b_eyes = hex2num(copytext(new_eyes, 6, 8)) - - if("s_tone") - if(species == "Human" || species == "Drask") - var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null - if(new_s_tone) - s_tone = 35 - max(min(round(new_s_tone), 220), 1) - else if(species == "Vox") - var/skin_c = input(user, "Choose your Vox's skin color:\n(1 = Default Green, 2 = Dark Green, 3 = Brown, 4 = Grey, \n5 = Emerald, 6 = Azure)", "Character Preference") as num|null - if(skin_c) - s_tone = max(min(round(skin_c), 6), 1) - - if("skin") - if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) - var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null - if(new_skin) - r_skin = hex2num(copytext(new_skin, 2, 4)) - g_skin = hex2num(copytext(new_skin, 4, 6)) - b_skin = hex2num(copytext(new_skin, 6, 8)) - - if("ooccolor") - var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null - if(new_ooccolor) - ooccolor = new_ooccolor - - if("bag") - var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist - if(new_backbag) - backbag = backbaglist.Find(new_backbag) - - if("nt_relation") - var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") - if(new_relation) - nanotrasen_relation = new_relation - - if("flavor_text") - var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message - - if(msg != null) - msg = copytext(msg, 1, MAX_MESSAGE_LEN) - msg = html_encode(msg) - - flavor_text = msg - - if("limbs") - var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") - if(species == "Machine") - valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") - var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs - if(!limb_name) return - - var/limb = null - var/second_limb = null // if you try to change the arm, the hand should also change - var/third_limb = null // if you try to unchange the hand, the arm should also change - var/valid_limb_states = list("Normal", "Amputated", "Prosthesis") - var/no_amputate = 0 - - switch(limb_name) - if("Torso") - limb = "chest" - second_limb = "groin" - no_amputate = 1 - if("Lower Body") - limb = "groin" - no_amputate = 1 - if("Head") - limb = "head" - no_amputate = 1 - if("Left Leg") - limb = "l_leg" - second_limb = "l_foot" - if("Right Leg") - limb = "r_leg" - second_limb = "r_foot" - if("Left Arm") - limb = "l_arm" - second_limb = "l_hand" - if("Right Arm") - limb = "r_arm" - second_limb = "r_hand" - if("Left Foot") - limb = "l_foot" - if(species != "Machine") - third_limb = "l_leg" - if("Right Foot") - limb = "r_foot" - if(species != "Machine") - third_limb = "r_leg" - if("Left Hand") - limb = "l_hand" - if(species != "Machine") - third_limb = "l_arm" - if("Right Hand") - limb = "r_hand" - if(species != "Machine") - third_limb = "r_arm" - - var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states - if(!new_state) return - - switch(new_state) - if("Normal") - if(limb == "head") - m_style = "None" - h_style = random_hair_style(gender, species) - f_style = facial_hair_styles_list["Shaved"] - organ_data[limb] = null - rlimb_data[limb] = null - if(third_limb) - organ_data[third_limb] = null - rlimb_data[third_limb] = null - if("Amputated") - if(!no_amputate) - organ_data[limb] = "amputated" - rlimb_data[limb] = null - if(second_limb) - organ_data[second_limb] = "amputated" - rlimb_data[second_limb] = null - if("Prosthesis") - var/choice - var/subchoice - var/datum/robolimb/R = new() - var/in_model - var/robolimb_companies = list() - for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products. - R = new limb_type() - if(!R.unavailable_at_chargen && (limb in R.parts) && R.has_subtypes) //Ensures users can only choose companies that offer the parts they want, that singular models get added to the list as well companies that offer more than one model, and... - robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for. - R = new() //Re-initialize R. - - choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants. - if(!choice) - return - R.company = choice - R = all_robolimbs[R.company] - if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it. - var/list/robolimb_models = list() - for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide. - var/datum/robolimb/L = new limb_type() - if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list. - robolimb_models[L.company] = L - if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option. - subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem. - if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later. - in_model = 1 - if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose. - subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models - if(subchoice) - choice = subchoice - if(limb == "head") - ha_style = "None" - h_style = hair_styles_list["Bald"] - f_style = facial_hair_styles_list["Shaved"] - m_style = "None" - rlimb_data[limb] = choice - organ_data[limb] = "cyborg" - if(second_limb) - if(subchoice) - if(in_model) - rlimb_data[second_limb] = choice - organ_data[second_limb] = "cyborg" - else - rlimb_data[second_limb] = choice - organ_data[second_limb] = "cyborg" - - if("organs") - var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") - if(!organ_name) return - - var/organ = null - switch(organ_name) - if("Heart") - organ = "heart" - if("Eyes") - organ = "eyes" - - var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") - if(!new_state) return - - switch(new_state) - if("Normal") - organ_data[organ] = null - if("Assisted") - organ_data[organ] = "assisted" - if("Mechanical") - organ_data[organ] = "mechanical" - -/* - if("skin_style") - var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") - if(!skin_style_name) return -*/ - -/* if("spawnpoint") - var/list/spawnkeys = list() - for(var/S in spawntypes) - spawnkeys += S - var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys - if(!choice || !spawntypes[choice]) - spawnpoint = "Arrivals Shuttle" - return - spawnpoint = choice */ - - else - switch(href_list["preference"]) - if("publicity") - if(unlock_content) - toggles ^= MEMBER_PUBLIC - - if("gender") - if(gender == MALE) - gender = FEMALE - else - gender = MALE - underwear = random_underwear(gender) - - if("hear_adminhelps") - sound ^= SOUND_ADMINHELP - - if("ui") - switch(UI_style) - if("Midnight") - UI_style = "Plasmafire" - if("Plasmafire") - UI_style = "Retro" - if("Retro") - UI_style = "Slimecore" - if("Slimecore") - UI_style = "Operative" - if("Operative") - UI_style = "White" - else - UI_style = "Midnight" - - if(ishuman(usr)) //mid-round preference changes, for aesthetics - var/mob/living/carbon/human/H = usr - H.remake_hud() - - if("nanoui") - nanoui_fancy = !nanoui_fancy - - if("ghost_att_anim") - show_ghostitem_attack = !show_ghostitem_attack - - if("UIcolor") - var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null - if(!UI_style_color_new) return - UI_style_color = UI_style_color_new - - if(ishuman(usr)) //mid-round preference changes, for aesthetics - var/mob/living/carbon/human/H = usr - H.remake_hud() - - if("UIalpha") - var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num - if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return - UI_style_alpha = UI_style_alpha_new - - if(ishuman(usr)) //mid-round preference changes, for aesthetics - var/mob/living/carbon/human/H = usr - H.remake_hud() - - if("be_special") - var/r = href_list["role"] - if(!(r in special_roles)) - var/cleaned_r = sql_sanitize_text(r) - if(r != cleaned_r) // up to no good - message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") - to_chat(user, "Stop right there, criminal scum") - else - be_special ^= r - - if("name") - be_random_name = !be_random_name - - if("randomslot") - randomslot = !randomslot - - if("hear_midis") - sound ^= SOUND_MIDI - - if("lobby_music") - sound ^= SOUND_LOBBY - if(sound & SOUND_LOBBY) - user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) - else - user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) - - if("ghost_ears") - toggles ^= CHAT_GHOSTEARS - - if("ghost_sight") - toggles ^= CHAT_GHOSTSIGHT - - if("ghost_radio") - toggles ^= CHAT_GHOSTRADIO - - if("ghost_radio") - toggles ^= CHAT_GHOSTRADIO - - if("save") - save_preferences(user) - save_character(user) - - if("reload") - load_preferences(user) - load_character(user) - - if("open_load_dialog") - if(!IsGuestKey(user.key)) - open_load_dialog(user) - return 1 - - if("close_load_dialog") - close_load_dialog(user) - - if("changeslot") - if(!load_character(user,text2num(href_list["num"]))) - random_character() - real_name = random_name(gender) - save_character(user) - close_load_dialog(user) - - if("tab") - if (href_list["tab"]) - current_tab = text2num(href_list["tab"]) - - ShowChoices(user) - return 1 - -/datum/preferences/proc/copy_to(mob/living/carbon/human/character) - var/datum/species/S = all_species[species] - character.change_species(species) // Yell at me if this causes everything to melt - if(be_random_name) - real_name = random_name(gender,species) - - if(config.humans_need_surnames) - var/firstspace = findtext(real_name, " ") - var/name_length = length(real_name) - if(!firstspace) //we need a surname - real_name += " [pick(last_names)]" - else if(firstspace == name_length) - real_name += "[pick(last_names)]" - - character.add_language(language) - - character.real_name = real_name - character.dna.real_name = real_name - character.name = character.real_name - - character.flavor_text = flavor_text - if(character.ckey && !jobban_isbanned(character, "Records")) - character.med_record = med_record - character.sec_record = sec_record - character.gen_record = gen_record - - character.change_gender(gender) - character.age = age - character.b_type = b_type - - character.r_eyes = r_eyes - character.g_eyes = g_eyes - character.b_eyes = b_eyes - - //Head-specific - var/obj/item/organ/external/head/H = character.get_organ("head") - H.r_hair = r_hair - H.g_hair = g_hair - H.b_hair = b_hair - - H.r_facial = r_facial - H.g_facial = g_facial - H.b_facial = b_facial - - H.h_style = h_style - H.f_style = f_style - //End of head-specific. - - character.r_skin = r_skin - character.g_skin = g_skin - character.b_skin = b_skin - - character.s_tone = s_tone - - // Destroy/cyborgize organs - for(var/name in organ_data) - - var/status = organ_data[name] - var/obj/item/organ/external/O = character.organs_by_name[name] - if(O) - if(status == "amputated") - character.organs_by_name[O.limb_name] = null - character.organs -= O - if(O.children) // This might need to become recursive. - for(var/obj/item/organ/external/child in O.children) - character.organs_by_name[child.limb_name] = null - character.organs -= child - - else if(status == "cyborg") - if(rlimb_data[name]) - O.robotize(rlimb_data[name]) - else - O.robotize() - else - var/obj/item/organ/internal/I = character.get_int_organ_tag(name) - if(I) - if(status == "assisted") - I.mechassist() - else if(status == "mechanical") - I.robotize() - - character.dna.b_type = b_type - if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT) - character.dna.SetSEState(FATBLOCK,1,1) - character.mutations += FAT - character.mutations += OBESITY - character.overeatduration = 600 - - if(disabilities & DISABILITY_FLAG_NEARSIGHTED) - character.dna.SetSEState(GLASSESBLOCK,1,1) - character.disabilities|=NEARSIGHTED - - if(disabilities & DISABILITY_FLAG_EPILEPTIC) - character.dna.SetSEState(EPILEPSYBLOCK,1,1) - character.disabilities|=EPILEPSY - - if(disabilities & DISABILITY_FLAG_DEAF) - character.dna.SetSEState(DEAFBLOCK,1,1) - character.sdisabilities|=DEAF - - if(disabilities & DISABILITY_FLAG_BLIND) - character.dna.SetSEState(BLINDBLOCK,1,1) - character.sdisabilities|=BLIND - - if(disabilities & DISABILITY_FLAG_MUTE) - character.dna.SetSEState(MUTEBLOCK,1,1) - character.sdisabilities |= MUTE - - S.handle_dna(character) - - if(character.dna.dirtySE) - character.dna.UpdateSE() - domutcheck(character) - - // Wheelchair necessary? - var/obj/item/organ/external/l_foot = character.get_organ("l_foot") - var/obj/item/organ/external/r_foot = character.get_organ("r_foot") - if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) - var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc) - character.buckled = W - character.update_canmove() - W.dir = character.dir - W.buckled_mob = character - W.add_fingerprint(character) - - character.underwear = underwear - character.undershirt = undershirt - character.socks = socks - - if(character.species.bodyflags & HAS_HEAD_ACCESSORY) - H.r_headacc = r_headacc - H.g_headacc = g_headacc - H.b_headacc = b_headacc - H.ha_style = ha_style - if(character.species.bodyflags & HAS_MARKINGS) - character.r_markings = r_markings - character.g_markings = g_markings - character.b_markings = b_markings - character.m_style = m_style - - if(body_accessory) - character.body_accessory = body_accessory_by_name["[body_accessory]"] - - if(backbag > 4 || backbag < 1) - backbag = 1 //Same as above - character.backbag = backbag - - //Debugging report to track down a bug, which randomly assigned the plural gender to people. - if(character.gender in list(PLURAL, NEUTER)) - if(isliving(src)) //Ghosts get neuter by default - message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.") - character.change_gender(MALE) - - character.dna.ready_dna(character, flatten_SE = 0) - character.sync_organ_dna(assimilate=1) - character.UpdateAppearance() - - // Do the initial caching of the player's body icons. - character.force_update_limbs() - character.update_eyes() - character.regenerate_icons() - -/datum/preferences/proc/open_load_dialog(mob/user) - - var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot") - - var/dat = "" - dat += "
      " - dat += "Select a character slot to load
      " - var/name - - for(var/i=1, i<=max_save_slots, i++) - if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") - message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") - return - while(query.NextRow()) - if(i==text2num(query.item[1])) - name = query.item[2] - if(!name) name = "Character[i]" - if(i==default_slot) - name = "[name]" - dat += "[name]
      " - name = null - - dat += "
      " - dat += "Close
      " - dat += "
      " -// user << browse(dat, "window=saves;size=300x390") - var/datum/browser/popup = new(user, "saves", "
      Character Saves
      ", 300, 390) - popup.set_content(dat) - popup.open(0) - -/datum/preferences/proc/close_load_dialog(mob/user) - user << browse(null, "window=saves") +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + +var/list/preferences_datums = list() + +var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles + ROLE_PAI = 0, + ROLE_POSIBRAIN = 0, + ROLE_GUARDIAN = 0, + ROLE_TRAITOR = 7, + ROLE_CHANGELING = 14, + ROLE_SHADOWLING = 14, + ROLE_WIZARD = 14, + ROLE_REV = 14, + ROLE_VAMPIRE = 14, + ROLE_BLOB = 14, + ROLE_REVENANT = 14, + ROLE_OPERATIVE = 21, + ROLE_CULTIST = 21, + ROLE_RAIDER = 21, + ROLE_ALIEN = 21, + ROLE_DEMON = 21, + ROLE_SENTIENT = 21, +// ROLE_GANG = 21, + ROLE_BORER = 21, + ROLE_NINJA = 21, + ROLE_MUTINEER = 21, + ROLE_MALF = 30, + ROLE_ABDUCTOR = 30, +) + +/proc/player_old_enough_antag(client/C, role) + if(available_in_days_antag(C, role) == 0) + return 1 //Available in 0 days = available right now = player is old enough to play. + return 0 + +/proc/available_in_days_antag(client/C, role) + if(!C) + return 0 + if(!role) + return 0 + if(!config.use_age_restriction_for_antags) + return 0 + if(!isnum(C.player_age)) + return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced + var/minimal_player_age_antag = special_role_times[num2text(role)] + if(!isnum(minimal_player_age_antag)) + return 0 + + return max(0, minimal_player_age_antag - C.player_age) + +/proc/check_client_age(client/C, var/days) // If days isn't provided, returns the age of the client. If it is provided, it returns the days until the player_age is equal to or greater than the days variable + if(!days) + return C.player_age + else + return max(0, days - C.player_age) + return 0 + +//used for alternate_option +#define GET_RANDOM_JOB 0 +#define BE_CIVILIAN 1 +#define RETURN_TO_LOBBY 2 + +#define MAX_SAVE_SLOTS 20 // Save slots for regular players +#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members + +#define MAX_GEAR_COST 5 + +#define TAB_CHAR 0 +#define TAB_GAME 1 +#define TAB_GEAR 2 + +/datum/preferences + //doohickeys for savefiles +// var/path + var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used +// var/savefile_version = 0 + var/max_save_slots = MAX_SAVE_SLOTS + + //non-preference stuff + var/warns = 0 + var/muted = 0 + var/last_ip + var/last_id + + //game-preferences + var/lastchangelog = "" //Saved changlog filesize to detect if there was a change + var/ooccolor = "#b82e00" + var/be_special = list() //Special role selection + var/UI_style = "Midnight" + var/nanoui_fancy = TRUE + var/toggles = TOGGLES_DEFAULT + var/sound = SOUND_DEFAULT + var/show_ghostitem_attack = TRUE + var/UI_style_color = "#ffffff" + var/UI_style_alpha = 255 + + + //character preferences + var/real_name //our character's name + var/be_random_name = 0 //whether we are a random name every round + var/gender = MALE //gender of character (well duh) + var/age = 30 //age of character + var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2). + var/b_type = "A+" //blood type (not-chooseable) + var/underwear = "Nude" //underwear type + var/undershirt = "Nude" //undershirt type + var/socks = "Nude" //socks type + var/backbag = 2 //backpack type + var/ha_style = "None" //Head accessory style + var/r_headacc = 0 //Head accessory colour + var/g_headacc = 0 //Head accessory colour + var/b_headacc = 0 //Head accessory colour + var/m_style = "None" //Marking style + var/r_markings = 0 //Marking colour + var/g_markings = 0 //Marking colour + var/b_markings = 0 //Marking colour + var/h_style = "Bald" //Hair type + var/r_hair = 0 //Hair color + var/g_hair = 0 //Hair color + var/b_hair = 0 //Hair color + var/f_style = "Shaved" //Face hair type + var/r_facial = 0 //Face hair color + var/g_facial = 0 //Face hair color + var/b_facial = 0 //Face hair color + var/s_tone = 0 //Skin tone + var/r_skin = 0 //Skin color + var/g_skin = 0 //Skin color + var/b_skin = 0 //Skin color + var/r_eyes = 0 //Eye color + var/g_eyes = 0 //Eye color + var/b_eyes = 0 //Eye color + var/species = "Human" + var/language = "None" //Secondary language + + var/body_accessory = null + + var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess + + //Mob preview + var/icon/preview_icon = null + var/icon/preview_icon_front = null + var/icon/preview_icon_side = null + + //Jobs, uses bitflags + var/job_support_high = 0 + var/job_support_med = 0 + var/job_support_low = 0 + + var/job_medsci_high = 0 + var/job_medsci_med = 0 + var/job_medsci_low = 0 + + var/job_engsec_high = 0 + var/job_engsec_med = 0 + var/job_engsec_low = 0 + + var/job_karma_high = 0 + var/job_karma_med = 0 + var/job_karma_low = 0 + + //Keeps track of preferrence for not getting any wanted jobs + var/alternate_option = 0 + + // maps each organ to either null(intact), "cyborg" or "amputated" + // will probably not be able to do this for head and torso ;) + var/list/organ_data = list() + var/list/rlimb_data = list() + + var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" +// var/accent = "en-us" +// var/voice = "m1" +// var/pitch = 50 +// var/talkspeed = 175 + var/flavor_text = "" + var/med_record = "" + var/sec_record = "" + var/gen_record = "" + var/disabilities = 0 + + var/nanotrasen_relation = "Neutral" + + // 0 = character settings, 1 = game preferences + var/current_tab = TAB_CHAR + + // OOC Metadata: + var/metadata = "" + var/slot_name = "" + + // Whether or not to use randomized character slots + var/randomslot = 0 + + // jukebox volume + var/volume = 100 + + // BYOND membership + var/unlock_content = 0 + + //Gear stuff + var/list/gear = list() + var/gear_tab = "General" + +/datum/preferences/New(client/C) + b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + if(istype(C)) + if(!IsGuestKey(C.key)) + unlock_content = C.IsByondMember() + if(unlock_content) + max_save_slots = MAX_SAVE_SLOTS_MEMBER + var/loaded_preferences_successfully = load_preferences(C) + if(loaded_preferences_successfully) + if(load_character(C)) + return + //we couldn't load character data so just randomize the character appearance + name + random_character() //let's create a random character then - rather than a fat, bald and naked man. + real_name = random_name(gender) + if(!loaded_preferences_successfully) + save_preferences(C) + save_character(C) //let's save this new random character so it doesn't keep generating new ones. + +/datum/preferences/proc/color_square(r, g, b) + return "___" + +// Hello I am a proc full of snowflake species checks how are you +/datum/preferences/proc/ShowChoices(mob/user) + if(!user || !user.client) + return + update_preview_icon() + user << browse_rsc(preview_icon_front, "previewicon.png") + user << browse_rsc(preview_icon_side, "previewicon2.png") + + var/dat = "" + dat += "
      " + dat += "Character Settings" + dat += "Game Preferences" + dat += "Loadout" + dat += "
      " + dat += "
      " + + switch(current_tab) + if(TAB_CHAR) // Character Settings + dat += "
      " + dat += "
      " + dat += "Name: " + dat += "[real_name]" + dat += "(Randomize)" + dat += "(Always Randomize)
      " + dat += "
      " + dat += "
      " + dat += "Slot [slot_name] - " + dat += "Load slot - " + dat += "Save slot - " + dat += "Reload slot" + dat += "
      " + dat += "
      " + dat += "
      " + dat += "

      Identity

      " + if(appearance_isbanned(user)) + dat += "You are banned from using custom names and appearances. \ + You can continue to adjust your characters, but you will be randomised once you join the game.\ +
      " + dat += "Gender: [gender == MALE ? "Male" : "Female"]
      " + dat += "Age: [age]
      " + dat += "Body: (®)
      " + dat += "Species: [species]
      " + if(species == "Vox") + dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]
      " + dat += "Secondary Language: [language]
      " + dat += "Blood Type: [b_type]
      " + if(species in list("Human", "Drask", "Vox")) + dat += "Skin Tone: [species == "Vox" ? "[s_tone]" : "[-s_tone + 35]/220"]
      " + dat += "Disabilities: \[Set\]
      " + dat += "Nanotrasen Relation: [nanotrasen_relation]
      " + dat += "Set Flavor Text
      " + if(lentext(flavor_text) <= 40) + if(!lentext(flavor_text)) dat += "\[...\]
      " + else dat += "[flavor_text]
      " + else dat += "[TextPreview(flavor_text)]...
      " + + dat += "

      Hair & Accessories

      " + + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + var/headaccessoryname = "Head Accessory: " + if(species == "Unathi") + headaccessoryname = "Horns: " + dat += "[headaccessoryname]" + dat += "[ha_style] " + dat += "Color [color_square(r_headacc, g_headacc, b_headacc)]
      " + + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings. + dat += "Body Markings: " + dat += "[m_style]" + dat += "Color [color_square(r_markings, g_markings, b_markings)]
      " + + dat += "Hair: " + dat += "[h_style]" + dat += "Color [color_square(r_hair, g_hair, b_hair)]
      " + + dat += "Facial Hair: " + dat += "[f_style ? "[f_style]" : "Shaved"]" + dat += "Color [color_square(r_facial, g_facial, b_facial)]
      " + + if(species != "Machine") + dat += "Eyes: " + dat += "Color [color_square(r_eyes, g_eyes, b_eyes)]
      " + + if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins + dat += "Body Color: " + dat += "Color [color_square(r_skin, g_skin, b_skin)]
      " + + if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) + dat += "Body Accessory: " + dat += "[body_accessory ? "[body_accessory]" : "None"]
      " + + dat += "
      " + dat += "

      Occupation Choices

      " + dat += "Set Occupation Preferences
      " + if(jobban_isbanned(user, "Records")) + dat += "You are banned from using character records.
      " + else + dat += "Character Records
      " + + dat += "

      Limbs

      " + dat += "Limbs and Parts: Adjust
      " + if(species != "Slime People" && species != "Machine") + dat += "Internal Organs: Adjust
      " + + //display limbs below + var/ind = 0 + for(var/name in organ_data) + var/status = organ_data[name] + var/organ_name = null + switch(name) + if("chest") organ_name = "torso" + if("groin") organ_name = "lower body" + if("head") organ_name = "head" + if("l_arm") organ_name = "left arm" + if("r_arm") organ_name = "right arm" + if("l_leg") organ_name = "left leg" + if("r_leg") organ_name = "right leg" + if("l_foot") organ_name = "left foot" + if("r_foot") organ_name = "right foot" + if("l_hand") organ_name = "left hand" + if("r_hand") organ_name = "right hand" + if("heart") organ_name = "heart" + if("eyes") organ_name = "eyes" + + if(status in list("cyborg", "amputated", "mechanical", "assisted")) + ++ind + if(ind > 1) dat += ", " + + switch(status) + if("cyborg") + var/datum/robolimb/R + if(rlimb_data[name] && all_robolimbs[rlimb_data[name]]) + R = all_robolimbs[rlimb_data[name]] + else + R = basic_robolimb + dat += "\t[R.company] [organ_name] prosthesis" + if("amputated") dat += "\tAmputated [organ_name]" + if("mechanical") dat += "\tMechanical [organ_name]" + if("assisted") + switch(organ_name) + if("heart") dat += "\tPacemaker-assisted [organ_name]" + if("voicebox") dat += "\tSurgically altered [organ_name]" + if("eyes") dat += "\tRetinal overlayed [organ_name]" + else dat += "\tMechanically assisted [organ_name]" + if(!ind) dat += "\[...\]
      " + else dat += "
      " + + dat += "

      Clothing

      " + dat += "Underwear: [underwear]
      " + dat += "Undershirt: [undershirt]
      " + dat += "Socks: [socks]
      " + dat += "Backpack Type: [backbaglist[backbag]]
      " + + dat += "
      " + + if(TAB_GAME) // General Preferences + dat += "
      " + dat += "

      General Settings

      " + dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
      " + dat += "Ghost-Item Attack Animation: [(show_ghostitem_attack) ? "Yes" : "No"]
      " + dat += "Custom UI settings:
      " + dat += " - UI Style: [UI_style]
      " + dat += " - Color: [UI_style_color]
      __

      " + dat += " - Alpha (transparency): [UI_style_alpha]
      " + dat += "
      " + dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
      " + dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
      " + if(user.client.holder) + dat += "Adminhelp sound: " + dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
      " + + if(check_rights(R_ADMIN,0)) + dat += "OOC:     Change
      " + if(config.allow_Metadata) + dat += "OOC notes: Edit
      " + if(unlock_content) + dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
      " + + dat += "Randomized character slot: [randomslot ? "Yes" : "No"]
      " + dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
      " + dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
      " + dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
      " + + dat += "
      " + dat += "

      Special Role Settings

      " + if(jobban_isbanned(user, "Syndicate")) + dat += "You are banned from special roles." + be_special = list() + else + for(var/i in special_roles) + if(jobban_isbanned(user, i)) + dat += "Be [capitalize(i)]: \[BANNED]
      " + else if(!player_old_enough_antag(user.client,i)) + var/available_in_days_antag = available_in_days_antag(user.client,i) + dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS]
      " + else + dat += "Be [capitalize(i)]: [(i in src.be_special) ? "Yes" : "No"]
      " + dat += "
      " + + if(TAB_GEAR) + var/total_cost = 0 + var/list/type_blacklist = list() + if(gear && gear.len) + for(var/i = 1, i <= gear.len, i++) + var/datum/gear/G = gear_datums[gear[i]] + if(G) + if(!G.subtype_cost_overlap) + if(G.subtype_path in type_blacklist) + continue + type_blacklist += G.subtype_path + total_cost += G.cost + + var/fcolor = "#3366CC" + if(total_cost < MAX_GEAR_COST) + fcolor = "#E67300" + dat += "" + dat += "" + dat += "" + + var/datum/loadout_category/LC = loadout_categories[gear_tab] + dat += "" + dat += "" + dat += "" + for(var/gear_name in LC.gear) + var/datum/gear/G = LC.gear[gear_name] + var/ticked = (G.display_name in gear) + dat += "" + dat += "" + if(G.allowed_roles) + dat += "" + dat += "" + if(ticked) + . += "" + dat += "
      [total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\]
      " + + var/firstcat = 1 + for(var/category in loadout_categories) + if(firstcat) + firstcat = 0 + else + dat += " |" + if(category == gear_tab) + dat += " [category] " + else + dat += " [category] " + dat += "

      [LC.category]

      [G.display_name][G.cost]Restrictions: " + for(var/role in G.allowed_roles) + dat += role + " " + dat += "[G.description]
      " + for(var/datum/gear_tweak/tweak in G.gear_tweaks) + . += " [tweak.get_contents(get_tweak_metadata(G, tweak))]" + . += "
      " + + dat += "
      " + if(!IsGuestKey(user.key)) + dat += "Undo - " + dat += "Save Setup - " + + dat += "Reset Setup" + dat += "
      " + + var/datum/browser/popup = new(user, "preferences", "
      Character Setup
      ", 820, 640) + popup.set_content(dat) + popup.open(0) + + +/datum/preferences/proc/get_gear_metadata(var/datum/gear/G) + . = gear[G.display_name] + if(!.) + . = list() + gear[G.display_name] = . + +/datum/preferences/proc/get_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak) + var/list/metadata = get_gear_metadata(G) + . = metadata["[tweak]"] + if(!.) + . = tweak.get_default() + metadata["[tweak]"] = . + +/datum/preferences/proc/set_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak, var/new_metadata) + var/list/metadata = get_gear_metadata(G) + metadata["[tweak]"] = new_metadata + + +/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790) + if(!job_master) + return + + //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice. + //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice. + //width - Screen' width. Defaults to 550 to make it look nice. + //height - Screen's height. Defaults to 500 to make it look nice. + + + var/HTML = "" + HTML += "
      " + HTML += "Choose occupation chances
      Unavailable occupations are crossed out.

      " + HTML += "
      \[Done\]

      " // Easier to press up here. + HTML += "
      Left-click to raise an occupation preference, right-click to lower it.
      " + HTML += "" + HTML += "
      " // Table within a table for alignment, also allows you to easily add more colomns. + HTML += "" + var/index = -1 + + //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. + var/datum/job/lastJob + if (!job_master) return + for(var/datum/job/job in job_master.occupations) + + if(job.admin_only) + continue + + index += 1 + if((index >= limit) || (job.title in splitJobs)) + if((index < limit) && (lastJob != null)) + //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with + //the last job's selection color. Creating a rather nice effect. + for(var/i = 0, i < (limit - index), i += 1) + HTML += "" + HTML += "
        
      " + index = 0 + + HTML += "" + continue + if(jobban_isbanned(user, rank)) + HTML += "[rank]" + continue + if(!job.player_old_enough(user.client)) + var/available_in_days = job.available_in_days(user.client) + HTML += "[rank]" + continue + if((job_support_low & CIVILIAN) && (rank != "Civilian")) + HTML += "[rank]" + continue + if((rank in command_positions) || (rank == "AI"))//Bold head jobs + HTML += "[rank]" + else + HTML += "[rank]" + + HTML += "" + HTML += "" + continue +/* + if(GetJobDepartment(job, 1) & job.flag) + HTML += " \[High]" + else if(GetJobDepartment(job, 2) & job.flag) + HTML += " \[Medium]" + else if(GetJobDepartment(job, 3) & job.flag) + HTML += " \[Low]" + else + HTML += " \[NEVER]" + */ + HTML += "[prefLevelLabel]" + + if(job.alt_titles) + HTML += "
      \[[GetPlayerAltTitle(job)]\]" + + + HTML += "" + + for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even + HTML += "" + + HTML += "
      " + var/rank = job.title + lastJob = job + if(!is_job_whitelisted(user, rank)) + HTML += "[rank] \[KARMA]
      \[BANNED]
      \[IN [(available_in_days)] DAYS]
      " + + var/prefLevelLabel = "ERROR" + var/prefLevelColor = "pink" + var/prefUpperLevel = -1 // level to assign on left click + var/prefLowerLevel = -1 // level to assign on right click + + if(GetJobDepartment(job, 1) & job.flag) + prefLevelLabel = "High" + prefLevelColor = "slateblue" + prefUpperLevel = 4 + prefLowerLevel = 2 + else if(GetJobDepartment(job, 2) & job.flag) + prefLevelLabel = "Medium" + prefLevelColor = "green" + prefUpperLevel = 1 + prefLowerLevel = 3 + else if(GetJobDepartment(job, 3) & job.flag) + prefLevelLabel = "Low" + prefLevelColor = "orange" + prefUpperLevel = 2 + prefLowerLevel = 4 + else + prefLevelLabel = "NEVER" + prefLevelColor = "red" + prefUpperLevel = 3 + prefLowerLevel = 1 + + + HTML += "" + +// HTML += "" + + if(rank == "Civilian")//Civilian is special + if(job_support_low & CIVILIAN) + HTML += " \[Yes]" + else + HTML += " \[No]" + if(job.alt_titles) + HTML += "
      \[[GetPlayerAltTitle(job)]\]
        
      " + + HTML += "
      " + + switch(alternate_option) + if(GET_RANDOM_JOB) + HTML += "

      Get random job if preferences unavailable

      " + if(BE_CIVILIAN) + HTML += "

      Be a civilian if preferences unavailable

      " + if(RETURN_TO_LOBBY) + HTML += "

      Return to lobby if preferences unavailable

      " + + HTML += "
      \[Reset\]
      " + HTML += "
      " + + user << browse(null, "window=preferences") +// user << browse(HTML, "window=mob_occupation;size=[width]x[height]") + var/datum/browser/popup = new(user, "mob_occupation", "
      Occupation Preferences
      ", width, height) + popup.set_window_options("can_close=0") + popup.set_content(HTML) + popup.open(0) + return + +/datum/preferences/proc/SetJobPreferenceLevel(var/datum/job/job, var/level) + if (!job) + return 0 + + if (level == 1) // to high + // remove any other job(s) set to high + job_support_med |= job_support_high + job_engsec_med |= job_engsec_high + job_medsci_med |= job_medsci_high + job_karma_med |= job_karma_high + job_support_high = 0 + job_engsec_high = 0 + job_medsci_high = 0 + job_karma_high = 0 + + if (job.department_flag == SUPPORT) + job_support_low &= ~job.flag + job_support_med &= ~job.flag + job_support_high &= ~job.flag + + switch(level) + if (1) + job_support_high |= job.flag + if (2) + job_support_med |= job.flag + if (3) + job_support_low |= job.flag + + return 1 + else if (job.department_flag == ENGSEC) + job_engsec_low &= ~job.flag + job_engsec_med &= ~job.flag + job_engsec_high &= ~job.flag + + switch(level) + if (1) + job_engsec_high |= job.flag + if (2) + job_engsec_med |= job.flag + if (3) + job_engsec_low |= job.flag + + return 1 + else if (job.department_flag == MEDSCI) + job_medsci_low &= ~job.flag + job_medsci_med &= ~job.flag + job_medsci_high &= ~job.flag + + switch(level) + if (1) + job_medsci_high |= job.flag + if (2) + job_medsci_med |= job.flag + if (3) + job_medsci_low |= job.flag + + return 1 + else if (job.department_flag == KARMA) + job_karma_low &= ~job.flag + job_karma_med &= ~job.flag + job_karma_high &= ~job.flag + + switch(level) + if (1) + job_karma_high |= job.flag + if (2) + job_karma_med |= job.flag + if (3) + job_karma_low |= job.flag + + return 1 + + return 0 + +/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl) + var/datum/job/job = job_master.GetJob(role) + + if(!job) + user << browse(null, "window=mob_occupation") + ShowChoices(user) + return + + if (!isnum(desiredLvl)) + to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!") + ShowChoices(user) + return + + if(role == "Civilian") + if(job_support_low & job.flag) + job_support_low &= ~job.flag + else + job_support_low |= job.flag + SetChoices(user) + return 1 + + SetJobPreferenceLevel(job, desiredLvl) + SetChoices(user) + + return 1 + +/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label) + if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")) + return "
    3. [species] cannot be fat.
    4. " + return "
    5. [label]: [disabilities & flag ? "Yes" : "No"]
    6. " + +/datum/preferences/proc/SetDisabilities(mob/user) + var/HTML = "" + + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += "
      " + HTML += {"
      + Choose disabilities
        "} + // END AUTOFIX + HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind") + HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute") + + + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += "
      " + HTML += {" + \[Done\] + \[Reset\] +
      "} + // END AUTOFIX + user << browse(null, "window=preferences") + user << browse(HTML, "window=disabil;size=350x300") + return + +/datum/preferences/proc/SetRecords(mob/user) + var/HTML = "" + HTML += "
      " + HTML += "Set Character Records
      " + + HTML += "Medical Records
      " + + if(lentext(med_record) <= 40) + HTML += "[med_record]" + else + HTML += "[copytext(med_record, 1, 37)]..." + + HTML += "

      Employment Records
      " + + if(lentext(gen_record) <= 40) + HTML += "[gen_record]" + else + HTML += "[copytext(gen_record, 1, 37)]..." + + HTML += "

      Security Records
      " + + if(lentext(sec_record) <= 40) + HTML += "[sec_record]
      " + else + HTML += "[copytext(sec_record, 1, 37)]...
      " + + HTML += "
      " + HTML += "\[Done\]" + HTML += "
      " + + user << browse(null, "window=preferences") + user << browse(HTML, "window=records;size=350x300") + return + +/datum/preferences/proc/GetPlayerAltTitle(datum/job/job) + return player_alt_titles.Find(job.title) > 0 \ + ? player_alt_titles[job.title] \ + : job.title + +/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title) + // remove existing entry + if(player_alt_titles.Find(job.title)) + player_alt_titles -= job.title + // add one if it's not default + if(job.title != new_title) + player_alt_titles[job.title] = new_title + +/datum/preferences/proc/SetJob(mob/user, role) + var/datum/job/job = job_master.GetJob(role) + if(!job) + user << browse(null, "window=mob_occupation") + ShowChoices(user) + return + + if(role == "Civilian") + if(job_support_low & job.flag) + job_support_low &= ~job.flag + else + job_support_low |= job.flag + SetChoices(user) + return 1 + + if(GetJobDepartment(job, 1) & job.flag) + SetJobDepartment(job, 1) + else if(GetJobDepartment(job, 2) & job.flag) + SetJobDepartment(job, 2) + else if(GetJobDepartment(job, 3) & job.flag) + SetJobDepartment(job, 3) + else//job = Never + SetJobDepartment(job, 4) + + SetChoices(user) + return 1 + +/datum/preferences/proc/ResetJobs() + job_support_high = 0 + job_support_med = 0 + job_support_low = 0 + + job_medsci_high = 0 + job_medsci_med = 0 + job_medsci_low = 0 + + job_engsec_high = 0 + job_engsec_med = 0 + job_engsec_low = 0 + + job_karma_high = 0 + job_karma_med = 0 + job_karma_low = 0 + + +/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(job.department_flag) + if(SUPPORT) + switch(level) + if(1) + return job_support_high + if(2) + return job_support_med + if(3) + return job_support_low + if(MEDSCI) + switch(level) + if(1) + return job_medsci_high + if(2) + return job_medsci_med + if(3) + return job_medsci_low + if(ENGSEC) + switch(level) + if(1) + return job_engsec_high + if(2) + return job_engsec_med + if(3) + return job_engsec_low + if(KARMA) + switch(level) + if(1) + return job_karma_high + if(2) + return job_karma_med + if(3) + return job_karma_low + return 0 + +/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(level) + if(1)//Only one of these should ever be active at once so clear them all here + job_support_high = 0 + job_medsci_high = 0 + job_engsec_high = 0 + job_karma_high = 0 + return 1 + if(2)//Set current highs to med, then reset them + job_support_med |= job_support_high + job_medsci_med |= job_medsci_high + job_engsec_med |= job_engsec_high + job_karma_med |= job_karma_high + job_support_high = 0 + job_medsci_high = 0 + job_engsec_high = 0 + job_karma_high = 0 + + switch(job.department_flag) + if(SUPPORT) + switch(level) + if(2) + job_support_high = job.flag + job_support_med &= ~job.flag + if(3) + job_support_med |= job.flag + job_support_low &= ~job.flag + else + job_support_low |= job.flag + if(MEDSCI) + switch(level) + if(2) + job_medsci_high = job.flag + job_medsci_med &= ~job.flag + if(3) + job_medsci_med |= job.flag + job_medsci_low &= ~job.flag + else + job_medsci_low |= job.flag + if(ENGSEC) + switch(level) + if(2) + job_engsec_high = job.flag + job_engsec_med &= ~job.flag + if(3) + job_engsec_med |= job.flag + job_engsec_low &= ~job.flag + else + job_engsec_low |= job.flag + if(KARMA) + switch(level) + if(2) + job_karma_high = job.flag + job_karma_med &= ~job.flag + if(3) + job_karma_med |= job.flag + job_karma_low &= ~job.flag + else + job_karma_low |= job.flag + return 1 + +/datum/preferences/proc/process_link(mob/user, list/href_list) + if(!user) return + + if(href_list["preference"] == "job") + switch(href_list["task"]) + if("close") + user << browse(null, "window=mob_occupation") + ShowChoices(user) + if("reset") + ResetJobs() + SetChoices(user) + if("random") + if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN) + alternate_option += 1 + else if(alternate_option == RETURN_TO_LOBBY) + alternate_option = 0 + else + return 0 + SetChoices(user) + if ("alt_title") + var/datum/job/job = locate(href_list["job"]) + if (job) + var/choices = list(job.title) + job.alt_titles + var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null + if(choice) + SetPlayerAltTitle(job, choice) + SetChoices(user) + if("input") + SetJob(user, href_list["text"]) + if("setJobLevel") + UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) + else + SetChoices(user) + return 1 + else if(href_list["preference"] == "disabilities") + + switch(href_list["task"]) + if("close") + user << browse(null, "window=disabil") + ShowChoices(user) + if("reset") + disabilities=0 + SetDisabilities(user) + if("input") + var/dflag=text2num(href_list["disability"]) + if(dflag >= 0) + if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))) + disabilities ^= text2num(href_list["disability"]) //MAGIC + SetDisabilities(user) + else + SetDisabilities(user) + return 1 + + else if(href_list["preference"] == "records") + if(text2num(href_list["record"]) >= 1) + SetRecords(user) + return + else + user << browse(null, "window=records") + if(href_list["task"] == "med_record") + var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message + + if(medmsg != null) + medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) + medmsg = html_encode(medmsg) + + med_record = medmsg + SetRecords(user) + + if(href_list["task"] == "sec_record") + var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message + + if(secmsg != null) + secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) + secmsg = html_encode(secmsg) + + sec_record = secmsg + SetRecords(user) + if(href_list["task"] == "gen_record") + var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message + + if(genmsg != null) + genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN) + genmsg = html_encode(genmsg) + + gen_record = genmsg + SetRecords(user) + + if(href_list["preference"] == "gear") + if(href_list["toggle_gear"]) + var/datum/gear/TG = gear_datums[href_list["toggle_gear"]] + if(TG.display_name in gear) + gear -= TG.display_name + else + var/total_cost = 0 + var/list/type_blacklist = list() + for(var/gear_name in gear) + var/datum/gear/G = gear_datums[gear_name] + if(istype(G)) + if(!G.subtype_cost_overlap) + if(G.subtype_path in type_blacklist) + continue + type_blacklist += G.subtype_path + total_cost += G.cost + + if((total_cost + TG.cost) <= MAX_GEAR_COST) + gear += TG.display_name + + else if(href_list["gear"] && href_list["tweak"]) + var/datum/gear/gear = gear_datums[href_list["gear"]] + var/datum/gear_tweak/tweak = locate(href_list["tweak"]) + if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks)) + return + var/metadata = tweak.get_metadata(user, get_tweak_metadata(gear, tweak)) + if(!metadata || !CanUseTopic(user)) + return + set_tweak_metadata(gear, tweak, metadata) + else if(href_list["select_category"]) + gear_tab = href_list["select_category"] + else if(href_list["clear_loadout"]) + gear.Cut() + + ShowChoices(user) + return + + switch(href_list["task"]) + if("random") + switch(href_list["preference"]) + if("name") + real_name = random_name(gender,species) + if("age") + age = rand(AGE_MIN, AGE_MAX) + if("hair") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + r_hair = rand(0,255) + g_hair = rand(0,255) + b_hair = rand(0,255) + if("h_style") + h_style = random_hair_style(gender, species) + if("facial") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + r_facial = rand(0,255) + g_facial = rand(0,255) + b_facial = rand(0,255) + if("f_style") + f_style = random_facial_hair_style(gender, species) + if("underwear") + underwear = random_underwear(gender) + ShowChoices(user) + if("undershirt") + undershirt = random_undershirt(gender) + ShowChoices(user) + if("socks") + socks = random_socks(gender) + ShowChoices(user) + if("eyes") + r_eyes = rand(0,255) + g_eyes = rand(0,255) + b_eyes = rand(0,255) + if("s_tone") + if(species in list("Human", "Drask", "Vox")) + s_tone = random_skin_tone() + if("s_color") + if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine")) + r_skin = rand(0,255) + g_skin = rand(0,255) + b_skin = rand(0,255) + if("bag") + backbag = rand(1,4) + /*if("skin_style") + h_style = random_skin_style(gender)*/ + if("all") + random_character() + if("input") + switch(href_list["preference"]) + if("name") + var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null + if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) + var/new_name = reject_bad_name(raw_name) + if(new_name) + real_name = new_name + else + to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .") + + if("age") + var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null + if(new_age) + age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) + if("species") + + var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") + var/prev_species = species +// var/whitelisted = 0 + + if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! + for(var/S in whitelisted_species) + if(is_alien_whitelisted(user,S)) + new_species += S +// whitelisted = 1 +// if(!whitelisted) +// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.") + else //Not using the whitelist? Aliens for everyone! + new_species += whitelisted_species + + species = input("Please select a species", "Character Generation", null) in new_species + + if(prev_species != species) + //grab one of the valid hair styles for the newly chosen species + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + + if(valid_hairstyles.len) + h_style = pick(valid_hairstyles) + else + //this shouldn't happen + h_style = hair_styles_list["Bald"] + + //grab one of the valid facial hair styles for the newly chosen species + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + if(valid_facialhairstyles.len) + f_style = pick(valid_facialhairstyles) + else + //this shouldn't happen + f_style = facial_hair_styles_list["Shaved"] + + // Don't wear another species' underwear! + var/datum/sprite_accessory/S = underwear_list[underwear] + if(!(species in S.species_allowed)) + underwear = random_underwear(gender, species) + + S = undershirt_list[undershirt] + if(!(species in S.species_allowed)) + undershirt = random_undershirt(gender, species) + + S = socks_list[socks] + if(!(species in S.species_allowed)) + socks = random_socks(gender, species) + + //reset hair colour and skin colour + r_hair = 0//hex2num(copytext(new_hair, 2, 4)) + g_hair = 0//hex2num(copytext(new_hair, 4, 6)) + b_hair = 0//hex2num(copytext(new_hair, 6, 8)) + + s_tone = 0 + + if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine"))) + r_skin = 0 + g_skin = 0 + b_skin = 0 + + ha_style = "None" // No Vulp ears on Unathi + m_style = "None" // No Unathi markings on Tajara + + body_accessory = null //no vulptail on humans damnit + + //Reset prosthetics. + organ_data = list() + rlimb_data = list() + if("speciesprefs")//oldvox code + speciesprefs = !speciesprefs + + if("language") +// var/languages_available + var/list/new_languages = list("None") +/* + if(config.usealienwhitelist) + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED )))) + new_languages += lang + languages_available = 1 + + if(!(languages_available)) + alert(user, "There are not currently any available secondary languages.") + else +*/ + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if(!(lang.flags & RESTRICTED)) + new_languages += lang.name + + language = input("Please select a secondary language", "Character Generation", null) in new_languages + + if("metadata") + var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null + if(new_metadata) + metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN)) + + if("b_type") + var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" ) + if(new_b_type) + b_type = new_b_type + + if("hair") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + var/input = "Choose your character's hair colour:" + var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null + if(new_hair) + r_hair = hex2num(copytext(new_hair, 2, 4)) + g_hair = hex2num(copytext(new_hair, 4, 6)) + b_hair = hex2num(copytext(new_hair, 6, 8)) + + if("h_style") + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(species == "Machine") //Species that can use prosthetic heads. + var/obj/item/organ/external/head/H = new() + if(S.name == "Bald") + valid_hairstyles[hairstyle] = S + if(!rlimb_data["head"]) //Handle situations where the head is default. + H.model = "Morpheus Cyberkinetics" + else + H.model = rlimb_data["head"] + var/datum/robolimb/robohead = all_robolimbs[H.model] + if(species in S.species_allowed) + if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head + //and said head is in the hair style's allowed models list... + valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle. + continue + else + if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles). + continue + else if(!robohead.is_monitor && ("Human" in S.species_allowed)) + valid_hairstyles[hairstyle] = S + continue + else + if(!(species in S.species_allowed)) + continue + + valid_hairstyles[hairstyle] = S + + var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles + if(new_h_style) + h_style = new_h_style + + if("headaccessory") + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories. + var/input = "Choose the colour of your your character's head accessory:" + var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null + if(new_head_accessory) + r_headacc = hex2num(copytext(new_head_accessory, 2, 4)) + g_headacc = hex2num(copytext(new_head_accessory, 4, 6)) + b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) + + if("ha_style") + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories. + var/list/valid_head_accessory_styles = list() + for(var/head_accessory_style in head_accessory_styles_list) + var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style] + if(!(species in H.species_allowed)) + continue + + valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style] + + var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles + if(new_head_accessory_style) + ha_style = new_head_accessory_style + + if("markings") + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings. + var/input = "Choose the colour of your your character's markings:" + var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null + if(new_markings) + r_markings = hex2num(copytext(new_markings, 2, 4)) + g_markings = hex2num(copytext(new_markings, 4, 6)) + b_markings = hex2num(copytext(new_markings, 6, 8)) + + if("m_style") + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings. + var/list/valid_markings = list() + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if(!(species in M.species_allowed)) + continue + + if(species == "Machine") //Species that can use prosthetic heads. + var/obj/item/organ/external/head/H = new() + if(!rlimb_data["head"]) //Handle situations where the head is default. + H.model = "Morpheus Cyberkinetics" + else + H.model = rlimb_data["head"] + var/datum/robolimb/robohead = all_robolimbs[H.model] + if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings. + continue + else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip. + if(!(robohead.company in M.models_allowed)) + continue + + valid_markings[markingstyle] = marking_styles_list[markingstyle] + + var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings + if(new_marking_style) + m_style = new_marking_style + + if("body_accessory") + var/list/possible_body_accessories = list() + if(check_rights(R_ADMIN, 1, user)) + possible_body_accessories = body_accessory_by_name.Copy() + else + for(var/B in body_accessory_by_name) + var/datum/body_accessory/accessory = body_accessory_by_name[B] + if(!istype(accessory)) + possible_body_accessories += "None" //the only null entry should be the "None" option + continue + if(species in accessory.allowed_species) + possible_body_accessories += B + + var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories + if(new_body_accessory) + body_accessory = (new_body_accessory == "None") ? null : new_body_accessory + + if("facial") + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null + if(new_facial) + r_facial = hex2num(copytext(new_facial, 2, 4)) + g_facial = hex2num(copytext(new_facial, 4, 6)) + b_facial = hex2num(copytext(new_facial, 6, 8)) + + if("f_style") + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(S.name == "Shaved") + valid_facialhairstyles[facialhairstyle] = S + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(species == "Machine") //Species that can use prosthetic heads. + var/obj/item/organ/external/head/H = new() + if(!rlimb_data["head"]) //Handle situations where the head is default. + H.model = "Morpheus Cyberkinetics" + else + H.model = rlimb_data["head"] + var/datum/robolimb/robohead = all_robolimbs[H.model] + if(species in S.species_allowed) + if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it. + valid_facialhairstyles[facialhairstyle] = S + continue + else + if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles). + continue + else if(!robohead.is_monitor && ("Human" in S.species_allowed)) + valid_facialhairstyles[facialhairstyle] = S + continue + else + if(!(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles + if(new_f_style) + f_style = new_f_style + + if("underwear") + var/list/underwear_options + if(gender == MALE) + underwear_options = underwear_m + else + underwear_options = underwear_f + + var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options + if(new_underwear) + underwear = new_underwear + ShowChoices(user) + + if("undershirt") + var/new_undershirt + if(gender == MALE) + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m + else + new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f + if(new_undershirt) + undershirt = new_undershirt + ShowChoices(user) + + if("socks") + var/list/valid_sockstyles = list() + for(var/sockstyle in socks_list) + var/datum/sprite_accessory/S = socks_list[sockstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if(!(species in S.species_allowed)) + continue + valid_sockstyles[sockstyle] = socks_list[sockstyle] + var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles + ShowChoices(user) + if(new_socks) + socks = new_socks + + if("eyes") + var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null + if(new_eyes) + r_eyes = hex2num(copytext(new_eyes, 2, 4)) + g_eyes = hex2num(copytext(new_eyes, 4, 6)) + b_eyes = hex2num(copytext(new_eyes, 6, 8)) + + if("s_tone") + if(species == "Human" || species == "Drask") + var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null + if(new_s_tone) + s_tone = 35 - max(min(round(new_s_tone), 220), 1) + else if(species == "Vox") + var/skin_c = input(user, "Choose your Vox's skin color:\n(1 = Default Green, 2 = Dark Green, 3 = Brown, 4 = Grey, \n5 = Emerald, 6 = Azure)", "Character Preference") as num|null + if(skin_c) + s_tone = max(min(round(skin_c), 6), 1) + + if("skin") + if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) + var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null + if(new_skin) + r_skin = hex2num(copytext(new_skin, 2, 4)) + g_skin = hex2num(copytext(new_skin, 4, 6)) + b_skin = hex2num(copytext(new_skin, 6, 8)) + + + if("ooccolor") + var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null + if(new_ooccolor) + ooccolor = new_ooccolor + + if("bag") + var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist + if(new_backbag) + backbag = backbaglist.Find(new_backbag) + + if("nt_relation") + var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") + if(new_relation) + nanotrasen_relation = new_relation + + if("flavor_text") + var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message + + if(msg != null) + msg = copytext(msg, 1, MAX_MESSAGE_LEN) + msg = html_encode(msg) + + flavor_text = msg + + if("limbs") + var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") + if(species == "Machine") + valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") + var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs + if(!limb_name) return + + var/limb = null + var/second_limb = null // if you try to change the arm, the hand should also change + var/third_limb = null // if you try to unchange the hand, the arm should also change + var/valid_limb_states = list("Normal", "Amputated", "Prosthesis") + var/no_amputate = 0 + + switch(limb_name) + if("Torso") + limb = "chest" + second_limb = "groin" + no_amputate = 1 + if("Lower Body") + limb = "groin" + no_amputate = 1 + if("Head") + limb = "head" + no_amputate = 1 + if("Left Leg") + limb = "l_leg" + second_limb = "l_foot" + if("Right Leg") + limb = "r_leg" + second_limb = "r_foot" + if("Left Arm") + limb = "l_arm" + second_limb = "l_hand" + if("Right Arm") + limb = "r_arm" + second_limb = "r_hand" + if("Left Foot") + limb = "l_foot" + if(species != "Machine") + third_limb = "l_leg" + if("Right Foot") + limb = "r_foot" + if(species != "Machine") + third_limb = "r_leg" + if("Left Hand") + limb = "l_hand" + if(species != "Machine") + third_limb = "l_arm" + if("Right Hand") + limb = "r_hand" + if(species != "Machine") + third_limb = "r_arm" + + var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states + if(!new_state) return + + switch(new_state) + if("Normal") + if(limb == "head") + m_style = "None" + h_style = random_hair_style(gender, species) + f_style = facial_hair_styles_list["Shaved"] + organ_data[limb] = null + rlimb_data[limb] = null + if(third_limb) + organ_data[third_limb] = null + rlimb_data[third_limb] = null + if("Amputated") + if(!no_amputate) + organ_data[limb] = "amputated" + rlimb_data[limb] = null + if(second_limb) + organ_data[second_limb] = "amputated" + rlimb_data[second_limb] = null + if("Prosthesis") + var/choice + var/subchoice + var/datum/robolimb/R = new() + var/in_model + var/robolimb_companies = list() + for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products. + R = new limb_type() + if(!R.unavailable_at_chargen && (limb in R.parts) && R.has_subtypes) //Ensures users can only choose companies that offer the parts they want, that singular models get added to the list as well companies that offer more than one model, and... + robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for. + R = new() //Re-initialize R. + + choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants. + if(!choice) + return + R.company = choice + R = all_robolimbs[R.company] + if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it. + var/list/robolimb_models = list() + for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide. + var/datum/robolimb/L = new limb_type() + if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list. + robolimb_models[L.company] = L + if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option. + subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem. + if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later. + in_model = 1 + if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose. + subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models + if(subchoice) + choice = subchoice + if(limb == "head") + ha_style = "None" + h_style = hair_styles_list["Bald"] + f_style = facial_hair_styles_list["Shaved"] + m_style = "None" + rlimb_data[limb] = choice + organ_data[limb] = "cyborg" + if(second_limb) + if(subchoice) + if(in_model) + rlimb_data[second_limb] = choice + organ_data[second_limb] = "cyborg" + else + rlimb_data[second_limb] = choice + organ_data[second_limb] = "cyborg" + + if("organs") + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") + if(!organ_name) return + + var/organ = null + switch(organ_name) + if("Heart") + organ = "heart" + if("Eyes") + organ = "eyes" + + var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") + if(!new_state) return + + switch(new_state) + if("Normal") + organ_data[organ] = null + if("Assisted") + organ_data[organ] = "assisted" + if("Mechanical") + organ_data[organ] = "mechanical" + +/* + if("skin_style") + var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") + if(!skin_style_name) return +*/ + +/* if("spawnpoint") + var/list/spawnkeys = list() + for(var/S in spawntypes) + spawnkeys += S + var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys + if(!choice || !spawntypes[choice]) + spawnpoint = "Arrivals Shuttle" + return + spawnpoint = choice */ + + else + switch(href_list["preference"]) + if("publicity") + if(unlock_content) + toggles ^= MEMBER_PUBLIC + + if("gender") + if(gender == MALE) + gender = FEMALE + else + gender = MALE + underwear = random_underwear(gender) + + if("hear_adminhelps") + sound ^= SOUND_ADMINHELP + + if("ui") + switch(UI_style) + if("Midnight") + UI_style = "Plasmafire" + if("Plasmafire") + UI_style = "Retro" + if("Retro") + UI_style = "Slimecore" + if("Slimecore") + UI_style = "Operative" + if("Operative") + UI_style = "White" + else + UI_style = "Midnight" + + if(ishuman(usr)) //mid-round preference changes, for aesthetics + var/mob/living/carbon/human/H = usr + H.remake_hud() + + if("nanoui") + nanoui_fancy = !nanoui_fancy + + if("ghost_att_anim") + show_ghostitem_attack = !show_ghostitem_attack + + if("UIcolor") + var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null + if(!UI_style_color_new) return + UI_style_color = UI_style_color_new + + if(ishuman(usr)) //mid-round preference changes, for aesthetics + var/mob/living/carbon/human/H = usr + H.remake_hud() + + if("UIalpha") + var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num + if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return + UI_style_alpha = UI_style_alpha_new + + if(ishuman(usr)) //mid-round preference changes, for aesthetics + var/mob/living/carbon/human/H = usr + H.remake_hud() + + if("be_special") + var/r = href_list["role"] + if(!(r in special_roles)) + var/cleaned_r = sql_sanitize_text(r) + if(r != cleaned_r) // up to no good + message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") + to_chat(user, "Stop right there, criminal scum") + else + be_special ^= r + + if("name") + be_random_name = !be_random_name + + if("randomslot") + randomslot = !randomslot + + if("hear_midis") + sound ^= SOUND_MIDI + + if("lobby_music") + sound ^= SOUND_LOBBY + if(sound & SOUND_LOBBY) + user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) + else + user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) + + if("ghost_ears") + toggles ^= CHAT_GHOSTEARS + + if("ghost_sight") + toggles ^= CHAT_GHOSTSIGHT + + if("ghost_radio") + toggles ^= CHAT_GHOSTRADIO + + if("ghost_radio") + toggles ^= CHAT_GHOSTRADIO + + if("save") + save_preferences(user) + save_character(user) + + if("reload") + load_preferences(user) + load_character(user) + + if("open_load_dialog") + if(!IsGuestKey(user.key)) + open_load_dialog(user) + return 1 + + if("close_load_dialog") + close_load_dialog(user) + + if("changeslot") + if(!load_character(user,text2num(href_list["num"]))) + random_character() + real_name = random_name(gender) + save_character(user) + close_load_dialog(user) + + if("tab") + if (href_list["tab"]) + current_tab = text2num(href_list["tab"]) + + ShowChoices(user) + return 1 + +/datum/preferences/proc/copy_to(mob/living/carbon/human/character) + var/datum/species/S = all_species[species] + character.change_species(species) // Yell at me if this causes everything to melt + if(be_random_name) + real_name = random_name(gender,species) + + if(config.humans_need_surnames) + var/firstspace = findtext(real_name, " ") + var/name_length = length(real_name) + if(!firstspace) //we need a surname + real_name += " [pick(last_names)]" + else if(firstspace == name_length) + real_name += "[pick(last_names)]" + + character.add_language(language) + + character.real_name = real_name + character.dna.real_name = real_name + character.name = character.real_name + + character.flavor_text = flavor_text + if(character.ckey && !jobban_isbanned(character, "Records")) + character.med_record = med_record + character.sec_record = sec_record + character.gen_record = gen_record + + character.change_gender(gender) + character.age = age + character.b_type = b_type + + character.r_eyes = r_eyes + character.g_eyes = g_eyes + character.b_eyes = b_eyes + + //Head-specific + var/obj/item/organ/external/head/H = character.get_organ("head") + H.r_hair = r_hair + H.g_hair = g_hair + H.b_hair = b_hair + + H.r_facial = r_facial + H.g_facial = g_facial + H.b_facial = b_facial + + H.h_style = h_style + H.f_style = f_style + //End of head-specific. + + character.r_skin = r_skin + character.g_skin = g_skin + character.b_skin = b_skin + + character.s_tone = s_tone + + // Destroy/cyborgize organs + for(var/name in organ_data) + + var/status = organ_data[name] + var/obj/item/organ/external/O = character.organs_by_name[name] + if(O) + if(status == "amputated") + character.organs_by_name[O.limb_name] = null + character.organs -= O + if(O.children) // This might need to become recursive. + for(var/obj/item/organ/external/child in O.children) + character.organs_by_name[child.limb_name] = null + character.organs -= child + + else if(status == "cyborg") + if(rlimb_data[name]) + O.robotize(rlimb_data[name]) + else + O.robotize() + else + var/obj/item/organ/internal/I = character.get_int_organ_tag(name) + if(I) + if(status == "assisted") + I.mechassist() + else if(status == "mechanical") + I.robotize() + + character.dna.b_type = b_type + if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT) + character.dna.SetSEState(FATBLOCK,1,1) + character.mutations += FAT + character.mutations += OBESITY + character.overeatduration = 600 + + if(disabilities & DISABILITY_FLAG_NEARSIGHTED) + character.dna.SetSEState(GLASSESBLOCK,1,1) + character.disabilities|=NEARSIGHTED + + if(disabilities & DISABILITY_FLAG_EPILEPTIC) + character.dna.SetSEState(EPILEPSYBLOCK,1,1) + character.disabilities|=EPILEPSY + + if(disabilities & DISABILITY_FLAG_DEAF) + character.dna.SetSEState(DEAFBLOCK,1,1) + character.sdisabilities|=DEAF + + if(disabilities & DISABILITY_FLAG_BLIND) + character.dna.SetSEState(BLINDBLOCK,1,1) + character.sdisabilities|=BLIND + + if(disabilities & DISABILITY_FLAG_MUTE) + character.dna.SetSEState(MUTEBLOCK,1,1) + character.sdisabilities |= MUTE + + S.handle_dna(character) + + if(character.dna.dirtySE) + character.dna.UpdateSE() + domutcheck(character) + + // Wheelchair necessary? + var/obj/item/organ/external/l_foot = character.get_organ("l_foot") + var/obj/item/organ/external/r_foot = character.get_organ("r_foot") + if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) + var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc) + character.buckled = W + character.update_canmove() + W.dir = character.dir + W.buckled_mob = character + W.add_fingerprint(character) + + character.underwear = underwear + character.undershirt = undershirt + character.socks = socks + + if(character.species.bodyflags & HAS_HEAD_ACCESSORY) + H.r_headacc = r_headacc + H.g_headacc = g_headacc + H.b_headacc = b_headacc + H.ha_style = ha_style + if(character.species.bodyflags & HAS_MARKINGS) + character.r_markings = r_markings + character.g_markings = g_markings + character.b_markings = b_markings + character.m_style = m_style + + if(body_accessory) + character.body_accessory = body_accessory_by_name["[body_accessory]"] + + if(backbag > 4 || backbag < 1) + backbag = 1 //Same as above + character.backbag = backbag + + //Debugging report to track down a bug, which randomly assigned the plural gender to people. + if(character.gender in list(PLURAL, NEUTER)) + if(isliving(src)) //Ghosts get neuter by default + message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.") + character.change_gender(MALE) + + character.dna.ready_dna(character, flatten_SE = 0) + character.sync_organ_dna(assimilate=1) + character.UpdateAppearance() + + // Do the initial caching of the player's body icons. + character.force_update_limbs() + character.update_eyes() + character.regenerate_icons() + +/datum/preferences/proc/open_load_dialog(mob/user) + + var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot") + + var/dat = "" + dat += "
      " + dat += "Select a character slot to load
      " + var/name + + for(var/i=1, i<=max_save_slots, i++) + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") + message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") + return + while(query.NextRow()) + if(i==text2num(query.item[1])) + name = query.item[2] + if(!name) name = "Character[i]" + if(i==default_slot) + name = "[name]" + dat += "[name]
      " + name = null + + dat += "
      " + dat += "Close
      " + dat += "
      " +// user << browse(dat, "window=saves;size=300x390") + var/datum/browser/popup = new(user, "saves", "
      Character Saves
      ", 300, 390) + popup.set_content(dat) + popup.open(0) + +/datum/preferences/proc/close_load_dialog(mob/user) + user << browse(null, "window=saves") \ No newline at end of file diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm similarity index 98% rename from code/modules/client/preferences_mysql.dm rename to code/modules/client/preference/preferences_mysql.dm index 15abdab0360..6de5dcc3b51 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -158,7 +158,8 @@ nanotrasen_relation, speciesprefs, socks, - body_accessory + body_accessory, + gear FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"}) if(!query.Execute()) var/err = query.ErrorMsg() @@ -236,6 +237,7 @@ //socks socks = query.item[58] body_accessory = query.item[59] + gear = params2list(query.item[60]) //Sanitize metadata = sanitize_text(metadata, initial(metadata)) @@ -298,6 +300,7 @@ if(!player_alt_titles) player_alt_titles = new() if(!organ_data) src.organ_data = list() if(!rlimb_data) src.rlimb_data = list() + if(!gear) gear = list() return 1 @@ -305,12 +308,15 @@ var/organlist var/rlimblist var/playertitlelist + var/gearlist if(!isemptylist(organ_data)) organlist = list2params(organ_data) if(!isemptylist(rlimb_data)) rlimblist = list2params(rlimb_data) if(!isemptylist(player_alt_titles)) playertitlelist = list2params(player_alt_titles) + if(!isemptylist(gear)) + gearlist = list2params(gear) var/DBQuery/firstquery = dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot") firstquery.Execute() @@ -374,7 +380,8 @@ nanotrasen_relation='[nanotrasen_relation]', speciesprefs='[speciesprefs]', socks='[socks]', - body_accessory='[body_accessory]' + body_accessory='[body_accessory]', + gear='[gearlist]' WHERE ckey='[C.ckey]' AND slot='[default_slot]'"} ) @@ -405,7 +412,7 @@ flavor_text, med_record, sec_record, gen_record, player_alt_titles, disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, - socks, body_accessory) + socks, body_accessory, gear) VALUES ('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]', @@ -426,7 +433,7 @@ '[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]', '[playertitlelist]', '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]', - '[socks]', '[body_accessory]') + '[socks]', '[body_accessory]', '[gearlist]') "} ) diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preference/preferences_spawnpoints.dm similarity index 100% rename from code/modules/client/preferences_spawnpoints.dm rename to code/modules/client/preference/preferences_spawnpoints.dm diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm similarity index 96% rename from code/modules/client/preferences_toggles.dm rename to code/modules/client/preference/preferences_toggles.dm index f2b9400c92d..541dee07242 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -1,216 +1,216 @@ -//toggles -/client/verb/toggle_ghost_ears() - set name = "Show/Hide GhostEars" - set category = "Preferences" - set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" - prefs.toggles ^= CHAT_GHOSTEARS - to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") - prefs.save_preferences(src) - feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggle_ghost_sight() - set name = "Show/Hide GhostSight" - set category = "Preferences" - set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" - prefs.toggles ^= CHAT_GHOSTSIGHT - to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") - prefs.save_preferences(src) - feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggle_ghost_radio() - set name = "Enable/Disable GhostRadio" - set category = "Preferences" - set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers" - prefs.toggles ^= CHAT_GHOSTRADIO - to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].") - prefs.save_preferences(src) - feedback_add_details("admin_verb","TGR") - -/client/proc/toggle_hear_radio() - set name = "Show/Hide RadioChatter" - set category = "Preferences" - set desc = "Toggle seeing radiochatter from radios and speakers" - if(!holder) return - prefs.toggles ^= CHAT_RADIO - prefs.save_preferences(src) - to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers") - feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggleadminhelpsound() - set name = "Hear/Silence Adminhelps" - set category = "Preferences" - set desc = "Toggle hearing a notification when admin PMs are recieved" - if(!holder) return - prefs.sound ^= SOUND_ADMINHELP - prefs.save_preferences(src) - to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.") - feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/deadchat() // Deadchat toggle is usable by anyone. - set name = "Show/Hide Deadchat" - set category = "Preferences" - set desc ="Toggles seeing deadchat" - prefs.toggles ^= CHAT_DEAD - prefs.save_preferences(src) - - if(src.holder) - to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") - else - to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") - - feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/toggleprayers() - set name = "Show/Hide Prayers" - set category = "Preferences" - set desc = "Toggles seeing prayers" - prefs.toggles ^= CHAT_PRAYER - prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") - feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/togglescoreboard() - set name = "Hide/Display End Round Scoreboard" - set category = "Preferences" - set desc = "Toggles displaying end of round scoreboard" - prefs.toggles ^= DISABLE_SCOREBOARD - prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.") - feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/togglekarmareminder() - set name = "Hide/Display End Round Karma Reminder" - set category = "Preferences" - set desc = "Toggles displaying end of round karma reminder" - prefs.toggles ^= DISABLE_KARMA_REMINDER - prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.") - feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggletitlemusic() - set name = "Hear/Silence LobbyMusic" - set category = "Preferences" - set desc = "Toggles hearing the GameLobby music" - prefs.sound ^= SOUND_LOBBY - prefs.save_preferences(src) - if(prefs.sound & SOUND_LOBBY) - to_chat(src, "You will now hear music in the game lobby.") - if(istype(mob, /mob/new_player)) - playtitlemusic() - else - to_chat(src, "You will no longer hear music in the game lobby.") - if(istype(mob, /mob/new_player)) - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jamsz - - feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/togglemidis() - set name = "Hear/Silence Midis" - set category = "Preferences" - set desc = "Toggles hearing sounds uploaded by admins" - prefs.sound ^= SOUND_MIDI - prefs.save_preferences(src) - if(prefs.sound & SOUND_MIDI) - to_chat(src, "You will now hear any sounds uploaded by admins.") - else - var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777) - break_sound.priority = 250 - src << break_sound//breaks the client's sound output on channel 777 - - to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.") - feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/listen_ooc() - set name = "Show/Hide OOC" - set category = "Preferences" - set desc = "Toggles seeing OutOfCharacter chat" - prefs.toggles ^= CHAT_OOC - prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") - feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/listen_looc() - set name = "Show/Hide LOOC" - set category = "Preferences" - set desc = "Toggles seeing Local OutOfCharacter chat" - prefs.toggles ^= CHAT_LOOC - prefs.save_preferences(src) - to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") - feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful - set name = "Hear/Silence Ambience" - set category = "Preferences" - set desc = "Toggles hearing ambient sound effects" - prefs.sound ^= SOUND_AMBIENCE - prefs.save_preferences(src) - if(prefs.sound & SOUND_AMBIENCE) - to_chat(src, "You will now hear ambient sounds.") - else - to_chat(src, "You will no longer hear ambient sounds.") - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) - feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels. - set name = "Hear/Silence White Noise" - set category = "Preferences" - set desc = "Toggles hearing ambient white noise" - prefs.sound ^= SOUND_BUZZ - prefs.save_preferences(src) - if(prefs.sound & SOUND_BUZZ) - to_chat(src, "You will now hear ambient white noise.") - else - to_chat(src, "You will no longer hear ambient white noise.") - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) - feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/Toggle_Heartbeat() //to toggle off heartbeat sounds, in case they get too annoying - set name = "Hear/Silence Heartbeat" - set category = "Preferences" - set desc = "Toggles hearing heart beating sound effects" - prefs.sound ^= SOUND_HEARTBEAT - prefs.save_preferences(src) - if(prefs.sound & SOUND_HEARTBEAT) - to_chat(src, "You will now hear heartbeat sounds.") - else - to_chat(src, "You will no longer hear heartbeat sounds.") - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) - feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -// This needs a toggle because you people are awful and spammed terrible music -/client/verb/toggle_instruments() - set name = "Hear/Silence Instruments" - set category = "Preferences" - set desc = "Toggles hearing musical instruments like the violin and piano" - prefs.toggles ^= SOUND_INSTRUMENTS - prefs.save_preferences(src) - if(prefs.toggles & SOUND_INSTRUMENTS) - to_chat(src, "You will now hear people playing musical instruments.") - else - to_chat(src, "You will no longer hear musical instruments.") - feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggle_media() - set name = "Hear/Silence Streaming" - set category = "Preferences" - set desc = "Toggle hearing streaming media (radios, jukeboxes, etc)" - - prefs.sound ^= SOUND_STREAMING - prefs.save_preferences(src) - to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.") - if(!media) return - if(prefs.sound & SOUND_STREAMING) - media.update_music() - else - media.stop_music() - -/client/verb/setup_character() - set name = "Game Preferences" - set category = "Preferences" - set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will." - prefs.current_tab = 1 +//toggles +/client/verb/toggle_ghost_ears() + set name = "Show/Hide GhostEars" + set category = "Preferences" + set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" + prefs.toggles ^= CHAT_GHOSTEARS + to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") + prefs.save_preferences(src) + feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_ghost_sight() + set name = "Show/Hide GhostSight" + set category = "Preferences" + set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" + prefs.toggles ^= CHAT_GHOSTSIGHT + to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") + prefs.save_preferences(src) + feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_ghost_radio() + set name = "Enable/Disable GhostRadio" + set category = "Preferences" + set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers" + prefs.toggles ^= CHAT_GHOSTRADIO + to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].") + prefs.save_preferences(src) + feedback_add_details("admin_verb","TGR") + +/client/proc/toggle_hear_radio() + set name = "Show/Hide RadioChatter" + set category = "Preferences" + set desc = "Toggle seeing radiochatter from radios and speakers" + if(!holder) return + prefs.toggles ^= CHAT_RADIO + prefs.save_preferences(src) + to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers") + feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggleadminhelpsound() + set name = "Hear/Silence Adminhelps" + set category = "Preferences" + set desc = "Toggle hearing a notification when admin PMs are recieved" + if(!holder) return + prefs.sound ^= SOUND_ADMINHELP + prefs.save_preferences(src) + to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.") + feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/deadchat() // Deadchat toggle is usable by anyone. + set name = "Show/Hide Deadchat" + set category = "Preferences" + set desc ="Toggles seeing deadchat" + prefs.toggles ^= CHAT_DEAD + prefs.save_preferences(src) + + if(src.holder) + to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") + else + to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") + + feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/toggleprayers() + set name = "Show/Hide Prayers" + set category = "Preferences" + set desc = "Toggles seeing prayers" + prefs.toggles ^= CHAT_PRAYER + prefs.save_preferences(src) + to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") + feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/togglescoreboard() + set name = "Hide/Display End Round Scoreboard" + set category = "Preferences" + set desc = "Toggles displaying end of round scoreboard" + prefs.toggles ^= DISABLE_SCOREBOARD + prefs.save_preferences(src) + to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.") + feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/togglekarmareminder() + set name = "Hide/Display End Round Karma Reminder" + set category = "Preferences" + set desc = "Toggles displaying end of round karma reminder" + prefs.toggles ^= DISABLE_KARMA_REMINDER + prefs.save_preferences(src) + to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.") + feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggletitlemusic() + set name = "Hear/Silence LobbyMusic" + set category = "Preferences" + set desc = "Toggles hearing the GameLobby music" + prefs.sound ^= SOUND_LOBBY + prefs.save_preferences(src) + if(prefs.sound & SOUND_LOBBY) + to_chat(src, "You will now hear music in the game lobby.") + if(istype(mob, /mob/new_player)) + playtitlemusic() + else + to_chat(src, "You will no longer hear music in the game lobby.") + if(istype(mob, /mob/new_player)) + src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jamsz + + feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/togglemidis() + set name = "Hear/Silence Midis" + set category = "Preferences" + set desc = "Toggles hearing sounds uploaded by admins" + prefs.sound ^= SOUND_MIDI + prefs.save_preferences(src) + if(prefs.sound & SOUND_MIDI) + to_chat(src, "You will now hear any sounds uploaded by admins.") + else + var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777) + break_sound.priority = 250 + src << break_sound //breaks the client's sound output on channel 777 + + to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.") + feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/listen_ooc() + set name = "Show/Hide OOC" + set category = "Preferences" + set desc = "Toggles seeing OutOfCharacter chat" + prefs.toggles ^= CHAT_OOC + prefs.save_preferences(src) + to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") + feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/verb/listen_looc() + set name = "Show/Hide LOOC" + set category = "Preferences" + set desc = "Toggles seeing Local OutOfCharacter chat" + prefs.toggles ^= CHAT_LOOC + prefs.save_preferences(src) + to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") + feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful + set name = "Hear/Silence Ambience" + set category = "Preferences" + set desc = "Toggles hearing ambient sound effects" + prefs.sound ^= SOUND_AMBIENCE + prefs.save_preferences(src) + if(prefs.sound & SOUND_AMBIENCE) + to_chat(src, "You will now hear ambient sounds.") + else + to_chat(src, "You will no longer hear ambient sounds.") + src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) + feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels. + set name = "Hear/Silence White Noise" + set category = "Preferences" + set desc = "Toggles hearing ambient white noise" + prefs.sound ^= SOUND_BUZZ + prefs.save_preferences(src) + if(prefs.sound & SOUND_BUZZ) + to_chat(src, "You will now hear ambient white noise.") + else + to_chat(src, "You will no longer hear ambient white noise.") + src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) + feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/verb/Toggle_Heartbeat() //to toggle off heartbeat sounds, in case they get too annoying + set name = "Hear/Silence Heartbeat" + set category = "Preferences" + set desc = "Toggles hearing heart beating sound effects" + prefs.sound ^= SOUND_HEARTBEAT + prefs.save_preferences(src) + if(prefs.sound & SOUND_HEARTBEAT) + to_chat(src, "You will now hear heartbeat sounds.") + else + to_chat(src, "You will no longer hear heartbeat sounds.") + src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) + src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) + feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +// This needs a toggle because you people are awful and spammed terrible music +/client/verb/toggle_instruments() + set name = "Hear/Silence Instruments" + set category = "Preferences" + set desc = "Toggles hearing musical instruments like the violin and piano" + prefs.sound ^= SOUND_INSTRUMENTS + prefs.save_preferences(src) + if(prefs.sound & SOUND_INSTRUMENTS) + to_chat(src, "You will now hear people playing musical instruments.") + else + to_chat(src, "You will no longer hear musical instruments.") + feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_media() + set name = "Hear/Silence Streaming" + set category = "Preferences" + set desc = "Toggle hearing streaming media (radios, jukeboxes, etc)" + + prefs.sound ^= SOUND_STREAMING + prefs.save_preferences(src) + to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.") + if(!media) return + if(prefs.sound & SOUND_STREAMING) + media.update_music() + else + media.stop_music() + +/client/verb/setup_character() + set name = "Game Preferences" + set category = "Preferences" + set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will." + prefs.current_tab = 1 prefs.ShowChoices(usr) \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 87dd9f64022..ee77f3253e1 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -530,7 +530,7 @@ BLIND // can't see anything flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL item_state = "s_helmet" permeability_coefficient = 0.01 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT @@ -552,8 +552,8 @@ BLIND // can't see anything flags = STOPSPRESSUREDMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank) - slowdown = 2 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) + slowdown = 1 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT @@ -570,7 +570,7 @@ BLIND // can't see anything body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS permeability_coefficient = 0.90 slot_flags = SLOT_ICLOTHING - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/uniform.dmi', diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 5dc555a10d7..48e2ccb7f95 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -7,7 +7,7 @@ var/brightness_on = 4 //luminosity when on var/on = 0 item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite) - armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20) + armor = list(melee = 15, bullet = 5, laser = 20, energy = 10, bomb = 20, bio = 10, rad = 20) flags_inv = 0 action_button_name = "Toggle Helmet Light" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index a9e8bbdb7e2..17058cc23b5 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -4,7 +4,7 @@ icon_state = "helmetmaterials" flags = HEADCOVERSEYES | HEADBANGPROTECT item_state = "helmetmaterials" - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) flags_inv = HIDEEARS|HIDEEYES cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT @@ -69,7 +69,7 @@ desc = "A bulletproof helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." icon_state = "swat" item_state = "swat-alt" - armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0) + armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0) species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', @@ -82,7 +82,7 @@ icon_state = "riot" item_state = "helmet" flags = HEADCOVERSEYES | HEADCOVERSMOUTH | HEADBANGPROTECT - armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 41, bullet = 15, laser = 5, energy = 5, bomb = 5, bio = 2, rad = 0) flags_inv = HIDEEARS strip_delay = 80 @@ -91,9 +91,8 @@ desc = "A classic metal helmet." icon_state = "knight_green" item_state = "knight_green" - flags = BLOCKHAIR | HEADCOVERSEYES | HEADCOVERSMOUTH - armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) - flags_inv = HIDEMASK | HIDEEARS | HIDEEYES | HIDEFACE + flags = BLOCKHAIR|HEADCOVERSEYES|HEADCOVERSMOUTH + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE /obj/item/clothing/head/helmet/justice name = "helmet of justice" @@ -120,7 +119,7 @@ icon_state = "swat" flags = HEADCOVERSEYES item_state = "swat" - armor = list(melee = 80, bullet = 60, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20) flags_inv = HIDEEARS|HIDEEYES cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT @@ -145,7 +144,7 @@ icon_state = "thunderdome" flags = HEADCOVERSEYES item_state = "thunderdome" - armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -181,7 +180,7 @@ obj/item/clothing/head/helmet/redtaghelm icon_state = "redtaghelm" flags = HEADCOVERSEYES item_state = "redtaghelm" - armor = list(melee = 30, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0) + armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0) // Offer about the same protection as a hardhat. flags_inv = HIDEEARS|HIDEEYES @@ -191,7 +190,7 @@ obj/item/clothing/head/helmet/bluetaghelm icon_state = "bluetaghelm" flags = HEADCOVERSEYES item_state = "bluetaghelm" - armor = list(melee = 30, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0) + armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0) // Offer about the same protection as a hardhat. flags_inv = HIDEEARS|HIDEEYES @@ -203,19 +202,19 @@ obj/item/clothing/head/blob flags = HEADCOVERSEYES|HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES -/obj/item/clothing/head/helmet/knight/blue +/obj/item/clothing/head/helmet/riot/knight/blue icon_state = "knight_blue" item_state = "knight_blue" -/obj/item/clothing/head/helmet/knight/yellow +/obj/item/clothing/head/helmet/riot/knight/yellow icon_state = "knight_yellow" item_state = "knight_yellow" -/obj/item/clothing/head/helmet/knight/red +/obj/item/clothing/head/helmet/riot/knight/red icon_state = "knight_red" item_state = "knight_red" -/obj/item/clothing/head/helmet/knight/templar +/obj/item/clothing/head/helmet/riot/knight/templar name = "crusader helmet" desc = "Deus Vult." icon_state = "knight_templar" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 9da40760327..9492b7839ac 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -15,7 +15,7 @@ icon_state = "captain" desc = "It's good being the king." item_state = "caphat" - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 60 //Captain: no longer space-worthy @@ -29,7 +29,7 @@ name = "head of personnel's cap" icon_state = "hopcap" desc = "The symbol of true bureaucratic micromanagement." - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) //Nanotrasen Representative /obj/item/clothing/head/ntrep @@ -57,7 +57,7 @@ desc = "Someone who wears this will look very smart." icon_state = "detective" allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn, /obj/item/weapon/pen) - armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) //Mime /obj/item/clothing/head/beret @@ -70,7 +70,7 @@ name = "head of security cap" desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge." icon_state = "hoscap" - armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0) strip_delay = 80 /obj/item/clothing/head/HoS/beret @@ -82,7 +82,7 @@ name = "warden's police hat" desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts." icon_state = "policehelm" - armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 60 /obj/item/clothing/head/officer @@ -90,20 +90,21 @@ desc = "A red cap with an old-fashioned badge on the front for establishing that you are, in fact, the law." icon_state = "customshelm" item_state = "customshelm" - armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + strip_delay = 60 /obj/item/clothing/head/beret/sec name = "security beret" desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety." icon_state = "beret_officer" - armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 60 /obj/item/clothing/head/beret/sec/warden name = "warden's beret" desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class." icon_state = "beret_warden" - armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/head/beret/eng name = "engineering beret" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 88af8bf4dd3..d0473fedb98 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -5,7 +5,7 @@ icon_state = "centcom" desc = "It's good to be emperor." item_state = "centhat" - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 80 /obj/item/clothing/head/hairflower diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 0fbb39e6f1b..f2df0420fbe 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -20,7 +20,7 @@ materials = list(MAT_METAL=1750, MAT_GLASS=400) flash_protect = 2 tint = 2 - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) action_button_name = "flip welding helmet" species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") @@ -149,7 +149,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE action_button_name = "Toggle Pumpkin Light" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 2 //luminosity when on @@ -161,7 +161,7 @@ item_color = "reindeer" flags_inv = 0 action_button_name = "Toggle Nose Light" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 1 //luminosity when on diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index e14057b32b1..e7dae7d04da 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -90,7 +90,7 @@ desc = "It's baseball hat in tasteful red colour." icon_state = "secsoft" item_color = "sec" - armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 60 /obj/item/clothing/head/soft/sec/corp diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 6f6d0f03446..ef3a0f2b83e 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -27,7 +27,7 @@ materials = list(MAT_METAL=4000, MAT_GLASS=2000) flash_protect = 2 tint = 2 - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) origin_tech = "materials=2;engineering=2" action_button_name = "Toggle Welding Helmet" @@ -78,7 +78,7 @@ desc = "A modernised version of the classic design, this mask will not only filter out toxins but it can also be connected to an air supply." icon_state = "plaguedoctor" item_state = "gas_mask" - armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 2, energy = 2, bomb = 0, bio = 75, rad = 0) /obj/item/clothing/mask/gas/swat name = "\improper SWAT mask" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index d9817add99f..3e99b277db3 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -63,7 +63,7 @@ flags = MASKCOVERSMOUTH gas_transfer_coefficient = 0.90 permeability_coefficient = 0.01 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0) action_button_name = "Adjust Sterile Mask" ignore_maskadjust = 0 species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 72d00a4abf1..af361951f3d 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -21,7 +21,7 @@ can_cut_open = 1 icon_state = "jackboots" item_state = "jackboots" - armor = list(melee = 50, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0) + armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0) species_restricted = null //Syndicate tech means even Tajarans can kick ass with these strip_delay = 70 @@ -29,7 +29,7 @@ name = "\improper SWAT shoes" desc = "High speed, no drag combat boots." permeability_coefficient = 0.01 - armor = list(melee = 80, bullet = 60, laser = 50, energy = 50, bomb = 50, bio = 30, rad = 30) + armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30) flags = NOSLIP /obj/item/clothing/shoes/sandal diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index d5fcbdf3251..988e9d09725 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -2,8 +2,6 @@ /obj/item/clothing/head/helmet/space/skrell name = "Skrellian helmet" desc = "Smoothly contoured and polished to a shine. Still looks like a fishbowl." - armor = list(melee = 20, bullet = 20, laser = 50,energy = 50, bomb = 50, bio = 100, rad = 100) - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT species_restricted = list("Skrell","Human") /obj/item/clothing/head/helmet/space/skrell/white @@ -19,10 +17,6 @@ /obj/item/clothing/suit/space/skrell name = "Skrellian hardsuit" desc = "Seems like a wetsuit with reinforced plating seamlessly attached to it. Very chic." - armor = list(melee = 20, bullet = 20, laser = 50,energy = 50, bomb = 50, bio = 100, rad = 100) - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) - heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT species_restricted = list("Skrell","Human") /obj/item/clothing/suit/space/skrell/white @@ -37,9 +31,6 @@ //Unathi space gear. Huge and restrictive. /obj/item/clothing/head/helmet/space/unathi - armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50) - heat_protection = HEAD - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT species_restricted = list("Unathi") /obj/item/clothing/head/helmet/space/unathi/helmet_cheap @@ -50,10 +41,6 @@ item_color = "unathi_helm_cheap" /obj/item/clothing/suit/space/unathi - armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50) - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) - heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT species_restricted = list("Unathi") /obj/item/clothing/suit/space/unathi/rig_cheap @@ -61,7 +48,6 @@ desc = "A cheap NT knock-off of a Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow." icon_state = "rig-unathi-cheap" item_state = "rig-unathi-cheap" - slowdown = 3 /obj/item/clothing/head/helmet/space/unathi/breacher name = "breacher helm" @@ -76,15 +62,13 @@ icon_state = "unathi_breacher" item_state = "unathi_breacher" item_color = "unathi_breacher" - slowdown = 1 // Vox space gear (vaccuum suit, low pressure armour) // Can't be equipped by any other species due to bone structure and vox cybernetics. /obj/item/clothing/suit/space/vox w_class = 3 allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) - slowdown = 2 - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT species_restricted = list("Vox", "Vox Armalis") @@ -94,7 +78,7 @@ ) /obj/item/clothing/head/helmet/space/vox - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE species_restricted = list("Vox","Vox Armalis") sprite_sheets = list( diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 334e659302b..96ae6519d5d 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -23,7 +23,6 @@ icon_state = "chronosuit" item_state = "chronosuit" action_button_name = "Toggle Chronosuit" - slowdown = 2 armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90) var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 91824a9856e..d5c4d5626bb 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -4,7 +4,7 @@ desc = "A helmet worn by members of the Nanotrasen Emergency Response Team. Armoured and space ready." icon_state = "rig0-ert_commander" item_state = "helm-command" - armor = list(melee = 50, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60) + armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50) rig_restrict_helmet = 0 // ERT helmets can be taken on and off at will. var/obj/machinery/camera/camera strip_delay = 130 @@ -30,8 +30,7 @@ item_state = "suit-command" w_class = 3 allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) - slowdown = 1 - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60) + armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50) allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \ /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \ /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse, \ diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 8e9daf59ba5..a72bb92e4ff 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -6,7 +6,7 @@ desc = "A special helmet designed for only the most fashionable of military figureheads." flags_inv = HIDEFACE permeability_coefficient = 0.01 - armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") species_fit = list("Vox") sprite_sheets = list( @@ -28,8 +28,7 @@ item_state = "capspacesuit" w_class = 4 allowed = list(/obj/item/weapon/tank, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs) - slowdown = 1 - armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") species_fit = list("Vox") sprite_sheets = list( @@ -58,8 +57,7 @@ icon_state = "deathsquad" item_state = "swat_suit" allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat) - armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100) - slowdown = 1 + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT unacidable = 1 strip_delay = 130 @@ -71,14 +69,14 @@ icon_state = "heavy" item_state = "swat_suit" allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat) - armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20) strip_delay = 120 /obj/item/clothing/head/helmet/space/deathsquad/beret name = "officer's beret" desc = "An armored beret commonly used by special operations officers." icon_state = "beret_officer" - armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 65, bullet = 55, laser = 35, energy = 20, bomb = 30, bio = 30, rad = 30) /obj/item/clothing/suit/space/deathsquad/officer name = "officer jacket" @@ -113,7 +111,7 @@ desc = "Yarr." icon_state = "pirate" item_state = "pirate" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE strip_delay = 40 put_on_delay = 20 @@ -126,7 +124,7 @@ w_class = 3 allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) slowdown = 0 - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) strip_delay = 40 put_on_delay = 20 @@ -148,8 +146,7 @@ icon_state = "spacenew" item_state = "s_suit" desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies." - slowdown = 1 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) /obj/item/clothing/head/helmet/space/eva name = "EVA helmet" @@ -157,7 +154,7 @@ item_state = "s_helmet" desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flash_protect = 0 //Mime's Hardsuit @@ -194,7 +191,7 @@ desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." icon_state = "griffinhat" item_state = "griffinhat" - armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) + armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 strip_delay = 130 @@ -205,8 +202,7 @@ icon_state = "freedom" item_state = "freedom" allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) - armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100) - slowdown = 1 + armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 strip_delay = 130 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index fd4122c56ec..2fe6ea491e8 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -5,7 +5,7 @@ desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies." allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) slowdown = 0 - armor = list(melee = 0, bullet = 0, laser = 0 ,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES @@ -185,14 +185,14 @@ /obj/item/clothing/suit/space/eva/plasmaman/miner name = "plasmaman miner suit" icon_state = "plasmamanMiner_suit" - armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) - slowdown = 2 + armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) + slowdown = 1 /obj/item/clothing/head/helmet/space/eva/plasmaman/miner name = "plasmaman miner helmet" icon_state = "plasmamanMiner_helmet0" base_state = "plasmamanMiner_helmet" - armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) // MEDSCI @@ -266,13 +266,13 @@ /obj/item/clothing/suit/space/eva/plasmaman/security name = "plasmaman security suit" icon_state = "plasmamanSecurity_suit" - armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50) + armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50) /obj/item/clothing/head/helmet/space/eva/plasmaman/security name = "plasmaman security helmet" icon_state = "plasmamanSecurity_helmet0" base_state = "plasmamanSecurity_helmet" - armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50) + armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50) /obj/item/clothing/suit/space/eva/plasmaman/security/hos name = "plasmaman head of security suit" diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index ce73bb13a24..d4a0fec12bc 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -55,7 +55,6 @@ desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit." icon_state = "rig-engineering" item_state = "eng_hardsuit" - slowdown = 2 armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd) siemens_coefficient = 0 @@ -247,7 +246,6 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "rig-engineering" item_state = "eng_hardsuit" - slowdown = 2 armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd) @@ -279,14 +277,14 @@ item_state = "mining_helm" item_color = "mining" flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE - armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) /obj/item/clothing/suit/space/rig/mining icon_state = "rig-mining" name = "mining hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating." item_state = "mining_hardsuit" - armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe) @@ -297,7 +295,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" item_color = "syndi" - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) on = 1 flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL action_button_name = "Toggle Helmet Mode" @@ -339,11 +337,10 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" item_color = "syndi" - slowdown = 1 w_class = 3 var/on = 1 action_button_name = "Toggle Hardsuit Mode" - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) /obj/item/clothing/suit/space/rig/syndi/update_icon() @@ -379,7 +376,7 @@ desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders." icon_state = "hardsuit0-syndielite" item_color = "syndielite" - armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) + armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT sprite_sheets = null @@ -398,7 +395,7 @@ desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode." icon_state = "hardsuit0-syndielite" item_color = "syndielite" - armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) + armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT sprite_sheets = null @@ -420,7 +417,7 @@ item_state = "wiz_helm" item_color = "wiz" unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles! - armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) + armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 @@ -431,10 +428,9 @@ name = "gem-encrusted hardsuit" desc = "A bizarre gem-encrusted suit that radiates magical energies." item_state = "wiz_hardsuit" - slowdown = 1 w_class = 3 unacidable = 1 - armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50) allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT @@ -458,7 +454,6 @@ name = "medical hardsuit" desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort." item_state = "medical_hardsuit" - slowdown = 1 allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/device/rad_laser) armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50) @@ -469,7 +464,7 @@ icon_state = "rig0-sec" item_state = "sec_helm" item_color = "sec" - armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50) /obj/item/clothing/suit/space/rig/security icon_state = "rig-sec" @@ -507,7 +502,7 @@ icon_state = "rig0-singuloth" item_state = "singuloth_helm" item_color = "singuloth" - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 100) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100) /obj/item/clothing/suit/space/rig/singuloth icon_state = "rig-singuloth" @@ -515,4 +510,4 @@ desc = "This is a ceremonial armor from the chapter of the Singuloth Knights. It's made of pure forged adamantium." item_state = "singuloth_hardsuit" flags = STOPSPRESSUREDMAGE - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 100) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 66a0e62a39b..9e0fb8c55b0 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -17,7 +17,7 @@ w_class = 4 // These values are passed on to all component pieces. - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) + armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0.2 diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index 5f43c172a39..8632b6cc472 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -3,13 +3,13 @@ desc = "A cheap NT knock-off of an Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow." suit_type = "NT breacher" icon_state = "breacher_rig_cheap" - armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 70, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 45, bio = 100, rad = 50) emp_protection = -20 slowdown = 6 offline_slowdown = 10 vision_restriction = 1 offline_vision_restriction = 2 - + chest_type = /obj/item/clothing/suit/space/new_rig helm_type = /obj/item/clothing/head/helmet/space/new_rig/unathi boot_type = /obj/item/clothing/shoes/magboots/rig/unathi @@ -19,7 +19,7 @@ desc = "An authentic Unathi breacher chassis. Huge, bulky and absurdly heavy. It must be like wearing a tank." suit_type = "breacher chassis" icon_state = "breacher_rig" - armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow. + armor = list(melee = 45, bullet = 45, laser = 45, energy = 45, bomb = 45, bio = 100, rad = 75) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow. //Whoever made this was on meth vision_restriction = 0 /obj/item/clothing/head/helmet/space/new_rig/unathi @@ -27,6 +27,6 @@ /obj/item/clothing/suit/space/new_rig/unathi species_restricted = list("Unathi") - + /obj/item/clothing/shoes/magboots/rig/unathi species_restricted = list("Unathi") \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm index cd37189a080..98adb708ada 100644 --- a/code/modules/clothing/spacesuits/rig/suits/combat.dm +++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm @@ -5,7 +5,7 @@ desc = "A sleek and dangerous hardsuit for active combat." icon_state = "security_rig" suit_type = "combat hardsuit" - armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) slowdown = 1 offline_slowdown = 3 offline_vision_restriction = 1 diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index f10a859af9a..4aed2a53f30 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -10,7 +10,7 @@ req_access = list(access_cent_specops) - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) + armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50) allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \ /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \ /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ @@ -27,7 +27,6 @@ desc = "A suit worn by the engineering division of an Emergency Response Team. Has orange highlights. Armoured and space ready." suit_type = "ERT engineer" icon_state = "ert_engineer_rig" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) siemens_coefficient = 0 initial_modules = list( @@ -68,7 +67,6 @@ desc = "A heavy suit worn by the highest level of Asset Protection, don't mess with the person wearing this. Armoured and space ready." suit_type = "heavy asset protection" icon_state = "asset_protection_rig" - armor = list(melee = 60, bullet = 50, laser = 50,energy = 40, bomb = 40, bio = 100, rad = 100) initial_modules = list( /obj/item/rig_module/ai_container, diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index fb6b0459a91..0bda9f9288a 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -5,7 +5,6 @@ icon_state = "ninja_rig" suit_type = "light suit" allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/stock_parts/cell) - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) emp_protection = 10 slowdown = 0 flags = STOPSPRESSUREDMAGE | THICKMATERIAL diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm index 58a66aaa4b1..a7512231641 100644 --- a/code/modules/clothing/spacesuits/rig/suits/merc.dm +++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm @@ -5,7 +5,7 @@ desc = "A blood-red hardsuit featuring some fairly illegal technology." icon_state = "merc_rig" suit_type = "crimson hardsuit" - armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) + armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) slowdown = 1 offline_slowdown = 3 offline_vision_restriction = 1 diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 4ddf6e419f3..a0e236daee7 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -15,7 +15,7 @@ suit_type = "augmented suit" desc = "Prepare for paperwork." icon_state = "internalaffairs_rig" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 slowdown = 0 offline_slowdown = 0 @@ -51,7 +51,7 @@ suit_type = "industrial hardsuit" desc = "A heavy, powerful rig used by construction crews and mining corporations." icon_state = "engineering_rig" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50) + armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75) slowdown = 3 offline_slowdown = 10 offline_vision_restriction = 2 @@ -80,7 +80,6 @@ suit_type = "EVA hardsuit" desc = "A light rig for repairs and maintenance to the outside of habitats and vessels." icon_state = "eva_rig" - armor = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100) slowdown = 0 offline_slowdown = 1 offline_vision_restriction = 1 @@ -108,7 +107,7 @@ suit_type = "advanced voidsuit" desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish." icon_state = "ce_rig" - armor = list(melee = 40, bullet = 10, laser = 30,energy = 25, bomb = 40, bio = 100, rad = 100) + armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90) slowdown = 0 offline_slowdown = 0 offline_vision_restriction = 0 @@ -150,7 +149,6 @@ suit_type = "hazmat hardsuit" desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it." icon_state = "science_rig" - armor = list(melee = 45, bullet = 5, laser = 45, energy = 80, bomb = 60, bio = 100, rad = 100) slowdown = 1 offline_vision_restriction = 1 @@ -179,7 +177,7 @@ suit_type = "rescue hardsuit" desc = "A durable suit designed for medical rescue in high risk areas." icon_state = "medical_rig" - armor = list(melee = 30, bullet = 15, laser = 20, energy = 60, bomb = 30, bio = 100, rad = 100) + armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50) slowdown = 1 offline_vision_restriction = 1 @@ -204,7 +202,7 @@ suit_type = "hazard hardsuit" desc = "A Security hardsuit designed for prolonged EVA in dangerous environments." icon_state = "hazard_rig" - armor = list(melee = 60, bullet = 40, laser = 30, energy = 15, bomb = 60, bio = 100, rad = 30) + armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50) slowdown = 1 offline_slowdown = 3 offline_vision_restriction = 1 diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 4017cb3f1f8..4b8f32f5a74 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -5,7 +5,7 @@ icon_state = "syndicate" item_state = "syndicate" desc = "Has a tag: Totally not property of an enemy corporation, honest." - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) /obj/item/clothing/suit/space/syndicate name = "red space suit" @@ -14,8 +14,7 @@ desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!" w_class = 3 allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) - slowdown = 1 - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) //Green syndicate space suit diff --git a/code/modules/clothing/spacesuits/void.dm b/code/modules/clothing/spacesuits/void.dm index 91142123450..cce0f4c49b3 100644 --- a/code/modules/clothing/spacesuits/void.dm +++ b/code/modules/clothing/spacesuits/void.dm @@ -11,5 +11,4 @@ icon_state = "void" item_state = "void" desc = "A high tech, NASA Centcom branch designed, dark red Space suit. Used for AI satellite maintenance." - slowdown = 1 allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/multitool) \ No newline at end of file diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 4633cfcb907..a261a1ab28b 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -20,7 +20,7 @@ item_state = "armor" blood_overlay_type = "armor" flags = ONESIZEFITSALL - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/armor/vest/jacket name = "military jacket" @@ -36,7 +36,6 @@ item_state = "bulletproof" blood_overlay_type = "armor" flags = ONESIZEFITSALL - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/armor/vest/security name = "security armor" @@ -98,7 +97,7 @@ icon_state = "hos" item_state = "hos" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) flags_inv = HIDEJUMPSUIT cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS @@ -145,7 +144,7 @@ icon_state = "capcarapace" item_state = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO - armor = list(melee = 50, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/armor/riot name = "Riot Suit" @@ -155,8 +154,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - slowdown = 1 - armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) flags_inv = HIDEJUMPSUIT strip_delay = 80 put_on_delay = 60 @@ -167,7 +165,7 @@ desc = "A classic suit of plate armour, highly effective at stopping melee attacks." icon_state = "knight_green" item_state = "knight_green" - armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) + slowdown = 1 /obj/item/clothing/suit/armor/riot/knight/yellow icon_state = "knight_yellow" @@ -194,7 +192,7 @@ icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" - armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0) + armor = list(melee = 15, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0) strip_delay = 70 put_on_delay = 50 @@ -204,7 +202,7 @@ icon_state = "armor_reflec" item_state = "armor_reflec" blood_overlay_type = "armor" - armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0) var/hit_reflect_chance = 40 /obj/item/clothing/suit/armor/laserproof/IsReflect(var/def_zone) @@ -279,13 +277,14 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT species_fit = null sprite_sheets = null + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) /obj/item/clothing/suit/armor/heavy name = "heavy armor" desc = "A heavily armored suit that protects against moderate damage." icon_state = "heavy" item_state = "swat_suit" - armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) w_class = 4//bulky item gas_transfer_coefficient = 0.90 flags = THICKMATERIAL @@ -295,7 +294,7 @@ hide_tail_by_species = list("Vox") /obj/item/clothing/suit/armor/tdome - armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT flags = THICKMATERIAL @@ -321,7 +320,7 @@ desc = "A set of armor worn by members of the Nanotrasen Emergency Response Team." icon_state = "ertarmor_cmd" item_state = "armor" - armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 20, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 20, bio = 0, rad = 0) //Commander /obj/item/clothing/suit/armor/vest/ert/command diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index aea43a09ec2..a5a935ebeaf 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -5,7 +5,7 @@ desc = "A hood that protects the head and face from biological comtaminants." permeability_coefficient = 0.01 flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES /obj/item/clothing/suit/bio_suit @@ -18,9 +18,9 @@ permeability_coefficient = 0.01 flags = ONESIZEFITSALL | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - slowdown = 1.0 + slowdown = 1 allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen) - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL strip_delay = 70 put_on_delay = 70 @@ -48,9 +48,11 @@ //Security biosuit, grey with red stripe across the chest /obj/item/clothing/head/bio_hood/security + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 20) icon_state = "bio_security" /obj/item/clothing/suit/bio_suit/security + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 20) icon_state = "bio_security" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 961e9fd4890..e3a1a1e1a2b 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -133,7 +133,7 @@ blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder) - armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags = ONESIZEFITSALL @@ -143,24 +143,20 @@ ) //Forensics -/obj/item/clothing/suit/storage/forensics +/obj/item/clothing/suit/storage/det_suit/forensics name = "jacket" desc = "A forensics technician jacket." item_state = "det_suit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/detective_scanner,/obj/item/device/taperecorder) - armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0) - species_fit = list("Vox") - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' - ) + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS + heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS -/obj/item/clothing/suit/storage/forensics/red +/obj/item/clothing/suit/storage/det_suit/forensics/red name = "red jacket" desc = "A red forensics technician jacket." icon_state = "forensics_red" -/obj/item/clothing/suit/storage/forensics/blue +/obj/item/clothing/suit/storage/det_suit/forensics/blue name = "blue jacket" desc = "A blue forensics technician jacket." icon_state = "forensics_blue" @@ -174,7 +170,7 @@ blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic) - armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags = ONESIZEFITSALL diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index aa8b6ece833..df68242d405 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -483,7 +483,7 @@ flags = ONESIZEFITSALL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen) - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL /obj/item/clothing/head/mercy_hood @@ -493,7 +493,7 @@ item_state = "mercy_hood" permeability_coefficient = 0.01 flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES /obj/item/clothing/suit/jacket @@ -526,7 +526,7 @@ strip_delay = 60 put_on_delay = 40 flags = ONESIZEFITSALL - armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) //End of inheritance from Security armour. /obj/item/clothing/suit/jacket/leather @@ -569,7 +569,7 @@ icon_state = "owl_wings" item_state = "owl_wings" body_parts_covered = ARMS - armor = list(melee = 5, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite) action_button_name = "Toggle Owl Wings" flags = NODROP @@ -616,7 +616,7 @@ permeability_coefficient = 0.01 flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD - armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100) + armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100) cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 18b26c080c7..2178821e3fa 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -19,7 +19,7 @@ permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher) - slowdown = 1.0 + slowdown = 1 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL flags = STOPSPRESSUREDMAGE | THICKMATERIAL heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS @@ -64,7 +64,7 @@ desc = "Use in case of bomb." icon_state = "bombsuit" flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL - armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0) + armor = list(melee = 20, bullet = 0, laser = 20, energy = 10, bomb = 100, bio = 0, rad = 0) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT @@ -84,7 +84,7 @@ flags = THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 2 - armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0) + armor = list(melee = 20, bullet = 0, laser = 20, energy = 10, bomb = 100, bio = 0, rad = 0) flags_inv = HIDEJUMPSUIT|HIDETAIL heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT @@ -116,7 +116,7 @@ icon_state = "rad" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100) strip_delay = 60 put_on_delay = 60 @@ -132,7 +132,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen) slowdown = 1.5 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100) flags_inv = HIDEJUMPSUIT|HIDETAIL strip_delay = 60 put_on_delay = 60 \ No newline at end of file diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index a2496168b5f..cf74d17de05 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -7,6 +7,7 @@ desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." origin_tech = "syndicate=3" var/list/clothing_choices = list() + armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) New() ..() diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 78d9428d4b2..0be5fe8eef5 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -24,6 +24,13 @@ item_color = "qm" flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/cargo/skirt + name = "quartermaster's jumpskirt" + desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." + icon_state = "qmf" + item_color = "qmf" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = null /obj/item/clothing/under/rank/cargotech name = "cargo technician's jumpsuit" @@ -33,6 +40,12 @@ item_color = "cargo" flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/cargotech/skirt + name = "cargo technician's jumpskirt" + desc = "Skirrrrrts! They're comfy and easy to wear!" + icon_state = "cargof" + item_color = "cargof" + flags = null /obj/item/clothing/under/rank/chaplain desc = "It's a black jumpsuit, often worn by religious folk." @@ -104,7 +117,7 @@ name = "janitor's jumpsuit" icon_state = "janitor" item_color = "janitor" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 4b91e82b2fc..15c314affa1 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -5,9 +5,17 @@ icon_state = "chiefengineer" item_state = "g_suit" item_color = "chief" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10) flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/chief_engineer/skirt + desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding." + name = "chief engineer's jumpskirt" + icon_state = "chieff" + item_color = "chieff" + flags = null + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + /obj/item/clothing/under/rank/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians." name = "atmospheric technician's jumpsuit" @@ -16,15 +24,32 @@ item_color = "atmos" flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/atmospheric_technician/skirt + desc = "It's a jumpskirt worn by atmospheric technicians." + name = "atmospheric technician's jumpskirt" + icon_state = "atmosf" + item_color = "atmosf" + flags = null + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + /obj/item/clothing/under/rank/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." name = "engineer's jumpsuit" icon_state = "engine" item_state = "engi_suit" item_color = "engine" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10) flags = ONESIZEFITSALL + +/obj/item/clothing/under/rank/engineer/skirt + desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding." + name = "engineer's jumpskirt" + icon_state = "enginef" + item_color = "enginef" + flags = null + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + /obj/item/clothing/under/rank/roboticist desc = "It's a slimming black with reinforced seams; great for industrial work." name = "roboticist's jumpsuit" @@ -33,6 +58,13 @@ item_color = "robotics" flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/roboticist/skirt + desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work." + name = "roboticist's jumpskirt" + icon_state = "roboticsf" + item_color = "roboticsf" + flags = null + /obj/item/clothing/under/rank/mechanic desc = "It's a pair of overalls worn by mechanics." name = "mechanic's overalls" diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index b6f83e78beb..608d5de363e 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -7,7 +7,7 @@ icon_state = "director" item_state = "g_suit" item_color = "director" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/scientist @@ -17,9 +17,16 @@ item_state = "w_suit" item_color = "toxinswhite" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/scientist/skirt + name = "scientist's jumpskirt" + icon_state = "sciencewhitef" + item_color = "sciencewhitef" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = null + /obj/item/clothing/under/rank/chemist desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." name = "chemist's jumpsuit" @@ -27,9 +34,16 @@ item_state = "w_suit" item_color = "chemistrywhite" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/chemist/skirt + name = "chemist's jumpskirt" + icon_state = "chemistrywhitef" + item_color = "chemistrywhitef" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = null + /* * Medical */ @@ -40,9 +54,17 @@ item_state = "w_suit" item_color = "cmo" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/chief_medical_officer/skirt + desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." + name = "chief medical officer's jumpskirt" + icon_state = "cmof" + item_color = "cmof" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = null + /obj/item/clothing/under/rank/geneticist desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." name = "geneticist's jumpsuit" @@ -50,9 +72,16 @@ item_state = "w_suit" item_color = "geneticswhite" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/geneticist/skirt + name = "geneticist's jumpskirt" + icon_state = "geneticswhitef" + item_color = "geneticswhitef" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = null + /obj/item/clothing/under/rank/virologist desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." name = "virologist's jumpsuit" @@ -60,9 +89,16 @@ item_state = "w_suit" item_color = "virologywhite" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/virologist/skirt + name = "virologist's jumpskirt" + icon_state = "virologywhitef" + item_color = "virologywhitef" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = null + /obj/item/clothing/under/rank/nursesuit desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." name = "nurse's suit" @@ -70,7 +106,7 @@ item_state = "nursesuit" item_color = "nursesuit" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/nurse @@ -80,7 +116,7 @@ item_state = "nurse" item_color = "nurse" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/orderly @@ -90,7 +126,7 @@ item_state = "orderly" item_color = "orderly" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/medical @@ -100,9 +136,16 @@ item_state = "w_suit" item_color = "medical" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL +/obj/item/clothing/under/rank/medical/skirt + name = "medical doctor's jumpskirt" + icon_state = "medicalf" + item_color = "medicalf" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags = null + /obj/item/clothing/under/rank/medical/blue name = "medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." @@ -139,7 +182,7 @@ item_state = "paramedic" item_color = "paramedic" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/psych @@ -169,7 +212,7 @@ item_state = "w_suit" item_color = "genetics_new" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/chemist_new @@ -179,7 +222,7 @@ item_state = "w_suit" item_color = "chemist_new" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/scientist_new @@ -189,7 +232,7 @@ item_state = "w_suit" item_color = "scientist_new" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/virologist_new @@ -199,5 +242,5 @@ item_state = "w_suit" item_color = "virologist_new" permeability_coefficient = 0.50 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index d40952e2030..e07419a3871 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -15,27 +15,43 @@ icon_state = "warden" item_state = "r_suit" item_color = "warden" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags = ONESIZEFITSALL strip_delay = 50 +/obj/item/clothing/under/rank/warden/skirt + desc = "Standard feminine fashion for a Warden. It is made of sturdier material than standard jumpskirts. It has the word \"Warden\" written on the shoulders." + name = "warden's jumpskirt" + icon_state = "wardenf" + item_state = "r_suit" + item_color = "wardenf" + flags = null + /obj/item/clothing/under/rank/security name = "security officer's jumpsuit" desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." icon_state = "security" item_state = "r_suit" item_color = "secred" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags = ONESIZEFITSALL strip_delay = 50 +/obj/item/clothing/under/rank/security/skirt + name = "security officer's jumpskirt" + desc = "Standard feminine fashion for Security Officers. It's made of sturdier material than the standard jumpskirts." + icon_state = "secredf" + item_state = "r_suit" + item_color = "secredf" + flags = null + /obj/item/clothing/under/rank/dispatch name = "dispatcher's uniform" desc = "A dress shirt and khakis with a security patch sewn on." icon_state = "dispatch" item_state = "dispatch" item_color = "dispatch" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/security2 @@ -44,7 +60,7 @@ icon_state = "redshirt2" item_state = "r_suit" item_color = "redshirt2" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags = ONESIZEFITSALL /obj/item/clothing/under/rank/security/corp icon_state = "sec_corporate" @@ -65,7 +81,7 @@ icon_state = "detective" item_state = "det" item_color = "detective" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags = ONESIZEFITSALL strip_delay = 50 species_fit = list("Vox") @@ -82,10 +98,18 @@ icon_state = "hos" item_state = "r_suit" item_color = "hosred" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags = ONESIZEFITSALL strip_delay = 60 +/obj/item/clothing/under/rank/head_of_security/skirt + desc = "It's a fashionable jumpskirt worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer." + name = "head of security's jumpskirt" + icon_state = "hosredf" + item_state = "r_suit" + item_color = "hosredf" + flags = null + /obj/item/clothing/under/rank/head_of_security/corp icon_state = "hos_corporate" item_state = "hos_corporate" @@ -154,5 +178,5 @@ item_state = "brig_phys" item_color = "brig_phys" permeability_coefficient = 0.50 - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) flags = ONESIZEFITSALL \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 9533d7c4aae..54b6384fe31 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -130,7 +130,7 @@ icon_state = "ert_uniform" item_state = "bl_suit" item_color = "ert_uniform" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/space name = "\improper NASA jumpsuit" @@ -156,7 +156,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD - armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100) + armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100) cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD @@ -568,7 +568,7 @@ icon_state = "vengine" item_state = "vengine" item_color = "vengine" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10) /obj/item/clothing/under/vox_sec name = "Vox Security Jumpsuit" @@ -576,7 +576,7 @@ icon_state = "vred" item_state = "vred" item_color = "vred" - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/vox_chem name = "Vox Chemist Jumpsuit" @@ -584,7 +584,7 @@ icon_state = "vchem" item_state = "vchem" item_color = "vchem" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) /obj/item/clothing/under/psyjump name = "Psychic Amp Jumpsuit" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index cfe317aaa3b..011f6784362 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -5,7 +5,7 @@ item_state = "bl_suit" item_color = "syndicate" has_sensor = 0 - armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/syndicate/combat name = "combat turtleneck" diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index 1b8bd092ee2..9bbab68b637 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -112,7 +112,8 @@ var/global/datum/ErrorViewer/ErrorCache/error_cache = null // Show the error to admins with debug messages turned on, but only if one // from the same source hasn't been shown too recently - if(error_source.next_message_at <= world.time) + // (Also, make sure config is initialized, or log_debug will runtime) + if(config && error_source.next_message_at <= world.time) var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly log_debug("Runtime in [e.file],[e.line]: [html_encode(e.name)] [error_entry.makeLink(viewtext)]") error_source.next_message_at = world.time + ERROR_MSG_DELAY diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm index 765792e5da1..7dccff585d8 100644 --- a/code/modules/holiday/christmas.dm +++ b/code/modules/holiday/christmas.dm @@ -61,5 +61,5 @@ icon_state = "xmashat" desc = "A crappy paper hat that you are REQUIRED to wear." flags_inv = 0 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 1dea731ff54..9cb59b4f296 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -314,6 +314,7 @@ w_class = 4 var/extend = 1 flags = NOSHIELD | CONDUCT + armour_penetration = 20 slot_flags = SLOT_BACK origin_tech = "materials=2;combat=2" attack_verb = list("chopped", "sliced", "cut", "reaped") @@ -339,6 +340,7 @@ w_class = 2.0 extend = 0 flags = NOSHIELD + armour_penetration = 20 slot_flags = SLOT_BELT origin_tech = "materials=3;combat=3" attack_verb = list("chopped", "sliced", "cut", "reaped") diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm index 3202f8fbe27..bc4e15eb598 100644 --- a/code/modules/martial_arts/sleeping_carp.dm +++ b/code/modules/martial_arts/sleeping_carp.dm @@ -38,6 +38,8 @@ D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \ "[A] grabs your wrist and violently wrenches it to the side!") playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if(prob(60)) + A.say(pick("WRISTY TWIRLY!", "WE FIGHT LIKE MEN!", "YOU DISHONOR YOURSELF!", "POHYAH!", "WHERE IS YOUR BATON NOW?", "SAY UNCLE!")) D.emote("scream") D.drop_item() D.apply_damage(5, BRUTE, pick("l_arm", "r_arm")) @@ -53,6 +55,8 @@ step_to(D,get_step(D,D.dir),1) D.Weaken(4) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + if(prob(80)) + A.say(pick("SURRPRIZU!","BACK STRIKE!","WOPAH!", "WATAAH", "ZOTA!", "Never turn your back to the enemy!")) return 1 return basic_hit(A,D) @@ -65,6 +69,8 @@ D.losebreath += 3 D.Stun(2) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + if(prob(80)) + A.say(pick("HWOP!", "KUH!", "YAKUUH!", "KYUH!", "KNEESTRIKE!")) return 1 return basic_hit(A,D) @@ -76,6 +82,8 @@ D.apply_damage(20, BRUTE, "head") D.drop_item() playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + if(prob(60)) + A.say(pick("OOHYOO!", "OOPYAH!", "HYOOAA!", "WOOAAA!", "SHURYUKICK!", "HIYAH!")) D.Stun(4) return 1 return basic_hit(A,D) @@ -89,6 +97,8 @@ D.death() //FINISH HIM! D.apply_damage(50, BRUTE, "chest") playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1) + if(prob(80)) + A.say(pick("BANZAIII!", "KIYAAAA!", "OMAE WA MOU SHINDEIRU!", "YOU CAN'T SEE ME!", "MY TIME IS NOW!", "COWABUNGA")) return 1 return basic_hit(A,D) @@ -111,6 +121,8 @@ "[A] [atk_verb] you!") D.apply_damage(rand(10,15), BRUTE) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1) + if(prob(50)) + A.say(pick("HUAH!", "HYA!", "CHOO!", "WUO!", "KYA!", "HUH!", "HIYOH!", "CARP STRIKE!", "CARP BITE!")) if(prob(D.getBruteLoss()) && !D.lying) D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!") D.Weaken(4) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 79bc5ce2dfb..f389c2376f3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -44,10 +44,6 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi stat = DEAD - ghostimage = image(src.icon,src,src.icon_state) - ghost_darkness_images |= ghostimage - updateallghostimages() - var/turf/T if(ismob(body)) T = get_turf(body) //Where is the body located? @@ -76,7 +72,15 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) mind = body.mind //we don't transfer the mind but we keep a reference to it. - + + ghostimage = image(icon = icon, loc = src, icon_state = icon_state) + ghostimage.overlays = overlays + ghostimage.dir = dir + ghostimage.appearance_flags |= KEEP_TOGETHER + ghostimage.alpha = alpha + appearance_flags |= KEEP_TOGETHER + ghost_darkness_images |= ghostimage + updateallghostimages() if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position forceMove(T) @@ -166,6 +170,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/Move(NewLoc, direct) following = null dir = direct + ghostimage.dir = dir if(NewLoc) forceMove(NewLoc) return diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index a6269b96d36..85b44accd6a 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -14,8 +14,26 @@ if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) return - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) - . = src.say_dead(message) + +/mob/dead/observer/emote(var/act, var/type, var/message) + message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN)) + + if(!message) + return + + if(act != "me") + return + + log_emote("Ghost/[src.key] : [message]") + + if(src.client) + if(src.client.prefs.muted & MUTE_DEADCHAT) + to_chat(src, "\red You cannot emote in deadchat (muted).") + return + + if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT)) + return + + . = src.emote_dead(message) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm new file mode 100644 index 00000000000..cd1bc6707a7 --- /dev/null +++ b/code/modules/mob/emote.dm @@ -0,0 +1,124 @@ +#define EMOTE_COOLDOWN 20 //Time in deciseconds that the cooldown lasts + +//Emote Cooldown System (it's so simple!) +/mob/proc/handle_emote_CD(cooldown = EMOTE_COOLDOWN) + if(emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use + if(src.emote_cd == 1) return 1 // Already on CD, prevent use + + src.emote_cd = 1 // Starting cooldown + spawn(cooldown) + if(emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown + src.emote_cd = 0 // Cooldown complete, ready for more! + + return 0 // Proceed with emote +//--FalseIncarnate + +// All mobs should have custom emote, really.. +/mob/proc/custom_emote(var/m_type=1,var/message = null) + + if(stat || !use_me && usr == src) + 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/input + if(!message) + input = sanitize(copytext(input(src,"Choose an emote to display.") as text|null,1,MAX_MESSAGE_LEN)) + else + input = message + if(input) + message = "[src] [input]" + else + return + + + if (message) + log_emote("[name]/[key] : [message]") + + //Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. + + for(var/mob/M in player_list) + if (!M.client) + continue //skip monkeys and leavers + if (istype(M, /mob/new_player)) + continue + if(findtext(message," snores.")) //Because we have so many sleeping people. + break + if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + + // Type 1 (Visual) emotes are sent to anyone in view of the item + if (m_type & 1) + 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) + + if(O.status_flags & PASSEMOTES) + + for(var/obj/item/weapon/holder/H in O.contents) + H.show_message(message, m_type) + + for(var/mob/living/M in O.contents) + M.show_message(message, m_type) + + O.show_message(message, m_type) + + // 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) + for (var/mob/O in get_mobs_in_view(7,src)) + + if(O.status_flags & PASSEMOTES) + + for(var/obj/item/weapon/holder/H in O.contents) + H.show_message(message, m_type) + + for(var/mob/living/M in O.contents) + M.show_message(message, m_type) + + O.show_message(message, m_type) + +/mob/proc/emote_dead(var/message) + + if(client.prefs.muted & MUTE_DEADCHAT) + to_chat(src, "\red You cannot send deadchat emotes (muted).") + return + + if(!(client.prefs.toggles & CHAT_DEAD)) + to_chat(src, "\red You have deadchat muted.") + return + + if(!src.client.holder) + if(!config.dsay_allowed) + to_chat(src, "\red Deadchat is globally muted") + return + + + var/input + if(!message) + input = sanitize(copytext(input(src, "Choose an emote to display.") as text|null, 1, MAX_MESSAGE_LEN)) + else + input = message + + if(input) + message = "DEAD: [src] [message]" + else + return + + + if(message) + log_emote("Ghost/[src.key] : [message]") + + for(var/mob/M in player_list) + if(istype(M, /mob/new_player)) + continue + + if(check_rights(R_ADMIN|R_MOD, 0, M) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods + to_chat(M, message) + + else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on + M.show_message(message, 2) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 6192b0acc6b..74e9fbfce93 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -217,7 +217,7 @@ if(judgebot.check_for_weapons(r_hand)) threatcount += 4 - //Loyalty implants imply trustworthyness + //Mindshield implants imply trustworthyness if(isloyal(src)) threatcount -= 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm new file mode 100644 index 00000000000..3b7d0b5d1b9 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -0,0 +1,115 @@ +/mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null) + var/param = null + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + +// if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' +// act = copytext(act,1,length(act)) //seriously who the fuck wrote this + var/muzzled = is_muzzled() + act = lowertext(act) + switch(act) + if("sign") + if(!restrained()) + var/num = null + if(text2num(param)) + num = "the number [text2num(param)]" + if(num) + message = "\The [src] signs [num]." + m_type = 1 + if ("burp") + if (!muzzled) + message = "\The [src] burps." + m_type = 2 + if ("deathgasp") + message = "\The [src] lets out a waning guttural screech, green blood bubbling from its maw..." + m_type = 2 + if("scratch") + if (!src.restrained()) + message = "\The [src] scratches." + m_type = 1 + if("whimper") + if (!muzzled) + message = "\The [src] whimpers." + m_type = 2 + if("roar") + if (!muzzled) + message = "\The [src] roars." + m_type = 2 + if("hiss") + if(!muzzled) + message = "\The [src] hisses." + m_type = 2 + if("tail") + message = "\The [src] waves its tail." + m_type = 1 + if("gasp") + message = "\The [src] gasps." + m_type = 2 + if("shiver") + message = "\The [src] shivers." + m_type = 2 + if("drool") + message = "\The [src] drools." + m_type = 1 + if("scretch") + if (!muzzled) + message = "\The [src] scretches." + m_type = 2 + if("choke") + message = "\The [src] chokes." + m_type = 2 + if("moan") + message = "\The [src] moans!" + m_type = 2 + if("nod") + message = "\The [src] nods its head." + m_type = 1 + if("sit") + message = "\The [src] sits down." + m_type = 1 + if("sway") + message = "\The [src] sways around dizzily." + m_type = 1 + if("sulk") + message = "\The [src] sulks down sadly." + m_type = 1 + if("twitch") + message = "\The [src] twitches violently." + m_type = 1 + if("dance") + if (!src.restrained()) + message = "\The [src] dances around happily." + m_type = 1 + if("roll") + if (!src.restrained()) + message = "\The [src] rolls." + m_type = 1 + if("shake") + message = "\The [src] shakes its head." + m_type = 1 + if("gnarl") + if (!muzzled) + message = "\The [src] gnarls and shows its teeth.." + m_type = 2 + if("jump") + message = "\The [src] jumps!" + m_type = 1 + if("collapse") + Paralyse(2) + message = "\The [src] collapses!" + m_type = 2 + if ("flip") + m_type = 1 + message = "\The [src] does a flip!" + src.SpinAnimation(5,1) + if("help") + to_chat(src, "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper") + + if(!stat) + if (act == "roar") + playsound(src.loc, 'sound/voice/hiss5.ogg', 40, 1, 1) + if (act == "deathgasp") + playsound(src.loc, 'sound/voice/hiss6.ogg', 80, 1, 1) + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm new file mode 100644 index 00000000000..0a7bc7708d6 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -0,0 +1,126 @@ +/mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null) + var/param = null + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + var/muzzled = is_muzzled() + act = lowertext(act) + switch(act) + if ("me") + if(silent) + return + if (src.client) + if (client.prefs.muted & MUTE_IC) + to_chat(src, "\red You cannot send IC messages (muted).") + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + return custom_emote(m_type, message) + + if ("custom") + return custom_emote(m_type, message) + if("sign") + if (!src.restrained()) + message = text("The alien signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) + m_type = 1 + if ("burp") + if (!muzzled) + message = "[src] burps." + m_type = 2 + if("scratch") + if (!src.restrained()) + message = "The [src.name] scratches." + m_type = 1 + if("whimper") + if (!muzzled) + message = "The [src.name] whimpers." + m_type = 2 +// if("roar") +// if (!muzzled) +// message = "The [src.name] roars." Commenting out since larva shouldn't roar /N +// m_type = 2 + if("tail") + message = "The [src.name] waves its tail." + m_type = 1 + if("gasp") + message = "The [src.name] gasps." + m_type = 2 + if("shiver") + message = "The [src.name] shivers." + m_type = 2 + if("drool") + message = "The [src.name] drools." + m_type = 1 + if("scretch") + if (!muzzled) + message = "The [src.name] scretches." + m_type = 2 + if("choke") + message = "The [src.name] chokes." + m_type = 2 + if("moan") + message = "The [src.name] moans!" + m_type = 2 + if("nod") + message = "The [src.name] nods its head." + m_type = 1 +// if("sit") +// message = "The [src.name] sits down." //Larvan can't sit down, /N +// m_type = 1 + if("sway") + message = "The [src.name] sways around dizzily." + m_type = 1 + if("sulk") + message = "The [src.name] sulks down sadly." + m_type = 1 + if("twitch") + message = "The [src.name] twitches violently." + m_type = 1 + if("dance") + if (!src.restrained()) + message = "The [src.name] dances around happily." + m_type = 1 + if("roll") + if (!src.restrained()) + message = "The [src.name] rolls." + m_type = 1 + if("shake") + message = "The [src.name] shakes its head." + m_type = 1 + if("gnarl") + if (!muzzled) + message = "The [src.name] gnarls and shows its teeth.." + m_type = 2 + if("jump") + message = "The [src.name] jumps!" + m_type = 1 + if("hiss_") + message = "The [src.name] hisses softly." + m_type = 1 + if("collapse") + Paralyse(2) + message = text("[] collapses!", src) + m_type = 2 + if("help") + to_chat(src, "burp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") + else + to_chat(src, text("Invalid Emote: []", act)) + if ((message && src.stat == 0)) + log_emote("[name]/[key] : [message]") + if (m_type & 1) + for(var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + //Foreach goto(703) + else + for(var/mob/O in hearers(src, null)) + O.show_message(message, m_type) + //Foreach goto(746) + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm new file mode 100644 index 00000000000..e6ead851c5b --- /dev/null +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -0,0 +1,51 @@ +/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null) + if(!(container && istype(container, /obj/item/device/mmi)))//No MMI, no emotes + return + + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + if(src.stat == DEAD) + return + act = lowertext(act) + switch(act) + + if ("alarm") + to_chat(src, "You sound an alarm.") + message = "\The [src] sounds an alarm." + m_type = 2 + if ("alert") + to_chat(src, "You let out a distressed noise.") + message = "\The [src] lets out a distressed noise." + m_type = 2 + if ("notice") + to_chat(src, "You play a loud tone.") + message = "\The [src] plays a loud tone." + m_type = 2 + if ("flash") + message = "The lights on \the [src] flash quickly." + m_type = 1 + if ("blink") + message = "\The [src] blinks." + m_type = 1 + if ("whistle") + to_chat(src, "You whistle.") + message = "\The [src] whistles." + m_type = 2 + if ("beep") + to_chat(src, "You beep.") + message = "\The [src] beeps." + m_type = 2 + if ("boop") + to_chat(src, "You boop.") + message = "\The [src] boops." + m_type = 2 + if ("help") + to_chat(src, "alarm, alert, notice, flash,blink, whistle, beep, boop") + + if(message && !stat) + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm new file mode 100644 index 00000000000..0cb277e8642 --- /dev/null +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -0,0 +1,889 @@ +/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force) + + if (stat == DEAD) + return // No screaming bodies + + var/param = null + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + var/muzzled = is_muzzled() + if(sdisabilities & MUTE || silent) + muzzled = 1 + //var/m_type = 1 + + for (var/obj/item/weapon/implant/I in src) + if (I.implanted) + I.trigger(act, src) + + var/miming = 0 + if(mind) + miming = mind.miming + + //Emote Cooldown System (it's so simple!) + // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + var/on_CD = 0 + act = lowertext(act) + switch(act) + //Cooldown-inducing emotes + if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no", "buzz2") + if (species.name == "Machine") //Only Machines can beep, ping, and buzz, yes, no, and make a silly sad trombone noise. + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + else //Everyone else fails, skip the emote attempt + return + if("drone","drones","hum","hums","rumble","rumbles") + if (species.name == "Drask") //Only Drask can make whale noises + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + else + return + if("squish", "squishes") + var/found_slime_bodypart = 0 + + if(species.name == "Slime People") //Only Slime People can squish + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm' + found_slime_bodypart = 1 + else + for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too! + if(L.dna.species in list("Slime People")) + on_CD = handle_emote_CD() + found_slime_bodypart = 1 + break + + if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt + return + if("scream", "screams") + on_CD = handle_emote_CD(50) //longer cooldown + if("fart", "farts", "flip", "flips", "snap", "snaps") + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + //Everything else, including typos of the above emotes + else + on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown + + if(on_CD == 1) // Check if we need to suppress the emote attempt. + return // Suppress emote, you're still cooling off. + + switch(act) + if("me") //OKAY SO RANT TIME, THIS FUCKING HAS TO BE HERE OR A SHITLOAD OF THINGS BREAK + return custom_emote(m_type, message) //DO YOU KNOW WHY SHIT BREAKS? BECAUSE SO MUCH OLDCODE CALLS mob.emote("me",1,"whatever_the_fuck_it_wants_to_emote") + //WHO THE FUCK THOUGHT THAT WAS A GOOD FUCKING IDEA!?!? + + if("ping", "pings") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] pings at [param]." + else + message = "[src] pings." + playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) + m_type = 2 + + if("buzz2") + message = "[src] emits an irritated buzzing sound." + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + m_type = 2 + + if("buzz", "buzzes") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] buzzes at [param]." + else + message = "[src] buzzes." + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + m_type = 2 + + if("beep", "beeps") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] beeps at [param]." + else + message = "[src] beeps." + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + m_type = 2 + + if("drone", "drones", "hum", "hums", "rumble", "rumbles") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] drones at [param]." + else + message = "[src] rumbles." + playsound(src.loc, 'sound/voice/DraskTalk.ogg', 50, 0) + m_type = 2 + + if("squish", "squishes") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] squishes at [param]." + else + message = "[src] squishes." + playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound. + m_type = 2 + + if("yes") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] emits an affirmative blip at [param]." + else + message = "[src] emits an affirmative blip." + playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0) + m_type = 2 + + if("no") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] emits a negative blip at [param]." + else + message = "[src] emits a negative blip." + playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0) + m_type = 2 + + if("wag", "wags") + if(body_accessory) + if(body_accessory.try_restrictions(src)) + message = "[src] starts wagging \his tail." + start_tail_wagging(1) + + else if(species.bodyflags & TAIL_WAGGING) + if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) + message = "[src] starts wagging \his tail." + src.start_tail_wagging(1) + else + return + else + return + m_type = 1 + + if("swag", "swags") + if(species.bodyflags & TAIL_WAGGING || body_accessory) + message = "[src] stops wagging \his tail." + src.stop_tail_wagging(1) + else + return + m_type = 1 + + if ("airguitar") + if (!src.restrained()) + message = "[src] is strumming the air and headbanging like a safari chimp." + m_type = 1 + + if ("blink", "blinks") + message = "[src] blinks." + m_type = 1 + + if ("blink_r", "blinks_r") + message = "[src] blinks rapidly." + m_type = 1 + + if ("bow", "bows") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] bows to [param]." + else + message = "[src] bows." + m_type = 1 + + if ("salute", "salutes") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] salutes to [param]." + else + message = "[src] salutes." + m_type = 1 + + if ("choke", "chokes") + if(miming) + message = "[src] clutches \his throat desperately!" + m_type = 1 + else + if (!muzzled) + message = "[src] chokes!" + m_type = 2 + else + message = "[src] makes a strong noise." + m_type = 2 + + if ("burp", "burps") + if(miming) + message = "[src] opens their mouth rather obnoxiously." + m_type = 1 + else + if (!muzzled) + message = "[src] burps." + m_type = 2 + else + message = "[src] makes a peculiar noise." + m_type = 2 + if ("clap", "claps") + if (!src.restrained()) + message = "[src] claps." + m_type = 2 + if(miming) + m_type = 1 + if ("flap", "flaps") + if (!src.restrained()) + message = "[src] flaps \his wings." + m_type = 2 + if(miming) + m_type = 1 + + if ("flip", "flips") + m_type = 1 + if (!src.restrained()) + var/M = null + if (param) + for (var/mob/A in view(1, null)) + if (param == A.name) + M = A + break + if (M == src) + M = null + + if(M) + if(lying || weakened) + message = "[src] flops and flails around on the floor." + else + message = "[src] flips in [M]'s general direction." + SpinAnimation(5,1) + else + if(lying || weakened) + message = "[src] flops and flails around on the floor." + else + var/obj/item/weapon/grab/G + if(istype(get_active_hand(), /obj/item/weapon/grab)) + G = get_active_hand() + if(G && G.affecting) + if(buckled || G.affecting.buckled) + return + var/turf/oldloc = loc + var/turf/newloc = G.affecting.loc + if(isturf(oldloc) && isturf(newloc)) + SpinAnimation(5,1) + forceMove(newloc) + G.affecting.forceMove(oldloc) + message = "[src] flips over [G.affecting]!" + else + message = "[src] does a flip!" + SpinAnimation(5,1) + + if ("aflap", "aflaps") + if (!src.restrained()) + message = "[src] flaps \his wings ANGRILY!" + m_type = 2 + if(miming) + m_type = 1 + + if ("drool", "drools") + message = "[src] drools." + m_type = 1 + + if ("eyebrow") + message = "[src] raises an eyebrow." + m_type = 1 + + if ("chuckle", "chuckles") + if(miming) + message = "[src] appears to chuckle." + m_type = 1 + else + if (!muzzled) + message = "[src] chuckles." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("twitch", "twitches") + message = "[src] twitches violently." + m_type = 1 + + if ("twitch_s", "twitches_s") + message = "[src] twitches." + m_type = 1 + + if ("faint", "faints") + message = "[src] faints." + if(src.sleeping) + return //Can't faint while asleep + src.sleeping += 1 + m_type = 1 + + if ("cough", "coughs") + if(miming) + message = "[src] appears to cough!" + m_type = 1 + else + if (!muzzled) + message = "[src] coughs!" + m_type = 2 + else + message = "[src] makes a strong noise." + m_type = 2 + + if ("frown", "frowns") + message = "[src] frowns." + m_type = 1 + + if ("nod", "nods") + message = "[src] nods." + m_type = 1 + + if ("blush", "blushes") + message = "[src] blushes." + m_type = 1 + + if ("wave", "waves") + message = "[src] waves." + m_type = 1 + + if ("quiver", "quivers") + message = "[src] quivers." + m_type = 1 + + if ("gasp", "gasps") + if(miming) + message = "[src] appears to be gasping!" + m_type = 1 + else + if (!muzzled) + message = "[src] gasps!" + m_type = 2 + else + message = "[src] makes a weak noise." + m_type = 2 + + if ("deathgasp", "deathgasps") + message = "[src] [species.death_message]" + m_type = 1 + + if ("giggle", "giggles") + if(miming) + message = "[src] giggles silently!" + m_type = 1 + else + if (!muzzled) + message = "[src] giggles." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("glare", "glares") + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] glares at [param]." + else + message = "[src] glares." + m_type = 1 + + if ("stare", "stares") + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] stares at [param]." + else + message = "[src] stares." + m_type = 1 + + if ("look", "looks") + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + + if (!M) + param = null + + if (param) + message = "[src] looks at [param]." + else + message = "[src] looks." + m_type = 1 + + if ("grin", "grins") + message = "[src] grins." + m_type = 1 + + if ("cry", "cries") + if(miming) + message = "[src] cries." + m_type = 1 + else + if (!muzzled) + message = "[src] cries." + m_type = 2 + else + message = "[src] makes a weak noise. \He frowns." + m_type = 2 + + if ("sigh", "sighs") + if(miming) + message = "[src] sighs." + m_type = 1 + else + if (!muzzled) + message = "[src] sighs." + m_type = 2 + else + message = "[src] makes a weak noise." + m_type = 2 + + if ("laugh", "laughs") + if(miming) + message = "[src] acts out a laugh." + m_type = 1 + else + if (!muzzled) + message = "[src] laughs." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("mumble", "mumbles") + message = "[src] mumbles!" + m_type = 2 + if(miming) + m_type = 1 + + if ("grumble", "grumbles") + if(miming) + message = "[src] grumbles!" + m_type = 1 + if (!muzzled) + message = "[src] grumbles!" + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("groan", "groans") + if(miming) + message = "[src] appears to groan!" + m_type = 1 + else + if (!muzzled) + message = "[src] groans!" + m_type = 2 + else + message = "[src] makes a loud noise." + m_type = 2 + + if ("moan", "moans") + if(miming) + message = "[src] appears to moan!" + m_type = 1 + else + message = "[src] moans!" + m_type = 2 + + if ("johnny") + var/M + if (param) + M = param + if (!M) + param = null + else + if(miming) + message = "[src] takes a drag from a cigarette and blows \"[M]\" out in smoke." + m_type = 1 + else + message = "[src] says, \"[M], please. They had a family.\" [src.name] takes a drag from a cigarette and blows their name out in smoke." + m_type = 2 + + if ("point", "points") + if (!src.restrained()) + var/atom/M = null + if (param) + for (var/atom/A as mob|obj|turf in view()) + if (param == A.name) + M = A + break + + if (!M) + message = "[src] points." + else + pointed(M) + m_type = 1 + + if ("raise", "raises") + if (!src.restrained()) + message = "[src] raises a hand." + m_type = 1 + + if("shake", "shakes") + message = "[src] shakes \his head." + m_type = 1 + + if ("shrug", "shrugs") + message = "[src] shrugs." + m_type = 1 + + if ("signal", "signals") + if (!src.restrained()) + var/t1 = round(text2num(param)) + if (isnum(t1)) + if (t1 <= 5 && (!src.r_hand || !src.l_hand)) + message = "[src] raises [t1] finger\s." + else if (t1 <= 10 && (!src.r_hand && !src.l_hand)) + message = "[src] raises [t1] finger\s." + m_type = 1 + + if ("smile", "smiles") + message = "[src] smiles." + m_type = 1 + + if ("shiver", "shivers") + message = "[src] shivers." + m_type = 2 + if(miming) + m_type = 1 + + if ("pale", "pales") + message = "[src] goes pale for a second." + m_type = 1 + + if ("tremble", "trembles") + message = "[src] trembles." + m_type = 1 + + if ("sneeze", "sneezes") + if (miming) + message = "[src] sneezes." + m_type = 1 + else + if (!muzzled) + message = "[src] sneezes." + m_type = 2 + else + message = "[src] makes a strange noise." + m_type = 2 + + if ("sniff", "sniffs") + message = "[src] sniffs." + m_type = 2 + if(miming) + m_type = 1 + + if ("snore", "snores") + if (miming) + message = "[src] sleeps soundly." + m_type = 1 + else + if (!muzzled) + message = "[src] snores." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("whimper", "whimpers") + if (miming) + message = "[src] appears hurt." + m_type = 1 + else + if (!muzzled) + message = "[src] whimpers." + m_type = 2 + else + message = "[src] makes a weak noise." + m_type = 2 + + if ("wink", "winks") + message = "[src] winks." + m_type = 1 + + if ("yawn", "yawns") + if (!muzzled) + message = "[src] yawns." + m_type = 2 + if(miming) + m_type = 1 + + if ("collapse", "collapses") + Paralyse(2) + message = "[src] collapses!" + m_type = 2 + if(miming) + m_type = 1 + + if("hug", "hugs") + m_type = 1 + if (!src.restrained()) + var/M = null + if (param) + for (var/mob/A in view(1, null)) + if (param == A.name) + M = A + break + if (M == src) + M = null + + if (M) + message = "[src] hugs [M]." + else + message = "[src] hugs \himself." + + if ("handshake") + m_type = 1 + if (!src.restrained() && !src.r_hand) + var/mob/M = null + if (param) + for (var/mob/A in view(1, null)) + if (param == A.name) + M = A + break + if (M == src) + M = null + + if (M) + if (M.canmove && !M.r_hand && !M.restrained()) + message = "[src] shakes hands with [M]." + else + message = "[src] holds out \his hand to [M]." + + if("dap", "daps") + m_type = 1 + if (!src.restrained()) + var/M = null + if (param) + for (var/mob/A in view(1, null)) + if (param == A.name) + M = A + break + if (M) + message = "[src] gives daps to [M]." + else + message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful." + + if("slap", "slaps") + m_type = 1 + if (!src.restrained()) + var/M = null + if (param) + for (var/mob/A in view(1, null)) + if (param == A.name) + M = A + break + if (M) + message = "\red [src] slaps [M] across the face. Ouch!" + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + else + message = "\red [src] slaps \himself!" + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + src.adjustFireLoss(4) + + if ("scream", "screams") + if (miming) + message = "[src] acts out a scream!" + m_type = 1 + else + if (!muzzled) + message = "[src] [species.scream_verb]!" + m_type = 2 + if(gender == FEMALE) + playsound(src.loc, "[species.female_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) + else + playsound(src.loc, "[species.male_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) //default to male screams if no gender is present. + + else + message = "[src] makes a very loud noise." + m_type = 2 + + + if ("snap", "snaps") + if(prob(95)) + m_type = 2 + var/mob/living/carbon/human/H = src + var/obj/item/organ/external/L = H.get_organ("l_hand") + var/obj/item/organ/external/R = H.get_organ("r_hand") + var/left_hand_good = 0 + var/right_hand_good = 0 + if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN))) + left_hand_good = 1 + if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN))) + right_hand_good = 1 + + if (!left_hand_good && !right_hand_good) + to_chat(usr, "You need at least one hand in good working order to snap your fingers.") + return + + message = "[src] snaps \his fingers." + playsound(src.loc, 'sound/effects/fingersnap.ogg', 50, 1, -3) + else + message = "[src] snaps \his fingers right off!" + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + + + // Needed for M_TOXIC_FART + if("fart", "farts") + if(reagents.has_reagent("simethicone")) + return +// playsound(src.loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun + if(locate(/obj/item/weapon/storage/bible) in get_turf(src)) + to_chat(viewers(src), "[src] farts on the Bible!") + to_chat(viewers(src), "A mysterious force smites [src]!") + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + src.gib() + else if(TOXIC_FARTS in mutations) + message = "[src] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart." + else + message = "[src] [pick("passes wind","farts")]." + m_type = 2 + + var/turf/location = get_turf(src) + var/aoe_range=2 // Default + + // Process toxic farts first. + if(TOXIC_FARTS in mutations) + for(var/mob/M in range(location,aoe_range)) + if (M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT)) + continue + // Now, we don't have this: + //new /obj/effects/fart_cloud(T,L) + if (M == src) + continue + M.reagents.add_reagent("jenkem", 1) + + if ("help") + var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dap(s)(none)/mob," \ + + " deathgasp(s), drool(s), eyebrow,fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), handshake-mob, hug(s)-(none)/mob," \ + + " glare(s)-(none)/mob, grin(s), johnny, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \ + + " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \ + + " wag(s), wave(s), whimper(s), wink(s), yawn(s)" + if(species.name == "Machine") + emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob" + else if(species.name == "Slime People") + emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob" + to_chat(src, emotelist) + + else + to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") + + + + + + if(message) //Humans are special fucking snowflakes and have 735 lines of emotes, they get to handle their own emotes, not call the parent + log_emote("[name]/[key] : [message]") + + //Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. + + for(var/mob/M in dead_mob_list) + if(!M.client || istype(M, /mob/new_player)) + continue //skip monkeys, leavers and new players + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + switch(m_type) + if(1) + visible_message(message) + if(2) + audible_message(message) + +/mob/living/carbon/human/verb/pose() + set name = "Set Pose" + set desc = "Sets a description which will be shown when someone examines you." + set category = "IC" + + pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN)) + +/mob/living/carbon/human/verb/set_flavor() + set name = "Set Flavour Text" + set desc = "Sets an extended description of your character's features." + set category = "IC" + + update_flavor_text() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ed02823215f..1bc79c16242 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1882,7 +1882,7 @@ threatcount += 2 - //Loyalty implants imply trustworthyness + //Mindshield implants imply slight trustworthiness if(isloyal(src)) threatcount -= 1 diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index 922810e758d..df608980e47 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -66,7 +66,7 @@ item_color = "golem" has_sensor = 0 flags = ABSTRACT | NODROP - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/suit/golem name = "adamantine shell" diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm new file mode 100644 index 00000000000..8c290dc6094 --- /dev/null +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -0,0 +1,75 @@ +/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null) + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + //param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + act = lowertext(act) + switch(act) //Alphabetical please + if ("me") + if(silent) + return + if (src.client) + if (client.prefs.muted & MUTE_IC) + to_chat(src, "\red You cannot send IC messages (muted).") + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + return custom_emote(m_type, message) + if("bounce") + message = "The [src.name] bounces in place." + m_type = 1 + + if ("custom") + return custom_emote(m_type, message) + + if("jiggle") + message = "The [src.name] jiggles!" + m_type = 1 + + if("light") + message = "The [src.name] lights up for a bit, then stops." + m_type = 1 + + if("moan") + message = "The [src.name] moans." + m_type = 2 + + if("shiver") + message = "The [src.name] shivers." + m_type = 2 + + if("sway") + message = "The [src.name] sways around dizzily." + m_type = 1 + + if("twitch") + message = "The [src.name] twitches." + m_type = 1 + + if("vibrate") + message = "The [src.name] vibrates!" + m_type = 1 + + if ("help") //This is an exception + to_chat(src, "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate") + + else + to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") + if ((message && src.stat == 0)) + if (m_type & 1) + for(var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + //Foreach goto(703) + else + for(var/mob/O in hearers(src, null)) + O.show_message(message, m_type) + //Foreach goto(746) + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index 1ad57bd787d..ab12c584259 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -191,14 +191,14 @@ if(isloyal(target)) to_chat(usr, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.") usr.visible_message("[usr] stops talking for a moment, then moves back away from [target].") - to_chat(target, "Your loyalty implant activates and a sharp pain reminds you of your loyalties to Nanotrasen.") + to_chat(target, "Your mindshield implant activates, protecting you from conversion.") return if(3) to_chat(usr, "You begin filling out the application form with [target].") usr.visible_message("[usr] pulls out a pen and paper and begins filling an application form with [target].") to_chat(target, "You are being convinced by [usr] to fill out an application form to become a henchman.")//Ow the edge - if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant + if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a mindshield implant to_chat(usr, "The enrollment process has been interrupted - you have lost the attention of [target].") to_chat(target, "You move away and are no longer under the charm of [usr]. The application form is null and void.") recruiting = 0 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 85eea65bbab..c6d0d8e3ee0 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -296,6 +296,34 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/GetVoice() return name +/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't + if(stat) return 0 //already snowflaked to shit can call the parent and handle emoting sanely + + if(..(act, type, message)) + return 1 + + if(act && type && message) //parent call + log_emote("[name]/[key] : [message]") + + for(var/mob/M in dead_mob_list) + if(!M.client || istype(M, /mob/new_player)) + continue //skip monkeys, leavers and new players //who the hell knows why new players are in the dead mob list + + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + switch(type) + if(1) //Visible + visible_message(message) + return 1 + if(2) //Audible + audible_message(message) + return 1 + + else //everything else failed, emote is probably invalid + if(act == "help") return //except help, because help is handled individually + to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") + /mob/living/whisper(message as text) message = trim_strip_html_properly(message) diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm new file mode 100644 index 00000000000..233df91eb55 --- /dev/null +++ b/code/modules/mob/living/silicon/emote.dm @@ -0,0 +1,127 @@ +/mob/living/silicon/emote(var/act, var/m_type=1, var/message = null) + var/param = null + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + //Emote Cooldown System (it's so simple!) + // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + var/on_CD = 0 + act = lowertext(act) + switch(act) + //Cooldown-inducing emotes + if("scream", "screams") + on_CD = handle_emote_CD(50) //longer cooldown + if("ping","pings","buzz","buzzs","buzzes","beep","beeps","yes","no", "buzz2") + //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT. + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + //Everything else, including typos of the above emotes + else + on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown + + if(on_CD == 1) // Check if we need to suppress the emote attempt. + return // Suppress emote, you're still cooling off. + //--FalseIncarnate + + switch(act) + if("ping","pings") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] pings at [param]." + else + message = "[src] pings." + playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) + m_type = 2 + + if("buzz","buzzs","buzzes") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] buzzes at [param]." + else + message = "[src] buzzes." + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + m_type = 2 + + if("beep","beeps") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] beeps at [param]." + else + message = "[src] beeps." + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + m_type = 2 + + if("yes") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] emits an affirmative blip at [param]." + else + message = "[src] emits an affirmative blip." + playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0) + m_type = 2 + + if("no") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] emits a negative blip at [param]." + else + message = "[src] emits a negative blip." + playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0) + m_type = 2 + + if("scream", "screams") + message = "[src] screams!" + playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0) + m_type = 2 + + if("buzz2") + message = "[src] emits an irritated buzzing sound." + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + m_type = 2 + + + if("help") + to_chat(src, "yes, no, beep, ping, buzz, scream, buzz2") + + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm new file mode 100644 index 00000000000..a418c0972d5 --- /dev/null +++ b/code/modules/mob/living/silicon/pai/emote.dm @@ -0,0 +1,2 @@ +/mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null) + ..(act, m_type, message) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm new file mode 100644 index 00000000000..9b014da6604 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -0,0 +1,163 @@ +/mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null) + var/param = null + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + //Emote Cooldown System (it's so simple!) + // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + var/on_CD = 0 + act = lowertext(act) + switch(act) + //Cooldown-inducing emotes + if("law","flip","flips","halt") //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT. + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + //Everything else, including typos of the above emotes + else + on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown + + if(on_CD == 1) // Check if we need to suppress the emote attempt. + return // Suppress emote, you're still cooling off. + //--FalseIncarnate + + switch(act) + + if ("salute","salutes") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] salutes to [param]." + else + message = "[src] salutes." + m_type = 1 + if ("bow","bows") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] bows to [param]." + else + message = "[src] bows." + m_type = 1 + + if ("clap","claps") + if (!src.restrained()) + message = "[src] claps." + m_type = 2 + if ("flap","flaps") + if (!src.restrained()) + message = "[src] flaps its wings." + m_type = 2 + + if ("aflap","aflaps") + if (!src.restrained()) + message = "[src] flaps its wings ANGRILY!" + m_type = 2 + + if ("twitch") + message = "[src] twitches violently." + m_type = 1 + + if ("twitch_s","twitches") + message = "[src] twitches." + m_type = 1 + + if ("nod","nods") + message = "[src] nods." + m_type = 1 + + if ("deathgasp") + message = "[src] shudders violently for a moment, then becomes motionless, its eyes slowly darkening." + m_type = 1 + + if ("glare","glares") + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] glares at [param]." + else + message = "[src] glares." + + if ("stare","stares") + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if (!M) + param = null + + if (param) + message = "[src] stares at [param]." + else + message = "[src] stares." + + if ("look","looks") + var/M = null + if (param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + + if (!M) + param = null + + if (param) + message = "[src] looks at [param]." + else + message = "[src] looks." + m_type = 1 + + + if("law") + if (istype(module,/obj/item/weapon/robot_module/security)) + message = "[src] shows its legal authorization barcode." + + playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0) + m_type = 2 + else + to_chat(src, "You are not THE LAW, pal.") + + if("halt") + if (istype(module,/obj/item/weapon/robot_module/security)) + message = "[src]'s speakers skreech, \"Halt! Security!\"." + + playsound(src.loc, 'sound/voice/halt.ogg', 50, 0) + m_type = 2 + else + to_chat(src, "You are not security.") + + if ("flip","flips") + m_type = 1 + message = "[src] does a flip!" + src.SpinAnimation(5,1) + + if ("help") + to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitches, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look,\n law, halt") + + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 94ae02a56ce..a546e164901 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -128,6 +128,13 @@ return return 1 +/mob/living/silicon/ai/emote(var/act, var/type, var/message) + var/obj/machinery/hologram/holopad/T = src.holo + if(T && T.hologram && T.master == src) //Is the AI using a holopad? + src.holopad_emote(message) + else //Emote normally, then. + ..() + #undef IS_AI #undef IS_ROBOT #undef IS_PAI diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm new file mode 100644 index 00000000000..0c8b591f069 --- /dev/null +++ b/code/modules/mob/living/simple_animal/bot/emote.dm @@ -0,0 +1,120 @@ +/mob/living/simple_animal/bot/emote(var/act, var/m_type=1, var/message = null) + var/param = null + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + //Emote Cooldown System (it's so simple!) + // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] + var/on_CD = 0 + act = lowertext(act) + switch(act) + //Cooldown-inducing emotes + if("scream", "screams") + on_CD = handle_emote_CD(50) //longer cooldown + if("ping","buzz","beep","yes","no") //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT. + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + //Everything else, including typos of the above emotes + else + on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown + + if(on_CD == 1) // Check if we need to suppress the emote attempt. + return // Suppress emote, you're still cooling off. + //--FalseIncarnate + + switch(act) + if("ping") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] pings at [param]." + else + message = "[src] pings." + playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) + m_type = 2 + + if("buzz") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] buzzes at [param]." + else + message = "[src] buzzes." + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + m_type = 2 + + if("beep") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] beeps at [param]." + else + message = "[src] beeps." + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) + m_type = 2 + + if("yes") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] emits an affirmative blip at [param]." + else + message = "[src] emits an affirmative blip." + playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0) + m_type = 2 + + if("no") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] emits a negative blip at [param]." + else + message = "[src] emits a negative blip." + playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0) + m_type = 2 + + if("scream", "screams") + message = "[src] screams!" + playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0) + m_type = 2 + + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 125061f9275..c62243a23f4 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -249,3 +249,26 @@ /mob/living/simple_animal/diona/put_in_active_hand(obj/item/W) to_chat(src, "You don't have any hands!") return + +/mob/living/simple_animal/diona/emote(var/act, var/m_type=1, var/message = null) + if(stat) + return + + var/on_CD = 0 + act = lowertext(act) + switch(act) + if("chirp") + on_CD = handle_emote_CD() + else + on_CD = 0 + + if(on_CD == 1) + return + + switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain. + if("chirp") + message = "\The [src] chirps!" + m_type = 2 //audible + playsound(src, 'sound/misc/nymphchirp.ogg', 40, 1, 1) + + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 6d2efd88010..287c3aaa69d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -456,8 +456,8 @@ if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner)) var/obj/item/clothing/C = target var/current_armor = C.armor - if(current_armor.["melee"] < 80) - current_armor.["melee"] = min(current_armor.["melee"] + 10, 80) + if(current_armor.["melee"] < 60) + current_armor.["melee"] = min(current_armor.["melee"] + 10, 60) to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") qdel(src) else diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f41cef386aa..2f85c4d02bd 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -23,7 +23,6 @@ else living_mob_list += src prepare_huds() - emoteHandler = new /datum/emoteHandler(src) ..() /atom/proc/prepare_huds() @@ -248,6 +247,7 @@ return // Bag could not be placed in players hands. I don't know what to do here... //Now, B represents a container we can insert W into. B.handle_item_insertion(W,1) + return B //The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. var/list/slot_equipment_priority = list( \ @@ -1328,11 +1328,11 @@ mob/proc/yank_out_object() /mob/proc/get_ghost(even_if_they_cant_reenter = 0) if(mind) - for(var/mob/dead/observer/G in dead_mob_list) - if(G.mind == mind) - if(G.can_reenter_corpse || even_if_they_cant_reenter) - return G - break + return mind.get_ghost(even_if_they_cant_reenter) + +/mob/proc/grab_ghost(force) + if(mind) + return mind.grab_ghost(force = force) /mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null) var/mob/dead/observer/ghost = get_ghost() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 13d5d7c976e..a8e7cd147f6 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -233,6 +233,4 @@ var/datum/vision_override/vision_type = null //Vision override datum. - var/list/permanent_huds = list() - - var/datum/emoteHandler/emoteHandler \ No newline at end of file + var/list/permanent_huds = list() \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6e0645866d5..35318d6ef65 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -22,7 +22,7 @@ return 0 return 1 -/proc/isloyal(A) //Checks to see if the person contains a loyalty implant, then checks that the implant is actually inside of them +/proc/isloyal(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them for(var/obj/item/weapon/implant/loyalty/L in A) if(L && L.implanted) return 1 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2d9181dbc9f..528527c15ba 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -415,21 +415,64 @@ else if(shuttle_master.emergency.mode >= SHUTTLE_CALL) dat += "The station is currently undergoing evacuation procedures.
      " - dat += "Choose from the following open positions:
      " + dat += "Choose from the following open positions:

      " + + var/list/activePlayers = list() + var/list/categorizedJobs = list( + "Command" = list(jobs = list(), titles = command_positions, color = "#aac1ee"), + "Engineering" = list(jobs = list(), titles = engineering_positions, color = "#ffd699"), + "Security" = list(jobs = list(), titles = security_positions, color = "#ff9999"), + "Miscellaneous" = list(jobs = list(), titles = list(), color = "#ffffff", colBreak = 1), + "Synthetic" = list(jobs = list(), titles = nonhuman_positions, color = "#ccffcc"), + "Support / Service" = list(jobs = list(), titles = service_positions, color = "#cccccc"), + "Medical" = list(jobs = list(), titles = medical_positions, color = "#99ffe6", colBreak = 1), + "Science" = list(jobs = list(), titles = science_positions, color = "#e6b3e6"), + "Supply" = list(jobs = list(), titles = supply_positions, color = "#ead4ae"), + ) for(var/datum/job/job in job_master.occupations) if(job && IsJobAvailable(job.title)) - var/active = 0 + activePlayers[job] = 0 + var/categorized = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active - for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 * 60 * 10) - active++ - dat += "[job.title] ([job.current_positions]) (Active: [active])
      " + for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 MINUTES) + activePlayers[job]++ + for(var/jobcat in categorizedJobs) + var/list/jobs = categorizedJobs[jobcat]["jobs"] + if(job.title in categorizedJobs[jobcat]["titles"]) + categorized = 1 + if(jobcat == "Command") // Put captain at top of command jobs + if(job.title == "Captain") + jobs.Insert(1, job) + else + jobs += job + else // Put heads at top of non-command jobs + if(job.title in command_positions) + jobs.Insert(1, job) + else + jobs += job + if(!categorized) + categorizedJobs["Miscellaneous"]["jobs"] += job - dat += "
      " + dat += "
      " + for(var/jobcat in categorizedJobs) + if(categorizedJobs[jobcat]["colBreak"]) + dat += "" + if(length(categorizedJobs[jobcat]["jobs"]) < 1) + continue + var/color = categorizedJobs[jobcat]["color"] + dat += "
      " + dat += "[jobcat]" + for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
      " + dat += "

      " + + dat += "
      " // Removing the old window method but leaving it here for reference // src << browse(dat, "window=latechoices;size=300x640;can_close=1") // Added the new browser window method - var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 440, 500) + var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 900, 600) popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') + popup.add_script("delay_interactivity", 'html/browser/delay_interactivity.js') popup.set_content(dat) popup.open(0) // 0 is passed to open so that it doesn't use the onclose() proc diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 493fade2ea1..50e203eb5fd 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -30,19 +30,15 @@ /mob/verb/me_verb(message as text) set name = "Me" - set category = "Emotes" - set desc = "(action) Enter a custom emote." + set category = "IC" - if(!message) - return + message = strip_html_properly(message) - message = trim_strip_html_properly(message) - - if(message == "") - return - - if(emoteHandler) - return emoteHandler.runEmote("me", message) + set_typing_indicator(0) + if(use_me) + custom_emote(usr.emote_type, message) + else + usr.emote(message) /mob/proc/say_dead(var/message) @@ -104,10 +100,8 @@ /mob/proc/emote(var/act, var/type, var/message) - - act = lowertext(act) - return emoteHandler.runEmote(act, message, type) - + if(act == "me") + return custom_emote(type, message) /mob/proc/get_ear() @@ -152,7 +146,4 @@ if (can_speak(L)) return L - return null - -/mob/proc/custom_emote(var/m_type=0, var/message = null) - return emoteHandler.runEmote("me", message, m_type) \ No newline at end of file + return null \ No newline at end of file diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 5e6a1cbcb32..701c4e7080b 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -5,7 +5,7 @@ item_state = "energy_katana" force = 40 throwforce = 20 - armour_penetration = 15 + armour_penetration = 50 var/cooldown = 0 // Because spam aint cool, yo. var/datum/effect/system/spark_spread/spark_system diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index c2fb287b9a8..5cb67e73db6 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -5,7 +5,7 @@ icon_state = "s-ninja" permeability_coefficient = 0.01 flags = NOSLIP - armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 30) cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT heat_protection = FEET diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 936f947758d..73ac456ebf9 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -15,7 +15,7 @@ Contents: allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/weapon/melee/baton, /obj/item/weapon/tank, /obj/item/weapon/stock_parts/cell) slowdown = 0 unacidable = 1 - armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 30) var/suitActive = 0 var/suitBusy = 0 diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 11f864451b7..db7a054a693 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -577,7 +577,7 @@ /obj/item/weapon/paper/armory name = "paper- 'Armory Inventory'" - info = "4 Deployable Barriers
      4 Portable Flashers
      1 Mechanical Toolbox
      2 Boxes of Spare Handcuffs
      1 Box of Flashbangs
      1 Box of Spare R.O.B.U.S.T. Cartridges
      1 Tracking Implant Kit
      1 Chemical Implant Kit
      1 Box of Tear Gas Grenades
      1 Explosive Ordnance Disposal Suit
      1 Biohazard Suit
      6 Gas Masks
      1 Lockbox of Loyalty Implants
      1 Ion Rifle
      3 Sets of Riot Equipment
      2 Sets of Security Hardsuits
      1 Ablative Armor Vest
      3 Bulletproof Vests
      3 Helmets

      2 Riot Shotguns
      2 Boxes of Beanbag Shells
      3 Laser Guns
      3 Energy Guns
      3 Advanced Tasers" + info = "4 Deployable Barriers
      4 Portable Flashers
      1 Mechanical Toolbox
      2 Boxes of Spare Handcuffs
      1 Box of Flashbangs
      1 Box of Spare R.O.B.U.S.T. Cartridges
      1 Tracking Implant Kit
      1 Chemical Implant Kit
      1 Box of Tear Gas Grenades
      1 Explosive Ordnance Disposal Suit
      1 Biohazard Suit
      6 Gas Masks
      1 Lockbox of Mindshield Implants
      1 Ion Rifle
      3 Sets of Riot Equipment
      2 Sets of Security Hardsuits
      1 Ablative Armor Vest
      3 Bulletproof Vests
      3 Helmets

      2 Riot Shotguns
      2 Boxes of Beanbag Shells
      3 Laser Guns
      3 Energy Guns
      3 Advanced Tasers" /obj/item/weapon/paper/firingrange name = "paper- 'Firing Range Instructions'" diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 59bd7fb649b..1d9949173ad 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -1,4 +1,4 @@ -/obj/item/weapon/gun/projectile/sniper_rifle +/obj/item/weapon/gun/projectile/automatic/sniper_rifle name = "sniper rifle" desc = "the kind of gun that will leave you crying for mummy before you even realise your leg's missing" icon_state = "sniper" @@ -7,6 +7,7 @@ weapon_weight = WEAPON_MEDIUM mag_type = /obj/item/ammo_box/magazine/sniper_rounds fire_delay = 40 + burst_size = 1 origin_tech = "combat=8" can_unsuppress = 1 can_suppress = 1 @@ -14,14 +15,15 @@ zoomable = TRUE zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. slot_flags = SLOT_BACK + action_button_name = null -/obj/item/weapon/gun/projectile/sniper_rifle/update_icon() +/obj/item/weapon/gun/projectile/automatic/sniper_rifle/update_icon() if(magazine) icon_state = "sniper-mag" else icon_state = "sniper" -/obj/item/weapon/gun/projectile/sniper_rifle/syndicate +/obj/item/weapon/gun/projectile/automatic/sniper_rifle/syndicate name = "syndicate sniper rifle" desc = "Syndicate flavoured sniper rifle, it packs quite a punch, a punch to your face" origin_tech = "combat=8;syndicate=4" diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 68bcd9306d3..b0200b22ab2 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -625,13 +625,17 @@ if(!name) return name = reject_bad_text(name) - while (count--) + var/is_medical_patch = chemical_safety_check(reagents) + while(count--) var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(src.loc) if(!name) name = reagents.get_master_reagent_name() P.name = "[name] patch" P.pixel_x = rand(-7, 7) //random position P.pixel_y = rand(-7, 7) reagents.trans_to(P,amount_per_patch) + if(is_medical_patch) + P.instant_application = 1 + P.icon_state = "bandaid_med" else if (href_list["createbottle"]) if(!condi) var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null @@ -757,6 +761,12 @@ else return 0 +/obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R) + var/all_safe = 1 + for(var/datum/reagent/A in R.reagent_list) + if(!safe_chem_list.Find(A.id)) + all_safe = 0 + return all_safe /obj/machinery/chem_master/condimaster name = "\improper CondiMaster 3000" diff --git a/code/modules/reagents/newchem/patch.dm b/code/modules/reagents/newchem/patch.dm index 793b6f8ae6f..f686d293c24 100644 --- a/code/modules/reagents/newchem/patch.dm +++ b/code/modules/reagents/newchem/patch.dm @@ -36,6 +36,7 @@ /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh name = "syntheflesh patch" desc = "Helps with burn injuries." + icon_state = "bandaid_med" instant_application = 1 /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh/New() diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm index 06f4cded765..9e9de74e73e 100644 --- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm +++ b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm @@ -5,7 +5,7 @@ desc = "A sealed bio suit capable of insulating against exotic alien energies" icon_state = "engspace_suit" item_state = "engspace_suit" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) species_fit = null sprite_sheets = null @@ -14,14 +14,14 @@ desc = "A sealed bio hood capable of insulating against exotic alien energies." icon_state = "engspace_helmet" item_state = "engspace_helmet" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) /obj/item/clothing/suit/space/eva/anomaly name = "Excavation suit" desc = "A pressure resistant excavation suit partially capable of insulating against exotic alien energies." icon_state = "cespace_suit" item_state = "cespace_suit" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank) /obj/item/clothing/head/helmet/space/eva/anomaly @@ -29,4 +29,4 @@ desc = "A pressure resistant excavation hood partially capable of insulating against exotic alien energies." icon_state = "cespace_helmet" item_state = "cespace_helmet" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) diff --git a/html/browser/delay_interactivity.js b/html/browser/delay_interactivity.js new file mode 100644 index 00000000000..f621906337b --- /dev/null +++ b/html/browser/delay_interactivity.js @@ -0,0 +1,26 @@ +// Disables all links for one second after the browser window opens. + +(function(){ + // If there's already an onload, let's not clobber it + var oldonload = window.onload; + window.onload = function(){ + if(typeof oldonload == 'function'){ + oldonload(); + } + var onclicks = Array(); + var links = document.getElementsByTagName("a"); + var returnfalse = function(){return false;}; + for(var i = 0; i < links.length; i++){ + onclicks.push(links[i].onclick); + links[i].onclick = returnfalse; + } + setTimeout(function(){ + for(var i = 0; i < links.length; i++){ + // Reset onclick, but only if something else hasn't already changed it + if(links[i].onclick == returnfalse){ + links[i].onclick = onclicks[i]; + } + } + }, 1000); + }; +})(); diff --git a/html/changelog.html b/html/changelog.html index 78b8faec193..d7c76ff989f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,72 @@ -->
      +

      02 July 2016

      +

      Fethas updated:

      +
        +
      • adds comfirmation dialogs to transforms from player panel
      • +
      +

      Fox McCloud updated:

      +
        +
      • Adds in laughter demons
      • +
      • Can summon laughter demons as a wizard
      • +
      • Chem master can produce instantaneous medical patches if all chems are safe
      • +
      • Can now purchase sniper rifle and associated ammo on uplink during nuke ops
      • +
      • Most melee and laser armor values halved or reduced; some bullet armor reduced slightly
      • +
      • Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still slow though)
      • +
      • Mining armor caps out at 60 melee resist as opposed to 80
      • +
      • Ling melee armor reduced; bullet and laser values buffed a bit and slowdown removed
      • +
      • Chameleon jumpsuit has a little bit of armor
      • +
      • Detective's forensic jacket now has identical armor to the native detective jacket
      • +
      • Armor penetration added to energy swords, chainsaws, scythes, and spears
      • +
      • Fixes stun batons, telebatons, and abductor batons piercing/bypassing shields
      • +
      +

      FreeStylaLT updated:

      +
        +
      • Adds appropriate battle yells to sleeping carp
      • +
      +

      KasparoVy updated:

      +
        +
      • Engineer boots that've had their toes cut open now have a sprite.
      • +
      • Vox now have engineer workboot sprites.
      • +
      • Removes unused SWAT boot sprites that were really just copypasted jackboot sprites.
      • +
      +

      Krausus updated:

      +
        +
      • The late-join job listing is now big enough to show all the jobs at once, and organizes them into labeled categories.
      • +
      • Fixed Hotkey Help and hotkey mode toggle messages not appearing.
      • +
      • The late-join job listing will now ignore (mis)clicks for the first second after popping up.
      • +
      +

      Kyep updated:

      +
        +
      • "Loyalty" implants are now known as "Mindshield" implants
      • +
      • Admins playing CC jobs can no longer get antag status from autotraitor.
      • +
      +

      Tastyfish updated:

      +
        +
      • There's essentially a completely new space hotel map! Explorers rejoice!
      • +
      +

      TheDZD updated:

      +
        +
      • Chance for vampires to burn in the chapel has been greatly reduced (from a 35% chance down to 8% per tick).
      • +
      • Vampires do not scream from chapel/space burning until they actually start catching fire.
      • +
      • Threshold for vampires to catch fire from space/chapel burning changed from 60 health to 50 health.
      • +
      • Fire stacks from vampire burning no longer apply twice 35% of the time while below the health threshold.
      • +
      +

      VampyrBytes updated:

      +
        +
      • No more *me emoting from your corpse!
      • +
      +

      monster860 updated:

      +
        +
      • Fixes ghosts having a generic icon when darkness is toggled off
      • +
      +

      tigercat2000 updated:

      +
        +
      • There's a new tab in the character setup screen, "loadouts". This allows you to spawn with a limited number of preset items.
      • +
      • Character setup now uses #defines for the different tabs.
      • +
      +

      28 June 2016

      CrAzYPiLoT updated:

        diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 29c68feb153..cecfb4eff2a 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1941,3 +1941,61 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: All uses of \icon have been replaced with bicon() tkdrg: - rscadd: Admins now have a verb to wipe all scripts from telecomms. +2016-07-02: + Fethas: + - bugfix: adds comfirmation dialogs to transforms from player panel + Fox McCloud: + - rscadd: Adds in laughter demons + - rscadd: Can summon laughter demons as a wizard + - rscadd: Chem master can produce instantaneous medical patches if all chems are + safe + - rscadd: Can now purchase sniper rifle and associated ammo on uplink during nuke + ops + - tweak: Most melee and laser armor values halved or reduced; some bullet armor + reduced slightly + - tweak: Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still + slow though) + - tweak: Mining armor caps out at 60 melee resist as opposed to 80 + - tweak: Ling melee armor reduced; bullet and laser values buffed a bit and slowdown + removed + - tweak: Chameleon jumpsuit has a little bit of armor + - tweak: Detective's forensic jacket now has identical armor to the native detective + jacket + - tweak: Armor penetration added to energy swords, chainsaws, scythes, and spears + - bugfix: Fixes stun batons, telebatons, and abductor batons piercing/bypassing + shields + FreeStylaLT: + - rscadd: Adds appropriate battle yells to sleeping carp + KasparoVy: + - imageadd: Engineer boots that've had their toes cut open now have a sprite. + - imageadd: Vox now have engineer workboot sprites. + - imagedel: Removes unused SWAT boot sprites that were really just copypasted jackboot + sprites. + Krausus: + - tweak: The late-join job listing is now big enough to show all the jobs at once, + and organizes them into labeled categories. + - bugfix: Fixed Hotkey Help and hotkey mode toggle messages not appearing. + - tweak: The late-join job listing will now ignore (mis)clicks for the first second + after popping up. + Kyep: + - tweak: '"Loyalty" implants are now known as "Mindshield" implants' + - tweak: Admins playing CC jobs can no longer get antag status from autotraitor. + Tastyfish: + - rscadd: There's essentially a completely new space hotel map! Explorers rejoice! + TheDZD: + - tweak: Chance for vampires to burn in the chapel has been greatly reduced (from + a 35% chance down to 8% per tick). + - tweak: Vampires do not scream from chapel/space burning until they actually start + catching fire. + - tweak: Threshold for vampires to catch fire from space/chapel burning changed + from 60 health to 50 health. + - tweak: Fire stacks from vampire burning no longer apply twice 35% of the time + while below the health threshold. + VampyrBytes: + - bugfix: No more *me emoting from your corpse! + monster860: + - bugfix: Fixes ghosts having a generic icon when darkness is toggled off + tigercat2000: + - rscadd: There's a new tab in the character setup screen, "loadouts". This allows + you to spawn with a limited number of preset items. + - tweak: 'Character setup now uses #defines for the different tabs.' diff --git a/html/changelogs/AutoChangeLog-pr-4812.yml b/html/changelogs/AutoChangeLog-pr-4812.yml deleted file mode 100644 index 2277d38eb9f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4812.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - imageadd: "Engineer boots that've had their toes cut open now have a sprite." - - imageadd: "Vox now have engineer workboot sprites." - - imagedel: "Removes unused SWAT boot sprites that were really just copypasted jackboot sprites." diff --git a/html/changelogs/AutoChangeLog-pr-4815.yml b/html/changelogs/AutoChangeLog-pr-4815.yml deleted file mode 100644 index 462b92c49ed..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4815.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kyep -delete-after: True -changes: - - tweak: "Admins playing CC jobs can no longer get antag status from autotraitor." diff --git a/html/changelogs/AutoChangeLog-pr-4823.yml b/html/changelogs/AutoChangeLog-pr-4823.yml deleted file mode 100644 index 16bbcd105af..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4823.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: VampyrBytes -delete-after: True -changes: - - bugfix: "No more *me emoting from your corpse!" diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 685e6b2977b..491349985d4 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 6fed8c42c66..28096d4e1a4 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index ccf3bad52b5..40f5b5ddc17 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 05ccd754f9d..8aacc4a4178 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 81fe75b269b..f144b225160 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -10,7 +10,7 @@ else src << link(config.wikiurl) else - src << "The wiki URL is not set in the server configuration." + to_chat(src, "The wiki URL is not set in the server configuration.") return /client/verb/changes() @@ -51,7 +51,7 @@ return src << link(config.forumurl) else - src << "The forum URL is not set in the server configuration." + to_chat(src, "The forum URL is not set in the server configuration.") return /client/verb/rules() @@ -63,7 +63,7 @@ return src << link(config.rulesurl) else - src << "The rules URL is not set in the server configuration." + to_chat(src, "The rules URL is not set in the server configuration.") return /client/verb/donate() @@ -75,7 +75,7 @@ return src << link(config.donationsurl) else - src << "The rules URL is not set in the server configuration." + to_chat(src, "The rules URL is not set in the server configuration.") return /client/verb/hotkeys_help() @@ -94,7 +94,7 @@ Admin: mob.hotkey_help() if(check_rights(R_MOD|R_ADMIN,0)) - src << adminhotkeys + to_chat(src, adminhotkeys) /mob/proc/hotkey_help() var/hotkey_mode = {" @@ -151,8 +151,8 @@ Any-Mode: (hotkey doesn't need to be on) \tF4 = Me "} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) /mob/living/silicon/robot/hotkey_help() var/hotkey_mode = {" @@ -203,15 +203,15 @@ Any-Mode: (hotkey doesn't need to be on) \tF4 = Me "} - src << hotkey_mode - src << other + to_chat(src, hotkey_mode) + to_chat(src, other) //adv. hotkey mode verbs, vars located in /code/modules/client/client defines.dm /client/verb/hotkey_toggle()//toggles hotkey mode between on and off, respects selected type set name = ".Toggle Hotkey Mode" hotkeyon = !hotkeyon//toggle the var - usr << (hotkeyon ? "Hotkey mode enabled." : "Hotkey mode disabled.")//feedback to the user + to_chat(usr, (hotkeyon ? "Hotkey mode enabled." : "Hotkey mode disabled."))//feedback to the user if(hotkeyon)//using an if statement because I don't want to clutter winset() with ? operators winset(usr, "mainwindow.hotkey_toggle", "is-checked=true")//checks the button @@ -233,4 +233,4 @@ Any-Mode: (hotkey doesn't need to be on) var/hotkeyname = hotkeys[hotkeyon ? "on" : "off"]//get the name of the hotkey, to not clutter winset() to much winset(usr, "mainwindow", "macro=[hotkeyname]")//change the hotkey - usr << "Hotkey mode changed to [hotkeytype]." + to_chat(usr, "Hotkey mode changed to [hotkeytype].") diff --git a/paradise.dme b/paradise.dme index 42ebf601555..98223a2c155 100644 --- a/paradise.dme +++ b/paradise.dme @@ -264,9 +264,6 @@ #include "code\datums\diseases\advance\symptoms\weakness.dm" #include "code\datums\diseases\advance\symptoms\weight.dm" #include "code\datums\diseases\advance\symptoms\youth.dm" -#include "code\datums\Emote_system\emote.dm" -#include "code\datums\Emote_system\emote_handler.dm" -#include "code\datums\Emote_system\emotes.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\global_iterator.dm" @@ -855,7 +852,7 @@ #include "code\game\objects\items\weapons\implants\implant_explosive.dm" #include "code\game\objects\items\weapons\implants\implant_freedom.dm" #include "code\game\objects\items\weapons\implants\implant_krav_maga.dm" -#include "code\game\objects\items\weapons\implants\implant_loyality.dm" +#include "code\game\objects\items\weapons\implants\implant_mindshield.dm" #include "code\game\objects\items\weapons\implants\implant_misc.dm" #include "code\game\objects\items\weapons\implants\implant_storage.dm" #include "code\game\objects\items\weapons\implants\implant_track.dm" @@ -1096,8 +1093,10 @@ #include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\map_rng.dm" #include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\snpc.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" +#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" @@ -1110,16 +1109,23 @@ #include "code\modules\awaymissions\mission_code\clownplanet.dm" #include "code\modules\awaymissions\mission_code\evil_santa.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" +#include "code\modules\awaymissions\mission_code\spacehotel.dm" +#include "code\modules\awaymissions\mission_code\spacehotel_npcs.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" #include "code\modules\awaymissions\mission_code\wildwest.dm" #include "code\modules\client\asset_cache.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\message.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_mysql.dm" -#include "code\modules\client\preferences_spawnpoints.dm" -#include "code\modules\client\preferences_toggles.dm" +#include "code\modules\client\preference\preferences.dm" +#include "code\modules\client\preference\preferences_mysql.dm" +#include "code\modules\client\preference\preferences_spawnpoints.dm" +#include "code\modules\client\preference\preferences_toggles.dm" +#include "code\modules\client\preference\loadout\gear_tweaks.dm" +#include "code\modules\client\preference\loadout\loadout.dm" +#include "code\modules\client\preference\loadout\loadout_accessories.dm" +#include "code\modules\client\preference\loadout\loadout_general.dm" +#include "code\modules\client\preference\loadout\loadout_uniform.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\glasses\glasses.dm" #include "code\modules\clothing\glasses\hud.dm" @@ -1400,6 +1406,7 @@ #include "code\modules\mining\laborcamp\laborstacker.dm" #include "code\modules\mob\abilities.dm" #include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" #include "code\modules\mob\hear_say.dm" #include "code\modules\mob\holder.dm" #include "code\modules\mob\inventory.dm" @@ -1451,6 +1458,7 @@ #include "code\modules\mob\living\carbon\alien\login.dm" #include "code\modules\mob\living\carbon\alien\logout.dm" #include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" #include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" #include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" #include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" @@ -1462,6 +1470,7 @@ #include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" #include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" #include "code\modules\mob\living\carbon\alien\larva\death.dm" +#include "code\modules\mob\living\carbon\alien\larva\emote.dm" #include "code\modules\mob\living\carbon\alien\larva\inventory.dm" #include "code\modules\mob\living\carbon\alien\larva\larva.dm" #include "code\modules\mob\living\carbon\alien\larva\life.dm" @@ -1472,6 +1481,7 @@ #include "code\modules\mob\living\carbon\brain\brain.dm" #include "code\modules\mob\living\carbon\brain\brain_item.dm" #include "code\modules\mob\living\carbon\brain\death.dm" +#include "code\modules\mob\living\carbon\brain\emote.dm" #include "code\modules\mob\living\carbon\brain\life.dm" #include "code\modules\mob\living\carbon\brain\login.dm" #include "code\modules\mob\living\carbon\brain\MMI.dm" @@ -1480,6 +1490,7 @@ #include "code\modules\mob\living\carbon\human\appearance.dm" #include "code\modules\mob\living\carbon\human\body_accessories.dm" #include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_attackalien.dm" @@ -1510,6 +1521,7 @@ #include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\station.dm" #include "code\modules\mob\living\carbon\slime\death.dm" +#include "code\modules\mob\living\carbon\slime\emote.dm" #include "code\modules\mob\living\carbon\slime\examine.dm" #include "code\modules\mob\living\carbon\slime\life.dm" #include "code\modules\mob\living\carbon\slime\powers.dm" @@ -1518,6 +1530,7 @@ #include "code\modules\mob\living\carbon\slime\subtypes.dm" #include "code\modules\mob\living\carbon\slime\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\emote.dm" #include "code\modules\mob\living\silicon\laws.dm" #include "code\modules\mob\living\silicon\login.dm" #include "code\modules\mob\living\silicon\say.dm" @@ -1540,6 +1553,7 @@ #include "code\modules\mob\living\silicon\decoy\decoy.dm" #include "code\modules\mob\living\silicon\decoy\life.dm" #include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\emote.dm" #include "code\modules\mob\living\silicon\pai\examine.dm" #include "code\modules\mob\living\silicon\pai\life.dm" #include "code\modules\mob\living\silicon\pai\pai.dm" @@ -1550,6 +1564,7 @@ #include "code\modules\mob\living\silicon\pai\software_modules.dm" #include "code\modules\mob\living\silicon\robot\component.dm" #include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" #include "code\modules\mob\living\silicon\robot\examine.dm" #include "code\modules\mob\living\silicon\robot\inventory.dm" #include "code\modules\mob\living\silicon\robot\laws.dm" @@ -1582,6 +1597,7 @@ #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" #include "code\modules\mob\living\simple_animal\bot\construction.dm" #include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" +#include "code\modules\mob\living\simple_animal\bot\emote.dm" #include "code\modules\mob\living\simple_animal\bot\floorbot.dm" #include "code\modules\mob\living\simple_animal\bot\medbot.dm" #include "code\modules\mob\living\simple_animal\bot\mulebot.dm" diff --git a/sound/spookoween/scary_horn2.ogg b/sound/spookoween/scary_horn2.ogg new file mode 100644 index 00000000000..fb2805bd2cd Binary files /dev/null and b/sound/spookoween/scary_horn2.ogg differ