diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index ec34b6632f3..1069dd6b2d6 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -33,23 +33,28 @@ CREATE TABLE `characters` (
`hair_red` smallint(4) NOT NULL,
`hair_green` smallint(4) NOT NULL,
`hair_blue` smallint(4) NOT NULL,
+ `secondary_hair_red` smallint(4) NOT NULL,
+ `secondary_hair_green` smallint(4) NOT NULL,
+ `secondary_hair_blue` smallint(4) NOT NULL,
`facial_red` smallint(4) NOT NULL,
`facial_green` smallint(4) NOT NULL,
`facial_blue` smallint(4) NOT NULL,
+ `secondary_facial_red` smallint(4) NOT NULL,
+ `secondary_facial_green` smallint(4) NOT NULL,
+ `secondary_facial_blue` smallint(4) NOT NULL,
`skin_tone` smallint(4) NOT NULL,
`skin_red` smallint(4) NOT NULL,
`skin_green` smallint(4) NOT NULL,
`skin_blue` smallint(4) NOT NULL,
- `markings_red` smallint(4) NOT NULL,
- `markings_green` smallint(4) NOT NULL,
- `markings_blue` smallint(4) NOT NULL,
+ `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000',
`head_accessory_red` smallint(4) NOT NULL,
`head_accessory_green` smallint(4) NOT NULL,
`head_accessory_blue` smallint(4) NOT NULL,
`hair_style_name` varchar(45) NOT NULL,
`facial_style_name` varchar(45) NOT NULL,
- `marking_style_name` varchar(45) NOT NULL,
+ `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None',
`head_accessory_style_name` varchar(45) NOT NULL,
+ `alt_head_name` varchar(45) NOT NULL,
`eyes_red` smallint(4) NOT NULL,
`eyes_green` smallint(4) NOT NULL,
`eyes_blue` smallint(4) NOT NULL,
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index b5115a93caf..55e71aa2aab 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -33,23 +33,28 @@ CREATE TABLE `SS13_characters` (
`hair_red` smallint(4) NOT NULL,
`hair_green` smallint(4) NOT NULL,
`hair_blue` smallint(4) NOT NULL,
+ `secondary_hair_red` smallint(4) NOT NULL,
+ `secondary_hair_green` smallint(4) NOT NULL,
+ `secondary_hair_blue` smallint(4) NOT NULL,
`facial_red` smallint(4) NOT NULL,
`facial_green` smallint(4) NOT NULL,
`facial_blue` smallint(4) NOT NULL,
+ `secondary_facial_red` smallint(4) NOT NULL,
+ `secondary_facial_green` smallint(4) NOT NULL,
+ `secondary_facial_blue` smallint(4) NOT NULL,
`skin_tone` smallint(4) NOT NULL,
`skin_red` smallint(4) NOT NULL,
`skin_green` smallint(4) NOT NULL,
`skin_blue` smallint(4) NOT NULL,
- `markings_red` smallint(4) NOT NULL,
- `markings_green` smallint(4) NOT NULL,
- `markings_blue` smallint(4) NOT NULL,
+ `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000',
`head_accessory_red` smallint(4) NOT NULL,
`head_accessory_green` smallint(4) NOT NULL,
`head_accessory_blue` smallint(4) NOT NULL,
`hair_style_name` varchar(45) NOT NULL,
`facial_style_name` varchar(45) NOT NULL,
- `marking_style_name` varchar(45) NOT NULL,
+ `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None',
`head_accessory_style_name` varchar(45) NOT NULL,
+ `alt_head_name` varchar(45) NOT NULL,
`eyes_red` smallint(4) NOT NULL,
`eyes_green` smallint(4) NOT NULL,
`eyes_blue` smallint(4) NOT NULL,
diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm
index ae596b4b18b..113bf83c346 100644
--- a/_maps/map_files/RandomZLevels/wildwest.dmm
+++ b/_maps/map_files/RandomZLevels/wildwest.dmm
@@ -255,7 +255,7 @@
"eU" = (/obj/effect/landmark/corpse/doctor{mobname = "Doctor Mugabee"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
"eV" = (/obj/item/stack/medical/bruise_pack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
"eW" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
-"eX" = (/turf/simulated/wall/mineral{icon_state = "sandstone0"; mineral = "sandstone"; tag = "icon-sandstone0"; walltype = "sandstone"},/area/awaymission/wwmines)
+"eX" = (/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines)
"eY" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
"eZ" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"fa" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/wood,/area/awaymission/wwmines)
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index b535dd748a6..233cb1d7e74 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -20,16 +20,16 @@
"aat" = (/turf/simulated/wall,/area/security/permabrig)
"aau" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/turf/simulated/floor/grass,/area/security/permabrig)
"aav" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaw" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/turf/simulated/floor/grass,/area/security/permabrig)
+"aaw" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/grass,/area/security/permabrig)
"aax" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aay" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaz" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/turf/simulated/floor/grass,/area/security/permabrig)
+"aaz" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/grass,/area/security/permabrig)
"aaA" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/security/permabrig)
"aaB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/permabrig)
"aaC" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaD" = (/turf/simulated/floor/plasteel,/area/security/permabrig)
"aaE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig)
-"aaF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaG" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaI" = (/obj/machinery/biogenerator,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
@@ -39,15 +39,15 @@
"aaM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaN" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaO" = (/obj/machinery/seed_extractor,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaP" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaP" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/item/weapon/bikehorn/rubberducky,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"aaQ" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"aaR" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"aaS" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaT" = (/obj/structure/table/glass,/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/bottle/fertilizer/ez,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/table/glass,/obj/item/weapon/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaW" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"aaX" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaW" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaX" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"aaY" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"aaZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/security/permabrig)
"aba" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
@@ -80,12 +80,12 @@
"abB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool,/obj/item/device/radio/intercom/locked/prison{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abC" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abD" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abF" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abG" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abI" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abJ" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abJ" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abK" = (/obj/structure/lattice{layer = 2.4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
"abL" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
"abM" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
@@ -216,7 +216,7 @@
"aeh" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aei" = (/obj/machinery/space_heater,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"aej" = (/obj/spacepod/sec{req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
-"aek" = (/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aek" = (/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig)
"ael" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonlockers)
"aem" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aen" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
@@ -436,7 +436,7 @@
"ait" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiu" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Interrogation"; name = "Interrogation Privacy Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
-"aiw" = (/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Brig Interrogation"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogation)
+"aiw" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/security/permabrig)
"aix" = (/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"aiy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
"aiz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/security/interrogationhallway)
@@ -462,7 +462,7 @@
"aiT" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage)
"aiU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury)
-"aiW" = (/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/security/permabrig)
+"aiW" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aiX" = (/obj/machinery/light{dir = 4},/obj/effect/decal/warning_stripes/red/hollow,/obj/structure/closet/bombcloset,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiY" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/interrogationhallway)
@@ -501,7 +501,7 @@
"ajG" = (/turf/simulated/wall,/area/security/warden)
"ajH" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogationhallway)
"ajI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
-"ajJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogation)
+"ajJ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"ajK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"ajL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
"ajM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/main)
@@ -527,7 +527,7 @@
"akg" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
"akh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
"aki" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/seceqstorage)
-"akj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
+"akj" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"akk" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Brig Warden's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"akl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"akm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/warden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
@@ -629,7 +629,7 @@
"ame" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range)
"amf" = (/obj/structure/closet/secure_closet/brigdoc,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/security/medbay)
"amg" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range)
-"amh" = (/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay)
+"amh" = (/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay)
"ami" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"amj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"amk" = (/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay)
@@ -733,7 +733,7 @@
"aoe" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/lobby)
"aof" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway)
"aog" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
-"aoh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp)
+"aoh" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
"aoi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"aoj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"aok" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
@@ -982,7 +982,7 @@
"asT" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing)
"asU" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B)
"asV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/evidence)
-"asW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/flag/nt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp)
+"asW" = (/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Brig Interrogation"; network = list("SS13")},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogation)
"asX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/evidence)
"asY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/camera{c_tag = "Labor Shuttle Dock"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
"asZ" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
@@ -1245,7 +1245,7 @@
"axW" = (/obj/item/flag/clown,/turf/simulated/floor/wood,/area/clownoffice)
"axX" = (/obj/machinery/photocopier,/obj/structure/sign/poster/legit{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
"axY" = (/obj/structure/clownstatue,/turf/simulated/floor/wood,/area/clownoffice)
-"axZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
+"axZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogation)
"aya" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/clownoffice)
"ayb" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/bananalamp,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/clownoffice)
"ayc" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/wood,/area/clownoffice)
@@ -1551,7 +1551,7 @@
"aDQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/mimeoffice)
"aDR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aDS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/magistrateoffice)
-"aDT" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"aDT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/flag/nt,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp)
"aDU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
"aDV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/stool/bed/chair/comfy/black,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/magistrateoffice)
"aDW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/item/weapon/gavelblock,/obj/item/weapon/gavelhammer,/turf/simulated/floor/carpet,/area/magistrateoffice)
@@ -1696,7 +1696,7 @@
"aGF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/lawoffice)
"aGG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/lawoffice)
"aGH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/lawoffice)
-"aGI" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/wood,/area/clownoffice)
+"aGI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp)
"aGJ" = (/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
"aGK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/sleep)
"aGL" = (/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
@@ -1860,13 +1860,13 @@
"aJN" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aJO" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aJP" = (/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aJQ" = (/obj/machinery/camera/motion{c_tag = "EVA Northwest"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aJQ" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
"aJR" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aJS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aJT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aJU" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/wood,/area/mimeoffice)
"aJV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aJW" = (/obj/machinery/camera{c_tag = "EVA Northeast"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aJW" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
"aJX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Softsuits"; req_access_txt = "18"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aJY" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aJZ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
@@ -2411,9 +2411,9 @@
"aUs" = (/obj/item/clothing/suit/space/eva/mime,/obj/item/clothing/head/helmet/space/eva/mime,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aUt" = (/obj/item/clothing/suit/space/eva/clown,/obj/item/clothing/head/helmet/space/eva/clown,/obj/structure/rack{dir = 8; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aUu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aUv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "EVA Soutwest"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"aUv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/wood,/area/clownoffice)
"aUw" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aUx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA Southeast"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
+"aUx" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Clown's Office"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/wood,/area/clownoffice)
"aUy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aUz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aUA" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north)
@@ -3356,7 +3356,7 @@
"bmB" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bmC" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bmD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
-"bmE" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bmE" = (/obj/machinery/camera/motion{c_tag = "EVA North-West"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva)
"bmF" = (/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bmG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bmH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/library)
@@ -3569,7 +3569,7 @@
"bqG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bqH" = (/obj/structure/cable,/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"bqJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 7"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bqJ" = (/obj/machinery/camera{c_tag = "EVA North-East"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva)
"bqK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"bqL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitecorner"},/area/hallway/secondary/exit)
"bqM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/secondary/exit)
@@ -3693,7 +3693,7 @@
"bta" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"btb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"btc" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
-"btd" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 6"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"btd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/camera{c_tag = "EVA Sout-West"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
"bte" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east)
"btf" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard/east)
"btg" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/secondary/exit)
@@ -4081,7 +4081,7 @@
"bAy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"bAz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/bridge/meeting_room)
"bAA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
-"bAB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Accounts uplink terminal"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
+"bAB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA South-East"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
"bAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/bridge/meeting_room)
"bAD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/lattice,/turf/space,/area/space)
"bAE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/turf/space,/area/space)
@@ -4370,7 +4370,7 @@
"bGb" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/chemistry)
"bGc" = (/obj/structure/closet/secure_closet/chemical,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry)
"bGd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/chemistry)
-"bGe" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
+"bGe" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/holofloor,/area/security/permabrig)
"bGf" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
"bGg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/medical/medbay3)
"bGh" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay3)
@@ -5278,7 +5278,7 @@
"bXz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
"bXA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
"bXB" = (/obj/item/roller,/obj/item/weapon/storage/box/disks,/obj/structure/table/glass,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
-"bXC" = (/obj/machinery/camera{c_tag = "Research Server Room"; dir = 2; network = list("Research","SS13"); pixel_x = 22},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
+"bXC" = (/obj/machinery/camera{c_tag = "Research Server Room"; dir = 2; network = list("Research","SS13"); pixel_x = 22},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/toxins/server)
"bXD" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"bXE" = (/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"bXF" = (/obj/machinery/camera{c_tag = "Research E.X.P.E.R.I-MENTOR Chamber"; dir = 2; network = list("Telepad","Research","SS13"); pixel_x = 0},/obj/machinery/light{dir = 1; on = 1},/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
@@ -5326,7 +5326,7 @@
"bYv" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"bYw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/janitor)
"bYx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark/start{name = "Janitor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
-"bYy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
+"bYy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "east bump Important Area"; pixel_x = 24; shock_proof = 0},/mob/living/simple_animal/pet/cat/Runtime,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/cmo)
"bYz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
"bYA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/janitor)
"bYB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/janitor)
@@ -6832,7 +6832,7 @@
"cBt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/engine/break_room)
"cBu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cBv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cBw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cBw" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/security/permabrig)
"cBx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cBy" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cBz" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/engine/break_room)
@@ -6940,8 +6940,8 @@
"cDx" = (/obj/machinery/camera{c_tag = "Engineering Equipment North"; network = list("SS13")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/vending/engivend,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cDy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/vending/tool,/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cDz" = (/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cDA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cDB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/atmos)
+"cDA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24; shock_proof = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
+"cDB" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyerPort"; name = "Medbay Entrance Port"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/medical/medbay2)
"cDC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cDD" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cDE" = (/turf/simulated/floor/plasteel,/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/atmos)
@@ -7004,7 +7004,7 @@
"cEJ" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cEK" = (/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cEL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
-"cEM" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/engineeringcart,/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
+"cEM" = (/obj/structure/table/glass,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cEN" = (/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cEO" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"cEP" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{level = 2},/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel,/area/atmos/distribution)
@@ -7019,7 +7019,7 @@
"cEY" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_b)
"cEZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/wall/r_wall,/area/medical/virology)
"cFa" = (/obj/machinery/smartfridge/secure/chemistry/virology,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
-"cFb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage)
+"cFb" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cFc" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cFd" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cFe" = (/obj/machinery/computer/pandemic,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
@@ -7054,7 +7054,7 @@
"cFH" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/aft)
"cFI" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cFJ" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/table,/obj/item/weapon/book/manual/engineering_hacking{pixel_x = 3; pixel_y = 3},/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/plasteel,/area/engine/engineering)
-"cFK" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering Northwest"; network = list("SS13")},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"cFK" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 4"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"cFL" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cFM" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/power/apc{dir = 8; name = "west bump Engineering"; pixel_x = -24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"cFN" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
@@ -7220,7 +7220,7 @@
"cIR" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/medical/virology)
"cIS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cIT" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"cIU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
+"cIU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/equipmentstorage)
"cIV" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cIW" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
"cIX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
@@ -7980,7 +7980,7 @@
"cXx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat{name = "\improper AI Satellite Hallway"})
"cXy" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/porta_turret{dir = 8; installation = /obj/item/weapon/gun/energy/gun; name = "hallway turret"},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"cXz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
-"cXA" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior West"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/aisat)
+"cXA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 6"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"cXB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
"cXC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/aisat{name = "\improper AI Satellite Hallway"})
"cXD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"})
@@ -8144,7 +8144,7 @@
"daF" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"daG" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/obj/structure/lattice,/turf/space,/area/space)
"daH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "gas_turbine_exterior"; locked = 1; name = "Turbine Exterior Airlock"; req_access_txt = "32"},/turf/simulated/floor/engine,/area/maintenance/turbine)
-"daI" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/maintenance/asmaint)
+"daI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"daJ" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/obj/machinery/atmospherics/binary/pump{name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"daK" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"daL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -8556,7 +8556,7 @@
"diB" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diC" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/docking_port/mobile{dir = 2; dwidth = 2; height = 18; id = "skipjack"; name = "Vox Skipjack"; roundstart_move = "skipjack_away"; width = 19},/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_ne"; name = "northeast of SS13"; width = 19},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
"diD" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"diE" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"diE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"diF" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diG" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diH" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -8905,14 +8905,14 @@
"dpm" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock)
"dpn" = (/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock)
"dpo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"dpp" = (/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpp" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/atmos)
"dpq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dpr" = (/obj/machinery/camera{c_tag = "Prison East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dps" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dpt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dpu" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dpv" = (/obj/machinery/door/airlock/glass{name = "Prison Basketball Court"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"dpw" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/holofloor,/area/security/permabrig)
+"dpw" = (/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/engineeringcart,/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/engine/equipmentstorage)
"dpx" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
"dpy" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/holofloor,/area/security/permabrig)
"dpz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig)
@@ -8963,12 +8963,13 @@
"dqs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/machinery/door_control{id = "Prison Lockdown 1"; name = "Cell 1 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
"dqt" = (/obj/machinery/door_control{id = "Prison Lockdown 2"; name = "Cell 2 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
"dqu" = (/obj/machinery/door_control{id = "Prison Lockdown 3"; name = "Cell 3 Lockdown"; pixel_x = 24; pixel_y = 3; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
-"dqv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Starboard Primary Hallway 5"; dir = 1; network = list("SS13")},/obj/item/device/radio/intercom{pixel_y = -28},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"dqw" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
"dqx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"dqy" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"dqz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dqA" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"dqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dqD" = (/obj/machinery/flasher_button{id = "permaflash1"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
"dqE" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
@@ -9026,7 +9027,7 @@
"drE" = (/obj/item/device/radio/intercom/custom{pixel_y = 25},/obj/item/device/radio/intercom/private{pixel_y = -28},/obj/item/device/radio/intercom{pixel_x = -28},/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"drF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"drG" = (/obj/item/device/radio/intercom/custom{pixel_y = 25},/obj/item/device/radio/intercom/private{pixel_y = -28},/obj/item/device/radio/intercom{pixel_x = 28},/obj/effect/landmark{name = "tripai"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"drH" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South West"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
+"drH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/camera{c_tag = "Accounts Uplink Terminal"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/bridge/meeting_room)
"drI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"drJ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes{charge = 5e+006},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"drK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall,/area/turret_protected/ai)
@@ -9034,6 +9035,11 @@
"drM" = (/obj/machinery/camera/motion{c_tag = "AI Core South"; dir = 2; network = list("SS13","MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"drN" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/turret_protected/ai)
"drO" = (/obj/machinery/camera{c_tag = "AI Satellite Exterior South"; dir = 2; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
+"drP" = (/turf/simulated/wall/r_wall/coated,/area/maintenance/asmaint)
+"drQ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall/coated,/area/maintenance/asmaint)
+"drR" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering North-West"; network = list("SS13")},/turf/simulated/floor/plasteel,/area/engine/engineering)
+"drS" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/aisat)
+"drT" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "AI Satellite Exterior South East"; dir = 4; network = list("SS13","MiniSat")},/turf/space,/area/turret_protected/ai)
"YDt" = (/obj/structure/table,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 6; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/nitrogen{pixel_x = 4; pixel_y = 3},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -4; pixel_y = 5},/obj/item/weapon/tank/emergency_oxygen/plasma{pixel_x = -6; pixel_y = 3},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/biostorage)
(1,1,1) = {"
@@ -9083,19 +9089,19 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldeqcaVdgkbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaabaalaaLaaNaaMaayaaOaalbikbikaabaalaaPaaRaaQaalaalaalbikbikaabaabaabaacbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikaalaaSaaTaaMaaVaaUaalbikaabaabaalaaWabhaaXabtaaYaalbikaabaabaacaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafbFldhNcaVdhOdhQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaalaaBaalaaZaatabaabbaataalabcaanaaoaalabdabeabxaataataalaalaalaalaalaalaalaalaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaalabgabiaaSabiaaMabfabjablaaxaavaayaboabmaaDabpabrabqabsaatabwabwabzabyabyaalaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaalabgabiaaSabiaaMabfabjablaaxaavaayaboabmaaDabpabrabqabsaataekabwabzabyaiwaalaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVayLdhTbFldhNcaVdhObFlaafdhWdhVdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBabDabCaaDaaMabEaayaayabFabGaavabIabHabJaaGaavabMabNaatabOabOabQabPabPaaBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhYcaVcaVdhZbFldiacaVcczdicdibdibdibbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikaalabRaaHabSaaHabTabVabUabYabXacaabZaccacbacfaceabZacjacjacFahdahcbnHahedhqbnIbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaavdiEdiDdkJdiIdpodkKdkJdkJdpqdppdpsdprdkJdptdpudkJdkJdpvdpxdpwdpydpwabPdpzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaavaiWdiDdkJdiIdpodkKdkJdkJdpqakjdpsdprdkJdptdpudkJdkJdpvdpxbGedpybGeabPdpzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdijcaVcaVcaVaVUdikdikdimbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaldpBdpAdpDdpCdpEaatdpFdpFaatdpGdpHaatdpJdpIaalaalaalaaldpKagtaaDagtabPdpLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaaldpMaaydpNabnbukdpDdpPbukdpQdpSbyEdpDdpTdpOagUagXdpOdpXdpWdpZdpYdqaaalbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabuaatabvdqbaatdqcaaqaatdqcaaqabxdqcaaqaalaabaEQaalaalaalaalaalaalaalaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaalaalaalaalabuaatdqddqeaatdqfdqfaatdqgdqgabxdqhdqhaalaabaEQabLabLabLdqiaEQaEQaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajbcaVcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaaldqkdqjdqmdqldqnabkdqpdqodqqdqqdqsdqrdqrdqtdqrdquaalaabaabaabaEQabLabLaEQaabbikbikaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwdqvdqydqxdqAdqzdqCacpdqAdqDdqAdqEdqFdqAdqAdqGaalbikaabaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwajJdqydqxdqAdqzdqCacpdqAdqDdqAdqEdqFdqAdqAdqGaalbikaabaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaalaalaalaaldqHdqIaalaalaalaalaalaalaalaalaalaalbikbikbikaabaEQabLabLaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaldqJdqLdqKdqNdqMahqaalaabaabaabbikbikbikbikbikaabaabaEQabLaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackaclaiWaalacmbikbikbikbikbikbikaabaabaabdqRabLabLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackaclcBwaalacmbikbikbikbikbikbikaabaabaabdqRabLabLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoaecacqacracsacdaalaalaalaalaalbikbikbikbikbikbikbikbikbikaabactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikbikbikbikactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEakMbikbikbikbikbikbikactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9105,14 +9111,14 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikaabbikbikbikaabaaladRacdacEaetadVadYadFaeaadZaevacEbikbikbikbikbikbikactaeIadLaewadNacXaexactaeyadtadtadtadtaezadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhzdgydgydgydhydgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeAaeAaeAaeAaeAaeAaeAaeAaabbikbikbikaabaabaabaabaabaabaaladBacdacEacEaeJaeLaeKafhaeMacEacEbikbikbikbikbikbikactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhBdhAdgSdhBdhAdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeWaeXaeYamdaeZaeXafaaeAaabbikbikaabadwadwadwadwadwadwaalaffafgadSacEafiadXafjaeuaflacEafmafmaepaeDahZafmafmactafnafoafpafqafractactafsaftafuafuafwadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxafxafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhDdhCdgydhEdhFdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAamdafyafzafAaeAbikbikbikaabadwadxaekadUaghaelaenafKafLaeoacEacEafPafOafQacEacEafmafDafcafRagaafIafEafWafXafYaegagaagaagbafVagdagcagfaggagnadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAamdafyafzafAaeAbikbikbikaabadwadxaohadUaghaelaenafKafLaeoacEacEafPafOafQacEacEafmafDafcafRagaafIafEafWafXafYaegagaagaagbafVagdagcagfaggagnadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAagjafAagkamdaglafAagmaeAaabbikbikbikadwadyaeraeqaeBagqagragsagtaeCagvagwagzagyaeFaehafeafMahlafSageafSafSafTahpafbafGafCafSafSaikagoagLagxagMagNagOagPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabagRaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdhKdhMdhLdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAamdafAafyafAaeAbikbikaabaabadwadzaeraeGaeHahaahbdqSdqUdqTagvaigahiahhahmahjafJagvagpagYahgaguaguagAagDagCafUagEagHagGahUafZahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyamdafyafAafyaeAbikaabbikbikadwadxafBagBagFahJahfagWahnagIagKagJahRahQairahSaiXagVagZahFahGahrahkahUahoahsahuahtahKahKahMahLahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAamdafyafyafAaeAaabaabbikbikadwadwaiOafFailailadTaatahTahNagvaiqaisahhamuaitdqOahOahVahPahXahWahYaifaibaiaamyamzamzaicaiCaidahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJamdafAafyaiKaeAamcaabaabaabaabadwagTaiOakcaiwaeEaatakoaiSagvaimaiUaiVdqQaiuaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajtajtajtajtajtajuajuafdaiAagSafHakjaofajGajGajNahIajEajFajGaiRaiPaiMaiNaipaiTajaajwaixaiEajhajiaiGajMajvajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWaknajubSoclqajcajAajyajDajuahDahCajJajxajLahHajBalnakkaklakmaiFajFaiRakiakaaiRajIaiRahUalhajKakbajYakpakdakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJamdafAafyaiKaeAamcaabaabaabaabadwagTaiOakcasWaeEaatakoaiSagvaimaiUaiVdqQaiuaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajtajtajtajtajtajuajuafdaiAagSafHcDAaofajGajGajNahIajEajFajGaiRaiPaiMaiNaipaiTajaajwaixaiEajhajiaiGajMajvajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWaknajubSoclqajcajAajyajDajuahDahCaxZajxajLahHajBalnakkaklakmaiFajFaiRakiakaaiRajIaiRahUalhajKakbajYakpakdakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmxdmodmzdmydmsdmAdmAdmAdmAdmAdmBbikbikbikacGbikbikaabbikaabbikbikajQbikbikaabbikaabbikbikacGbikbikbikbikbikbikbikbikbikbikbikbikaeAakFafyakGakHakIakJakKakLajucjgakNakOakOakPajZajuaivainaiBaizakrahHakWakXakYakZalaalbajdalvakwakuakqaksaktakTalBakSalcakUalealdaiCalfajOaieaieaieaieaieaieaieaieahAaabaloaabaabaabaloaabbikbikaabaloaabaabbikbikaloaabbikaabaabajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmCdmodmEdmDdmAdmAdmAdmAdmGdmFdmwbikbikbikacGaabalpalpalpalpalpbikalqbikalpalpalpalpalpaabacGbikbikbikbikbikbikbikbikbikbikbikbikaeAalralsakGafyaltakJalualwajuaoIalxalyalzakQakxajuampaiQakRaiZalEajzajBalFalGaklalHalIajFaliahPaljaljallalCalgalJajXakfakealMakeakhakgahAahAahAahAahAahAahAahAahAahAaabaloaabbikajkajlajmbikbikajkajlajmbikbikajkajlajmaabaabbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaXhdmddmddmddmldmddmddmmdmddmddmIbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamaalZaowanxambbikbikbikamcaeAamdamdamdamdamealKamgamdajuamfamiamjamkamhamlajualNajHammalQamnakvajGamsamtaXNamvaYjajGamXamDamqanlamYdoHaocaoNdoIasvaiCateauydoNalkahAamKamKamKamKamKbikbikbikbikaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9120,27 +9126,27 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikaabbikbikbikaoranwanzanyanBanAanDanCanAanGanGanHanIanJanKanLanManNanOanPanQanRanSanTaoiaokalRaqjaoMaojaPcauwaswamoamxamwamBamAamEamCamGamFaokaojaokaolaomamHamJamIanfaEEaovapmaotaovaEHaouaoyaoxbikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSauQasYamrankauSaoLaoLanoanmaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWapIapaaoTavRapcawqanpaoTapdanUaoTapdapbaqEapearZaoVapfapgaphapianVapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsdmMdmLdmOdmNbikaAnaApaAocsHaBuajjbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamOaoCaoCaoDamObikbikbikapwanganianhanWawDanianiapBapBapBapBapCapDapEapEapEapFapGapHapFapEapEapEaoeaodaodanXanZanYaopaooahEasaaobaoaasaahEapRapSapTapUapVapWapXapmapnapYapYamKapZapZapZamKaqaamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmaabaabbikaabaiIaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikcsIcsJcsJcsJcsIacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaoraoEaoCaoFamOamRamSamSamSaxyaniasWaohaogaoqaonapBaqnaqoaqpapjaqraqsaqtaquaqvapxapvaqyaqzaqAaqsapzapyapyaosaoHaoBapMapLahEauHaoKaoJaqiahEaqMaqNaqOaqhaqQaslapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikcsIcsJcsJcsJcsIacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaoraoEaoCaoFamOamRamSamSamSaxyaniaDTaGIaogaoqaonapBaqnaqoaqpapjaqraqsaqtaquaqvapxapvaqyaqzaqAaqsapzapyapyaosaoHaoBapMapLahEauHaoKaoJaqiahEaqMaqNaqOaqhaqQaslapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmRdmRdmRdmPbikcsIctRctOctRcsIacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAaxtaniayYapAaoOapJatYapBarkarlarmarnaqCarparqarrarsartaruarvarrarwarxaqDapyapyaosapNapKaqHaqGapPapOaqgapQawFahEaszasAarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmTdmSdmUdmPbikcsIcxDcxCcxEcsIacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOaqcaqcaqcamOamRamSazdazdazfaqlaqkaqqaqmaqxaqwapBascasdasearzasgashasiasjaskarAasmasnasoaspasharBapyapyaosaqBaooarFarEaqFaykaqJaqIaqKahEatnatoatparNarMasBapXasCasDasEasFasEasGasHamKamKapnamKaloasIasJakCakCarTakCakCakCakCarTakCakCakCakCarTakCakCakCasKasLasIaloaabbikagQaabbikbikbikbikbikbikbikbikbikbikaabbikaabbikasMasMasNasNasNasNasNasNasMasMaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikcsIcyUctRctRcsIacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaqPaqPaqRaqRaqRaqRarhapBapBatRapBavadoYapEapEatSapEasbawLapEatSapEasZaxIasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikcsIcyUctRctRcsIacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaJQaqPaqRaqRaqRaqRarhapBapBatRapBavadoYapEapEatSapEasbawLapEatSapEasZaxIasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikcsIcKActRcLqcsIaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikarIaqPaqPaqParJaqRarKarXarLapBatPatUatTatbatVaqsatQauJauEatdatcavEavBatWaqsatfaATapyapyapyathaSWatiahEarYaryasqasrahEatXatOarMarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmSdmSdmSdmWbikcsIcKActRcLqcsIacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikarIassaqPaqPastaqRaqRasxaxjapBarkavJauzaucauBaudauDdlLauFauGdpVauIdlMauKaujaugauNauNauNauNauNcwXauhahEasyasqaryasTasSasXasVasSauMauXauPapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikcsIcOOctRctRcTVacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatjataatlatkcqIatmatZayVapBdlPdlQavyauZasgashdlRdlSashavvdrfashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmZdmSdnadmPbikcsIdbdctRctRcsIaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOazIazIazIavSdoJdoGdoLauRasUasUasUawoawvawuawrawrawsawrawyawwawrawtasZasZaUcawzawAawBawCawBawCawAahEahEahEahEahEasSauUauTauVaxbaxeaxdawEaxfavUawGawHawIavVawJawKaAaawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnddncdnddnebikdbOdnYctRdoKdbOaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauWavDauYavGavFavIaxvdoQaxxdoZaxhaxhaxzaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpdoUaxlaxlaxqdoVaxqaxraxraxAaxraxBaxuadQavLavKavNaxXaxCaxDaxEapmavUaxGaxHaAfavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikdnbdnfdnebikbikdpRdbOdridbOdrjaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdrhaDTadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikdnbdnfdnebikbikdpRdbOdridbOdrjaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdrhaJWadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikaxVaxVaxVaxVaxVaxVaxVaxVaabaabaxRazsayMayNaxRayOaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdplaxgaxcaxkaxiaxsazgdpabOIayXayXayZdlNazbazcayXayXayXdpbayXayXayXayXayXayXazedpcazgazgazgazhaziazjaziazkazlazmaznadQadQadQadQazoazoazoaxEapmavUazpaxHazqavVcscazraxJcvYavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikaabayCaFCaztazuayCaabbikaabbikbikaabbikbikayGazvayGazvayGayKayHayHayHayHayHayHayHayHayHazwazxayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikazyazzazybikbikbikaxVazHdrkazHazAazBazCaxVbikbikaxRazDazEazFazGazHaxVbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOauOdpdawmdlVayaayaazLazJazKazKaVMazMazNazOazPazPazOazQazOazRazRazRazRazRazRazSazRazRazTazUazVazWazIazXazIazYazIazIaqVazZaovaovaovaovaFgapmavUaAbaxHaAcavVaAdayAayBawMavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikazyaAeazybikaabayCaFsaAgaAhayCaAiaAiaAiaAiaAiazvazvazvayGaAjayHazwazxayJayHayJayJayJayGaAkayGayGayGayGayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaAlaAmaAlbikbikaabaxVdrldrmazHazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVbikaabbikbikbikbikbikbikbikbikdpdaxFaxwaxYaxWaxZazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADbfTaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASdoMaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabbikbikbikbikazvaBeazvbikaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaAlaAmaAlbikbikaabaxVdrldrmazHazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVbikaabbikbikbikbikbikbikbikbikdpdaxFaxwaxYaxWaUvazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADbfTaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASdoMaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabbikbikbikbikazvaBeazvbikaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikappaBpaBobikaBqaBsaBraabaabaAlazHaAlbikbikaabaxVdrnaBvaBwaBxaByaBzaxVaBAazHaBBaBCaBDaBEaBEaBEaBEaBEaBEaBEaBEaBFaxVbikaBGbikbikbikbikbikbikbikbikdpdaycaybayfayeaySdoRaBIaBJaBKazMaAwazOaBLafvaBNaAAaABaBOaBPaBPaBPaBPaBPaAIbjlaAKaxlaxqaxrazIaBQaBRaBSaBTaBSaBSaBUaBVaBWaBWaBWaBWaBWaBWaBXaBYaBZaCaaCbaCcaCdaCeavWavWaCfaCgaChaChaChaChaChaCgaCfaabbikbikbikbikazvaCiaCjbikaAiaCkaClaCmaCnayHayHayHayJayHayJaCoayHayHayGayHaCpaCqaCoaAkayHayGaCraCsayGayHaCtayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaBtaCvaBtaCuaCwaCxaCwaCuaabaAlaCzaCAbikbikaxVaxVaxVaxVaxVaCBaCCaCDaCEaCFaCGaCGaCHaCIaCIaCJaCKaxVazHaxVaxVaxVaCLaxVbikaabbikbikbikbikbikbikaabaabdpdaGIayTdpeayWazaaCMaCNaCOaBKazMaAwazOaCPaCQaCRaAAaCSaCTaBPaCUaBPaCVaCVaAIaBPaAKaxlaxqaCWazIaCXaBRaCYaCZaDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaCfaCgaChaChaChaChaChaCgaCfaabaabaabaabazvazvaDuaDvazvaAiaDwayHaDxayHayKayHayGayGaDyayGayGaDzayJayJaCoaDAaDBayHayGayHaDCaDCaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaacaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaBtaCvaBtaCuaCwaCxaCwaCuaabaAlaCzaCAbikbikaxVaxVaxVaxVaxVaCBaCCaCDaCEaCFaCGaCGaCHaCIaCIaCJaCKaxVazHaxVaxVaxVaCLaxVbikaabbikbikbikbikbikbikaabaabdpdaUxayTdpeayWazaaCMaCNaCOaBKazMaAwazOaCPaCQaCRaAAaCSaCTaBPaCUaBPaCVaCVaAIaBPaAKaxlaxqaCWazIaCXaBRaCYaCZaDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaCfaCgaChaChaChaChaChaCgaCfaabaabaabaabazvazvaDuaDvazvaAiaDwayHaDxayHayKayHayGayGaDyayGayGaDzayJayJaCoaDAaDBayHayGayHaDCaDCaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaacaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaBtaCyaBtaDEaCwaDFaCwaDEaxVaAlaDHaDIaAlaAlaxVazHazHazHazHazHazHazHaCBaCLaxVaxVaxVaxVaxVaDJaxVaxVazHaDKaxVaDLaCLaxVaxVaxVbikbikbikbikbikaDMaDMaDMaDMaDMaDMaDMaDMawmaCMaDNaDOaDPaDQaDRaDSaHhaDUaDVaDWaABaDXaBPaDYaDZaEaaEbaEcaEdaAKaxlaxqaxrazIatsaEeaEfaCZaDaaDbaEgaEhaEhaEhaEhaEhaEhaEhaEhaEhaEhaEiaEjaEkaElaEmaEnaEoaEpaCgaChaChaChaChaChaCgaCfaCfaCfbikbikazvayHaEqaEraBhayJaDAaCoaDxayHaEtayIaEuaAkayHayHayHayHaEvayHayHaDAaEwayHaDzayHaDCaExaEyaEzaDCaEAaEBaECaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaDGcUCaEDaDEaEFddzaEGaEJaEKazHaELaEMaENaDKaEOazHaxVaxVaxVaxVaxVaxVaxVaCLaxVaEPaEQaERaxVaESaETaEUazHaEOaxVaENaEVaBEaBFaEWbikbikbikbikbikaEXaEYaEZaFaaFbaFcaFdaDMdoXaCMaFfaFeaJUaCMaFhazOaFiaFjaFkaFlaABaFnaBPaFoaFpaFqaFraKcaFtaFuaFvaydaFwaFxaFyaFzaFAaCZaDaaDbaFBaEhaHTaHTaHTaEhaEhaFDaFEaFEaFFaEiaFGaFHaFIaFIaFJaFKaFLaFMaChaChaChaChaChaFNaFOaFPaFQbikbikazvayHayHaFRayHayJaFSayHaFTaFUaFUaFUaFUaFVaFUaFWayHayHayHayHayHayHayHayHayJayIaDCaFXaFYaFYaDCaFZaGaaGbaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaGcaGdaGeaDEaGcaGdaGeaEJaBzazHaGfazHazHazHazHazHaxVaGgaGhaGiaGjaGkaxVaCLaxVaEQaGlaEPaGmaGnaGoaxVaGpaxVaxVaxVaxVaGpaCLaEWbikazyazyazyazyaGqaEYaGraGsaGtaGuaGvaGwaDMaCMaBHaGxaGxaGxaGyaGzaGAaGzaGzaGzaGBaGCaGDaGEaGFaGFaGFaGFaGGaGHaKZaxqaGJazIatsaGKaGLaCZaDaaDbaEgaHTaGMaGMaGNaHTaEhaGOaGPaGPaGQaGRaFGaGSaGTaGUaGVaEhaGWaFQaChaChaChaChaChaFQaGXaGYaFQaabaabayGayHayHayJayJayJazxazxayGayGayGayJayJayJayGaHaaHbayGayJayJayGayJayJayGayGaHcaHdaHeaHfaHgaOPaHiaFXaHjaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbjNaInaCuaDEaEIaHlaCuaDEaEIaHlaCuaxVaCBaxVaxVaxVaxVaxVazHaxVazHaHnaHoazHazHaxVaCLaxVaHpaabaHpaxVaBvaGoaxVaHqaHraxVaENaBzaxVaAwaDMaDMaHsaHsaHsaHsaHsaHsaHsaHsaHsaGvaGvaGwaHtaHuaHvaHwaHxaHyaHzaHAaHBaHBaHBaHBaHCaHDaHEaHFaHGaHBaHBaHHaHHaHIaHJaHKaHLaHMaHNaGKaHOaHPaHPaDbaEgaHTaGMaHRaHSaHTaEhaGOaGPaGPaGQaKhaFGaGSaGUaGUaGVaEhaGWaFQaChaChaChaChaChaFQaHUaGYaFQbikbikayGaHVayHayHaHWayJaHXazwaHYaHZayKayGaFSayKayGaIaayHayGaIbayHayGaIcaIdaIeaFUaIfaFUaIgaIhaIiaIjaIkaIlaImaDCaDDaDDaacaacaDDaDDaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmJdmKaGddmKaIoaIoaIoaIqaIoaIoaIoaIsaItaIuaIuaIuaIuaIvaxVazHaxVaIwaIxaIyazHaIzaGpaCLaxVaxVaxVaxVaxVaxVaGpaxVazHaIyaCBazHazHaGvaIAaIBaICaIDaIDaIDaIDaIEaIDaIDaIFaIGaICaIHaIIaIIaIIaIIaIIaIIaIIaIJaIKaIKaIKaIKaILaIMaIKaINaIKaIOaILaIKaIKaIKaIKaIPaIQaIRaISaITaFzaIUaIVaHPaIWaEgaHTaIXaIYbvsaHTaEhaIZaJaaJaaJbaEiaFGaJcaJdaJdaJeaEhaJfaJgaChaChaChaChaChaJhaJiaJjaFQbikbikayGayHayHayHayHayHayHaIeaFUaFUaFUaFUaFUaFUaFUaCmayHayHayHayHaDzayHayHaDxayHaJkaJlaJmaJnaJoaFYaFYaFYaJpaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaInaKzaJqaJraJsaJtaJuaJvaJwaJxaJvaJyaJzaJvaJvaJAaxVazHaxVaJBazHazHaJCaJDaxVaEVaBFazHazHazHazHazHazHaGpaJEazHaxVaEKaEKaDMaJFaDMaJGaJHaJIaJIaJIaJJaJIaJIaJIaJKaJGaJLaJMaJMaJMaJMaJMaJMaJMaGvaIKaJNaJOaJPaJQaJRawxaJTaPAaJVaJWaJXaJOaJYaIKaJZaxqaKaazIaKbaGKaSyaKdaKdaKeaKfaKgaSsaKiaKiaKjaKkaKlaKjaKkaKkaKmaKnaKoaEhaEhaKpaEhaKqaKraChaChaChaChaChaKraCfaCfaCfayGayGayGayKayJayJaAkayGayGaDxayJayGaKsayJayGaAkayGaDxaHVayJayGaAkayGayHaHVaDxayHaKtaDCaKuaIhaKvaKwaKxaIhaKyaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaInaKzaJqaJraJsaJtaJuaJvaJwaJxaJvaJyaJzaJvaJvaJAaxVazHaxVaJBazHazHaJCaJDaxVaEVaBFazHazHazHazHazHazHaGpaJEazHaxVaEKaEKaDMaJFaDMaJGaJHaJIaJIaJIaJJaJIaJIaJIaJKaJGaJLaJMaJMaJMaJMaJMaJMaJMaGvaIKaJNaJOaJPbmEaJRawxaJTaPAaJVbqJaJXaJOaJYaIKaJZaxqaKaazIaKbaGKaSyaKdaKdaKeaKfaKgaSsaKiaKiaKjaKkaKlaKjaKkaKkaKmaKnaKoaEhaEhaKpaEhaKqaKraChaChaChaChaChaKraCfaCfaCfayGayGayGayKayJayJaAkayGayGaDxayJayGaKsayJayGaAkayGaDxaHVayJayGaAkayGayHaHVaDxayHaKtaDCaKuaIhaKvaKwaKxaIhaKyaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaKzaKAaKzaKBaJraJraKCaKzaKAaKzaKDaKEaKFaKGaxVazHaGpaGpaxVaxVaxVaKHaKHaKHazNaKHaKHaKHaKHaKHaGvaDMaDMaDMaDMaDMaDMaDMaJFaKIaJGbikaabbikaabbikaabbikaabbikaJGaJLaJMaKJaKKaKLaKMaKNaJMaGvaIKaKOaKOaKPaKQaKRaKSaKTaKSaKUaKVaKWaKOaKOaIKaJZaxqaKXazIaKbaGKaGLaCZaDaaDbaEgaKYaTJaLaaLbaLcaLcaLdaLeaLcaLeaLfaLgaLhaLiaLjaLkaLlaCfaKraChaChaChaChaChaKrayGaCtayHaLmaLnayJayGayJaCtayHayGaCtaDxayGaLoayHayGaLpayHayJaLqaLrayGaLsayHayJaAkaAkaDxaAkaLtaDCaLuaIhaLvaLwaLvaIhaLxaDCaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaLyaCuaLzaGdaKzaLAaLBaLCaLDaKzaGdaLEaInaCuaLFaLGaxVazHazHazHazHazHazHaKHaLHaLIaLJaLKaLLaLMaLHaKHaLNaLOaIDaIDaIDaIDaIDaIDaLPaLQaJGaabaLRaLRaLRaLRaLRaLRaLRaabaJGaJLaJMaLSaLTaLUaLVaLSaJMaGvaIKbCjbCjbCjaLWaLXaJOaLYaJOaLXaLZbCjbCjbCjaIKaJZaxqaMaazIaKbaGKaFAaCZaDaaDbaFBaMbaMcaMcaMcaMcaMcaMcaMcaMdaMcaMeaMeaMeaMeaMeaMfayGaCfaKraChaChaChaChaChaKrayGayGayHaMgaLnayJaMhayGayHayHayGayHaDxayJayHayHayGayHayHayJaDxayIayGayHayHayJaMiayHaDxayHaMjaMkaMkaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaDDaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaKAaKzaKzaKzaKzaKzaKzaKAaInaMlaCuaMmaMnaMoaMoaMoaMoaMoaMoaMpaKHaLHaMqaLJaMraMqaMqaLHaKHaMsaMtaMuaMuaMuaMuaMuaMuaMuaMuaMvbikaLRaMwaMxaMyaMzaMAaLRbikaJGaJLaJMaMBaMCaMDaMEaLSaJMaGvaIKaMFaMFaKPaMGaMHaKSaKTaKSaMHaMIaMJaKOaKOaIKaJZaxqaKaazIaMKaBRaMLaCZaDaaDbaEgaMbaMcaMMaMNaMOaMOaMcaMPaMQaMRaMeaMSaMTaMUaMeaMVayGbikaMWaMXaMXaMXaMXaMXaMYbikayGayHaMZaNaayJayJayGayGayJayJaNbaNcayJayGazxayGayGayJayJaNdaNeayGayGayGaHYaMiayHaDxayHaMjazwayKaFSayGaNfaNgaNfayGayGayGaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9148,7 +9154,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaUFaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaXtaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaWsaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQabpqaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaZmaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKbCjbCjbCjaQLaLXaJOaLYaJOaLXaQMbCjbCjbCjaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRvaRuaTkaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaOCbbVaTCaRTaRUaQbaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpdpgaSraPdaPdaZVaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaWFaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaTeaSXaSYaSZaTaaTbaTcaTdaTbaTbaUjaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIcLhaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQbaXRaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbdphaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaJGaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaYgaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaYPaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQbaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbdphaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaJGaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUubtdaKSaUwaKSbABaUyaUzaIKaUAaUBaUCaUDaUEaYgaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaYPaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQbaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLdpiaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaJGaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKbKgaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWrbeoaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQbaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzdeQaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqdpjaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMbgBaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfbjwaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIbkFaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQbaYVaGZaEsaYWaGZaGZaGZaGZaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZldpkaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaJSaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnbcMaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbaVbbbKbbLaVbaVbbakbbMbakaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9159,20 +9165,20 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaCuaInaInaInaInaInaInaInaInaInaCuaDEbgLbgMbgNbgNbgNbgNbgNbgNbgObgNbgNbgNaDEbdVbejbgPbcobgQbecbecdhUbgSbgTbgUdhUbecbecbecbgVbcobejbekbctbgWbgXbgYbcvbgZbhabhbbcvbhcbhdbhebhfbhgbesbhhbhiaXObcDbcDbhjbcEbcEbcEbhkbhlbhmbhnbhobhobhpbhqbhobhrbhobhsbhtbhubhvbhwbhxbcEbcEbcEbhjbcKbcKbeGaYiaYiaMebhybhzbgkbhAbmwbhBbhCbmwbhDbhEbglbmwbnMbeMbeMbhFbcSbhHbhIbhJbhKbhLbeMbhMbgubhNdlHbeYbeYbhObhPbhQaVbaVhayHaRDbhRbhSbhTbbPbbQbhUaTvaTvbhVaTvbhWbhXaQbbhYbhZbiabfgbfgbibbiabicaQbbidbgHbatbatbatbavbatbatbKnbIzbPfbNjbiibPfddJbmKbmKbmKbmKbmKbmKbmKbmKbmKbmKbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbltbltblubltbltbltblvbltbltbmPaabaInaLAaJtbilbgNbimbinbiobipbiqbirbisbitbgNbiubivbiwbixbcobiybecbecdhUbgTbizbiAdhUbecbecbiBbiCbcobejbekbctbctbiDbctbcvbiEbiFbiGbcvbiHbhfbiIbhfbiJbesbeubiKaXOaXPaXPbiLbiMbiNbcEbiObfRbiPbhobhobiQbiRbiSakybiSbiUbiVbiWbiXbiYbiZbjabcEbjbbiMbjcbjdbjebeGaYiaYibjfbmwbjgbmwbmwbmwbjhbjibmwbhDbjjbglbmwbeLbeMbeMbjkbBDbjmbjnbjobjpbhLbjqaVbdlJdlIdlKbeYbeYbeXbhPbjsaVbbjtbjuaRDbjvaRDaRDbogbbQbjxbjyaTvbjzbjAaWSbjBbdvbjCbjDbjEbjFbjFbjGbjHbjIbdvbjJbjKbatbjLbatbavbatbatddAbaAbaAbaAbaAbgKbqUddBbmKbutbwmbtmbmKbutbwmbtmbmKddCbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikblsbohbptbojbpwbpwbqWbpwbpwbpwbqWblubjNaInaKzaKBbfqbgNbimbjObjPbimbjQbjRbjSbjTbgNbjUaFmbjWbcsbcobjXbjYbjZbkabkbbkcbkdbkebkebkebkfbkgbcobejbivbkhbkibkjbkkbcvbcvbcvbcvbcvbklbkmbknbkobkpbesbeubiKaXJaXJaXJbkqbkrbksbktbkubkvbhobkwbkxbkybkzbkAbkBbkCbkDbkEboNbkGbkubkHbkIbkJbkKbkMbkLbkObkObkPaYibkQaMebmwbkRbkSbglbmwbkTbkUbmwbkVbkWbglbmwbnMbeMbeMbeMbeNbeMbkXbeMbjpbhLbkYaVbdlObhNbeXbeYbeYbeXbhPblaaVbblbblcbldbleblfblgblhblibljbljbljbljbljbljblkbllblmbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbatbatbavbatbatddDbgKblrblrblrbaAbwmbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbwmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcobpcblLblMblNblOblPblQblRblSblRblTblTblTblTblTboFblUbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbmwbnCbmwbmwbmwaRebmwbmwbmvbmvbmwbmwbmxbeMbeMbmybqHbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbbmEbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbqYbqXbqXbqXbqXbqXbqXbqXbqXbqXbqXbqZbraaGdbraaJrbfqbgNblwbimblxblxblxblybimblzbgNblAblBbjWblCblCblCblCblDblCblEbecblFblGblHblHblIblJbcobpcblLblMblNblOblPblQblRblSblRblTblTblTblTblTboFblUbeublVblWblXblYblZbmabmbbmcbmdbkBbmebmfbmgbmgbmgbmgbmhbmgbmibmjbmkbmlbmebmmbmnbcEbmobmpbmqbkNbmsbmtaYiaYibjfbmwbnCbmwbmwbmwaRebmwbmwbmvbmvbmwbmwbmxbeMbeMbmybqHbeMbeMbeMbmAbmBbmCaVbbgxbhNbeXbeXbeXbeXbhPbmDaVbcFKbmFbmFbmGbmFbmHbbPbbPbbPbbPbmIbbPbbPbbPbmJblobfgbfgbfgbfgbfgbfgbfgblnbloblpbgHbatbfjbfjbfkbfjbatddEbaAbmLbmMbmNbaAbBQbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbBQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbrbbrebrdbrfbrfbrgbrfbrfbrfbrgbluaInaInaKzbrVbcjbmQbimbmRblxblxblxblybmRbimbgNbmSbmTbjWblCbmUbmVbmWbmXblCbmYbmZbnabcobnbbncbndbnebcobejbnfbngbngbnhbngbngbngbngbnibnjbnjbnjbnkbnjbnlbuWbnnbnobnpbnrbnrbnrbnrbnrbnqbnqbnsbnqbmgbmgbntbnubnvbnwbnxbnybntbnzbmgbnAbnBbnAbnAbnAbnAbnAbnAbnAbmtaYiaYiaMebnEbmwcakbnGbmwbnFbmwbnJdmhdmgbmwbpjaUTbnKbnLaUTaUTczObnNddybnNaUTaUTaVbbnObnPbnQbnQbnQbnQbnPbnRaVbbnSbmFbmFbmGbnTaRDbnUbnVbnWbnXbnYbnZboabobbocaQbbodaRSboebfgbfgboeaRSbofaQbbszbgHbatbgIbgIbgJbgIbatddDbgKblrblrblrbaAbGVbtmbmKbutbGVbtmbmKbutbGVbtmbmKbutbGVbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbltbltblubltbltbltblvbltbltbtnaabaInboibdFbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEbSVbyzbyzbyzbuVboGboHboIbnrboJboKboLboMbsLboOboPboQbmgboRbnvbnvbpWboTbpWbnvbnvboVbmgboWboXboYboZbpabpbbsWbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbplbpkbpkbpkbpkbpmbpJaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatddAbaAbaAbaAbaAbgKbqUddFbmKbmKbmKbmKbmKbmKbmKbmKbmKddGbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbAibmubpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWboUbpWbnvbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqnbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqyaHkbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbtNbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbAibmubpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWboUbpWbnvbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqnbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqyaHkbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbtNbqIcXAbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbtpbtqbtqbtqbtqbwpbwpbtqbtqbxZbikaabaInaLAaJtbzPbzObzRbzQbzQbzQbzQbzSbzUbzTbcsbdVbBFbrhblCblCblCbribotblCbcobcobcobcobnbbrjbrkbrlbcobrmbrnbngbrobrpboAbpFbrqbngboCbrrbpHbAibpIbrsbrtbnmbrubpNboIbpObrvbrwbrxbrybrzbrAbpTbrBbmgbrCbpWbnvbrDbrEbrDbnvbpWbrFbnzbrGbqbbqbbqcbrHbqebqbbrIbnAbrJbqibqibqjbqkbqlbqnbqnbqnbqnbqnbqnbqnbrKbqnbqnbqnbqnbqnbqnbrLbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrNbrObrPbqKbqKbrQbmFbmFbmFbmFbmFbmGbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbrRbmFbrSbrTbatbatbatbatbatbatbatddLbaAbgKbaAbaAbaAbqUddMddOddNbdBddPbdBddPbdBddQddMddObqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbAibpIbpIbsqbnmbsrbpNboIbpObWDbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybvTbsAbnvbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbxtbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbxHbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddYddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbAibpIbpIbsqbnmbsrbpNboIbpObWDbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybvTbsAbnvbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbxtbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbxHbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcdqvbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddYddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbAibpIbpIbtKbtLbtMbpNbyHbnrbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbqrbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuiaZtbuibuibuibuibuibuiafkbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedaYXaYXbuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUdngbyzdnidnhbpIbuXbuYbuZbtMbpNbvabnrbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrccIbtXbqbbvtbnAbxebvwbxfbucbzcbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbCtbvUbvUbvVbuiafNbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeibEdbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddYddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnrbIDbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbEibuhbxubxvbxwbxxbxAbxzbxvbxAbuibDdbvXbxCbxDbxEbxFbxFbxGbEtbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbLSbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbpXbyFbyGbEEbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzebzdcSCbzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbuibIbbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAbABbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbaHQbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbuibDdbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubKpbupbBwbBxbBybusbBzbBAbBBbxUbBCbKwbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAdrHbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbaHQbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbuibDdbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubKpbupbBwbBxbBybusbBzbBAbBBbxUbBCbKwbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdfMdesdesdesdesdesdfNbikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibPcbCkbCpbCpbKzbCpbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbFdbCubCvbCwbCxbCybCzbCAbEsbvwbHtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbuibIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbPcbPcbCpbEabnDbEcbIibEebCpbvibAEbvjbEfbEgbEhbqtbEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbJjbEFbEGbEHbuhbCTbEIbujbuhbuhbuibEKbELbEMbuibuibuibuibENbIdbvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbKhbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdbGebGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvcbAbKBbIebKjbKibvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdcDBbGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvcbAbKBbIebKjbKibvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjCdjEdjDdjGdjFdjIdjHdjFdjJdjLdjKdjydjydjBbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbGWbmrbNkbmrbGXbGYbGZbGYbGYbGYbGYbHabyvbAfbHbbngbngbHcbpIbAibFvbHdbtLbHebHfbHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbHrbHsbCpbCqbAEbvjbKHbHubHvbHwbHxbvjbikbEkbHybHzbHybHybHybHybHybHAbHybKPbvwbKObucbHCbHDbHDbHEbHFbEybHGbHHbHIbHJbHKbHLbHMbHIbHNbHObHPbHQbHRbHSbHTbHTbHUbHVbHWbHXbHYbLibLCbLBbNdbNcbNebIfbIfbIgbIhbKYbxGbIjbxJbxJbIkbIlbEUbImbInbIobIpbIqbIrbIsbItbIubxybIubusbusbIwbEXbGxbLDbLDbLDbLDbLDbGxbFhbFkbFibFkbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjHdjHdjHdjMdjFdjNdjNdjFdjOdjHdjHdjQdjPdjydjBbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbLFbKmbIAbKmbIBbAebFqbFrbFrbFrbAebAebyvbAfbICbKobngbIEbpIbAibFvbIFbtLbIGbpIbrsbpIbIHbDXbvvbIIbHlbHmbIJbIKbILbIMbINbIObIPbIQbIRbISbISbITbIUbIVbvjbvjbikbEkbHybIWbIXbIYbIZbJabJbbJcbJdbMhbvwbKObCHbJfbJgbJhbJibMGbEybJkbJlbJmbJnbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEcbAchEbIecnfcjubvYbJIbJJbJKbJLbJLbxGbJMbJNbJObxGbJPbEUbJQbxGbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKfbIxbJFbJHbGzbKlbFfbDBbNhbDBbFfbLEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjSdjRdjUdjTdjVdjFdjWdjHdjXdjHdjHdjHdjHdjHdjMdjFbikbikbikbikbikbikbikbikbikbikdewdeCdevdevdevcOfdewbFnbBRbBRdezbAebFqbAebAebAebAebAebyvbAfbICbLwbngbLQbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbqzbKxbKybKzbKAbOkbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybOPbKIbKJbKKbKLbKLbKMbKNbMibvwbMjbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbQsbKUbJkbKZbLabLbcchbLbbLcbLbbLdbLdbLebLfbLgbLgbLgcpLbLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLIbLxbLybLzbLAbLAbEObGAbHZbGxbGzbGzbGzbIabGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9202,18 +9208,18 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcyrcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcmQcsFcnBcodcoeckIcoEcorcsKcsLcsMcsNcsObGybGycpFcwlcsQcsRcsScsTcwmcpFdehcsTcsWcsXdlFdqVcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDcoGcwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNcqzctPctQcyqctSctTbEbctVctWctXcAvctZcuacnqcubcuccudcuecufcugcuhdqWcpFdqXcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLcrpdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKdqYcpFdqZcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWcoGbGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwcwAcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcwUcwUcwUcwUdnXcwUcvFcvGcvGcvHctBdlXcwUcCmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcAzcwhdradrcdrbcpFdrdcqKdrecqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRcoGcyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDcwAcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcwUcwUcwUcwUdnXcwUcvFcvGcvGcvHctBdlXcwUcCmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcAzcwhdradrcdrbcpFdrdcEMdrecqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRcoGcyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDcwAcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxaabagiaabaqZbikaqZaqZdoidoCdojdojdojdoldokcwUcwOcwPcwQcwRcwScwTcwUcwVcwWcvOcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrcwecpFcpFcxBcpFcpFcwecrvcuccuccuccxFcuccsEcpMbikbikbikdbFdbFdbFdbFdbFdbydcedcgcBbcoGbGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTcwAcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikaabaabbikaabaabbikbikaabaabaabaabaabdoidoidohdoidoidoncEBcwUcwUcwUcwUcwUcwUcwUcwUdoicwWcvOcyccydcyecyfcyfcyfcyfcygcyhcyicxjcyjcxjcxjcykcxjcylcymcyncyocxocbkcypcyqcDucxscyscytcyucxscyvcywcyxcyycyzcyAcyBcyCcyDcyEcyEcAaczUcAdcAccAeczTbGyceJcAhbGycAMcoAcoAcoAcoAcoAbikbikbikbikdcidchdckdcjcoGdclbVibVicuscoAcoAcoAcoAcoAbikbikckPcxOcxOcxOcyZczaczbczcczdcAicAOcFRcwAcAVcAYcAWckPbikbikcwGczkcwJczlcwJczmcwGbxXbxXcvzczMbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdoDbikacGbikczoczpczqbikczoczpczqbikczoczpczqbikbikdoidoocfRdopdoidoqcGKdojdojdojdojdojdojdojdojdojcEycvOcztcxjcykczucxjcxjcxjczvcxjcztcztcxjcxjcxjcxjczwczxcymczyctEczzcoacyqcyqczAcxsczBczCczDcxsczEctWczFczGczHczIczJczKbGyczLcdcczLbGycBacAZcBccBccBccBccBPcBNcBNcBNcBNcBNcBQcoAbikbikbikbikdcidchdckdcmcTabGyckObVicusbGybGybGycgmcoAbikbikckPcwAcwAcwAcwAczWcqUczXczYczZcCfcAbcwAcCGcCYcCIckPbikbikcwGcAfcAgcDLcwJcDNcwGcEdbxXcvzbwoaabaabaabaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikczocAkczqbikczocAkczqbikczocAkczqbikaqZdoicfRcfRcfRdoidoidorczsdoidoiczsczsdoidoiczsczscwWcvOcztcAlcxjcAmcAncAocAocyjcxjcztcApcxjcxjcxjcxjcAqcArcAscAtbZNcAucAPcAwcAxcAycxsczBdlYcAAcxscABctWcsOcACcsLcADcAEcAFcAGcAHcAIcAJcAGcAKcAGcAGcAGcoAcoAcoAcoAcoAcoAcoAcoAcEhcoAbikbikbikbikdcicBTdcqcBUcoGcgmcFdbVicFmcFlcFlcFnbGycoAbikbikckPcwtcwucwvcAQcARczbcAScATcAUcFrcIScAXcGscIScGtckPbikbikcwGcwGcGIcCrcBdcwGcwGbwobxXcGycyJcyJcyJbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikaqZaabczocAkczqbikczocAkczqaabczocAkczqbikaabdoidondosdoqdoibikaabbikbikbikbikbikaabbikbikczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcBwcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcALcBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAbikbikckPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPbikaabaabcwGcwGcCscwGcwGbikbwobxXcvzcyJcHycHxbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikczocAkczqaabczocAkczqbikczocAkczqaabbikdoidoiczsdoidoibikaabaabbikaabbikaabaabbikbikcybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcFbcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctaclUciUckucjoclUcBXcCPcBYcCRcCQcoAcusbGycoAbikbikckPcxOcxOcxOckycCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabbikbikbikcIKbikbikbikbwobxXcvzcyJbxXbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaqZbikczocAkczqaabczocAkczqbikczocAkczqaabbikbikbikbikbikbikbikbikbikaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmdotcDocDncDncDpcDpcDncDqcDrcDscDtcDtcFMcDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcCSczVcuqczVcDUcoAcusbGycoAcoAbikckPcwAcwAcwAcwAcEkcqUcCbdlZcEmcCecqUcEncEocEocEpcEqcXYaabbikbikbikbikbikbikbikbwobxXcGybxXbxXcIPbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucDdcKlcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJIcGCcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcHscFNcJlcFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikaqZaabczocAkczqbikczocAkczqaabczocAkczqbikaabdoidondosdoqdoibikaabbikbikbikbikbikaabbikbikczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcFbcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcALcBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAbikbikckPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPbikaabaabcwGcwGcCscwGcwGbikbwobxXcvzcyJcHycHxbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikczocAkczqaabczocAkczqbikczocAkczqaabbikdoidoiczsdoidoibikaabaabbikaabbikaabaabbikbikcybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcIUcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctaclUciUckucjoclUcBXcCPcBYcCRcCQcoAcusbGycoAbikbikckPcxOcxOcxOckycCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabbikbikbikcIKbikbikbikbwobxXcvzcyJbxXbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaqZbikczocAkczqaabczocAkczqbikczocAkczqaabbikbikbikbikbikbikbikbikbikaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmdotcDocDncDncDpcDpcDncDqcDrcDscDtcDtcFMcDvdaIcDxcDycDzcDzdiEdppcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcCSczVcuqczVcDUcoAcusbGycoAcoAbikckPcwAcwAcwAcwAcEkcqUcCbdlZcEmcCecqUcEncEocEocEpcEqcXYaabbikbikbikbikbikbikbikbwobxXcGybxXbxXcIPbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucDdcKlcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzdpwcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJIcGCcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJdrRcFLcHscFNcJlcFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikbikcDccDccDccGGcGHcWAcDddovcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcBWcHEcHFcHGcHJcHIcqUcqUcqUcqUcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIedmabRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUcIUczbcIVczbcIVczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIedmabRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUdqBczbcIVczbcIVczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcFNcJgcDtcJicJjcFWcJkcQDcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcXPcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzbClcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcFgcCOcDXcNDcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcIWcLmcJScwAcLlcLpcLnckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqaabczocHOczqaabaabaabaabbikaabbikbikaabaabbikbikbikaabbikbikcJbcKjcKjcKkcLscLscLscLtcLucLvcECcLwcLxcLycLzcLAcLBcLCcLDcLDcLEcLFcLGcGOcGOcGOcLHcLIcLJcLKcLLcLMcLNcLOcLPcECcLQcLQcLRcHhcCAcLScLTcLUcLVcLWcDFcLXcLYcLZcMacMbcCKcCKcCKcCKcCKcHBcoDcEhcLbbGybGybYDclUcNEczVczVcOtcDZcQMcRwcyTdbkcYuclUcuscGvczhbGychCcITcoAbikbikckPcMpcxOcxOcwAcMpcxOcxOcwAcMpcxOcxOckPbikaabaabbikbikbikbikbikcyJcyJbwocLccyJbxXbwobwobwocJNcJNaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9234,8 +9240,8 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaccMucMucMucMucMucMucMucECcSDcSEbikddcaaccSQaabaabdlqdlpdlraabcTzbikaacddcbikcSEcSDcECcECcMHcECcCKcTAcTBcTAcCKcTCcTDcTCcCKcTEcTFcTEcCKaabcUkbikacGbikcTUcYhcZRcZTcZScZucZUcZWcZVcYicZXcZZcZYdaacAhbGycGvcGvdabdaddacbGydaeazybikaabbikcxHcxHcxHbwobwobwobwobwobwodafcyKcyJdagbxXbxXcyJbxXbxXbxXbxXcYqbxXcPAcqecrZcsacsbcqeaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaacaacaabaabaabacGacGcECcECcTGcSEbikddfddgbikbikaabdlscTHdltaabbikbikdlodlnbikcSEcTJcECcECcMHcECcCKcTAcTKcTAcCKcTCcTLcTCcCKcTEcTMcTEcCKaabcUkbikacGbikcTUcYhcYhcYhdahcrBcrkdajcrkcrBcZXdakbGycGzdalcFicHrcGvdamcoAcoDcoDcoDdanaabaabbikcxHdaodapcyJbxXdaqdarcNRcyJdasbxXcyJdatbxXbxXdaubxXbwobwobwocxHcxHbwocqectrctscttcqeaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaabaabbikbikaabaabacGcECcECcSDcSEbikddcaacbikcTNaabdlvdludlwaabaabcSQaacddcbikcSEcSDcECcECcMHcECcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKcCKaabcUkbikaqZbikcTUbikbikbikdavcrBdawdaydaxcrBbGydazbGybGydaAdaBcGqdaDdaCcoAbikbikbikbikbikaabbikcxHdaEdaFdaubxXcQobxXbxXdaucZobxXcyJcyJcyJcyJcyJbxXbwoaabbikbikbikaabcuzcuzcuAcuzcuzaabaabczraabaabcZEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcECcTncTocSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTlcTmcECcUscECcECcECcECcUvcTScTScTScTScTScTScTScTScTScTScUwaabaabaabcUebikbikbikdaGcrBcrkdaHcrkcrBcoAdaIcFicFidaJdaLdaKcoAcoAcoAbikbikbikbikbikaabbikcxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabbikbikbikaabbikcuzcvEcuzbikaabbikaabbikbikaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikaabcECcTdcSEcTPbikddfddgbikbikbikaabbikbikbikbikbikdlodlnbikcSEcSEcTdcECddhddjddicMHddkcUwaabaabaabaabaabaabaabcUnaabaabaabaabaabaabcUeaabaabaabdaGcrBdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAbikaabbikbikbikbikbikaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabbikbikbikaabbikcuzcwMcuzbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcECcTncTocSEbikddcaacbikbikaabaabaabaabaabbikbikaacddcbikcSEcTlcTmcECcUscECcECcECcECcUvcTScTScTScTScTScTScTScTScTScTScUwaabaabaabcUebikbikbikdaGcrBcrkdaHcrkcrBdrPdrQcFicFidaJdaLdaKcoAcoAcoAbikbikbikbikbikaabbikcxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabbikbikbikaabbikcuzcvEcuzbikaabbikaabbikbikaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikaabcECcTdcSEcTPbikddfddgbikbikbikaabbikbikbikbikbikdlodlnbikcSEcSEcTdcECddhddjddicMHddkcUwaabaabaabaabaabaabaabcUnaabaabaabaabaabaabcUeaabaabaabdaGcrBdaPdaRdaQdaSaabdrPcoAcoDdaTcoDcoAcoAbikaabbikbikbikbikbikaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabbikbikbikaabbikcuzcwMcuzbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcECcTXcTYdddaabddcaaccSQbikbikcSQbikbikbikbikcSQaacddcbikddecUacUbcECddlcECcECcECcECcECcECbikbikaabbikbikbikcUnbikbikcUocUocUocUocUpbikbikaabdaGcUrcrBdaVcrBcrBbikaabbikbikdaWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbwodaFdaXbwocGxaabbwobwocxHcxHczMbwobikaabbikbikbikaabbikbikcxZbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcECcUfcUgcUhbikddcaacaacdlxaacaacdlxaacaacdlxaacaacddcbikcUicUgcUjcECddmcTRddnddocUtcUzcUxcUucUucUDcUucUucUucULcUucUucUMcUOcUNcUPcUpbikbikaabcUQazycrBdaYcrBdaZaabaabbikbikdctbikbikbikbikbikbikbikbikbikbikbikaabaabbikaahbikbikbwodbbdbabwodbcaabbikaabbikbikaabbikbikaabbikbikbikaabbikbikcznbikbikaabbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcNycECcECdlybikdlzcTIcTIdlAcTIcTIdlAcTIcTIdlAcTIcTIdlBbikdlycECcECcECddmcUcddpcUlddqcURcRebikbikaabbikbikbikcUncUocUocUocUTcUScUTcUpbikbikaabaabazycLodbecLoazyaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikbikbikcxHdbfcxHcxHaabczrbikaabbikbikaabbikagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9255,7 +9261,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcXdcWucXecXfcXdcXdcXgcXhcXdcXfcXicXfcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQagQagQagQbikbikbikcGEbikbikbikagQagQagQaqZagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXdcXkcXjcXfcXmcXocXncXpcXmcXfcXqcXrcXdbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikagQaabcSBaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcXdcXscXjcXfcXmcXocXncXpcXmcXfcXqcXtcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXucXdcWVcXvcXfcXwcXocXxcXzcXycXfcXqcXdcXdcXAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQagQagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcXucXdcWVcXvcXfcXwcXocXxcXzcXycXfcXqcXdcXddrSbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQagQagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcWVcXBcXfcXCcXocXncXpcXmcXfcXDcXdaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWVcXEcXGcXFcXIcXHcXpcXJcXLcXKcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWVcXMcXfcXNcXOcXncXpdrAcXfcXMcXdaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -9270,7 +9276,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBdrsdrrdrudrtdrwdrvdrxcWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBcWPcXZdrzdrydpfdaicWRcWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWBcWBcWBboSdgYcWTdrBcWTdrCboScWBcWBcWBaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjgbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdrDcWBcWBdrEcWLdrFcWTcWTcWTcWOcWLdrGcWBcWBdrHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdrDcWBcWBdrEcWLdrFcWTcWTcWTcWOcWLdrGcWBcWBdrTbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcWBcWBcWBcWPdrIdrKdrJcWTcWLcWRcWBcWBcWBaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBdrscWLdrMdrLboScWLdrxcWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcWBcWBcWBboScWLcXldrNcWLcWLboScWBcWBcWBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index 8570977d617..244e9c26aa3 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -213,7 +213,7 @@
var/datum/gas_mixture/environment = tile.return_air()
if(scrubbing)
- if((environment.toxins>0.001) || (environment.carbon_dioxide>0.001) || (environment.trace_gases.len>0))
+ if((scrub_O2 && environment.oxygen>0.001) || (scrub_N2 && environment.nitrogen>0.001) || (scrub_CO2 && environment.carbon_dioxide>0.001) || (scrub_Toxins && environment.toxins>0.001) || (environment.trace_gases.len>0))
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
//Take a gas sample
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 2b2adbdbaf2..61bc32d378e 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -59,10 +59,14 @@
#define HAS_SKIN_TONE 64
#define HAS_ICON_SKIN_TONE 128
#define HAS_SKIN_COLOR 256
-#define HAS_MARKINGS 512
-#define TAIL_WAGGING 1024
-#define NO_EYES 2048
-#define HAS_FUR 4096
+#define HAS_HEAD_MARKINGS 512
+#define HAS_BODY_MARKINGS 1024
+#define HAS_TAIL_MARKINGS 2048
+#define HAS_MARKINGS HAS_HEAD_MARKINGS|HAS_BODY_MARKINGS|HAS_TAIL_MARKINGS
+#define TAIL_WAGGING 4096
+#define NO_EYES 8192
+#define HAS_FUR 16384
+#define HAS_ALT_HEADS 32768
//Species Diet Flags
#define DIET_CARN 1
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 85221f5cf3c..dad6165400f 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -208,14 +208,14 @@
#define GLOVES_LAYER 11
#define EARS_LAYER 12
#define SUIT_LAYER 13
-#define GLASSES_LAYER 14
-#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt?
-#define SUIT_STORE_LAYER 16
-#define BACK_LAYER 17
-#define TAIL_LAYER 18 //bs12 specific. this hack is probably gonna come back to haunt me
-#define HAIR_LAYER 19 //TODO: make part of head layer?
-#define HEAD_ACCESSORY_LAYER 20
-#define FHAIR_LAYER 21
+#define BELT_LAYER 14 //Possible make this an overlay of somethign required to wear a belt?
+#define SUIT_STORE_LAYER 15
+#define BACK_LAYER 16
+#define HAIR_LAYER 17 //TODO: make part of head layer?
+#define HEAD_ACCESSORY_LAYER 18
+#define FHAIR_LAYER 19
+#define TAIL_LAYER 20 //bs12 specific. this hack is probably gonna come back to haunt me
+#define GLASSES_LAYER 21
#define FACEMASK_LAYER 22
#define HEAD_LAYER 23
#define COLLAR_LAYER 24
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 736ca0d291f..bf9c479d3e8 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -50,6 +50,10 @@
#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up
+//Mob attribute defaults.
+#define DEFAULT_MARKING_STYLES list("head" = "None", "body" = "None", "tail" = "None") //Marking styles. Use instead of initial() for m_styles.
+#define DEFAULT_MARKING_COLOURS list("head" = "#000000", "body" = "#000000", "tail" = "#000000") //Marking colours. Use instead of initial() for m_colours.
+
////////REAGENT STUFF////////
// How many units of reagent are consumed per tick, by default.
#define REAGENTS_METABOLISM 0.4
@@ -72,15 +76,18 @@
#define APPEARANCE_SKIN 8
#define APPEARANCE_HAIR 16
#define APPEARANCE_HAIR_COLOR 32
-#define APPEARANCE_FACIAL_HAIR 64
-#define APPEARANCE_FACIAL_HAIR_COLOR 128
-#define APPEARANCE_EYE_COLOR 256
-#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR
-#define APPEARANCE_HEAD_ACCESSORY 512
-#define APPEARANCE_MARKINGS 1024
-#define APPEARANCE_BODY_ACCESSORY 2048
-#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY
-#define APPEARANCE_ALL 4095
+#define APPEARANCE_SECONDARY_HAIR_COLOR 64
+#define APPEARANCE_FACIAL_HAIR 128
+#define APPEARANCE_FACIAL_HAIR_COLOR 256
+#define APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR 512
+#define APPEARANCE_EYE_COLOR 1024
+#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_SECONDARY_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR
+#define APPEARANCE_HEAD_ACCESSORY 2048
+#define APPEARANCE_MARKINGS 4096
+#define APPEARANCE_BODY_ACCESSORY 8192
+#define APPEARANCE_ALT_HEAD 16384
+#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD
+#define APPEARANCE_ALL 32767
// Intents
#define I_HELP "help"
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 8e0b22ffc2b..155f7dfae58 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -401,23 +401,6 @@
mobs_found += M
return mobs_found
-/proc/GetRedPart(const/hexa)
- return hex2num(copytext(hexa,2,4))
-
-/proc/GetGreenPart(const/hexa)
- return hex2num(copytext(hexa,4,6))
-
-/proc/GetBluePart(const/hexa)
- return hex2num(copytext(hexa,6,8))
-
-/proc/GetHexColors(const/hexa)
- return list(
- GetRedPart(hexa),
- GetGreenPart(hexa),
- GetBluePart(hexa)
- )
-
-
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
var/area/our_area = get_area_master(the_area)
for(var/C in living_mob_list)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index ac7271278b0..c8d4fd2c659 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -18,6 +18,8 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
+ //alt heads
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/alt_heads, alt_heads_list)
init_subtypes(/datum/surgery_step, surgery_steps)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index edde3f13142..a2e8542b825 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -1,3 +1,15 @@
+proc/GetOppositeDir(var/dir)
+ switch(dir)
+ if(NORTH) return SOUTH
+ if(SOUTH) return NORTH
+ if(EAST) return WEST
+ if(WEST) return EAST
+ if(SOUTHWEST) return NORTHEAST
+ if(NORTHWEST) return SOUTHEAST
+ if(NORTHEAST) return SOUTHWEST
+ if(SOUTHEAST) return NORTHWEST
+ return 0
+
proc/random_underwear(gender, species = "Human")
var/list/pick_list = list()
switch(gender)
@@ -34,57 +46,133 @@ proc/pick_species_allowed_underwear(list/all_picks, species)
return pick(valid_picks)
-proc/random_hair_style(var/gender, species = "Human")
+proc/random_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead)
var/h_style = "Bald"
-
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(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
+ continue
+ if((gender == MALE && S.gender == FEMALE) || (gender == FEMALE && S.gender == MALE))
+ continue
+ if(species == "Machine") //If the user is a species who can have a robotic head...
+ if(!robohead)
+ robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
+ else
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
if(valid_hairstyles.len)
h_style = pick(valid_hairstyles)
- return h_style
+ return h_style
-proc/GetOppositeDir(var/dir)
- switch(dir)
- if(NORTH) return SOUTH
- if(SOUTH) return NORTH
- if(EAST) return WEST
- if(WEST) return EAST
- if(SOUTHWEST) return NORTHEAST
- if(NORTHWEST) return SOUTHEAST
- if(NORTHEAST) return SOUTHWEST
- if(SOUTHEAST) return NORTHWEST
- return 0
-
-proc/random_facial_hair_style(var/gender, species = "Human")
+proc/random_facial_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead)
var/f_style = "Shaved"
-
- var/list/valid_facialhairstyles = list()
+ var/list/valid_facial_hairstyles = 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(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
+ continue
+ if((gender == MALE && S.gender == FEMALE) || (gender == FEMALE && S.gender == MALE))
+ continue
+ if(species == "Machine") //If the user is a species who can have a robotic head...
+ if(!robohead)
+ robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
+ else
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
+ if(valid_facial_hairstyles.len)
+ f_style = pick(valid_facial_hairstyles)
- return f_style
+ return f_style
+
+proc/random_head_accessory(species = "Human")
+ var/ha_style = "None"
+ var/list/valid_head_accessories = list()
+ for(var/head_accessory in head_accessory_styles_list)
+ var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
+
+ if(!(species in S.species_allowed))
+ continue
+ valid_head_accessories += head_accessory
+
+ if(valid_head_accessories.len)
+ ha_style = pick(valid_head_accessories)
+
+ return ha_style
+
+proc/random_marking_style(var/location = "body", species = "Human", var/datum/robolimb/robohead, var/body_accessory, var/alt_head)
+ var/m_style = "None"
+ var/list/valid_markings = list()
+ for(var/marking in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/S = marking_styles_list[marking]
+ if(S.name == "None")
+ valid_markings += marking
+ continue
+ if(S.marking_location != location) //If the marking isn't for the location we desire, skip.
+ continue
+ if(!(species in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ continue
+ if(location == "tail")
+ if(!body_accessory)
+ if(S.tails_allowed)
+ continue
+ else
+ if(!S.tails_allowed || !(body_accessory in S.tails_allowed))
+ continue
+ if(location == "head")
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
+ if(species == "Machine")//If the user is a species that can have a robotic head...
+ if(!robohead)
+ robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
+ continue
+ else if(alt_head && alt_head != "None") //If the user's got an alt head, validate markings for that head.
+ if(!("All" in M.heads_allowed) && !(alt_head in M.heads_allowed))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
+ valid_markings += marking
+
+ if(valid_markings.len)
+ m_style = pick(valid_markings)
+
+ return m_style
+
+proc/random_body_accessory(species = "Vulpkanin")
+ var/body_accessory = null
+ var/list/valid_body_accessories = list()
+ for(var/B in body_accessory_by_name)
+ var/datum/body_accessory/A = body_accessory_by_name[B]
+ if(!istype(A))
+ valid_body_accessories += "None" //The only null entry should be the "None" option.
+ continue
+ if(species in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
+ valid_body_accessories += B
+
+ if(valid_body_accessories.len)
+ body_accessory = pick(valid_body_accessories)
+
+ return body_accessory
proc/random_name(gender, species = "Human")
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 7e4fca82c32..1265846d199 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -10,7 +10,7 @@
//Returns an integer given a hex input
/proc/hex2num(hex)
- if(!( istext(hex) ))
+ if(!(istext(hex)))
return
var/num = 0
@@ -59,6 +59,27 @@
hex = "0[hex]"
return hex || "0"
+//Returns an integer value for R of R/G/B given a hex color input.
+/proc/color2R(hex)
+ if(!(istext(hex)))
+ return
+
+ return hex2num(copytext(hex, 2, 4)) //Returning R
+
+//Returns an integer value for G of R/G/B given a hex color input.
+/proc/color2G(hex)
+ if(!(istext(hex)))
+ return
+
+ return hex2num(copytext(hex, 4, 6)) //Returning G
+
+//Returns an integer value for B of R/G/B given a hex color input.
+/proc/color2B(hex)
+ if(!(istext(hex)))
+ return
+
+ return hex2num(copytext(hex, 6, 8)) //Returning B
+
/proc/text2numlist(text, delimiter="\n")
var/list/num_list = list()
for(var/x in splittext(text, delimiter))
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index d409d6e54c9..713289c737c 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -23,6 +23,8 @@ var/global/list/undershirt_f = list() //stores only undershirt name
var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
var/global/list/socks_m = list() //stores only socks name
var/global/list/socks_f = list() //stores only socks name
+ //Alt Heads
+var/global/list/alt_heads_list = list() //stores /datum/sprite_accessory/alt_heads indexed by name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 26738b137fe..c7edd88803a 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -141,7 +141,12 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
var/icon/temp
temp = new /icon(icobase, "groin_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
- temp = new /icon(icobase, "head_[g]")
+ var/head = "head"
+ if(head_organ.alt_head && head_organ.species.bodyflags & HAS_ALT_HEADS)
+ var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[head_organ.alt_head]
+ if(alternate_head.icon_state)
+ head = alternate_head.icon_state
+ temp = new /icon(icobase, "[head]_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
//Tail
@@ -188,6 +193,13 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
hair_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD)
else
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
+
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
@@ -205,15 +217,31 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
facial_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD)
else
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_s.Blend(facial_s, ICON_OVERLAY)
//Markings
- if(H.species.bodyflags & HAS_MARKINGS)
- var/datum/sprite_accessory/marking_style = marking_styles_list[H.m_style]
- if(marking_style && marking_style.species_allowed)
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- markings_s.Blend(rgb(H.r_markings, H.g_markings, H.b_markings), ICON_ADD)
- face_s.Blend(markings_s, ICON_OVERLAY)
+ if((H.species.bodyflags & HAS_HEAD_MARKINGS) || (H.species.bodyflags & HAS_BODY_MARKINGS))
+ if(H.species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ var/body_marking = H.m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed)
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ b_marking_s.Blend(H.m_colours["body"], ICON_ADD)
+ face_s.Blend(b_marking_s, ICON_OVERLAY)
+ if(H.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ var/head_marking = H.m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed)
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ h_marking_s.Blend(H.m_colours["head"], ICON_ADD)
+ face_s.Blend(h_marking_s, ICON_OVERLAY)
preview_icon.Blend(face_s, ICON_OVERLAY)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index b62ee00b320..fcf1ded97cc 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -589,7 +589,7 @@
var/list/possible_targets = list("Free objective")
for(var/datum/mind/possible_target in ticker.minds)
if((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human))
- possible_targets += possible_target.current
+ possible_targets += possible_target
var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets
if(!new_target)
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index c147bd9235c..62774ad61a7 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -60,7 +60,7 @@
Sound(message_sound)
Log(message, message_title)
-datum/announcement/proc/Message(message as text, message_title as text)
+/datum/announcement/proc/Message(message as text, message_title as text)
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, "
[title]
")
@@ -72,14 +72,14 @@ datum/announcement/proc/Message(message as text, message_title as text)
to_chat(world, "[message_title]")
to_chat(world, "[message]")
-datum/announcement/priority/Message(message as text, message_title as text)
+/datum/announcement/priority/Message(message as text, message_title as text)
to_chat(world, "[message_title]
")
to_chat(world, "[message]")
if(announcer)
to_chat(world, " -[html_encode(announcer)]")
to_chat(world, "
")
-datum/announcement/priority/command/Message(message as text, message_title as text)
+/datum/announcement/priority/command/Message(message as text, message_title as text)
var/command
command += "[command_name()] Update
"
if(message_title)
@@ -91,7 +91,7 @@ datum/announcement/priority/command/Message(message as text, message_title as te
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, command)
-datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text)
+/datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text)
var/command
command += "[from]
"
if(message_title)
@@ -103,11 +103,11 @@ datum/announcement/priority/enemy/Message(message as text, message_title as text
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, command)
-datum/announcement/priority/security/Message(message as text, message_title as text)
+/datum/announcement/priority/security/Message(message as text, message_title as text)
to_chat(world, "[message_title]")
to_chat(world, "[message]")
-datum/announcement/proc/NewsCast(message as text, message_title as text)
+/datum/announcement/proc/NewsCast(message as text, message_title as text)
if(disable_newscasts)
return
if(!newscast)
@@ -121,28 +121,28 @@ datum/announcement/proc/NewsCast(message as text, message_title as text)
news.can_be_redacted = 0
announce_newscaster_news(news)
-datum/announcement/proc/PlaySound(var/message_sound)
+/datum/announcement/proc/PlaySound(var/message_sound)
if(!message_sound)
return
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player) && !isdeaf(M))
M << message_sound
-datum/announcement/proc/Sound(var/message_sound)
+/datum/announcement/proc/Sound(var/message_sound)
PlaySound(message_sound)
-datum/announcement/priority/Sound(var/message_sound)
+/datum/announcement/priority/Sound(var/message_sound)
if(sound)
world << sound
-datum/announcement/priority/command/Sound(var/message_sound)
+/datum/announcement/priority/command/Sound(var/message_sound)
PlaySound(message_sound)
-datum/announcement/proc/Log(message as text, message_title as text)
+/datum/announcement/proc/Log(message as text, message_title as text)
if(log)
log_say("[key_name(usr)] has made \a [announcement_type]: [message_title] - [message] - [announcer]")
message_admins("[key_name_admin(usr)] has made \a [announcement_type].", 1)
-
+
/proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I)
// Format currently matches that of newscaster feeds: Registered Name (Assigned Rank)
- return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
+ return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
\ No newline at end of file
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 78b889071f5..82f7ffb2e93 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -30,19 +30,27 @@
#define DNA_UI_HACC_R 11
#define DNA_UI_HACC_G 12
#define DNA_UI_HACC_B 13
-#define DNA_UI_MARK_R 14
-#define DNA_UI_MARK_G 15
-#define DNA_UI_MARK_B 16
-#define DNA_UI_EYES_R 17
-#define DNA_UI_EYES_G 18
-#define DNA_UI_EYES_B 19
-#define DNA_UI_GENDER 20
-#define DNA_UI_BEARD_STYLE 21
-#define DNA_UI_HAIR_STYLE 22
+#define DNA_UI_HEAD_MARK_R 14
+#define DNA_UI_HEAD_MARK_G 15
+#define DNA_UI_HEAD_MARK_B 16
+#define DNA_UI_BODY_MARK_R 17
+#define DNA_UI_BODY_MARK_G 18
+#define DNA_UI_BODY_MARK_B 19
+#define DNA_UI_TAIL_MARK_R 20
+#define DNA_UI_TAIL_MARK_G 21
+#define DNA_UI_TAIL_MARK_B 22
+#define DNA_UI_EYES_R 23
+#define DNA_UI_EYES_G 24
+#define DNA_UI_EYES_B 25
+#define DNA_UI_GENDER 26
+#define DNA_UI_BEARD_STYLE 27
+#define DNA_UI_HAIR_STYLE 28
/*#define DNA_UI_BACC_STYLE 23*/
-#define DNA_UI_HACC_STYLE 23
-#define DNA_UI_MARK_STYLE 24
-#define DNA_UI_LENGTH 24 // Update this when you add something, or you WILL break shit.
+#define DNA_UI_HACC_STYLE 29
+#define DNA_UI_HEAD_MARK_STYLE 30
+#define DNA_UI_BODY_MARK_STYLE 31
+#define DNA_UI_TAIL_MARK_STYLE 32
+#define DNA_UI_LENGTH 32 // Update this when you add something, or you WILL break shit.
#define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
@@ -128,16 +136,18 @@ var/global/list/bad_blocks[0]
var/obj/item/organ/external/head/H = character.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes)
-
/*// Body Accessory
if(!character.body_accessory)
character.body_accessory = null
var/bodyacc = character.body_accessory*/
// Markings
- if(!character.m_style)
- character.m_style = "None"
- var/marks = marking_styles_list.Find(character.m_style)
+ if(!character.m_styles)
+ character.m_styles = DEFAULT_MARKING_STYLES
+
+ var/head_marks = marking_styles_list.Find(character.m_styles["head"])
+ var/body_marks = marking_styles_list.Find(character.m_styles["body"])
+ var/tail_marks = marking_styles_list.Find(character.m_styles["tail"])
head_traits_to_dna(H)
eye_color_to_dna(eyes_organ)
@@ -146,15 +156,25 @@ var/global/list/bad_blocks[0]
SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1)
SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1)
- SetUIValueRange(DNA_UI_MARK_R, character.r_markings, 255, 1)
- SetUIValueRange(DNA_UI_MARK_G, character.g_markings, 255, 1)
- SetUIValueRange(DNA_UI_MARK_B, character.b_markings, 255, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_R, color2R(character.m_colours["head"]), 255, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_G, color2G(character.m_colours["head"]), 255, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_B, color2B(character.m_colours["head"]), 255, 1)
- SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
+ SetUIValueRange(DNA_UI_BODY_MARK_R, color2R(character.m_colours["body"]), 255, 1)
+ SetUIValueRange(DNA_UI_BODY_MARK_G, color2G(character.m_colours["body"]), 255, 1)
+ SetUIValueRange(DNA_UI_BODY_MARK_B, color2B(character.m_colours["body"]), 255, 1)
- SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_R, color2R(character.m_colours["tail"]), 255, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_G, color2G(character.m_colours["tail"]), 255, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_B, color2B(character.m_colours["tail"]), 255, 1)
+
+ SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
+
+ SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
/*SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, facial_hair_styles_list.len, 1)*/
- SetUIValueRange(DNA_UI_MARK_STYLE, marks, marking_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, marking_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, marking_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_STYLE, tail_marks, marking_styles_list.len, 1)
UpdateUI()
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 137617ffd1e..2c5fdbbb5b1 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -138,9 +138,9 @@
H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255)
H.b_skin = dna.GetUIValueRange(DNA_UI_SKIN_B, 255)
- H.r_markings = dna.GetUIValueRange(DNA_UI_MARK_R, 255)
- H.g_markings = dna.GetUIValueRange(DNA_UI_MARK_G, 255)
- H.b_markings = dna.GetUIValueRange(DNA_UI_MARK_B, 255)
+ H.m_colours["head"] = rgb(dna.GetUIValueRange(DNA_UI_HEAD_MARK_R, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_G, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_B, 255))
+ H.m_colours["body"] = rgb(dna.GetUIValueRange(DNA_UI_BODY_MARK_R, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_G, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_B, 255))
+ H.m_colours["tail"] = rgb(dna.GetUIValueRange(DNA_UI_TAIL_MARK_R, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_G, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_B, 255))
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
@@ -149,16 +149,37 @@
else
H.change_gender(MALE, 0)
- //Markings
- var/marks = dna.GetUIValueRange(DNA_UI_MARK_STYLE,marking_styles_list.len)
- if((0 < marks) && (marks <= marking_styles_list.len))
- H.m_style = marking_styles_list[marks]
+ var/number_head_marks = 0
+ var/number_body_marks = 0
+ var/number_tail_marks = 0
+ for(var/m in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/marking = marking_styles_list[m]
+ if(marking.marking_location == "head")
+ number_head_marks++
+ else if(marking.marking_location == "body")
+ number_body_marks++
+ else if(marking.marking_location == "tail")
+ number_tail_marks++
+
+ //Head Markings
+ var/head_marks = dna.GetUIValueRange(DNA_UI_HEAD_MARK_STYLE, marking_styles_list.len)
+ if((head_marks > 0) && (head_marks <= number_head_marks))
+ H.m_styles["head"] = marking_styles_list[head_marks]
+ //Body Markings
+ var/body_marks = dna.GetUIValueRange(DNA_UI_BODY_MARK_STYLE, marking_styles_list.len)
+ if((body_marks > 0) && (body_marks <= number_body_marks))
+ H.m_styles["body"] = marking_styles_list[body_marks]
+ //Tail Markings
+ var/tail_marks = dna.GetUIValueRange(DNA_UI_TAIL_MARK_STYLE, marking_styles_list.len)
+ if((tail_marks > 0) && (tail_marks <= number_tail_marks))
+ H.m_styles["tail"] = marking_styles_list[tail_marks]
H.force_update_limbs()
H.update_eyes()
H.update_hair()
H.update_fhair()
H.update_markings()
+ H.update_tail_layer()
H.update_head_accessory()
return 1
@@ -178,7 +199,7 @@
//Hair
var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len)
- if((0 < hair) && (hair <= hair_styles_list.len))
+ if((hair > 0) && (hair <= hair_styles_list.len))
head_organ.h_style = hair_styles_list[hair]
head_organ.r_hair = GetUIValueRange(DNA_UI_HAIR_R, 255)
@@ -187,7 +208,7 @@
//Facial Hair
var/beard = GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len)
- if((0 < beard) && (beard <= facial_hair_styles_list.len))
+ if((beard > 0) && (beard <= facial_hair_styles_list.len))
head_organ.f_style = facial_hair_styles_list[beard]
head_organ.r_facial = GetUIValueRange(DNA_UI_BEARD_R, 255)
@@ -196,7 +217,7 @@
//Head Accessories
var/headacc = GetUIValueRange(DNA_UI_HACC_STYLE,head_accessory_styles_list.len)
- if((0 < headacc) && (headacc <= head_accessory_styles_list.len))
+ if((headacc > 0) && (headacc <= head_accessory_styles_list.len))
head_organ.ha_style = head_accessory_styles_list[headacc]
head_organ.r_headacc = GetUIValueRange(DNA_UI_HACC_R, 255)
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index 992e4326317..a194ddfeed1 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -54,10 +54,14 @@
eyes_blue = eyes_organ.eye_colour[3]
var/new_eyes = input("Please select eye color.", "Character Generation", rgb(eyes_red,eyes_green,eyes_blue)) as null|color
if(new_eyes)
- eyes_red = hex2num(copytext(new_eyes, 2, 4))
- eyes_green = hex2num(copytext(new_eyes, 4, 6))
- eyes_blue = hex2num(copytext(new_eyes, 6, 8))
- M.change_eye_color(eyes_red, eyes_green, eyes_blue)
+ M.change_eye_color(color2R(new_eyes), color2G(new_eyes), color2B(new_eyes))
+
+ //Alt heads.
+ if(head_organ.species.bodyflags & HAS_ALT_HEADS)
+ var/list/valid_alt_heads = M.generate_valid_alt_heads()
+ var/new_alt_head = input("Please select alternate head", "Character Generation", head_organ.alt_head) as null|anything in valid_alt_heads
+ if(new_alt_head)
+ M.change_alt_head(new_alt_head)
// hair
var/list/valid_hairstyles = M.generate_valid_hairstyles()
@@ -65,52 +69,45 @@
// if new style selected (not cancel)
if(new_style)
- head_organ.h_style = new_style
+ M.change_hair(new_style)
var/new_hair = input("Please select hair color.", "Character Generation", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as null|color
if(new_hair)
- head_organ.r_hair = hex2num(copytext(new_hair, 2, 4))
- head_organ.g_hair = hex2num(copytext(new_hair, 4, 6))
- head_organ.b_hair = hex2num(copytext(new_hair, 6, 8))
+ M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair))
+
+ var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style]
+ if(hair_style.secondary_theme && !hair_style.no_sec_colour)
+ new_hair = input("Please select secondary hair color.", "Character Generation", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as null|color
+ if(new_hair)
+ M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair), 1)
// facial hair
var/list/valid_facial_hairstyles = M.generate_valid_facial_hairstyles()
new_style = input("Please select facial style", "Character Generation", head_organ.f_style) as null|anything in valid_facial_hairstyles
if(new_style)
- head_organ.f_style = new_style
+ M.change_facial_hair(new_style)
var/new_facial = input("Please select facial hair color.", "Character Generation", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as null|color
if(new_facial)
- head_organ.r_facial = hex2num(copytext(new_facial, 2, 4))
- head_organ.g_facial = hex2num(copytext(new_facial, 4, 6))
- head_organ.b_facial = hex2num(copytext(new_facial, 6, 8))
+ M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial))
+
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
+ if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour)
+ new_facial = input("Please select secondary facial hair color.", "Character Generation", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as null|color
+ if(new_facial)
+ M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial), 1)
//Head accessory.
if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
var/list/valid_head_accessories = M.generate_valid_head_accessories()
var/new_head_accessory = input("Please select head accessory style", "Character Generation", head_organ.ha_style) as null|anything in valid_head_accessories
if(new_head_accessory)
- head_organ.ha_style = new_head_accessory
+ M.change_head_accessory(new_head_accessory)
var/new_head_accessory_colour = input("Please select head accessory colour.", "Character Generation", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as null|color
if(new_head_accessory_colour)
- head_organ.r_headacc = hex2num(copytext(new_head_accessory_colour, 2, 4))
- head_organ.g_headacc = hex2num(copytext(new_head_accessory_colour, 4, 6))
- head_organ.b_headacc = hex2num(copytext(new_head_accessory_colour, 6, 8))
-
- //Body markings.
- if(M.species.bodyflags & HAS_MARKINGS)
- var/list/valid_markings = M.generate_valid_markings()
- var/new_marking = input("Please select marking style", "Character Generation", M.m_style) as null|anything in valid_markings
- if(new_marking)
- M.m_style = new_marking
-
- var/new_marking_colour = input("Please select marking colour.", "Character Generation", rgb(M.r_markings, M.g_markings, M.b_markings)) as null|color
- if(new_marking_colour)
- M.r_markings = hex2num(copytext(new_marking_colour, 2, 4))
- M.g_markings = hex2num(copytext(new_marking_colour, 4, 6))
- M.b_markings = hex2num(copytext(new_marking_colour, 6, 8))
+ M.change_head_accessory_color(color2R(new_head_accessory_colour), color2G(new_head_accessory_colour), color2B(new_head_accessory_colour))
//Body accessory.
if(M.species.tail && M.species.bodyflags & HAS_TAIL)
@@ -118,18 +115,51 @@
if(valid_body_accessories.len > 1) //By default valid_body_accessories will always have at the very least a 'none' entry populating the list, even if the user's species is not present in any of the list items.
var/new_body_accessory = input("Please select body accessory style", "Character Generation", M.body_accessory) as null|anything in valid_body_accessories
if(new_body_accessory)
- M.body_accessory = body_accessory_by_name[new_body_accessory]
+ M.change_body_accessory(new_body_accessory)
+
+ //Head markings.
+ if(M.species.bodyflags & HAS_HEAD_MARKINGS)
+ var/list/valid_head_markings = M.generate_valid_markings("head")
+ var/new_marking = input("Please select head marking style", "Character Generation", M.m_styles["head"]) as null|anything in valid_head_markings
+ if(new_marking)
+ M.change_markings(new_marking, "head")
+
+ var/new_marking_colour = input("Please select head marking colour.", "Character Generation", M.m_colours["head"]) as null|color
+ if(new_marking_colour)
+ M.change_marking_color(new_marking_colour, "head")
+ //Body markings.
+ if(M.species.bodyflags & HAS_BODY_MARKINGS)
+ var/list/valid_body_markings = M.generate_valid_markings("body")
+ var/new_marking = input("Please select body marking style", "Character Generation", M.m_styles["body"]) as null|anything in valid_body_markings
+ if(new_marking)
+ M.change_markings(new_marking, "body")
+
+ var/new_marking_colour = input("Please select body marking colour.", "Character Generation", M.m_colours["body"]) as null|color
+ if(new_marking_colour)
+ M.change_marking_color(new_marking_colour, "body")
+ //Tail markings.
+ if(M.species.bodyflags & HAS_TAIL_MARKINGS)
+ var/list/valid_tail_markings = M.generate_valid_markings("tail")
+ var/new_marking = input("Please select tail marking style", "Character Generation", M.m_styles["tail"]) as null|anything in valid_tail_markings
+ if(new_marking)
+ M.change_markings(new_marking, "tail")
+
+ var/new_marking_colour = input("Please select tail marking colour.", "Character Generation", M.m_colours["tail"]) as null|color
+ if(new_marking_colour)
+ M.change_marking_color(new_marking_colour, "tail")
//Skin tone.
if(M.species.bodyflags & HAS_SKIN_TONE)
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", M.s_tone) as null|text
if(!new_tone)
new_tone = 35
- M.s_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
+ else
+ new_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
+ M.change_skin_tone(new_tone)
if(M.species.bodyflags & HAS_ICON_SKIN_TONE)
var/prompt = "Please select skin tone: 1-[M.species.icon_skin_tones.len] ("
- for(var/i = 1; i <= M.species.icon_skin_tones.len; i++)
+ for(var/i = 1 to M.species.icon_skin_tones.len)
prompt += "[i] = [M.species.icon_skin_tones[i]]"
if(i != M.species.icon_skin_tones.len)
prompt += ", "
@@ -138,18 +168,16 @@
var/new_tone = input(prompt, "Character Generation", M.s_tone) as null|text
if(!new_tone)
new_tone = 0
- M.s_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1)
+ else
+ new_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1)
+ M.change_skin_tone(new_tone)
//Skin colour.
if(M.species.bodyflags & HAS_SKIN_COLOR)
var/new_body_colour = input("Please select body colour.", "Character Generation", rgb(M.r_skin, M.g_skin, M.b_skin)) as null|color
if(new_body_colour)
- M.r_skin = hex2num(copytext(new_body_colour, 2, 4))
- M.g_skin = hex2num(copytext(new_body_colour, 4, 6))
- M.b_skin = hex2num(copytext(new_body_colour, 6, 8))
+ M.change_skin_color(color2R(new_body_colour), color2G(new_body_colour), color2B(new_body_colour))
- M.force_update_limbs()
- M.regenerate_icons()
M.update_dna()
M.visible_message("[src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index e0fc32f1eda..25ad0d234da 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -160,16 +160,13 @@ proc/issyndicate(mob/living/M as mob)
if(prob(5))
facial_hair_style = pick(facial_hair_styles_list)
- head_organ.r_facial = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_facial = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_facial = hex2num(copytext(hair_c, 6, 8))
- head_organ.r_hair = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_hair = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_hair = hex2num(copytext(hair_c, 6, 8))
- var/eyes_red = hex2num(copytext(eye_c, 2, 4))
- var/eyes_green = hex2num(copytext(eye_c, 4, 6))
- var/eyes_blue = hex2num(copytext(eye_c, 6, 8))
- M.change_eye_color(eyes_red, eyes_green, eyes_blue)
+ head_organ.r_facial = color2R(hair_c)
+ head_organ.g_facial = color2G(hair_c)
+ head_organ.b_facial = color2B(hair_c)
+ head_organ.r_hair = color2R(hair_c)
+ head_organ.g_hair = color2G(hair_c)
+ head_organ.b_hair = color2B(hair_c)
+ M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
M.s_tone = skin_tone
head_organ.h_style = hair_style
head_organ.f_style = facial_hair_style
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 8c139dabdbd..58d041b9442 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -129,7 +129,6 @@ var/const/access_trade_sol = 160
return 0
-
/obj/item/proc/GetAccess()
return list()
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 7c77ca6099f..01608efedcb 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -1,9 +1,12 @@
-
#define COMM_SCREEN_MAIN 1
#define COMM_SCREEN_STAT 2
#define COMM_SCREEN_MESSAGES 3
#define COMM_SCREEN_SECLEVEL 4
+#define COMM_AUTHENTICATION_NONE 0
+#define COMM_AUTHENTICATION_MIN 1
+#define COMM_AUTHENTICATION_MAX 2
+
// The communications computer
/obj/machinery/computer/communications
name = "communications console"
@@ -13,7 +16,7 @@
req_access = list(access_heads)
circuit = /obj/item/weapon/circuitboard/communications
var/prints_intercept = 1
- var/authenticated = 0
+ var/authenticated = COMM_AUTHENTICATION_NONE
var/list/messagetitle = list()
var/list/messagetext = list()
var/currmsg = 0
@@ -39,16 +42,16 @@
crew_announcement.newscast = 1
/obj/machinery/computer/communications/proc/is_authenticated(var/mob/user, var/message = 1)
- if(authenticated == 2)
- return 2
+ if(authenticated == COMM_AUTHENTICATION_MAX)
+ return COMM_AUTHENTICATION_MAX
else if(user.can_admin_interact())
- return 2
+ return COMM_AUTHENTICATION_MAX
else if(authenticated)
- return 1
+ return COMM_AUTHENTICATION_MIN
else
if(message)
to_chat(user, "Access denied.")
- return 0
+ return COMM_AUTHENTICATION_NONE
/obj/machinery/computer/communications/Topic(href, href_list)
if(..(href, href_list))
@@ -62,23 +65,23 @@
if(!ishuman(usr))
to_chat(usr, "Access denied.")
return
- var/mob/living/carbon/human/M = usr
- var/obj/item/card = M.get_active_hand()
- var/obj/item/weapon/card/id/I = (card && card.GetID())||M.wear_id||M.wear_pda
- if(istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if(I && istype(I))
- if(src.check_access(I))
- authenticated = 1
- if(access_captain in I.access)
- authenticated = 2
- crew_announcement.announcer = GetNameAndAssignmentFromId(I)
+
+ var/list/access = usr.get_access()
+ if(allowed(usr))
+ authenticated = COMM_AUTHENTICATION_MIN
+
+ if(access_captain in access)
+ authenticated = COMM_AUTHENTICATION_MAX
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/weapon/card/id = H.get_idcard(TRUE)
+ if(istype(id))
+ crew_announcement.announcer = GetNameAndAssignmentFromId(id)
+
nanomanager.update_uis(src)
return
if(href_list["logout"])
- authenticated = 0
+ authenticated = COMM_AUTHENTICATION_NONE
crew_announcement.announcer = ""
setMenuState(usr,COMM_SCREEN_MAIN)
nanomanager.update_uis(src)
@@ -131,13 +134,13 @@
to_chat(usr, "You need to swipe your ID.")
if("announce")
- if(is_authenticated(usr) == 2)
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
if(message_cooldown)
to_chat(usr, "Please allow at least one minute to pass between announcements.")
nanomanager.update_uis(src)
return
var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement")
- if(!input || message_cooldown || ..() || !(is_authenticated(usr) == 2))
+ if(!input || message_cooldown || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
crew_announcement.Announce(input)
@@ -213,13 +216,13 @@
setMenuState(usr,COMM_SCREEN_STAT)
if("nukerequest")
- if(is_authenticated(usr) == 2)
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
if(centcomm_message_cooldown)
to_chat(usr, "Arrays recycling. Please stand by.")
nanomanager.update_uis(src)
return
var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") as text|null
- if(!input || ..() || !(is_authenticated(usr) == 2))
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
Nuke_request(input, usr)
@@ -232,13 +235,13 @@
setMenuState(usr,COMM_SCREEN_MAIN)
if("MessageCentcomm")
- if(is_authenticated(usr) == 2)
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
if(centcomm_message_cooldown)
to_chat(usr, "Arrays recycling. Please stand by.")
nanomanager.update_uis(src)
return
var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null
- if(!input || ..() || !(is_authenticated(usr) == 2))
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
Centcomm_announce(input, usr)
@@ -251,13 +254,13 @@
// OMG SYNDICATE ...LETTERHEAD
if("MessageSyndicate")
- if((is_authenticated(usr) == 2) && (src.emagged))
+ if((is_authenticated(usr) == COMM_AUTHENTICATION_MAX) && (src.emagged))
if(centcomm_message_cooldown)
to_chat(usr, "Arrays recycling. Please stand by.")
nanomanager.update_uis(src)
return
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null
- if(!input || ..() || !(is_authenticated(usr) == 2))
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
Syndicate_announce(input, usr)
@@ -518,7 +521,7 @@
return ..()
shuttle_master.emergency.request(null, 0.3, null, "All communication consoles, boards, and AI's have been destroyed.")
- log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
- message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
+ log_game("All the AI's, communication consoles and boards are destroyed. Shuttle called.")
+ message_admins("All the AI's, communication consoles and boards are destroyed. Shuttle called.", 1)
return ..()
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 58ae88dba27..160fbeb9827 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -27,7 +27,6 @@
if(mode.kickoff)
to_chat(user, "You have been locked out from this console!")
-
/obj/machinery/computer/robotics/proc/is_authenticated(var/mob/user as mob)
if(isobserver(user) && check_rights(R_ADMIN, 0, user))
return 1
@@ -116,8 +115,7 @@
message_admins("[key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [key_name_admin(target)]!")
log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [key_name(target)]!")
- target.canmove = !target.canmove
- target.lockcharge = !target.lockcharge
+ target.SetLockdown(!target.lockcharge)
to_chat(target, "[!target.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]")
if(target.connected_ai)
to_chat(target.connected_ai, "[!target.lockcharge ? "NOTICE - Cyborg lockdown lifted" : "ALERT - Cyborg lockdown detected"]: [target.name]
")
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 94bc3f5b90b..6dd6182c930 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -134,7 +134,6 @@
if(air_contents)
temperature_archived = air_contents.temperature
heat_gas_contents()
- expel_gas()
if(occupant)
process_occupant()
@@ -401,16 +400,6 @@
var/combined_energy = T20C*current_heat_capacity + air_heat_capacity*air_contents.temperature
air_contents.temperature = combined_energy/combined_heat_capacity
-/obj/machinery/atmospherics/unary/cryo_cell/proc/expel_gas()
- if(air_contents.total_moles() < 1)
- return
- var/datum/gas_mixture/expel_gas = new
- var/remove_amount = air_contents.total_moles()/100
- expel_gas = air_contents.remove(remove_amount)
- expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed
- loc.assume_air(expel_gas)
- air_update_turf()
-
/obj/machinery/atmospherics/unary/cryo_cell/proc/go_out()
if(!occupant)
return
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 30e5cac609f..acad5a5a563 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -4,7 +4,7 @@
name = "airlock electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
- w_class = 2 //It should be tiny! -Agouri
+ w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
req_access = list(access_engine)
@@ -12,101 +12,96 @@
var/list/conf_access = null
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
var/last_configurator = null
- var/locked = 1
+ var/locked = TRUE
+ var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics
- attack_self(mob/user as mob)
- if(!ishuman(user) && !istype(user,/mob/living/silicon/robot))
- return ..(user)
+/obj/item/weapon/airlock_electronics/attack_self(mob/user)
+ if(!ishuman(user) && !isrobot(user))
+ return ..()
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.getBrainLoss() >= 60)
+ if(H.getBrainLoss() >= max_brain_damage)
+ to_chat(user, "You forget how to use \the [src].")
return
- var/t1 = text("Access control
\n")
+ var/t1 = text("Access control
\n")
+ if(last_configurator)
+ t1 += "Operator: [last_configurator]
"
- if(last_configurator)
- t1 += "Operator: [last_configurator]
"
+ if(locked)
+ t1 += "Swipe ID
"
+ else
+ t1 += "Block
"
- if(locked)
- t1 += "Swipe ID
"
+ t1 += "Access requirement is set to "
+ t1 += one_access ? "ONE
" : "ALL
"
+
+ t1 += conf_access == null ? "All
" : "All
"
+
+ t1 += "
"
+
+ var/list/accesses = get_all_accesses()
+ for(var/acc in accesses)
+ var/aname = get_access_desc(acc)
+
+ if(!conf_access || !conf_access.len || !(acc in conf_access))
+ t1 += "[aname]
"
+ else if(one_access)
+ t1 += "[aname]
"
+ else
+ t1 += "[aname]
"
+
+ t1 += "Close
\n"
+
+ var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400)
+ popup.set_content(t1)
+ popup.open(0)
+ onclose(user, "airlock")
+
+/obj/item/weapon/airlock_electronics/Topic(href, href_list)
+ ..()
+
+ if(usr.incapacitated() || (!ishuman(usr) && !isrobot(usr)))
+ return 1
+
+ if(href_list["close"])
+ usr << browse(null, "window=airlock")
+ return
+
+ if(href_list["login"])
+ if(allowed(usr))
+ locked = FALSE
+ last_configurator = usr.name
+
+ if(locked)
+ return
+
+ if(href_list["logout"])
+ locked = TRUE
+
+ if(href_list["one_access"])
+ one_access = !one_access
+
+ if(href_list["access"])
+ toggle_access(href_list["access"])
+
+ attack_self(usr)
+
+/obj/item/weapon/airlock_electronics/proc/toggle_access(var/access)
+ if(access == "all")
+ conf_access = null
+ else
+ var/req = text2num(access)
+
+ if(conf_access == null)
+ conf_access = list()
+
+ if(!(req in conf_access))
+ conf_access += req
else
- t1 += "Block
"
-
- t1 += "Access requirement is set to "
- t1 += one_access ? "ONE
" : "ALL
"
-
- t1 += conf_access == null ? "All
" : "All
"
-
- t1 += "
"
-
- var/list/accesses = get_all_accesses()
- for(var/acc in accesses)
- var/aname = get_access_desc(acc)
-
- if(!conf_access || !conf_access.len || !(acc in conf_access))
- t1 += "[aname]
"
- else if(one_access)
- t1 += "[aname]
"
- else
- t1 += "[aname]
"
-
- t1 += "Close
\n"
-
- var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400)
- popup.set_content(t1)
- popup.open(0)
- onclose(user, "airlock")
-
- Topic(href, href_list)
- ..()
- if(usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
- return
- if(href_list["close"])
- usr << browse(null, "window=airlock")
- return
-
- if(href_list["login"])
- if(istype(usr,/mob/living/silicon))
- src.locked = 0
- src.last_configurator = usr.name
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if(I && src.check_access(I))
- src.locked = 0
- src.last_configurator = I:registered_name
-
- if(locked)
- return
-
- if(href_list["logout"])
- locked = 1
-
- if(href_list["one_access"])
- one_access = !one_access
-
- if(href_list["access"])
- toggle_access(href_list["access"])
-
- attack_self(usr)
-
- proc
- toggle_access(var/acc)
- if(acc == "all")
+ conf_access -= req
+ if(!conf_access.len)
conf_access = null
- else
- var/req = text2num(acc)
-
- if(conf_access == null)
- conf_access = list()
-
- if(!(req in conf_access))
- conf_access += req
- else
- conf_access -= req
- if(!conf_access.len)
- conf_access = null
diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm
index 151478ddee6..73e590361a7 100644
--- a/code/game/machinery/dye_generator.dm
+++ b/code/game/machinery/dye_generator.dm
@@ -111,21 +111,21 @@
if(do_after(user, 50, target = H))
switch(what_to_dye)
if("hair")
- var/r_hair = hex2num(copytext(dye_color, 2, 4))
- var/g_hair = hex2num(copytext(dye_color, 4, 6))
- var/b_hair = hex2num(copytext(dye_color, 6, 8))
+ var/r_hair = color2R(dye_color)
+ var/g_hair = color2G(dye_color)
+ var/b_hair = color2B(dye_color)
if(H.change_hair_color(r_hair, g_hair, b_hair))
H.update_dna()
if("facial hair")
- var/r_facial = hex2num(copytext(dye_color, 2, 4))
- var/g_facial = hex2num(copytext(dye_color, 4, 6))
- var/b_facial = hex2num(copytext(dye_color, 6, 8))
+ var/r_facial = color2R(dye_color)
+ var/g_facial = color2G(dye_color)
+ var/b_facial = color2B(dye_color)
if(H.change_facial_hair_color(r_facial, g_facial, b_facial))
H.update_dna()
if("body")
- var/r_skin = hex2num(copytext(dye_color, 2, 4))
- var/g_skin = hex2num(copytext(dye_color, 4, 6))
- var/b_skin = hex2num(copytext(dye_color, 6, 8))
+ var/r_skin = color2R(dye_color)
+ var/g_skin = color2G(dye_color)
+ var/b_skin = color2B(dye_color)
if(H.change_skin_color(r_skin, g_skin, b_skin))
H.update_dna()
user.visible_message("[user] finishes dying [M]'s [what_to_dye]!", "You finish dying [M]'s [what_to_dye]!")
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 7ebf1e233c3..c8f93bc74ce 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -563,7 +563,9 @@
dam_coeff = B.damage_coeff
break
- if(prob(deflect_chance & deflection) && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ if(prob(deflect_chance * deflection) && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ visible_message("[src]'s armour deflects [Proj]!")
+ else
visible_message("[src] is hit by [Proj].")
take_damage(Proj.damage * dam_coeff, Proj.flag)
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT))
diff --git a/code/game/objects/items/mountable_frames/lights.dm b/code/game/objects/items/mountable_frames/lights.dm
index 3655070ce2f..b108240b332 100644
--- a/code/game/objects/items/mountable_frames/lights.dm
+++ b/code/game/objects/items/mountable_frames/lights.dm
@@ -11,7 +11,7 @@
playsound(get_turf(src), 'sound/machines/click.ogg', 75, 1)
var/constrdir = user.dir
var/constrloc = get_turf(user)
- if(!do_after(user, 30, target = src))
+ if(!do_after(user, 30, target = on_wall))
return
var/obj/machinery/light_construct/newlight
switch(fixture_type)
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 448054deb1a..a4420872e5e 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -292,7 +292,8 @@
defib.on = 0
loc = defib
defib.update_icon()
- return unwield()
+ update_icon()
+ return unwield(user)
/obj/item/weapon/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O)
if(!mainunit || !istype(mainunit, /obj/item/weapon/defibrillator)) //To avoid weird issues from admin spawns
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 600ff934a8f..be74349f8ca 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -285,7 +285,7 @@
/obj/item/weapon/nullrod/whip/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity)
return
- if(istype(AM, /mob/living/carbon/human))
+ if(ishuman(AM))
var/mob/living/carbon/human/H = AM
if(is_shadow(H))
var/phrase = pick("Die monster! You don't belong in this world!!!", "You steal men's souls and make them your slaves!!!", "Your words are as empty as your soul!!!", "Mankind ill needs a savior such as you!!!")
@@ -399,7 +399,7 @@
/obj/item/weapon/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
+ if(!iscarbon(M))
return ..()
if(!user.mind || user.mind.assigned_role != "Chaplain")
@@ -414,7 +414,7 @@
praying = 1
if(do_after(user, 150, target = M))
- if(istype(M, /mob/living/carbon/human)) // This probably should not work on vulps. They're unholy abominations.
+ if(ishuman(M)) // This probably should not work on vulps. They're unholy abominations.
var/mob/living/carbon/human/target = M
if(target.mind)
@@ -443,15 +443,15 @@
praying = 0
/obj/item/weapon/nullrod/rosary/process()
- if(istype(loc, /mob/living/carbon/human))
+ if(ishuman(loc))
var/mob/living/carbon/human/holder = loc
if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will
- for(var/mob/living/carbon/human/M in range(5))
- if(M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full))
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ for(var/mob/living/carbon/human/H in range(5))
+ if(H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
+ H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2)
if(prob(10))
- to_chat(M, "Being in the presence of [holder]'s [src] is interfering with your powers!")
+ to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!")
/obj/item/weapon/nullrod/missionary_staff
name = "holy staff"
@@ -503,7 +503,7 @@
return 0
/obj/item/weapon/nullrod/missionary_staff/afterattack(mob/living/carbon/human/target, mob/living/carbon/human/missionary, flag, params)
- if(!istype(target) || !istype(missionary)) //ishuman checks effectively
+ if(!ishuman(target) || !ishuman(missionary)) //ishuman checks
return
if(target == missionary) //you can't convert yourself, that would raise too many questions about your own dedication to the cause
return
@@ -533,7 +533,7 @@
/obj/item/weapon/nullrod/missionary_staff/proc/do_convert(mob/living/carbon/human/target, mob/living/carbon/human/missionary)
var/convert_duration = 6000 //10 min
- if(!target || !istype(target) || !missionary || !istype(missionary))
+ if(!target || !ishuman(target) || !missionary || !ishuman(missionary))
return
if(ismindslave(target) || target.mind.zealot_master) //mindslaves and zealots override the staff because the staff is just a temporary mindslave
to_chat(missionary, "Your faith is strong, but their mind is already slaved to someone else's ideals. Perhaps an inquisition would reveal more...")
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 7cc71918905..448395df3e4 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -16,41 +16,41 @@
var/icon_closed = "lockbox"
var/icon_broken = "lockbox+b"
-
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/card/id))
- if(src.broken)
- to_chat(user, "It appears to be broken.")
- return
- if(src.allowed(user))
- src.locked = !( src.locked )
- if(src.locked)
- src.icon_state = src.icon_locked
- to_chat(user, "You lock the [src.name]!")
- return
- else
- src.icon_state = src.icon_closed
- to_chat(user, "You unlock the [src.name]!")
- origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
- return
- else
- to_chat(user, "Access Denied")
- else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)
- emag_act(user)
+/obj/item/weapon/storage/lockbox/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(broken)
+ to_chat(user, "It appears to be broken.")
return
- if(!locked)
- ..()
+ if(check_access(W))
+ locked = !locked
+ if(locked)
+ icon_state = icon_locked
+ to_chat(user, "You lock \the [src]!")
+ return
+ else
+ icon_state = icon_closed
+ to_chat(user, "You unlock \the [src]!")
+ origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
+ return
else
- to_chat(user, "It's locked!")
+ to_chat(user, "Access denied.")
+ return
+ else if((istype(W, /obj/item/weapon/card/emag) || (istype(W, /obj/item/weapon/melee/energy/blade)) && !broken))
+ emag_act(user)
return
+ if(!locked)
+ ..()
+ else
+ to_chat(user, "It's locked!")
+ return
- show_to(mob/user as mob)
- if(locked)
- to_chat(user, "It's locked!")
- else
- ..()
- return
+/obj/item/weapon/storage/lockbox/show_to(mob/user as mob)
+ if(locked)
+ to_chat(user, "It's locked!")
+ else
+ ..()
+ return
/obj/item/weapon/storage/lockbox/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!locked)
@@ -64,7 +64,7 @@
broken = 1
locked = 0
desc = "It appears to be broken."
- icon_state = src.icon_broken
+ icon_state = icon_broken
to_chat(user, "You unlock \the [src].")
origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
return
@@ -84,23 +84,21 @@
name = "Lockbox (Mindshield Implants)"
req_access = list(access_security)
- New()
- ..()
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implanter/loyalty(src)
-
+/obj/item/weapon/storage/lockbox/loyalty/New()
+ ..()
+ new /obj/item/weapon/implantcase/loyalty(src)
+ new /obj/item/weapon/implantcase/loyalty(src)
+ new /obj/item/weapon/implantcase/loyalty(src)
+ new /obj/item/weapon/implanter/loyalty(src)
/obj/item/weapon/storage/lockbox/clusterbang
name = "lockbox (clusterbang)"
desc = "You have a bad feeling about opening this."
req_access = list(access_security)
- New()
- ..()
- new /obj/item/weapon/grenade/clusterbuster(src)
-
+/obj/item/weapon/storage/lockbox/clusterbang/New()
+ ..()
+ new /obj/item/weapon/grenade/clusterbuster(src)
/obj/item/weapon/storage/lockbox/medal
name = "medal box"
@@ -116,14 +114,14 @@
icon_closed = "medalbox"
icon_broken = "medalbox+b"
- New()
- ..()
- new /obj/item/clothing/accessory/medal/gold/heroism(src)
- new /obj/item/clothing/accessory/medal/silver/security(src)
- new /obj/item/clothing/accessory/medal/silver/valor(src)
- new /obj/item/clothing/accessory/medal/nobel_science(src)
- new /obj/item/clothing/accessory/medal/bronze_heart(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/gold/captain(src)
+/obj/item/weapon/storage/lockbox/medal/New()
+ ..()
+ new /obj/item/clothing/accessory/medal/gold/heroism(src)
+ new /obj/item/clothing/accessory/medal/silver/security(src)
+ new /obj/item/clothing/accessory/medal/silver/valor(src)
+ new /obj/item/clothing/accessory/medal/nobel_science(src)
+ new /obj/item/clothing/accessory/medal/bronze_heart(src)
+ new /obj/item/clothing/accessory/medal/conduct(src)
+ new /obj/item/clothing/accessory/medal/conduct(src)
+ new /obj/item/clothing/accessory/medal/conduct(src)
+ new /obj/item/clothing/accessory/medal/gold/captain(src)
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index af2c59c4759..c9c9497cb71 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -143,7 +143,7 @@
air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/weapon/tank/jetpack/carbondioxide/examine(mob/user)
- if(!..(0))
+ if(!..(user, 0))
return
if(air_contents.carbon_dioxide < 10)
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index d498109b2dd..ae28bd61d17 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -78,9 +78,13 @@
/obj/item/weapon/tank/examine(mob/user)
+ if(!..(user, 0))
+ return
+
var/obj/icon = src
if(istype(loc, /obj/item/assembly))
icon = loc
+
if(!in_range(src, user))
if(icon == src)
to_chat(user, "It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.")
@@ -102,7 +106,7 @@
else
descriptive = "furiously hot"
- to_chat(user, "\blue \The [bicon(icon)][src] feels [descriptive]")
+ to_chat(user, "\The [bicon(icon)][src] feels [descriptive]")
return
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index f1eca747755..cc09bfb1f8a 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -18,20 +18,37 @@
return
switch(choice)
if("Underwear")
- var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_list
- if(new_undies)
- H.underwear = new_undies
+ var/list/valid_underwear = list()
+ for(var/underwear in underwear_list)
+ var/datum/sprite_accessory/S = underwear_list[underwear]
+ if(!(H.species.name in S.species_allowed))
+ continue
+ valid_underwear[underwear] = underwear_list[underwear]
+ var/new_underwear = input(user, "Choose your underwear:", "Changing") as null|anything in valid_underwear
+ if(new_underwear)
+ H.underwear = new_underwear
if("Undershirt")
- var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in undershirt_list
+ var/list/valid_undershirts = list()
+ for(var/undershirt in undershirt_list)
+ var/datum/sprite_accessory/S = undershirt_list[undershirt]
+ if(!(H.species.name in S.species_allowed))
+ continue
+ valid_undershirts[undershirt] = undershirt_list[undershirt]
+ var/new_undershirt = input(user, "Choose your undershirt:", "Changing") as null|anything in valid_undershirts
if(new_undershirt)
H.undershirt = new_undershirt
if("Socks")
- var/new_socks = input(user, "Select your socks", "Changing") as null|anything in socks_list
+ var/list/valid_sockstyles = list()
+ for(var/sockstyle in socks_list)
+ var/datum/sprite_accessory/S = socks_list[sockstyle]
+ if(!(H.species.name in S.species_allowed))
+ continue
+ valid_sockstyles[sockstyle] = socks_list[sockstyle]
+ var/new_socks = input(user, "Choose your socks:", "Changing") as null|anything in valid_sockstyles
if(new_socks)
- H.socks= new_socks
-
+ H.socks = new_socks
add_fingerprint(H)
H.update_body()
\ No newline at end of file
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 7bfb152240d..6051bbebef6 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -236,7 +236,6 @@
icon_state= "cultgirder"
anchored = 1
density = 1
- layer = 2
var/health = 250
/obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob, params)
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 81e800a2b00..121228b4d3f 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -167,16 +167,13 @@ var/ert_request_answered = 0
if(prob(5))
facial_hair_style = pick(facial_hair_styles_list)
- head_organ.r_facial = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_facial = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_facial = hex2num(copytext(hair_c, 6, 8))
- head_organ.r_hair = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_hair = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_hair = hex2num(copytext(hair_c, 6, 8))
- var/eyes_red = hex2num(copytext(eye_c, 2, 4))
- var/eyes_green = hex2num(copytext(eye_c, 4, 6))
- var/eyes_blue = hex2num(copytext(eye_c, 6, 8))
- M.change_eye_color(eyes_red, eyes_green, eyes_blue)
+ head_organ.r_facial = color2R(hair_c)
+ head_organ.g_facial = color2G(hair_c)
+ head_organ.b_facial = color2B(hair_c)
+ head_organ.r_hair = color2R(hair_c)
+ head_organ.g_hair = color2G(hair_c)
+ head_organ.b_hair = color2B(hair_c)
+ M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
M.s_tone = skin_tone
head_organ.h_style = hair_style
head_organ.f_style = facial_hair_style
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 45f0e42a2aa..d1fb0326466 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -3,7 +3,6 @@
desc = "A huge chunk of metal used to seperate rooms."
icon = 'icons/turf/walls/wall.dmi'
icon_state = "wall"
- var/mineral = "metal"
var/rotting = 0
var/damage = 0
@@ -22,9 +21,11 @@
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
- var/walltype = "metal"
var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through.
var/engraving, engraving_quality //engraving on the wall
+
+ var/sheet_type = /obj/item/stack/sheet/metal
+ var/obj/item/stack/sheet/builtin_sheet = null
canSmoothWith = list(
/turf/simulated/wall,
@@ -36,6 +37,10 @@
/turf/simulated/wall/r_wall/coated)
smooth = SMOOTH_TRUE
+/turf/simulated/wall/New()
+ ..()
+ builtin_sheet = new sheet_type
+
/turf/simulated/wall/BeforeChange()
for(var/obj/effect/E in src)
// such quality code
@@ -43,8 +48,8 @@
qdel(E)
. = ..()
+
//Appearance
-
/turf/simulated/wall/examine(mob/user)
. = ..(user)
@@ -117,46 +122,14 @@
if(radiated_temperature > max_temperature)
take_damage(rand(10, 20) * (radiated_temperature / max_temperature))
-/turf/simulated/wall/proc/dismantle_wall(devastated=0, explode=0)
- if(istype(src,/turf/simulated/wall/r_wall))
- if(!devastated)
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- new /obj/structure/girder/reinforced(src)
- new /obj/item/stack/sheet/plasteel( src )
- else
- new /obj/item/stack/sheet/metal( src )
- new /obj/item/stack/sheet/metal( src )
- new /obj/item/stack/sheet/plasteel( src )
- else if(istype(src,/turf/simulated/wall/cult))
- if(!devastated)
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- new /obj/effect/decal/cleanable/blood(src)
- new /obj/structure/cultgirder(src)
- else
- new /obj/effect/decal/cleanable/blood(src)
- new /obj/effect/decal/remains/human(src)
-
+/turf/simulated/wall/proc/dismantle_wall(devastated = 0, explode = 0)
+ if(devastated)
+ devastate_wall()
else
- if(!devastated)
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- new /obj/structure/girder(src)
- if(mineral == "metal")
- new /obj/item/stack/sheet/metal( src )
- new /obj/item/stack/sheet/metal( src )
- else
- var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]")
- new M( src )
- new M( src )
- else
- if(mineral == "metal")
- new /obj/item/stack/sheet/metal( src )
- new /obj/item/stack/sheet/metal( src )
- new /obj/item/stack/sheet/metal( src )
- else
- var/M = text2path("/obj/item/stack/sheet/mineral/[mineral]")
- new M( src )
- new M( src )
- new /obj/item/stack/sheet/metal( src )
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ var/newgirder = break_wall()
+ if(newgirder) //maybe we don't /want/ a girder!
+ transfer_fingerprints_to(newgirder)
for(var/obj/O in src.contents) //Eject contents!
if(istype(O,/obj/structure/sign/poster))
@@ -166,6 +139,16 @@
O.loc = src
ChangeTurf(/turf/simulated/floor/plating)
+
+/turf/simulated/wall/proc/break_wall()
+ builtin_sheet.amount = 2
+ builtin_sheet.loc = src
+ return (new /obj/structure/girder(src))
+
+/turf/simulated/wall/proc/devastate_wall()
+ builtin_sheet.amount = 2
+ builtin_sheet.loc = src
+ new /obj/item/stack/sheet/metal(src)
/turf/simulated/wall/ex_act(severity)
switch(severity)
@@ -176,7 +159,7 @@
if(prob(50))
take_damage(rand(150, 250))
else
- dismantle_wall(1,1)
+ dismantle_wall(1, 1)
if(3.0)
take_damage(rand(0, 250))
else
@@ -216,8 +199,9 @@
O.mouse_opacity = 0
/turf/simulated/wall/proc/thermitemelt(mob/user as mob)
- if(mineral == "diamond")
+ if(istype(sheet_type, /obj/item/stack/sheet/mineral/diamond))
return
+
var/obj/effect/overlay/O = new/obj/effect/overlay( src )
O.name = "Thermite"
O.desc = "Looks hot."
@@ -236,7 +220,6 @@
spawn(100)
if(O) qdel(O)
-// F.sd_LumReset() //TODO: ~Carn
return
//Interactions
@@ -292,7 +275,8 @@
return
//get the user's location
- if(!istype(user.loc, /turf)) return //can't do this stuff whilst inside objects and such
+ if(!istype(user.loc, /turf))
+ return //can't do this stuff whilst inside objects and such
if(rotting)
if(istype(W, /obj/item/weapon/weldingtool) )
@@ -370,7 +354,7 @@
to_chat(user, "You begin slicing through the outer plating.")
playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, mineral == "diamond" ? 120 : 60, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src))
to_chat(user, "You remove the outer plating.")
dismantle_wall()
visible_message("[user] slices apart \the [src]!","You hear metal being sliced apart.")
@@ -380,7 +364,7 @@
to_chat(user, "You begin to drill though the wall.")
- if(do_after(user, mineral == "diamond" ? 120 : 60, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src))
to_chat(user, "Your drill tears though the last of the reinforced plating.")
dismantle_wall()
visible_message("[user] drills through \the [src]!","You hear the grinding of metal.")
@@ -389,7 +373,7 @@
to_chat(user, "You begin to disintegrates the wall.")
- if(do_after(user, mineral == "diamond" ? 60 : 30, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 60 : 30, target = src))
to_chat(user, "Your jackhammer disintegrate the reinforced plating.")
dismantle_wall()
visible_message("[user] disintegrates \the [src]!","You hear the grinding of metal.")
@@ -401,7 +385,7 @@
to_chat(user, "You stab \the [EB] into the wall and begin to slice it apart.")
playsound(src, "sparks", 50, 1)
- if(do_after(user, mineral == "diamond" ? 140 : 70, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 140 : 70, target = src))
EB.spark_system.start()
playsound(src, "sparks", 50, 1)
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index f0d5b52843f..914cb8973c8 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -12,10 +12,7 @@
desc = "A wall with gold plating. Swag!"
icon = 'icons/turf/walls/gold_wall.dmi'
icon_state = "gold"
- walltype = "gold"
- mineral = "gold"
- //var/electro = 1
- //var/shocked = null
+ sheet_type = /obj/item/stack/sheet/mineral/gold
explosion_block = 0 //gold is a soft metal you dingus.
canSmoothWith = list(/turf/simulated/wall/mineral/gold, /obj/structure/falsewall/gold)
@@ -24,10 +21,7 @@
desc = "A wall with silver plating. Shiny!"
icon = 'icons/turf/walls/silver_wall.dmi'
icon_state = "silver"
- walltype = "silver"
- mineral = "silver"
- //var/electro = 0.75
- //var/shocked = null
+ sheet_type = /obj/item/stack/sheet/mineral/silver
canSmoothWith = list(/turf/simulated/wall/mineral/silver, /obj/structure/falsewall/silver)
/turf/simulated/wall/mineral/diamond
@@ -35,8 +29,7 @@
desc = "A wall with diamond plating. You monster."
icon = 'icons/turf/walls/diamond_wall.dmi'
icon_state = "diamond"
- walltype = "diamond"
- mineral = "diamond"
+ sheet_type = /obj/item/stack/sheet/mineral/diamond
explosion_block = 3
canSmoothWith = list(/turf/simulated/wall/mineral/diamond, /obj/structure/falsewall/diamond)
@@ -45,8 +38,7 @@
desc = "A wall with bananium plating. Honk!"
icon = 'icons/turf/walls/bananium_wall.dmi'
icon_state = "bananium"
- walltype = "bananium"
- mineral = "bananium"
+ sheet_type = /obj/item/stack/sheet/mineral/bananium
canSmoothWith = list(/turf/simulated/wall/mineral/bananium, /obj/structure/falsewall/bananium)
/turf/simulated/wall/mineral/sandstone
@@ -54,8 +46,7 @@
desc = "A wall with sandstone plating."
icon = 'icons/turf/walls/sandstone_wall.dmi'
icon_state = "sandstone"
- walltype = "sandstone"
- mineral = "sandstone"
+ sheet_type = /obj/item/stack/sheet/mineral/sandstone
explosion_block = 0
canSmoothWith = list(/turf/simulated/wall/mineral/sandstone, /obj/structure/falsewall/sandstone)
@@ -64,8 +55,7 @@
desc = "A wall with uranium plating. This is probably a bad idea."
icon = 'icons/turf/walls/uranium_wall.dmi'
icon_state = "uranium"
- walltype = "uranium"
- mineral = "uranium"
+ sheet_type = /obj/item/stack/sheet/mineral/uranium
canSmoothWith = list(/turf/simulated/wall/mineral/uranium, /obj/structure/falsewall/uranium)
/turf/simulated/wall/mineral/uranium/proc/radiate()
@@ -98,15 +88,14 @@
desc = "A wall with plasma plating. This is definately a bad idea."
icon = 'icons/turf/walls/plasma_wall.dmi'
icon_state = "plasma"
- walltype = "plasma"
- mineral = "plasma"
+ sheet_type = /obj/item/stack/sheet/mineral/plasma
thermal_conductivity = 0.04
canSmoothWith = list(/turf/simulated/wall/mineral/plasma, /obj/structure/falsewall/plasma)
/turf/simulated/wall/mineral/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
- message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1)
+ log_game("Plasma wall ignited by [key_name(user)] in ([x], [y], [z])")
ignite(is_hot(W))
return
..()
@@ -132,29 +121,12 @@
PlasmaBurn(500)
..()
-/*
-/turf/simulated/wall/mineral/proc/shock()
- if(electrocute_mob(user, C, src))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- return 1
- else
- return 0
-
-/turf/simulated/wall/mineral/proc/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if((mineral == "gold") || (mineral == "silver"))
- if(shocked)
- shock()
-*/
-
/turf/simulated/wall/mineral/alien
name = "alien wall"
desc = "A strange-looking alien wall."
icon = 'icons/turf/walls/plasma_wall.dmi'
icon_state = "plasma"
- walltype = "alien"
- mineral = "alien"
+ sheet_type = null
canSmoothWith = list(/turf/simulated/wall/mineral/alien, /obj/structure/falsewall/alien)
/turf/simulated/wall/mineral/wood
@@ -162,8 +134,7 @@
desc = "A wall with wooden plating. Stiff."
icon = 'icons/turf/walls/wood_wall.dmi'
icon_state = "wood"
- walltype = "wood"
- mineral = "wood"
+ sheet_type = /obj/item/stack/sheet/wood
hardness = 70
explosion_block = 0
canSmoothWith = list(/turf/simulated/wall/mineral/wood, /obj/structure/falsewall/wood)
@@ -173,8 +144,7 @@
desc = "A wall with rough metal plating."
icon = 'icons/turf/walls/iron_wall.dmi'
icon_state = "iron"
- walltype = "iron"
- mineral = "rods"
+ sheet_type = /obj/item/stack/rods
canSmoothWith = list(/turf/simulated/wall/mineral/iron, /obj/structure/falsewall/iron)
/turf/simulated/wall/mineral/abductor
@@ -182,7 +152,6 @@
desc = "A wall with alien alloy plating."
icon = 'icons/turf/walls/abductor_wall.dmi'
icon_state = "abductor"
- walltype = "abductor"
- mineral = "abductor"
+ sheet_type = /obj/item/stack/sheet/mineral/abductor
explosion_block = 3
canSmoothWith = list(/turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor)
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 9aca6f4918e..a450572f145 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -3,7 +3,7 @@
desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick"
icon = 'icons/turf/walls/cult_wall.dmi'
icon_state = "cult"
- walltype = "cult"
+ builtin_sheet = null
canSmoothWith = null
smooth = SMOOTH_FALSE
@@ -21,20 +21,26 @@
/turf/simulated/wall/cult/narsie_act()
return
+
+/turf/simulated/wall/cult/break_wall()
+ new /obj/effect/decal/cleanable/blood(src)
+ return (new /obj/structure/cultgirder(src))
+
+/turf/simulated/wall/cult/devastate_wall()
+ new /obj/effect/decal/cleanable/blood(src)
+ new /obj/effect/decal/remains/human(src)
/turf/simulated/wall/rust
name = "rusted wall"
desc = "A rusted metal wall."
icon = 'icons/turf/walls/rusty_wall.dmi'
icon_state = "arust"
- walltype = "arust"
/turf/simulated/wall/r_wall/rust
name = "rusted reinforced wall"
desc = "A huge chunk of rusted reinforced metal."
icon = 'icons/turf/walls/rusty_reinforced_wall.dmi'
icon_state = "rrust"
- walltype = "rrust"
/turf/simulated/wall/r_wall/coated //Coated for heat resistance
name = "coated reinforced wall"
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 7c6c750c70e..1dbda894c52 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -9,7 +9,7 @@
damage_cap = 200
max_temperature = 6000
hardness = 10
- walltype = "rwall"
+ sheet_type = /obj/item/stack/sheet/plasteel
var/d_state = 0
var/can_be_reinforced = 1
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 227188b2209..37ff565f4a3 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -92,7 +92,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
- to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]")
+ to_chat(usr, "[procname] returned: [!isnull(returnval) ? returnval : "null"]")
feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/callproc_datum(var/A as null|area|mob|obj|turf)
@@ -122,7 +122,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
spawn()
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
- to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]")
+ to_chat(usr, "[procname] returned: [!isnull(returnval) ? returnval : "null"]")
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 82f76a04824..72ec8f101d2 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -108,18 +108,30 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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/list/m_styles = list(
+ "head" = "None",
+ "body" = "None",
+ "tail" = "None"
+ ) //Marking styles.
+ var/list/m_colours = list(
+ "head" = "#000000",
+ "body" = "#000000",
+ "tail" = "#000000"
+ ) //Marking colours.
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/r_hair_sec = 0 //Secondary hair color
+ var/g_hair_sec = 0 //Secondary hair color
+ var/b_hair_sec = 0 //Secondary hair color
+ var/f_style = "Shaved" //Facial hair type
+ var/r_facial = 0 //Facial hair color
+ var/g_facial = 0 //Facial hair color
+ var/b_facial = 0 //Facial hair color
+ var/r_facial_sec = 0 //Secondary facial hair color
+ var/g_facial_sec = 0 //Secondary facial hair color
+ var/b_facial_sec = 0 //Secondary facial hair color
var/s_tone = 0 //Skin tone
var/r_skin = 0 //Skin color
var/g_skin = 0 //Skin color
@@ -127,6 +139,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/r_eyes = 0 //Eye color
var/g_eyes = 0 //Eye color
var/b_eyes = 0 //Eye color
+ var/alt_head = "None" //Alt head style.
var/species = "Human"
var/language = "None" //Secondary language
@@ -284,18 +297,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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.
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ dat += "Head Markings: "
+ dat += "[m_styles["head"]]"
+ dat += "Color [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))]
"
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
dat += "Body Markings: "
- dat += "[m_style]"
- dat += "Color [color_square(r_markings, g_markings, b_markings)]
"
+ dat += "[m_styles["body"]]"
+ dat += "Color [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))]
"
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ dat += "Tail Markings: "
+ dat += "[m_styles["tail"]]"
+ dat += "Color [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))]
"
dat += "Hair: "
dat += "[h_style]"
- dat += "Color [color_square(r_hair, g_hair, b_hair)]
"
+ dat += "Color [color_square(r_hair, g_hair, b_hair)]"
+ var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style]
+ if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour)
+ dat += " Color #2 [color_square(r_hair_sec, g_hair_sec, b_hair_sec)]"
+ dat += "
"
dat += "Facial Hair: "
dat += "[f_style ? "[f_style]" : "Shaved"]"
- dat += "Color [color_square(r_facial, g_facial, b_facial)]
"
+ dat += "Color [color_square(r_facial, g_facial, b_facial)]"
+ var/datum/sprite_accessory/temp_facial_hair_style = facial_hair_styles_list[f_style]
+ if(temp_facial_hair_style && temp_facial_hair_style.secondary_theme && !temp_facial_hair_style.no_sec_colour)
+ dat += " Color #2 [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]"
+ dat += "
"
+
if(species != "Machine")
dat += "Eyes: "
@@ -318,6 +348,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "Character Records
"
dat += "Limbs
"
+ if(species in list("Unathi")) //Species with alt heads.
+ dat += "Alternate Head: "
+ dat += "[alt_head]
"
dat += "Limbs and Parts: Adjust
"
if(species != "Slime People" && species != "Machine")
dat += "Internal Organs: Adjust
"
@@ -1097,6 +1130,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(href_list["task"])
if("random")
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
switch(href_list["preference"])
if("name")
real_name = random_name(gender,species)
@@ -1107,23 +1144,59 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
r_hair = rand(0,255)
g_hair = rand(0,255)
b_hair = rand(0,255)
+ if("secondary_hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_hair_sec = rand(0,255)
+ g_hair_sec = rand(0,255)
+ b_hair_sec = rand(0,255)
if("h_style")
- h_style = random_hair_style(gender, species)
+ h_style = random_hair_style(gender, species, robohead)
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("secondary_facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_facial_sec = rand(0,255)
+ g_facial_sec = rand(0,255)
+ b_facial_sec = rand(0,255)
if("f_style")
- f_style = random_facial_hair_style(gender, species)
+ f_style = random_facial_hair_style(gender, species, robohead)
+ if("headaccessory")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ r_headacc = rand(0,255)
+ g_headacc = rand(0,255)
+ b_headacc = rand(0,255)
+ if("ha_style")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ ha_style = random_head_accessory(species)
+ if("m_style_head")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ if("m_head_colour")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255))
+ if("m_style_body")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ m_styles["body"] = random_marking_style("body", species)
+ if("m_body_colour")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255))
+ if("m_style_tail")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ if("m_tail_colour")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255))
if("underwear")
- underwear = random_underwear(gender)
+ underwear = random_underwear(gender, species)
ShowChoices(user)
if("undershirt")
- undershirt = random_undershirt(gender)
+ undershirt = random_undershirt(gender, species)
ShowChoices(user)
if("socks")
- socks = random_socks(gender)
+ socks = random_socks(gender, species)
ShowChoices(user)
if("eyes")
r_eyes = rand(0,255)
@@ -1159,7 +1232,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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
@@ -1177,43 +1249,41 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
species = input("Please select a species", "Character Generation", null) in new_species
if(prev_species != species)
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
//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"]
+ h_style = random_hair_style(gender, species, robohead)
//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
+ f_style = random_facial_hair_style(gender, species, robohead)
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ ha_style = random_head_accessory(species)
else
- //this shouldn't happen
- f_style = facial_hair_styles_list["Shaved"]
+ ha_style = "None" // No Vulp ears on Unathi
+ r_headacc = 0
+ g_headacc = 0
+ b_headacc = 0
+
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ else
+ m_styles["head"] = "None"
+ m_colours["head"] = "#000000"
+
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ m_styles["body"] = random_marking_style("body", species)
+ else
+ m_styles["body"] = "None"
+ m_colours["body"] = "#000000"
+
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ else
+ m_styles["tail"] = "None"
+ m_colours["tail"] = "#000000"
// Don't wear another species' underwear!
var/datum/sprite_accessory/S = underwear_list[underwear]
@@ -1228,20 +1298,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(!S || !(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
+ //reset skin tone and colour
+ if(species in list("Human", "Drask", "Vox"))
+ random_skin_tone(species)
+ else
+ 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
+ alt_head = "None" //No alt heads on species that don't have them.
body_accessory = null //no vulptail on humans damnit
@@ -1288,39 +1356,44 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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))
+ r_hair = color2R(new_hair)
+ g_hair = color2G(new_hair)
+ b_hair = color2B(new_hair)
+
+ if("secondary_hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
+ if(hair_style.secondary_theme && !hair_style.no_sec_colour)
+ var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", rgb(r_hair_sec, g_hair_sec, b_hair_sec)) as color|null
+ if(new_hair)
+ r_hair_sec = color2R(new_hair)
+ g_hair_sec = color2G(new_hair)
+ b_hair_sec = color2B(new_hair)
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
+ if(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
+ continue
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/head_model
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ head_model = "Morpheus Cyberkinetics"
+ else
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
+ else
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
if(new_h_style)
@@ -1331,9 +1404,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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))
+ r_headacc = color2R(new_head_accessory)
+ g_headacc = color2G(new_head_accessory)
+ b_headacc = color2B(new_head_accessory)
if("ha_style")
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
@@ -1343,47 +1416,130 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(!(species in H.species_allowed))
continue
- valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
+ valid_head_accessory_styles += 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))
+ if("alt_head")
+ if(organ_data["head"] == "cyborg")
+ return
+ if(species in list("Unathi")) //Species with alt heads.
+ var/list/valid_alt_heads = list()
+ valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option
+ for(var/alternate_head in alt_heads_list)
+ var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
+ if(!(species in head.species_allowed))
continue
+ valid_alt_heads += alternate_head
+
+ var/new_alt_head = input(user, "Choose your character's alternate head style:", "Character Preference") as null|anything in valid_alt_heads
+ if(new_alt_head)
+ alt_head = new_alt_head
+ if(m_styles["head"])
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
+ if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(alt_head in head_marking_style.heads_allowed)))
+ m_styles["head"] = "None"
+
+ if("m_style_head")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+ if(M.marking_location != "head")
+ continue
+ if(alt_head && alt_head != "None")
+ if(!("All" in M.heads_allowed) && !(alt_head in M.heads_allowed))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
+
if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
+ var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
+ head_model = "Morpheus Cyberkinetics"
else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_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]
+ valid_markings += 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
+ var/new_marking_style = input(user, "Choose the style of your character's head markings:", "Character Preference", m_styles["head"]) as null|anything in valid_markings
if(new_marking_style)
- m_style = new_marking_style
+ m_styles["head"] = new_marking_style
+
+ if("m_head_colour")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ var/input = "Choose the colour of your your character's head markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["head"]) as color|null
+ if(new_markings)
+ m_colours["head"] = new_markings
+
+ if("m_style_body")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+ if(M.marking_location != "body")
+ continue
+
+ valid_markings += markingstyle
+
+ var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference", m_styles["body"]) as null|anything in valid_markings
+ if(new_marking_style)
+ m_styles["body"] = new_marking_style
+
+ if("m_body_colour")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ var/input = "Choose the colour of your your character's body markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["body"]) as color|null
+ if(new_markings)
+ m_colours["body"] = new_markings
+
+ if("m_style_tail")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/tail/M = marking_styles_list[markingstyle]
+ if(M.marking_location != "tail")
+ continue
+ if(!(species in M.species_allowed))
+ continue
+ if(!body_accessory)
+ if(M.tails_allowed)
+ continue
+ else
+ if(!M.tails_allowed || !(body_accessory in M.tails_allowed))
+ continue
+
+ valid_markings += markingstyle
+
+ var/new_marking_style = input(user, "Choose the style of your character's tail markings:", "Character Preference", m_styles["tail"]) as null|anything in valid_markings
+ if(new_marking_style)
+ m_styles["tail"] = new_marking_style
+
+ if("m_tail_colour")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ var/input = "Choose the colour of your your character's tail markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["tail"]) as color|null
+ if(new_markings)
+ m_colours["tail"] = new_markings
if("body_accessory")
var/list/possible_body_accessories = list()
@@ -1400,74 +1556,90 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
if(new_body_accessory)
+ m_styles["tail"] = "None"
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))
+ r_facial = color2R(new_facial)
+ g_facial = color2G(new_facial)
+ b_facial = color2B(new_facial)
+
+ if("secondary_facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
+ if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour)
+ var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", rgb(r_facial_sec, g_facial_sec, b_facial_sec)) as color|null
+ if(new_facial)
+ r_facial_sec = color2R(new_facial)
+ g_facial_sec = color2G(new_facial)
+ b_facial_sec = color2B(new_facial)
if("f_style")
- var/list/valid_facialhairstyles = list()
+ var/list/valid_facial_hairstyles = 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(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
+ continue
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()
+ var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
+ head_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
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
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
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
- 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
+ var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facial_hairstyles
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
+ var/list/valid_underwear = list()
+ for(var/underwear in underwear_list)
+ var/datum/sprite_accessory/S = underwear_list[underwear]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_underwear[underwear] = underwear_list[underwear]
+ var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in valid_underwear
+ ShowChoices(user)
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
+ var/list/valid_undershirts = list()
+ for(var/undershirt in undershirt_list)
+ var/datum/sprite_accessory/S = undershirt_list[undershirt]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_undershirts[undershirt] = undershirt_list[undershirt]
+ var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in valid_undershirts
+ ShowChoices(user)
if(new_undershirt)
undershirt = new_undershirt
- ShowChoices(user)
if("socks")
var/list/valid_sockstyles = list()
@@ -1488,9 +1660,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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))
+ r_eyes = color2R(new_eyes)
+ g_eyes = color2G(new_eyes)
+ b_eyes = color2B(new_eyes)
if("s_tone")
if(species == "Human" || species == "Drask")
@@ -1506,9 +1678,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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))
+ r_skin = color2R(new_skin)
+ g_skin = color2G(new_skin)
+ b_skin = color2B(new_skin)
if("ooccolor")
@@ -1594,8 +1766,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(new_state)
if("Normal")
if(limb == "head")
- m_style = "None"
- h_style = random_hair_style(gender, species)
+ m_styles["head"] = "None"
+ h_style = hair_styles_list["Bald"]
f_style = facial_hair_styles_list["Shaved"]
organ_data[limb] = null
rlimb_data[limb] = null
@@ -1640,11 +1812,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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"
+ if(limb in list("head", "chest", "groin"))
+ if(species != "Machine")
+ return
+ if(limb == "head")
+ ha_style = "None"
+ alt_head = null
+ h_style = hair_styles_list["Bald"]
+ f_style = facial_hair_styles_list["Shaved"]
+ m_styles["head"] = "None"
rlimb_data[limb] = choice
organ_data[limb] = "cyborg"
if(second_limb)
@@ -1655,7 +1831,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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
@@ -1847,16 +2022,27 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
//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_hair_sec = r_hair_sec
+ H.g_hair_sec = g_hair_sec
+ H.b_hair_sec = b_hair_sec
+
H.r_facial = r_facial
H.g_facial = g_facial
H.b_facial = b_facial
+ H.r_facial_sec = r_facial_sec
+ H.g_facial_sec = g_facial_sec
+ H.b_facial_sec = b_facial_sec
+
H.h_style = h_style
H.f_style = f_style
+
+ H.alt_head = alt_head
//End of head-specific.
character.r_skin = r_skin
@@ -1946,10 +2132,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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
+ character.m_colours = m_colours
+ character.m_styles = m_styles
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index 4506d510754..1425f714183 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -110,23 +110,28 @@
hair_red,
hair_green,
hair_blue,
+ secondary_hair_red,
+ secondary_hair_green,
+ secondary_hair_blue,
facial_red,
facial_green,
facial_blue,
+ secondary_facial_red,
+ secondary_facial_green,
+ secondary_facial_blue,
skin_tone,
skin_red,
skin_green,
skin_blue,
- markings_red,
- markings_green,
- markings_blue,
+ marking_colours,
head_accessory_red,
head_accessory_green,
head_accessory_blue,
hair_style_name,
facial_style_name,
- marking_style_name,
+ marking_styles,
head_accessory_style_name,
+ alt_head_name,
eyes_red,
eyes_green,
eyes_blue,
@@ -181,52 +186,57 @@
r_hair = text2num(query.item[8])
g_hair = text2num(query.item[9])
b_hair = text2num(query.item[10])
- r_facial = text2num(query.item[11])
- g_facial = text2num(query.item[12])
- b_facial = text2num(query.item[13])
- s_tone = text2num(query.item[14])
- r_skin = text2num(query.item[15])
- g_skin = text2num(query.item[16])
- b_skin = text2num(query.item[17])
- r_markings = text2num(query.item[18])
- g_markings = text2num(query.item[19])
- b_markings = text2num(query.item[20])
- r_headacc = text2num(query.item[21])
- g_headacc = text2num(query.item[22])
- b_headacc = text2num(query.item[23])
- h_style = query.item[24]
- f_style = query.item[25]
- m_style = query.item[26]
- ha_style = query.item[27]
- r_eyes = text2num(query.item[28])
- g_eyes = text2num(query.item[29])
- b_eyes = text2num(query.item[30])
- underwear = query.item[31]
- undershirt = query.item[32]
- backbag = text2num(query.item[33])
- b_type = query.item[34]
+ r_hair_sec = text2num(query.item[11])
+ g_hair_sec = text2num(query.item[12])
+ b_hair_sec = text2num(query.item[13])
+ r_facial = text2num(query.item[14])
+ g_facial = text2num(query.item[15])
+ b_facial = text2num(query.item[16])
+ r_facial_sec = text2num(query.item[17])
+ g_facial_sec = text2num(query.item[18])
+ b_facial_sec = text2num(query.item[19])
+ s_tone = text2num(query.item[20])
+ r_skin = text2num(query.item[21])
+ g_skin = text2num(query.item[22])
+ b_skin = text2num(query.item[23])
+ m_colours = params2list(query.item[24])
+ r_headacc = text2num(query.item[25])
+ g_headacc = text2num(query.item[26])
+ b_headacc = text2num(query.item[27])
+ h_style = query.item[28]
+ f_style = query.item[29]
+ m_styles = params2list(query.item[30])
+ ha_style = query.item[31]
+ alt_head = query.item[32]
+ r_eyes = text2num(query.item[33])
+ g_eyes = text2num(query.item[34])
+ b_eyes = text2num(query.item[35])
+ underwear = query.item[36]
+ undershirt = query.item[37]
+ backbag = text2num(query.item[38])
+ b_type = query.item[39]
//Jobs
- alternate_option = text2num(query.item[35])
- job_support_high = text2num(query.item[36])
- job_support_med = text2num(query.item[37])
- job_support_low = text2num(query.item[38])
- job_medsci_high = text2num(query.item[39])
- job_medsci_med = text2num(query.item[40])
- job_medsci_low = text2num(query.item[41])
- job_engsec_high = text2num(query.item[42])
- job_engsec_med = text2num(query.item[43])
- job_engsec_low = text2num(query.item[44])
- job_karma_high = text2num(query.item[45])
- job_karma_med = text2num(query.item[46])
- job_karma_low = text2num(query.item[47])
+ alternate_option = text2num(query.item[40])
+ job_support_high = text2num(query.item[41])
+ job_support_med = text2num(query.item[42])
+ job_support_low = text2num(query.item[43])
+ job_medsci_high = text2num(query.item[44])
+ job_medsci_med = text2num(query.item[45])
+ job_medsci_low = text2num(query.item[46])
+ job_engsec_high = text2num(query.item[47])
+ job_engsec_med = text2num(query.item[48])
+ job_engsec_low = text2num(query.item[49])
+ job_karma_high = text2num(query.item[50])
+ job_karma_med = text2num(query.item[51])
+ job_karma_low = text2num(query.item[52])
//Miscellaneous
- flavor_text = query.item[48]
- med_record = query.item[49]
- sec_record = query.item[50]
- gen_record = query.item[51]
+ flavor_text = query.item[53]
+ med_record = query.item[54]
+ sec_record = query.item[55]
+ gen_record = query.item[56]
// Apparently, the preceding vars weren't always encoded properly...
if(findtext(flavor_text, "<")) // ... so let's clumsily check for tags!
flavor_text = html_encode(flavor_text)
@@ -236,17 +246,17 @@
sec_record = html_encode(sec_record)
if(findtext(gen_record, "<"))
gen_record = html_encode(gen_record)
- disabilities = text2num(query.item[52])
- player_alt_titles = params2list(query.item[53])
- organ_data = params2list(query.item[54])
- rlimb_data = params2list(query.item[55])
- nanotrasen_relation = query.item[56]
- speciesprefs = text2num(query.item[57])
+ disabilities = text2num(query.item[57])
+ player_alt_titles = params2list(query.item[58])
+ organ_data = params2list(query.item[59])
+ rlimb_data = params2list(query.item[60])
+ nanotrasen_relation = query.item[61]
+ speciesprefs = text2num(query.item[62])
//socks
- socks = query.item[58]
- body_accessory = query.item[59]
- gear = params2list(query.item[60])
+ socks = query.item[63]
+ body_accessory = query.item[64]
+ gear = params2list(query.item[65])
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -262,23 +272,30 @@
r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair))
+ r_hair_sec = sanitize_integer(r_hair_sec, 0, 255, initial(r_hair_sec))
+ g_hair_sec = sanitize_integer(g_hair_sec, 0, 255, initial(g_hair_sec))
+ b_hair_sec = sanitize_integer(b_hair_sec, 0, 255, initial(b_hair_sec))
r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial))
g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial))
b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial))
+ r_facial_sec = sanitize_integer(r_facial_sec, 0, 255, initial(r_facial_sec))
+ g_facial_sec = sanitize_integer(g_facial_sec, 0, 255, initial(g_facial_sec))
+ b_facial_sec = sanitize_integer(b_facial_sec, 0, 255, initial(b_facial_sec))
s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone))
r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin))
g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin))
b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin))
- r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings))
- g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings))
- b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings))
+ for(var/marking_location in m_colours)
+ m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location])
r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc))
g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc))
b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc))
h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style))
f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style))
- m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style))
+ for(var/marking_location in m_styles)
+ m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location])
ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style))
+ alt_head = sanitize_inlist(alt_head, alt_heads_list, initial(alt_head))
r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes))
g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
@@ -318,6 +335,9 @@
var/rlimblist
var/playertitlelist
var/gearlist
+
+ var/markingcolourslist = list2params(m_colours)
+ var/markingstyleslist = list2params(m_styles)
if(!isemptylist(organ_data))
organlist = list2params(organ_data)
if(!isemptylist(rlimb_data))
@@ -341,23 +361,28 @@
hair_red='[r_hair]',
hair_green='[g_hair]',
hair_blue='[b_hair]',
+ secondary_hair_red='[r_hair_sec]',
+ secondary_hair_green='[g_hair_sec]',
+ secondary_hair_blue='[b_hair_sec]',
facial_red='[r_facial]',
facial_green='[g_facial]',
facial_blue='[b_facial]',
+ secondary_facial_red='[r_facial_sec]',
+ secondary_facial_green='[g_facial_sec]',
+ secondary_facial_blue='[b_facial_sec]',
skin_tone='[s_tone]',
skin_red='[r_skin]',
skin_green='[g_skin]',
skin_blue='[b_skin]',
- markings_red='[r_markings]',
- markings_green='[g_markings]',
- markings_blue='[b_markings]',
+ marking_colours='[sanitizeSQL(markingcolourslist)]',
head_accessory_red='[r_headacc]',
head_accessory_green='[g_headacc]',
head_accessory_blue='[b_headacc]',
hair_style_name='[sanitizeSQL(h_style)]',
facial_style_name='[sanitizeSQL(f_style)]',
- marking_style_name='[sanitizeSQL(m_style)]',
+ marking_styles='[sanitizeSQL(markingstyleslist)]',
head_accessory_style_name='[sanitizeSQL(ha_style)]',
+ alt_head_name='[sanitizeSQL(alt_head)]',
eyes_red='[r_eyes]',
eyes_green='[g_eyes]',
eyes_blue='[b_eyes]',
@@ -406,14 +431,17 @@
INSERT INTO [format_table_name("characters")] (ckey, slot, OOC_Notes, real_name, name_is_always_random, gender,
age, species, language,
hair_red, hair_green, hair_blue,
+ secondary_hair_red, secondary_hair_green, secondary_hair_blue,
facial_red, facial_green, facial_blue,
+ secondary_facial_red, secondary_facial_green, secondary_facial_blue,
skin_tone, skin_red, skin_green, skin_blue,
- markings_red, markings_green, markings_blue,
+ marking_colours,
head_accessory_red, head_accessory_green, head_accessory_blue,
hair_style_name,
facial_style_name,
- marking_style_name,
+ marking_styles,
head_accessory_style_name,
+ alt_head_name,
eyes_red, eyes_green, eyes_blue,
underwear, undershirt,
backbag, b_type, alternate_option,
@@ -433,14 +461,17 @@
('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]',
'[age]', '[sanitizeSQL(species)]', '[sanitizeSQL(language)]',
'[r_hair]', '[g_hair]', '[b_hair]',
+ '[r_hair_sec]', '[g_hair_sec]', '[b_hair_sec]',
'[r_facial]', '[g_facial]', '[b_facial]',
+ '[r_facial_sec]', '[g_facial_sec]', '[b_facial_sec]',
'[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]',
- '[r_markings]', '[g_markings]', '[b_markings]',
+ '[sanitizeSQL(markingcolourslist)]',
'[r_headacc]', '[g_headacc]', '[b_headacc]',
'[sanitizeSQL(h_style)]',
'[sanitizeSQL(f_style)]',
- '[sanitizeSQL(m_style)]',
+ '[sanitizeSQL(markingstyleslist)]',
'[sanitizeSQL(ha_style)]',
+ '[sanitizeSQL(alt_head)]',
'[r_eyes]', '[g_eyes]', '[b_eyes]',
'[underwear]', '[undershirt]',
'[backbag]', '[b_type]', '[alternate_option]',
diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm
index 726de710a1a..a4fad8a16cb 100644
--- a/code/modules/computer3/computers/communications.dm
+++ b/code/modules/computer3/computers/communications.dm
@@ -66,16 +66,21 @@
if("main" in href_list)
state = STATE_DEFAULT
if("login" in href_list)
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
+ if(!ishuman(usr))
+ to_chat(usr, "Access denied.")
+ return
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/I = H.get_active_hand()
if(I)
I = I.GetID()
if(istype(I,/obj/item/weapon/card/id) && check_access(I))
authenticated = 1
if(access_captain in I.GetAccess())
authenticated = 2
- crew_announcement.announcer = GetNameAndAssignmentFromId(I)
-
+ var/obj/item/weapon/card/id = H.get_idcard(TRUE)
+ if(istype(id))
+ crew_announcement.announcer = GetNameAndAssignmentFromId(id)
+
if("logout" in href_list)
authenticated = 0
crew_announcement.announcer = ""
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 35e31dc9519..c7126795143 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -14,7 +14,7 @@
var/used = 0
/obj/item/device/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks
- name = "dispoable tattoo pen"
+ name = "disposable tattoo pen"
desc = "A cheap plastic tattoo application pen."
icon = 'icons/obj/custom_items.dmi'
icon_state = "tatgun"
@@ -22,7 +22,7 @@
throwforce = 0
w_class = 1
var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages
- var/tattoo_icon = "Tiger Body" // body_accessory.dmi, new icons defined in sprite_accessories.dm
+ var/tattoo_icon = "Tiger-stripe Tattoo" // body_accessory.dmi, new icons defined in sprite_accessories.dm
var/tattoo_r = 1 // RGB values for the body markings
var/tattoo_g = 1
var/tattoo_b = 1
@@ -47,10 +47,15 @@
to_chat(user, "[target] has no skin, how do you expect to tattoo them?")
return
- if(target.m_style != "None")
+ if(target.m_styles["body"] != "None")
to_chat(user, "[target] already has body markings, any more would look silly!")
return
+ var/datum/sprite_accessory/body_markings/tattoo/temp_tatt = marking_styles_list[tattoo_icon]
+ if(!(target.species.name in temp_tatt.species_allowed))
+ to_chat(user, "You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.")
+ return
+
if(target == user)
to_chat(user, "You use the [src] to apply a [tattoo_name] to yourself!")
@@ -61,12 +66,8 @@
user.visible_message("[user] finishes the [tattoo_name] on [target].", "You finish the [tattoo_name].")
if(!used) // No exploiting do_after to tattoo multiple folks.
- target.m_style = tattoo_icon
- target.r_markings = tattoo_r
- target.g_markings = tattoo_g
- target.b_markings = tattoo_b
-
- target.update_markings()
+ target.change_markings(tattoo_icon, "body")
+ target.change_marking_color(rgb(tattoo_r, tattoo_g, tattoo_b), "body")
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
used = 1
@@ -98,9 +99,9 @@
if(!used)
var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null
if(ink_color && !(user.incapacitated() || used) )
- tattoo_r = hex2num(copytext(ink_color, 2, 4))
- tattoo_g = hex2num(copytext(ink_color, 4, 6))
- tattoo_b = hex2num(copytext(ink_color, 6, 8))
+ tattoo_r = color2R(ink_color)
+ tattoo_g = color2G(ink_color)
+ tattoo_b = color2B(ink_color)
to_chat(user, "You change the color setting on the [src].")
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index caca591b90b..b583c04702f 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -123,8 +123,6 @@ log transactions
to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.")
return
if(get_dist(src,user) <= 1)
- //check to see if the user has low security enabled
- scan_user(user)
add_fingerprint(user)
//js replicated from obj/machinery/computer/card
@@ -252,55 +250,59 @@ log transactions
var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0)
authenticated_account.security_level = new_sec_level
if("attempt_auth")
- if(linked_db && !ticks_left_locked_down)
- var/tried_account_num = text2num(href_list["account_num"])
- if(!tried_account_num)
- tried_account_num = held_card.associated_account_number
- var/tried_pin = text2num(href_list["account_pin"])
+ if(linked_db)
+ // check if they have low security enabled
+ scan_user(usr)
+
+ if(!ticks_left_locked_down && held_card)
+ var/tried_account_num = text2num(href_list["account_num"])
+ if(!tried_account_num)
+ tried_account_num = held_card.associated_account_number
+ var/tried_pin = text2num(href_list["account_pin"])
- authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
- if(!authenticated_account)
- number_incorrect_tries++
- if(previous_account_number == tried_account_num)
- if(number_incorrect_tries > max_pin_attempts)
- //lock down the atm
- ticks_left_locked_down = 30
- playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
+ authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
+ if(!authenticated_account)
+ number_incorrect_tries++
+ if(previous_account_number == tried_account_num)
+ if(number_incorrect_tries > max_pin_attempts)
+ //lock down the atm
+ ticks_left_locked_down = 30
+ playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
- //create an entry in the account transaction log
- var/datum/money_account/failed_account = linked_db.get_account(tried_account_num)
- if(failed_account)
- var/datum/transaction/T = new()
- T.target_name = failed_account.owner_name
- T.purpose = "Unauthorised login attempt"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = worldtime2text()
- failed_account.transaction_log.Add(T)
+ //create an entry in the account transaction log
+ var/datum/money_account/failed_account = linked_db.get_account(tried_account_num)
+ if(failed_account)
+ var/datum/transaction/T = new()
+ T.target_name = failed_account.owner_name
+ T.purpose = "Unauthorised login attempt"
+ T.source_terminal = machine_id
+ T.date = current_date_string
+ T.time = worldtime2text()
+ failed_account.transaction_log.Add(T)
+ else
+ to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
+ previous_account_number = tried_account_num
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
else
- to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
- previous_account_number = tried_account_num
- playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
+ to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
+ number_incorrect_tries = 0
else
- to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
- number_incorrect_tries = 0
- else
- playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
- ticks_left_timeout = 120
- view_screen = NO_SCREEN
+ playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
+ ticks_left_timeout = 120
+ view_screen = NO_SCREEN
- //create a transaction log entry
- var/datum/transaction/T = new()
- T.target_name = authenticated_account.owner_name
- T.purpose = "Remote terminal access"
- T.source_terminal = machine_id
- T.date = current_date_string
- T.time = worldtime2text()
- authenticated_account.transaction_log.Add(T)
+ //create a transaction log entry
+ var/datum/transaction/T = new()
+ T.target_name = authenticated_account.owner_name
+ T.purpose = "Remote terminal access"
+ T.source_terminal = machine_id
+ T.date = current_date_string
+ T.time = worldtime2text()
+ authenticated_account.transaction_log.Add(T)
- to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
- previous_account_number = tried_account_num
+ previous_account_number = tried_account_num
if("withdrawal")
var/amount = max(text2num(href_list["funds_amount"]),0)
if(amount <= 0)
@@ -404,3 +406,5 @@ log transactions
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
+
+ view_screen = NO_SCREEN
diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm
index da60e939987..fd92e6675f1 100644
--- a/code/modules/lighting/light_source.dm
+++ b/code/modules/lighting/light_source.dm
@@ -114,9 +114,9 @@
/datum/light_source/proc/parse_light_color()
if(light_color)
- lum_r = GetRedPart(light_color) / 255
- lum_g = GetGreenPart(light_color) / 255
- lum_b = GetBluePart(light_color) / 255
+ lum_r = color2R(light_color) / 255
+ lum_g = color2G(light_color) / 255
+ lum_b = color2B(light_color) / 255
else
lum_r = 1
lum_g = 1
@@ -195,7 +195,7 @@
effect_str.Cut()
effect_turf.Cut()
-
+
/datum/light_source/proc/forget_turf(turf/T)
var/idx = effect_turf.Find(T)
effect_turf.Cut(idx, idx + 1)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 1b1e4755e9b..9e4f7289532 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -344,7 +344,6 @@
desc = "An easily-compressable wall used for temporary shelter."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "smooth"
- walltype = "shuttle"
smooth = SMOOTH_MORE // To Do: Add in Diagnaol Smooth Support
canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 6797744fbf6..9e91abdd3e4 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -27,13 +27,15 @@
var/heat_protection = 0.5
var/leaping = 0
ventcrawler = 2
+
+ var/list/alien_organs = list()
/mob/living/carbon/alien/New()
verbs += /mob/living/verb/mob_sleep
verbs += /mob/living/verb/lay_down
- internal_organs += new /obj/item/organ/internal/brain/xeno
- internal_organs += new /obj/item/organ/internal/xenos/hivenode
- for(var/obj/item/organ/internal/I in internal_organs)
+ alien_organs += new /obj/item/organ/internal/brain/xeno
+ alien_organs += new /obj/item/organ/internal/xenos/hivenode
+ for(var/obj/item/organ/internal/I in alien_organs)
I.insert(src)
..()
diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm
index 220b61e28d8..3949948b0f3 100644
--- a/code/modules/mob/living/carbon/alien/alien_defenses.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm
@@ -15,7 +15,6 @@ In all, this is a lot like the monkey code. /N
return
switch(M.a_intent)
-
if(I_HELP)
sleeping = max(0,sleeping-5)
resting = 0
@@ -25,11 +24,12 @@ In all, this is a lot like the monkey code. /N
visible_message("[M.name] nuzzles [src] trying to wake it up!")
if(I_GRAB)
- src.grabbedby(M)
+ grabbedby(M)
return 1
else
if(health > 0)
+ M.do_attack_animation(src)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
var/damage = 1
visible_message("[M.name] bites [src]!", \
@@ -39,13 +39,10 @@ In all, this is a lot like the monkey code. /N
updatehealth()
else
to_chat(M, "[name] is too injured for that.")
- return
-
/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L as mob)
return attack_alien(L)
-
/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M as mob)
if(..()) //to allow surgery to return properly.
return 0
@@ -56,7 +53,7 @@ In all, this is a lot like the monkey code. /N
if(I_HELP)
help_shake_act(M)
if(I_GRAB)
- src.grabbedby(M)
+ grabbedby(M)
if(I_HARM, I_DISARM)
return 1
return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
index e45fa198006..958742b3e61 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
@@ -12,9 +12,9 @@
if(src.name == "alien drone")
src.name = text("alien drone ([rand(1, 1000)])")
src.real_name = src.name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/drone
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/resinspinner
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/drone
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/resinspinner
..()
//Drones use the same base as generic humanoids.
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 60a1e5daa5f..60a7e4e2f1a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -12,7 +12,7 @@
if(name == "alien hunter")
name = text("alien hunter ([rand(1, 1000)])")
real_name = name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter
..()
/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
index d93fb0a835c..186577a1908 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
@@ -41,9 +41,9 @@
if(name == "alien sentinel")
name = text("alien sentinel ([rand(1, 1000)])")
real_name = name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
/mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
index b49bc8c1ad1..346247c8e10 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
@@ -44,11 +44,11 @@
break
real_name = src.name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/eggsac
- internal_organs += new /obj/item/organ/internal/xenos/resinspinner
- internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/eggsac
+ alien_organs += new /obj/item/organ/internal/xenos/resinspinner
+ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
/mob/living/carbon/alien/humanoid/empress
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 5692c99e9be..876cae4b312 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -243,70 +243,6 @@
visible_message("[M] has attempted to disarm [src]!")
return
-/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
-As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
-In all, this is a lot like the monkey code. /N
-*/
-
-/mob/living/carbon/alien/humanoid/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if(!ticker)
- to_chat(M, "You cannot attack people before the game has started.")
- return
-
- if(istype(loc, /turf) && istype(loc.loc, /area/start))
- to_chat(M, "No attacking people at spawn, you jackass.")
- return
-
- ..()
-
- switch(M.a_intent)
-
- if(I_HELP)
- sleeping = max(0,sleeping-5)
- resting = 0
- AdjustParalysis(-3)
- AdjustStunned(-3)
- AdjustWeakened(-3)
- visible_message("[M.name] nuzzles [src] trying to wake it up!")
-
- else
- if(health > 0)
- M.do_attack_animation(src)
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- var/damage = rand(1, 3)
- visible_message("[M.name] bites [src]!!", \
- "[M.name] bites [src]!!")
-
- adjustBruteLoss(damage)
- updatehealth()
- else
- to_chat(M, "[name] is too injured for that.")
- return
-
-
-/mob/living/carbon/alien/humanoid/attack_larva(mob/living/carbon/alien/larva/L as mob)
-
- switch(L.a_intent)
- if(I_HELP)
- visible_message("[L] rubs its head against [src].")
-
-
- else
- if(health > 0)
- L.do_attack_animation(src)
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- var/damage = rand(1, 3)
- visible_message("[L.name] bites [src]!!", \
- "[L.name] bites [src]!!")
-
- adjustBruteLoss(damage)
- updatehealth()
- else
- to_chat(L, "[name] is too injured for that.")
- return
-
-
-
/mob/living/carbon/alien/humanoid/restrained()
if(handcuffed)
return 1
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index daba3852764..0fcec18e8ad 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -23,11 +23,11 @@
break
real_name = src.name
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
- internal_organs += new /obj/item/organ/internal/xenos/acidgland
- internal_organs += new /obj/item/organ/internal/xenos/eggsac
- internal_organs += new /obj/item/organ/internal/xenos/resinspinner
- internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
+ alien_organs += new /obj/item/organ/internal/xenos/acidgland
+ alien_organs += new /obj/item/organ/internal/xenos/eggsac
+ alien_organs += new /obj/item/organ/internal/xenos/resinspinner
+ alien_organs += new /obj/item/organ/internal/xenos/neurotoxin
..()
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index eb5522cafac..8e9e0dea576 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -24,7 +24,7 @@
regenerate_icons()
add_language("Xenomorph")
add_language("Hivemind")
- internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/larva
+ alien_organs += new /obj/item/organ/internal/xenos/plasmavessel/larva
..()
@@ -190,41 +190,6 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("[M] has attempted to kick [src]!", \
"[M] has attempted to kick [src]!")
- return
-
-/mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if(!ticker)
- to_chat(M, "You cannot attack people before the game has started.")
- return
-
- if(istype(loc, /turf) && istype(loc.loc, /area/start))
- to_chat(M, "No attacking people at spawn, you jackass.")
- return
-
- ..()
-
- switch(M.a_intent)
-
- if(I_HELP)
- sleeping = max(0,sleeping-5)
- resting = 0
- AdjustParalysis(-3)
- AdjustStunned(-3)
- AdjustWeakened(-3)
- visible_message("[M.name] nuzzles [src] trying to wake it up!")
-
- else
- if(health > 0)
- M.do_attack_animation(src)
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- var/damage = 1
- visible_message("[M.name] bites [src]!", \
- "[M.name] bites [src]!")
- adjustBruteLoss(damage)
- updatehealth()
- else
- to_chat(M, "[name] is too injured for that.")
- return
/mob/living/carbon/alien/larva/restrained()
return 0
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 7802cfd53c6..eb58d39ea7c 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -4,32 +4,29 @@
AC.ui_interact(user, state = state)
/mob/living/carbon/human/proc/change_species(var/new_species)
- if(!new_species)
+ if(!new_species || species == new_species || !(new_species in all_species))
return
- if(species == new_species)
- return
-
- if(!(new_species in all_species))
- return
-
- set_species(new_species)
+ set_species(new_species, null, 1)
reset_hair()
+ if(species.bodyflags & HAS_MARKINGS)
+ reset_markings()
+
return 1
-/mob/living/carbon/human/proc/change_gender(var/gender, var/update_dna = 1)
+/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1)
var/obj/item/organ/external/head/H = organs_by_name["head"]
- if(src.gender == gender)
+ if(gender == new_gender)
return
- src.gender = gender
+ gender = new_gender
var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style]
- if(current_hair.gender != NEUTER && current_hair.gender != src.gender)
+ if(current_hair.gender != NEUTER && current_hair.gender != gender)
reset_head_hair()
var/datum/sprite_accessory/hair/current_fhair = facial_hair_styles_list[H.f_style]
- if(current_fhair.gender != NEUTER && current_fhair.gender != src.gender)
+ if(current_fhair.gender != NEUTER && current_fhair.gender != gender)
reset_facial_hair()
if(update_dna)
@@ -40,13 +37,7 @@
/mob/living/carbon/human/proc/change_hair(var/hair_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!hair_style)
- return
-
- if(H.h_style == hair_style)
- return
-
- if(!(hair_style in hair_styles_list))
+ if(!hair_style || !H || H.h_style == hair_style || !(hair_style in hair_styles_list))
return
H.h_style = hair_style
@@ -56,13 +47,7 @@
/mob/living/carbon/human/proc/change_facial_hair(var/facial_hair_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!facial_hair_style)
- return
-
- if(H.f_style == facial_hair_style)
- return
-
- if(!(facial_hair_style in facial_hair_styles_list))
+ if(!facial_hair_style || !H || H.f_style == facial_hair_style || !(facial_hair_style in facial_hair_styles_list))
return
H.f_style = facial_hair_style
@@ -72,13 +57,7 @@
/mob/living/carbon/human/proc/change_head_accessory(var/head_accessory_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!head_accessory_style)
- return
-
- if(H.ha_style == head_accessory_style)
- return
-
- if(!(head_accessory_style in head_accessory_styles_list))
+ if(!head_accessory_style || !H || H.ha_style == head_accessory_style || !(head_accessory_style in head_accessory_styles_list))
return
H.ha_style = head_accessory_style
@@ -86,52 +65,95 @@
update_head_accessory()
return 1
-/mob/living/carbon/human/proc/change_markings(var/marking_style)
- if(!marking_style)
+/mob/living/carbon/human/proc/change_markings(var/marking_style, var/location = "body")
+ if(!marking_style || m_styles[location] == marking_style || !(marking_style in marking_styles_list))
return
- if(src.m_style == marking_style)
+ var/datum/sprite_accessory/body_markings/marking = marking_styles_list[marking_style]
+ if(marking.name != "None" && marking.marking_location != location)
return
- if(!(marking_style in marking_styles_list))
- return
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(location == "head")
+ if(!head_organ)
+ return
- src.m_style = marking_style
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style]
+ if(marking.name != "None" && (!H.heads_allowed || (!("All" in H.heads_allowed) && !(head_organ.alt_head in H.heads_allowed))))
+ return
+ else
+ if(!head_organ.alt_head || head_organ.alt_head == "None")
+ head_organ.alt_head = "None"
+ var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style]
+ if(H.heads_allowed && !("All" in H.heads_allowed))
+ return
- update_markings()
+ if(location == "tail" && marking.name != "None")
+ var/datum/sprite_accessory/body_markings/tail/tail_marking = marking_styles_list[marking_style]
+ if(!body_accessory)
+ if(tail_marking.tails_allowed)
+ return
+ else
+ if(!tail_marking.tails_allowed || !(body_accessory.name in tail_marking.tails_allowed))
+ return
+
+ m_styles[location] = marking_style
+
+ if(location == "tail")
+ stop_tail_wagging()
+ else
+ update_markings()
return 1
/mob/living/carbon/human/proc/change_body_accessory(var/body_accessory_style)
var/found
- if(!body_accessory_style)
+ if(!body_accessory_style || (body_accessory && body_accessory.name == body_accessory_style))
return
- if(src.body_accessory)
- if(src.body_accessory.name == body_accessory_style)
- return
-
for(var/B in body_accessory_by_name)
if(B == body_accessory_style)
- src.body_accessory = body_accessory_by_name[body_accessory_style]
+ body_accessory = body_accessory_by_name[body_accessory_style]
found = 1
if(!found)
return
+ m_styles["tail"] = "None"
update_tail_layer()
return 1
+/mob/living/carbon/human/proc/change_alt_head(var/alternate_head)
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H || H.alt_head == alternate_head || (H.status & ORGAN_ROBOT) || (!(species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list))
+ return
+
+ H.alt_head = alternate_head
+
+ //Handle head markings if they're incompatible with the new alt head.
+ if(m_styles["head"])
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
+ if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(H.alt_head in head_marking_style.heads_allowed)))
+ m_styles["head"] = "None"
+ update_markings()
+
+ update_body(1, 1) //Update the body and force limb icon regeneration to update the head with the new icon.
+ if(wear_mask)
+ update_inv_wear_mask()
+ return 1
+
/mob/living/carbon/human/proc/reset_hair()
reset_head_hair()
reset_facial_hair()
reset_head_accessory()
- if(m_style && m_style != "None") //Resets the markings if they were head markings.
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style && marking_style.marking_location == "head")
- reset_markings()
+ if(m_styles["head"] && m_styles["head"] != "None") //Resets head markings.
+ reset_markings("head")
/mob/living/carbon/human/proc/reset_head_hair()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_hairstyles = generate_valid_hairstyles()
if(valid_hairstyles.len)
H.h_style = pick(valid_hairstyles)
@@ -143,6 +165,8 @@
/mob/living/carbon/human/proc/reset_facial_hair()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_facial_hairstyles = generate_valid_facial_hairstyles()
if(valid_facial_hairstyles.len)
H.f_style = pick(valid_facial_hairstyles)
@@ -151,17 +175,32 @@
H.f_style = "Shaved"
update_fhair()
-/mob/living/carbon/human/proc/reset_markings()
- var/list/valid_markings = generate_valid_markings()
- if(valid_markings.len)
- m_style = pick(valid_markings)
+/mob/living/carbon/human/proc/reset_markings(var/location)
+ var/list/valid_markings
+
+ if(location)
+ valid_markings = generate_valid_markings(location)
+ if(valid_markings.len)
+ m_styles[location] = pick(valid_markings)
+ else
+ //this shouldn't happen
+ m_styles[location] = "None"
else
- //this shouldn't happen
- m_style = "None"
+ for(var/m_location in list("head", "body", "tail"))
+ valid_markings = generate_valid_markings(m_location)
+ if(valid_markings.len)
+ m_styles[m_location] = pick(valid_markings)
+ else
+ //this shouldn't happen
+ m_styles[m_location] = "None"
+
update_markings()
+ stop_tail_wagging()
/mob/living/carbon/human/proc/reset_head_accessory()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_head_accessories = generate_valid_head_accessories()
if(valid_head_accessories.len)
H.ha_style = pick(valid_head_accessories)
@@ -193,32 +232,57 @@
update_body()
return 1
-/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue)
+/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue, var/secondary)
var/obj/item/organ/external/head/H = get_organ("head")
- if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
+ if(!H)
return
- H.r_hair = red
- H.g_hair = green
- H.b_hair = blue
+ if(!secondary)
+ if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
+ return
+
+ H.r_hair = red
+ H.g_hair = green
+ H.b_hair = blue
+ else
+ if(red == H.r_hair_sec && green == H.g_hair_sec && blue == H.b_hair_sec)
+ return
+
+ H.r_hair_sec = red
+ H.g_hair_sec = green
+ H.b_hair_sec = blue
update_hair()
return 1
-/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue)
+/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue, var/secondary)
var/obj/item/organ/external/head/H = get_organ("head")
- if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
+ if(!H)
return
- H.r_facial = red
- H.g_facial = green
- H.b_facial = blue
+ if(!secondary)
+ if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
+ return
+
+ H.r_facial = red
+ H.g_facial = green
+ H.b_facial = blue
+ else
+ if(red == H.r_facial_sec && green == H.g_facial_sec && blue == H.b_facial_sec)
+ return
+
+ H.r_facial_sec = red
+ H.g_facial_sec = green
+ H.b_facial_sec = blue
update_fhair()
return 1
/mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue)
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
+
if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc)
return
@@ -229,15 +293,16 @@
update_head_accessory()
return 1
-/mob/living/carbon/human/proc/change_marking_color(var/red, var/green, var/blue)
- if(red == r_markings && green == g_markings && blue == b_markings)
+/mob/living/carbon/human/proc/change_marking_color(var/colour, var/location = "body")
+ if(colour == m_colours[location])
return
- r_markings = red
- g_markings = green
- b_markings = blue
+ m_colours[location] = colour
- update_markings()
+ if(location == "tail")
+ update_tail_layer()
+ else
+ update_markings()
return 1
@@ -287,75 +352,66 @@
/mob/living/carbon/human/proc/generate_valid_hairstyles()
var/list/valid_hairstyles = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no hair.
+
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
+ if(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
continue
- if(gender == FEMALE && S.gender == MALE)
+ if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!H)
- return
- if(H.species.name in S.species_allowed) //If this is a hairstyle native to the user's species...
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
- valid_hairstyles += hairstyle //Give them their hairstyles if they do.
- continue
- else //If they don't have the default head, they shouldn't be getting any hairstyles they wouldn't normally.
- continue
+ if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
- if(robohead.is_monitor) //If the hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
- continue
- else
- if("Human" in S.species_allowed) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head.
- valid_hairstyles += hairstyle
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the hair style allows, skip it. Otherwise, add it to the list.
- continue
- valid_hairstyles += hairstyle
+ if(H.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
return valid_hairstyles
/mob/living/carbon/human/proc/generate_valid_facial_hairstyles()
var/list/valid_facial_hairstyles = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no hair.
+
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
+ if(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
continue
- if(gender == FEMALE && S.gender == MALE)
+ if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!H)
- continue // No head, no hair
if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
- valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do.
- continue
- else //If they don't have the default head, they shouldn't be getting any facial hair styles they wouldn't normally.
- continue
+ if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
-
- if(robohead.is_monitor) //If the facial hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
- continue
- else
- if("Human" in S.species_allowed) //If the user has a robotic head and the facial hair style can fit humans, let them use it as a postiche for their humanoid robot head.
- valid_facial_hairstyles += facialhairstyle
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the facial hair style allows, skip it. Otherwise, add it to the list.
- continue
- valid_facial_hairstyles += facialhairstyle
+ if(H.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
return valid_facial_hairstyles
/mob/living/carbon/human/proc/generate_valid_head_accessories()
var/list/valid_head_accessories = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no head accessory.
+
for(var/head_accessory in head_accessory_styles_list)
var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
@@ -365,18 +421,40 @@
return valid_head_accessories
-/mob/living/carbon/human/proc/generate_valid_markings()
+/mob/living/carbon/human/proc/generate_valid_markings(var/location = "body")
var/list/valid_markings = new()
var/obj/item/organ/external/head/H = get_organ("head")
- for(var/marking in marking_styles_list)
- var/datum/sprite_accessory/S = marking_styles_list[marking]
+ if(!H && location == "head")
+ return //No head, no head markings.
- if(!(species.name in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ for(var/marking in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/S = marking_styles_list[marking]
+ if(S.name == "None")
+ valid_markings += marking
continue
- if(H.species.flags & ALL_RPARTS) //If the user is a species that can have a robotic head...
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
- continue
+ if(S.marking_location != location) //If the marking isn't for the location we desire, skip.
+ continue
+ if(!(species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ continue
+ if(location == "tail")
+ if(!body_accessory)
+ if(S.tails_allowed)
+ continue
+ else
+ if(!S.tails_allowed || !(body_accessory.name in S.tails_allowed))
+ continue
+ if(location == "head")
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
+ if(H.species.flags & ALL_RPARTS)//If the user is a species that can have a robotic head...
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
+ continue
+ else if(H.alt_head && H.alt_head != "None") //If the user's got an alt head, validate markings for that head.
+ if(!M.heads_allowed || (!("All" in M.heads_allowed) && !(H.alt_head in M.heads_allowed)))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
valid_markings += marking
return valid_markings
@@ -389,10 +467,24 @@
valid_body_accessories = body_accessory_by_name.Copy()
else
if(!istype(A))
- valid_body_accessories += "None" //The only null entry should be the "None" option.
+ valid_body_accessories["None"] = "None" //The only null entry should be the "None" option.
continue
- if(!(species.name in A.allowed_species)) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
- continue
- valid_body_accessories += B
+ if(species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
+ valid_body_accessories += B
return valid_body_accessories
+
+/mob/living/carbon/human/proc/generate_valid_alt_heads()
+ var/list/valid_alt_heads = list()
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no alt heads.
+ valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option, and there should always be a "None" option.
+ for(var/alternate_head in alt_heads_list)
+ var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
+ if(!(H.species.name in head.species_allowed))
+ continue
+
+ valid_alt_heads += alternate_head
+
+ return valid_alt_heads
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm
index f4b95eec4d4..8744a09ea4d 100644
--- a/code/modules/mob/living/carbon/human/body_accessories.dm
+++ b/code/modules/mob/living/carbon/human/body_accessories.dm
@@ -112,36 +112,30 @@ var/global/list/body_accessory_by_species = list("None" = null)
//Vulpkanin
/datum/body_accessory/tail/vulpkanin_2
name = "Vulpkanin Alt 1 (Bushy)"
-
icon_state = "vulptail2"
animated_icon_state = "vulptail2_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_3
name = "Vulpkanin Alt 2 (Straight)"
-
icon_state = "vulptail3"
animated_icon_state = "vulptail3_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_4
name = "Vulpkanin Alt 3 (Tiny)"
-
icon_state = "vulptail4"
animated_icon_state = "vulptail4_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_5
name = "Vulpkanin Alt 4 (Short)"
-
icon_state = "vulptail5"
animated_icon_state = "vulptail5_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_6
name = "Vulpkanin Alt 5 (Straight Bushy)"
-
icon_state = "vulptail6"
animated_icon_state = "vulptail6_a"
allowed_species = list("Vulpkanin")
-
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index df78c286254..4e8ab049927 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -155,11 +155,19 @@
if(istype(H))
if(H.f_style)
- H.f_style = "Shaved"
+ H.f_style = initial(H.f_style)
if(H.h_style)
- H.h_style = "Bald"
+ H.h_style = initial(H.h_style)
+ if(H.ha_style)
+ H.ha_style = initial(H.ha_style)
+ if(H.alt_head)
+ H.alt_head = initial(H.alt_head)
+ H.handle_alt_icon()
+ m_styles = DEFAULT_MARKING_STYLES
update_fhair(0)
update_hair(0)
+ update_head_accessory(0)
+ update_markings(0)
mutations.Add(SKELETON)
mutations.Add(NOCLONE)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ed48c229b89..561e60a3522 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -709,12 +709,19 @@
if(!.) . = if_no_id //to prevent null-names making the mob unclickable
return
-//gets ID card object from special clothes slot or null.
-/mob/living/carbon/human/proc/get_idcard()
+//gets ID card object from special clothes slot or, if applicable, hands as well
+/mob/living/carbon/human/proc/get_idcard(var/check_hands = FALSE)
var/obj/item/weapon/card/id/id = wear_id
var/obj/item/device/pda/pda = wear_id
if(istype(pda) && pda.id)
id = pda.id
+
+ if(check_hands)
+ if(istype(get_active_hand(), /obj/item/weapon/card/id))
+ id = get_active_hand()
+ else if(istype(get_inactive_hand(), /obj/item/weapon/card/id))
+ id = get_inactive_hand()
+
if(istype(id))
return id
@@ -1472,7 +1479,6 @@
to_chat(usr, "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
-
var/datum/species/oldspecies = species
if(!dna)
if(!new_species)
@@ -1525,9 +1531,9 @@
if(species.base_color && default_colour)
//Apply colour.
- r_skin = hex2num(copytext(species.base_color, 2, 4))
- g_skin = hex2num(copytext(species.base_color, 4, 6))
- b_skin = hex2num(copytext(species.base_color, 6, 8))
+ r_skin = color2R(species.base_color)
+ g_skin = color2G(species.base_color)
+ b_skin = color2B(species.base_color)
else
r_skin = 0
g_skin = 0
@@ -1542,37 +1548,47 @@
var/obj/item/organ/external/head/H = get_organ("head")
if(species.default_hair)
H.h_style = species.default_hair
+ else
+ H.h_style = "Bald"
if(species.default_fhair)
H.f_style = species.default_fhair
+ else
+ H.f_style = "Shaved"
if(species.default_headacc)
H.ha_style = species.default_headacc
+ else
+ H.ha_style = "None"
if(species.default_hair_colour)
//Apply colour.
- H.r_hair = hex2num(copytext(species.default_hair_colour, 2, 4))
- H.g_hair = hex2num(copytext(species.default_hair_colour, 4, 6))
- H.b_hair = hex2num(copytext(species.default_hair_colour, 6, 8))
+ H.r_hair = color2R(species.default_hair_colour)
+ H.g_hair = color2G(species.default_hair_colour)
+ H.b_hair = color2B(species.default_hair_colour)
else
H.r_hair = 0
H.g_hair = 0
H.b_hair = 0
if(species.default_fhair_colour)
- H.r_facial = hex2num(copytext(species.default_fhair_colour, 2, 4))
- H.g_facial = hex2num(copytext(species.default_fhair_colour, 4, 6))
- H.b_facial = hex2num(copytext(species.default_fhair_colour, 6, 8))
+ H.r_facial = color2R(species.default_fhair_colour)
+ H.g_facial = color2G(species.default_fhair_colour)
+ H.b_facial = color2B(species.default_fhair_colour)
else
H.r_facial = 0
H.g_facial = 0
H.b_facial = 0
if(species.default_headacc_colour)
- H.r_headacc = hex2num(copytext(species.default_headacc_colour, 2, 4))
- H.g_headacc = hex2num(copytext(species.default_headacc_colour, 4, 6))
- H.b_headacc = hex2num(copytext(species.default_headacc_colour, 6, 8))
+ H.r_headacc = color2R(species.default_headacc_colour)
+ H.g_headacc = color2G(species.default_headacc_colour)
+ H.b_headacc = color2B(species.default_headacc_colour)
else
H.r_headacc = 0
H.g_headacc = 0
H.b_headacc = 0
+ m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None".
+ m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings.
+ body_accessory = null
+
if(!dna)
dna = new /datum/dna(null)
dna.species = species.name
@@ -1673,16 +1689,13 @@
if(!head_organ)
return
if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics!
- var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null
+ var/optic_colour = input(src, "Select optic colour", m_colours["head"]) as color|null
if(incapacitated())
to_chat(src, "You were interrupted while changing the colour of your optics.")
return
if(optic_colour)
- r_markings = hex2num(copytext(optic_colour, 2, 4))
- g_markings = hex2num(copytext(optic_colour, 4, 6))
- b_markings = hex2num(copytext(optic_colour, 6, 8))
+ change_markings(optic_colour, "head")
- update_markings()
else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
var/list/hair = list()
for(var/i in hair_styles_list)
@@ -1690,14 +1703,12 @@
if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
- var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
+ var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
if(incapacitated())
to_chat(src, "You were interrupted while changing your monitor display.")
return
if(new_style)
- head_organ.h_style = new_style
-
- update_hair()
+ change_hair(new_style)
//Putting a couple of procs here that I don't know where else to dump.
//Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse).
@@ -1977,6 +1988,12 @@
var/obj/item/weapon/card/id/id = wear_id
if(istype(id) && id.is_untrackable())
return 0
+ if(wear_pda)
+ var/obj/item/device/pda/pda = wear_pda
+ if(istype(pda))
+ var/obj/item/weapon/card/id/id = pda.id
+ if(istype(id) && id.is_untrackable())
+ return 0
if(istype(head, /obj/item/clothing/head))
var/obj/item/clothing/head/hat = head
if(hat.blockTracking)
@@ -1992,6 +2009,8 @@
if(wear_id)
. |= wear_id.GetAccess()
+ if(wear_pda)
+ . |= wear_pda.GetAccess()
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
if(U.accessories)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 272cb65e33a..0d30c5c8265 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -4,10 +4,8 @@ var/global/default_martial_art = new/datum/martial_art
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
//Marking colour and style
- var/r_markings = 0
- var/g_markings = 0
- var/b_markings = 0
- var/m_style = "None"
+ var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
+ var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None.
var/s_tone = 0 //Skin tone
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 8288c2dbd8b..50f1e7cd342 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -152,7 +152,7 @@
mutations.Remove(FAT)
update_mutantrace(0)
update_mutations(0)
- update_body(0)
+ update_body(0, 1)
update_inv_w_uniform(0)
update_inv_wear_suit()
@@ -167,7 +167,7 @@
mutations.Add(FAT)
update_mutantrace(0)
update_mutations(0)
- update_body(0)
+ update_body(0, 1)
update_inv_w_uniform(0)
update_inv_wear_suit()
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 72e6ff63314..26ca4af83e8 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -142,7 +142,7 @@
message = uppertext(message)
verb = "yells loudly"
- if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)
+ if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs))
message = "[message]"
returns[1] = message
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 7c14584eee9..96eb24772af 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -120,11 +120,11 @@
var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg'
//Default hair/headacc style vars.
- var/default_hair = "Bald" //Default hair style for newly created humans unless otherwise set.
+ var/default_hair //Default hair style for newly created humans unless otherwise set.
var/default_hair_colour
- var/default_fhair = "Shaved" //Default facial hair style for newly created humans unless otherwise set.
+ var/default_fhair //Default facial hair style for newly created humans unless otherwise set.
var/default_fhair_colour
- var/default_headacc = "None" //Default head accessory style for newly created humans unless otherwise set.
+ var/default_headacc //Default head accessory style for newly created humans unless otherwise set.
var/default_headacc_colour
//Defining lists of icon skin tones for species that have them.
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 924a7c03bf4..1a6c8254a3e 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -8,7 +8,7 @@
language = "Sol Common"
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_TONE
+ bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
unarmed_type = /datum/unarmed_attack/punch
blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
@@ -40,7 +40,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
+ bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING
dietflags = DIET_CARN
cold_level_1 = 280 //Default 260 - Lower is better
@@ -112,13 +112,11 @@
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
- base_color = "#333333"
- //Default styles for created mobs.
- default_headacc = "Tajaran Ears"
+ base_color = "#424242"
butt_sprite = "tajaran"
has_organ = list(
@@ -164,11 +162,11 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
- base_color = "#B43214"
+ base_color = "#CF4D2F"
butt_sprite = "vulp"
has_organ = list(
@@ -212,7 +210,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR
+ bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
dietflags = DIET_HERB
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
@@ -287,7 +285,7 @@
flags = NO_SCAN | IS_WHITELISTED
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
- bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED
+ bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
blood_color = "#2299FC"
flesh_color = "#808D11"
@@ -705,6 +703,7 @@
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
+ bodyflags = HAS_BODY_MARKINGS
dietflags = DIET_HERB
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
@@ -855,7 +854,7 @@
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY
+ bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
dietflags = 0 //IPCs can't eat, so no diet
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
@@ -946,7 +945,7 @@
flags = IS_WHITELISTED | HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
- bodyflags = FEET_CLAWS | HAS_SKIN_TONE
+ bodyflags = FEET_CLAWS | HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 8f7ed81a5fa..037e5234d27 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -212,15 +212,15 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
//BASE MOB SPRITE
-/mob/living/carbon/human/proc/update_body(var/update_icons=1)
+/mob/living/carbon/human/proc/update_body(var/update_icons=1, var/rebuild_base=0)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
- var/husk = (HUSK in src.mutations)
- var/fat = (FAT in src.mutations)
- var/hulk = (HULK in src.mutations)
- var/skeleton = (SKELETON in src.mutations)
+ var/husk = (HUSK in mutations)
+ var/fat = (FAT in mutations)
+ var/hulk = (HULK in mutations)
+ var/skeleton = (SKELETON in mutations)
if(species && species.bodyflags & HAS_ICON_SKIN_TONE)
species.updatespeciescolor(src)
@@ -262,7 +262,7 @@ var/global/list/damage_icon_parts = list()
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
- if(human_icon_cache[icon_key])
+ if(human_icon_cache[icon_key] && !rebuild_base)
base_icon = human_icon_cache[icon_key]
else
//BEGIN CACHED ICON GENERATION.
@@ -309,7 +309,7 @@ var/global/list/damage_icon_parts = list()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
- if(src.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs...
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
else
overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's
@@ -360,29 +360,32 @@ var/global/list/damage_icon_parts = list()
//MARKINGS OVERLAY
/mob/living/carbon/human/proc/update_markings(var/update_icons=1)
- //Reset our markings
+ //Reset our markings.
overlays_standing[MARKINGS_LAYER] = null
+ //Base icon.
+ var/icon/markings_standing = new/icon('icons/mob/body_accessory.dmi',"accessory_none_s")
+
+ //Body markings.
var/obj/item/organ/external/chest/chest_organ = get_organ("chest")
- if(!chest_organ || chest_organ.is_stump() || (chest_organ.status & ORGAN_DESTROYED) )
- if(update_icons) update_icons()
- return
-
- //base icons
- var/icon/markings_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
-
- if(m_style && m_style != "None")
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style)
- var/obj/item/organ/external/head/head_organ = get_organ("head")
- if((!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) && marking_style.marking_location == "head")
- return //If the head is destroyed and it is the organ the marking is located on, get us out of here. This prevents floating optical markings on decapitated IPCs, for example.
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- markings_standing.Blend(markings_s, ICON_OVERLAY)
- else
- //warning("Invalid m_style for [species.name]: [m_style]")
+ if(chest_organ && !chest_organ.is_stump() && !(chest_organ.status & ORGAN_DESTROYED) && m_styles["body"])
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ if(body_marking_style.do_colouration)
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ markings_standing.Blend(b_marking_s, ICON_OVERLAY)
+ //Head markings.
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(head_organ && !head_organ.is_stump() && !(head_organ.status & ORGAN_DESTROYED) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ markings_standing.Blend(h_marking_s, ICON_OVERLAY)
overlays_standing[MARKINGS_LAYER] = image(markings_standing)
@@ -399,7 +402,7 @@ var/global/list/damage_icon_parts = list()
return
//masks and helmets can obscure our head accessory
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -426,15 +429,15 @@ var/global/list/damage_icon_parts = list()
//HAIR OVERLAY
/mob/living/carbon/human/proc/update_hair(var/update_icons=1)
//Reset our hair
- overlays_standing[HAIR_LAYER] = null
+ overlays_standing[HAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -454,13 +457,19 @@ var/global/list/damage_icon_parts = list()
else if(hair_style.do_colouration)
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY)
//Having it this way preserves animations. Useful for IPC screens.
else
//warning("Invalid h_style for [species.name]: [h_style]")
//hair_standing.Blend(debrained_s, ICON_OVERLAY)//how does i overlay for fish?
- overlays_standing[HAIR_LAYER] = image(hair_standing)
+ overlays_standing[HAIR_LAYER] = image(hair_standing)
if(update_icons) update_icons()
@@ -468,15 +477,15 @@ var/global/list/damage_icon_parts = list()
//FACIAL HAIR OVERLAY
/mob/living/carbon/human/proc/update_fhair(var/update_icons=1)
//Reset our facial hair
- overlays_standing[FHAIR_LAYER] = null
+ overlays_standing[FHAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our facial hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -492,11 +501,18 @@ var/global/list/damage_icon_parts = list()
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
else if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_standing.Blend(facial_s, ICON_OVERLAY)
else
//warning("Invalid f_style for [species.name]: [f_style]")
- overlays_standing[FHAIR_LAYER] = image(face_standing)
+ overlays_standing[FHAIR_LAYER] = image(face_standing)
if(update_icons) update_icons()
@@ -536,7 +552,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1)
//BS12 EDIT
- var/skel = (SKELETON in src.mutations)
+ var/skel = (SKELETON in mutations)
if(skel)
skeleton = 'icons/mob/human_races/r_skeleton.dmi'
else
@@ -562,7 +578,7 @@ var/global/list/damage_icon_parts = list()
..()
if(notransform) return
update_mutations(0)
- update_body(0)
+ update_body(0, 1) //Update the body and force limb icon regeneration.
update_hair(0)
update_head_accessory(0)
update_fhair(0)
@@ -997,13 +1013,21 @@ var/global/list/damage_icon_parts = list()
if(inv)
inv.update_icon()
if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory)))
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ var/datum/sprite_accessory/alt_heads/alternate_head
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ alternate_head = alt_heads_list[head_organ.alt_head]
+
var/image/standing
+ var/icon/mask_icon = new(wear_mask.icon)
if(wear_mask.icon_override)
- standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.icon_override)
+ standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name])
- standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.sprite_sheets[species.name])
+ standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else
- standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
+ standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood")
@@ -1053,7 +1077,7 @@ var/global/list/damage_icon_parts = list()
clear_alert("legcuffed")
if(legcuffed)
overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1")
- throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
if(m_intent != "walk")
m_intent = "walk"
if(hud_used && hud_used.move_intent)
@@ -1121,71 +1145,66 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(new/icon(accessory_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(accessory_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(accessory_s,dir=WEST),dir=WEST)
-
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
// Creates a blank icon, and copies accessory_s' north direction sprite into it
// before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
+ var/icon/over = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- temp2.Insert(new/icon(accessory_s,dir=NORTH),dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(new/icon(tail_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(tail_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(tail_s,dir=WEST),dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ under.Insert(new/icon(tail_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tail_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tail_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(new/icon(tail_s,dir=NORTH),dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ over.Insert(new/icon(tail_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tail_s)
+ overlays_standing[TAIL_LAYER] = image(tail_s)
if(update_icons)
update_icons()
@@ -1193,70 +1212,67 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]w_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(body_accessory.allowed_species)
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species))
+ under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(accessory_s,dir=SOUTH)
- temp1.Insert(accessory_s,dir=EAST)
- temp1.Insert(accessory_s,dir=WEST)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
+ over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else // Else if the user's species is not in the list of allowed species for the currently selected body accessory, this point must have been reached by admin-override. Use vulpkanin timings as default.
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
-
- temp2.Insert(accessory_s,dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL)
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(tailw_s,dir=SOUTH)
- temp1.Insert(tailw_s,dir=EAST)
- temp1.Insert(tailw_s,dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(tailw_s,dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tailw_s)
+ overlays_standing[TAIL_LAYER] = image(tailw_s)
if(update_icons)
update_icons()
@@ -1282,17 +1298,17 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.icon_override)
var/icon_path = "[wear_suit.icon_override]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
var/icon_path = "[wear_suit.sprite_sheets[species.name]]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else
if(wear_suit.icon_state in C.IconStates())
standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index e534d67ee72..3987b709e3e 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -80,9 +80,6 @@ proc/get_radio_key_from_channel(var/channel)
verb = "stammers"
speech_problem_flag = 1
- if(COMIC in mutations)
- message = "[message]"
-
if(!IsVocal())
message = ""
speech_problem_flag = 1
@@ -283,8 +280,14 @@ 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
+/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't already snowflaked to shit can call the parent and handle emoting sanely
+ if(client)
+ if(client.prefs.muted & MUTE_IC)
+ to_chat(src, "You cannot speak in IC (Muted).")
+ return
+
+ if(stat)
+ return 0
if(..(act, type, message))
return 1
diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm
index fa71b48232e..bd93fd6c3c4 100644
--- a/code/modules/mob/living/silicon/login.dm
+++ b/code/modules/mob/living/silicon/login.dm
@@ -1,15 +1,12 @@
/mob/living/silicon/Login()
sleeping = 0
if(mind && ticker && ticker.mode)
- ticker.mode.remove_traitor(mind)
- ticker.mode.remove_traitor_mind(mind)
ticker.mode.remove_revolutionary(mind, 1)
ticker.mode.remove_cultist(mind, 1)
ticker.mode.remove_wizard(mind)
ticker.mode.remove_changeling(mind)
ticker.mode.remove_vampire(mind)
ticker.mode.remove_thrall(mind, 0)
- ticker.mode.remove_operative(mind)
ticker.mode.remove_shadowling(mind)
ticker.mode.remove_abductor(mind)
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index dfa79a0d0d1..104c2746d16 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -547,8 +547,7 @@
else
var/datum/gas_mixture/env = T.return_air()
data["reading"] = 1
- var/pres = env.return_pressure() * 10
- data["pressure"] = "[round(pres/10)].[pres%10]"
+ data["pressure"] = env.return_pressure()
data["temperature"] = round(env.temperature)
data["temperatureC"] = round(env.temperature-T0C)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
index 0a98e276c43..053384baba5 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
@@ -1,4 +1,7 @@
-/mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null)
+/mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null)
+ if(copytext(message, 1, 2) == "*")
+ return emote(copytext(message, 2))
+
if(!speaking)
speaking = parse_language(message)
if(!speaking)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 7e771b2f372..335ecbcd1f6 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -730,18 +730,18 @@ var/list/robot_verbs_default = list(
else
to_chat(user, "Unable to locate a radio.")
- else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
+ else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
if(emagged)//still allow them to open the cover
- to_chat(user, "The interface seems slightly damaged")
+ to_chat(user, "The interface seems slightly damaged.")
if(opened)
to_chat(user, "You must close the cover to swipe an ID card.")
else
- if(allowed(usr))
+ if(allowed(W))
locked = !locked
to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.")
update_icons()
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied.")
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
@@ -957,29 +957,15 @@ var/list/robot_verbs_default = list(
user.visible_message("[user] pets [src]!", \
"You pet [src]!")
-/mob/living/silicon/robot/proc/allowed(mob/M)
- //check if it doesn't require any access at all
- if(check_access(null))
+/mob/living/silicon/robot/proc/allowed(obj/item/I)
+ var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob
+ dummy.req_access = req_access
+
+ if(dummy.check_access(I))
+ qdel(dummy)
return 1
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- //if they are holding or wearing a card that has access, that works
- if(check_access(H.get_active_hand()) || check_access(H.wear_id))
- return 1
- return 0
-
-/mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I)
- if(!istype(req_access, /list)) //something's very wrong
- return 1
-
- var/list/L = req_access
- if(!L.len) //no requirements
- return 1
- if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
- return 0
- for(var/req in req_access)
- if(req in I.access) //have one of the required accesses
- return 1
+
+ qdel(dummy)
return 0
/mob/living/silicon/robot/update_icons()
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index c59cdf0570a..64469bb87ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -154,7 +154,7 @@
if(istype(noms, /turf/simulated/wall))
W = noms
nomDelay *= 2
- if(W.walltype == "rwall")
+ if(istype(W, /turf/simulated/wall/r_wall))
nomDelay *= 2
else
return
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index c55fa301e10..d99da389b8f 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -517,7 +517,8 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
var/length
var/pos
for(var/datum/objective/objective in all_objectives)
- if(objective.target != mind) continue
+ if(!mind || objective.target != mind)
+ continue
length = lentext(oldname)
pos = findtextEx(objective.explanation_text, oldname)
objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index cf8a7f05574..f0bcbfe0312 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -1,6 +1,10 @@
/datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
/datum/preferences/proc/random_character(gender_override)
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
if(gender_override)
gender = gender_override
else
@@ -8,18 +12,41 @@
underwear = random_underwear(gender, species)
undershirt = random_undershirt(gender, species)
socks = random_socks(gender, species)
- if(species in list("Human", "Drask"))
- s_tone = random_skin_tone()
- h_style = random_hair_style(gender, species)
- f_style = random_facial_hair_style(gender, species)
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin")
+ if(species == "Vulpkanin")
+ body_accessory = random_body_accessory(species)
+ if(body_accessory == "None") //Required to prevent a bug where the information/icons in the character preferences screen wouldn't update despite the data being changed.
+ body_accessory = null
+ if(species in list("Human", "Drask", "Vox"))
+ s_tone = random_skin_tone(species)
+ h_style = random_hair_style(gender, species, robohead)
+ f_style = random_facial_hair_style(gender, species, robohead)
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
randomize_hair_color("hair")
- randomize_hair_color("facial")
- randomize_eyes_color()
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin")
+ randomize_hair_color("facial")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))
+ ha_style = random_head_accessory(species)
+ var/list/colours = randomize_skin_color(1)
+ r_headacc = colours["red"]
+ g_headacc = colours["green"]
+ b_headacc = colours["blue"]
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin"))
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask"))
+ m_styles["body"] = random_marking_style("body", species)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species != "Machine")
+ randomize_eyes_color()
+ if(species in list("Unathi", "Tajaran", "Skrell", "Vulpkanin"))
randomize_skin_color()
backbag = 2
- age = rand(AGE_MIN,AGE_MAX)
+ age = rand(AGE_MIN, AGE_MAX)
/datum/preferences/proc/randomize_hair_color(var/target = "hair")
@@ -130,7 +157,7 @@
g_eyes = green
b_eyes = blue
-/datum/preferences/proc/randomize_skin_color()
+/datum/preferences/proc/randomize_skin_color(var/pass_to_list)
var/red
var/green
var/blue
@@ -174,9 +201,17 @@
green = max(min(green + rand (-25, 25), 255), 0)
blue = max(min(blue + rand (-25, 25), 255), 0)
- r_skin = red
- g_skin = green
- b_skin = blue
+ if(pass_to_list)
+ var/list/colours = list(
+ "red" = red,
+ "blue" = blue,
+ "green" = green
+ )
+ return colours
+ else
+ r_skin = red
+ g_skin = green
+ b_skin = blue
/datum/preferences/proc/blend_backpack(var/icon/clothes_s,var/backbag,var/satchel,var/backpack="backpack")
switch(backbag)
@@ -222,26 +257,12 @@
fat="_fat"
preview_icon = new /icon(icobase, "torso_[g][fat]")
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
- preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
-
- //Tail
- if(current_species && (current_species.bodyflags & HAS_TAIL))
- var/tail_icon
- var/tail_icon_state
-
- if(body_accessory)
- var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
- tail_icon = accessory.icon
- tail_icon_state = accessory.icon_state
- else
- tail_icon = "icons/effects/species.dmi"
- if(coloured_tail)
- tail_icon_state = "[coloured_tail]_s"
- else
- tail_icon_state = "[current_species.tail]_s"
-
- var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state)
- preview_icon.Blend(temp, ICON_OVERLAY)
+ var/head = "head"
+ if(alt_head && current_species.bodyflags & HAS_ALT_HEADS)
+ var/datum/sprite_accessory/alt_heads/H = alt_heads_list[alt_head]
+ if(H.icon_state)
+ head = H.icon_state
+ preview_icon.Blend(new /icon(icobase, "[head]_[g]"), ICON_OVERLAY)
for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand"))
if(organ_data[name] == "amputated") continue
@@ -266,13 +287,53 @@
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
- //Body Markings
- if(current_species && (current_species.bodyflags & HAS_MARKINGS))
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style && marking_style.species_allowed)
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- preview_icon.Blend(markings_s, ICON_OVERLAY)
+ //Tail
+ if(current_species && (current_species.bodyflags & HAS_TAIL))
+ var/tail_icon
+ var/tail_icon_state
+
+ if(body_accessory)
+ var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
+ tail_icon = accessory.icon
+ tail_icon_state = accessory.icon_state
+ else
+ tail_icon = "icons/effects/species.dmi"
+ if(coloured_tail)
+ tail_icon_state = "[coloured_tail]_s"
+ else
+ tail_icon_state = "[current_species.tail]_s"
+
+ var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state)
+
+ if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR))
+ temp.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
+
+ if(current_species && (current_species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking]
+ if(tail_marking_style && tail_marking_style.species_allowed)
+ var/icon/t_marking_s = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ t_marking_s.Blend(m_colours["tail"], ICON_ADD)
+ temp.Blend(t_marking_s, ICON_OVERLAY)
+
+ preview_icon.Blend(temp, ICON_OVERLAY)
+
+ //Markings
+ if(current_species && ((current_species.bodyflags & HAS_HEAD_MARKINGS) || (current_species.bodyflags & HAS_BODY_MARKINGS)))
+ if(current_species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed)
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ preview_icon.Blend(b_marking_s, ICON_OVERLAY)
+ if(current_species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed)
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ preview_icon.Blend(h_marking_s, ICON_OVERLAY)
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
@@ -289,6 +350,13 @@
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(r_hair_sec, g_hair_sec, b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
@@ -306,6 +374,13 @@
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(r_facial_sec, g_facial_sec, b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_s.Blend(facial_s, ICON_OVERLAY)
var/icon/underwear_s = null
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 3ade5970d03..0e8f3456335 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -25,14 +25,15 @@
for(var/path in subtypesof(prototype))
var/datum/sprite_accessory/D = new path()
- L[D.name] = D
+ if(D.name)
+ L[D.name] = D
- switch(D.gender)
- if(MALE) male[D.name] = D
- if(FEMALE) female[D.name] = D
- else
- male[D.name] = D
- female[D.name] = D
+ switch(D.gender)
+ if(MALE) male[D.name] = D
+ if(FEMALE) female[D.name] = D
+ else
+ male[D.name] = D
+ female[D.name] = D
return L
/datum/sprite_accessory
@@ -43,8 +44,12 @@
// Restrict some styles to specific species
var/list/species_allowed = list("Human", "Slime People")
- var/models_allowed = list() //Specifies which, if any, hairstyles can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with.
+ var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with.
var/marking_location //Specifies which bodypart a body marking is located on.
+ var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this.
+ var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme.
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -61,492 +66,762 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
- bald
- name = "Bald"
- icon_state = "bald"
- gender = MALE
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton")
+/datum/sprite_accessory/hair/bald
+ name = "Bald"
+ icon_state = "bald"
+ species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran")
- short
- name = "Short Hair" // try to capatilize the names please~
- icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
+/datum/sprite_accessory/hair/short
+ name = "Short Hair" // try to capatilize the names please~
+ icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
- cut
- name = "Cut Hair"
- icon_state = "hair_c"
+/datum/sprite_accessory/hair/cut
+ name = "Cut Hair"
+ icon_state = "hair_c"
- long
- name = "Shoulder-length Hair"
- icon_state = "hair_b"
+/datum/sprite_accessory/hair/long
+ name = "Shoulder-length Hair"
+ icon_state = "hair_b"
- longalt
- name = "Shoulder-length Hair Alt"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longalt
+ name = "Shoulder-length Hair Alt"
+ icon_state = "hair_longfringe"
- /*longish
- name = "Longer Hair"
- icon_state = "hair_b2"*/
+/*/datum/sprite_accessory/hair/longish
+ name = "Longer Hair"
+ icon_state = "hair_b2"*/
- longer
- name = "Long Hair"
- icon_state = "hair_vlong"
+/datum/sprite_accessory/hair/longer
+ name = "Long Hair"
+ icon_state = "hair_vlong"
- longeralt
- name = "Long Hair Alt"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longeralt
+ name = "Long Hair Alt"
+ icon_state = "hair_vlongfringe"
- longest
- name = "Very Long Hair"
- icon_state = "hair_longest"
+/datum/sprite_accessory/hair/longest
+ name = "Very Long Hair"
+ icon_state = "hair_longest"
- longfringe
- name = "Long Fringe"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longfringe
+ name = "Long Fringe"
+ icon_state = "hair_longfringe"
- longestalt
- name = "Longer Fringe"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longestalt
+ name = "Longer Fringe"
+ icon_state = "hair_vlongfringe"
- halfbang
- name = "Half-banged Hair"
- icon_state = "hair_halfbang"
+/datum/sprite_accessory/hair/halfbang
+ name = "Half-banged Hair"
+ icon_state = "hair_halfbang"
- halfbangalt
- name = "Half-banged Hair Alt"
- icon_state = "hair_halfbang_alt"
+/datum/sprite_accessory/hair/halfbangalt
+ name = "Half-banged Hair Alt"
+ icon_state = "hair_halfbang_alt"
- ponytail1
- name = "Ponytail male"
- icon_state = "hair_ponytailm"
- gender = MALE
+/datum/sprite_accessory/hair/ponytail1
+ name = "Ponytail male"
+ icon_state = "hair_ponytailm"
+ gender = MALE
- ponytail2
- name = "Ponytail female"
- icon_state = "hair_ponytailf"
- gender = FEMALE
+/datum/sprite_accessory/hair/ponytail2
+ name = "Ponytail female"
+ icon_state = "hair_ponytailf"
+ gender = FEMALE
- ponytail3
- name = "Ponytail alt"
- icon_state = "hair_ponytail3"
+/datum/sprite_accessory/hair/ponytail3
+ name = "Ponytail alt"
+ icon_state = "hair_ponytail3"
- sideponytail
- name = "Side Ponytail"
- icon_state = "hair_stail"
- gender = FEMALE
+/datum/sprite_accessory/hair/sideponytail
+ name = "Side Ponytail"
+ icon_state = "hair_stail"
+ gender = FEMALE
- highponytail
- name = "High Ponytail"
- icon_state = "hair_highponytail"
- gender = FEMALE
+/datum/sprite_accessory/hair/highponytail
+ name = "High Ponytail"
+ icon_state = "hair_highponytail"
+ gender = FEMALE
+/datum/sprite_accessory/hair/wisp
+ name = "Wisp"
+ icon_state = "hair_wisp"
+ gender = FEMALE
- wisp
- name = "Wisp"
- icon_state = "hair_wisp"
- gender = FEMALE
+/datum/sprite_accessory/hair/parted
+ name = "Parted"
+ icon_state = "hair_parted"
- parted
- name = "Parted"
- icon_state = "hair_parted"
+/datum/sprite_accessory/hair/pompadour
+ name = "Pompadour"
+ icon_state = "hair_pompadour"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- pompadour
- name = "Pompadour"
- icon_state = "hair_pompadour"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/quiff
+ name = "Quiff"
+ icon_state = "hair_quiff"
+ gender = MALE
- quiff
- name = "Quiff"
- icon_state = "hair_quiff"
- gender = MALE
+/datum/sprite_accessory/hair/bedhead
+ name = "Bedhead"
+ icon_state = "hair_bedhead"
- bedhead
- name = "Bedhead"
- icon_state = "hair_bedhead"
+/datum/sprite_accessory/hair/bedhead2
+ name = "Bedhead 2"
+ icon_state = "hair_bedheadv2"
- bedhead2
- name = "Bedhead 2"
- icon_state = "hair_bedheadv2"
+/datum/sprite_accessory/hair/bedhead3
+ name = "Bedhead 3"
+ icon_state = "hair_bedheadv3"
- bedhead3
- name = "Bedhead 3"
- icon_state = "hair_bedheadv3"
+/datum/sprite_accessory/hair/beehive
+ name = "Beehive"
+ icon_state = "hair_beehive"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- beehive
- name = "Beehive"
- icon_state = "hair_beehive"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bobcurl
+ name = "Bobcurl"
+ icon_state = "hair_bobcurl"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bobcurl
- name = "Bobcurl"
- icon_state = "hair_bobcurl"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bob
+ name = "Bob"
+ icon_state = "hair_bobcut"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bob
- name = "Bob"
- icon_state = "hair_bobcut"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bowl
+ name = "Bowl"
+ icon_state = "hair_bowlcut"
+ gender = MALE
- bowl
- name = "Bowl"
- icon_state = "hair_bowlcut"
- gender = MALE
+/datum/sprite_accessory/hair/braid2
+ name = "Long Braid"
+ icon_state = "hair_hbraid"
+ gender = FEMALE
- braid2
- name = "Long Braid"
- icon_state = "hair_hbraid"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid_hip
+ name = "Hippie Braid"
+ icon_state = "hair_hipbraid"
+ secondary_theme = "beads"
- buzz
- name = "Buzzcut"
- icon_state = "hair_buzzcut"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/braid_hip_una
+ name = "Unathi Hippie Braid"
+ icon_state = "hair_ubraid"
+ species_allowed = list("Unathi")
+ secondary_theme = "beads"
- crew
- name = "Crewcut"
- icon_state = "hair_crewcut"
- gender = MALE
+/datum/sprite_accessory/hair/buzz
+ name = "Buzzcut"
+ icon_state = "hair_buzzcut"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- combover
- name = "Combover"
- icon_state = "hair_combover"
- gender = MALE
+/datum/sprite_accessory/hair/crew
+ name = "Crewcut"
+ icon_state = "hair_crewcut"
+ gender = MALE
- devillock
- name = "Devil Lock"
- icon_state = "hair_devilock"
+/datum/sprite_accessory/hair/combover
+ name = "Combover"
+ icon_state = "hair_combover"
+ gender = MALE
- dreadlocks
- name = "Dreadlocks"
- icon_state = "hair_dreads"
+/datum/sprite_accessory/hair/devillock
+ name = "Devil Lock"
+ icon_state = "hair_devilock"
- curls
- name = "Curls"
- icon_state = "hair_curls"
+/datum/sprite_accessory/hair/dreadlocks
+ name = "Dreadlocks"
+ icon_state = "hair_dreads"
- afro
- name = "Afro"
- icon_state = "hair_afro"
+/datum/sprite_accessory/hair/curls
+ name = "Curls"
+ icon_state = "hair_curls"
- afro2
- name = "Afro 2"
- icon_state = "hair_afro2"
+/datum/sprite_accessory/hair/afro
+ name = "Afro"
+ icon_state = "hair_afro"
- afro_large
- name = "Big Afro"
- icon_state = "hair_bigafro"
- gender = MALE
+/datum/sprite_accessory/hair/afro2
+ name = "Afro 2"
+ icon_state = "hair_afro2"
- sargeant
- name = "Flat Top"
- icon_state = "hair_sargeant"
- gender = MALE
+/datum/sprite_accessory/hair/afro_large
+ name = "Big Afro"
+ icon_state = "hair_bigafro"
+ gender = MALE
- emo
- name = "Emo"
- icon_state = "hair_emo"
+/datum/sprite_accessory/hair/sergeant
+ name = "Flat Top"
+ icon_state = "hair_sergeant"
+ gender = MALE
- fag
- name = "Flow Hair"
- icon_state = "hair_f"
+/datum/sprite_accessory/hair/emo
+ name = "Emo"
+ icon_state = "hair_emo"
- feather
- name = "Feather"
- icon_state = "hair_feather"
+/datum/sprite_accessory/hair/fag
+ name = "Flow Hair"
+ icon_state = "hair_f"
- hitop
- name = "Hitop"
- icon_state = "hair_hitop"
- gender = MALE
+/datum/sprite_accessory/hair/feather
+ name = "Feather"
+ icon_state = "hair_feather"
- mohawk
- name = "Mohawk"
- icon_state = "hair_d"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/hitop
+ name = "Hitop"
+ icon_state = "hair_hitop"
+ gender = MALE
- jensen
- name = "Adam Jensen Hair"
- icon_state = "hair_jensen"
- gender = MALE
+/datum/sprite_accessory/hair/mohawk
+ name = "Mohawk"
+ icon_state = "hair_d"
+ species_allowed = list("Human", "Slime People", "Unathi")
- cia
- name = "CIA"
- icon_state = "hair_cia"
- gender = MALE
+/datum/sprite_accessory/hair/jensen
+ name = "Adam Jensen Hair"
+ icon_state = "hair_jensen"
+ gender = MALE
- mulder
- name = "Mulder"
- icon_state = "hair_mulder"
- gender = MALE
+/datum/sprite_accessory/hair/cia
+ name = "CIA"
+ icon_state = "hair_cia"
+ gender = MALE
- gelled
- name = "Gelled Back"
- icon_state = "hair_gelled"
- gender = FEMALE
+/datum/sprite_accessory/hair/mulder
+ name = "Mulder"
+ icon_state = "hair_mulder"
+ gender = MALE
- gentle
- name = "Gentle"
- icon_state = "hair_gentle"
- gender = FEMALE
+/datum/sprite_accessory/hair/gelled
+ name = "Gelled Back"
+ icon_state = "hair_gelled"
+ gender = FEMALE
- spiky
- name = "Spiky"
- icon_state = "hair_spikey"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/gentle
+ name = "Gentle"
+ icon_state = "hair_gentle"
+ gender = FEMALE
- kusangi
- name = "Kusanagi Hair"
- icon_state = "hair_kusanagi"
+/datum/sprite_accessory/hair/spiky
+ name = "Spiky"
+ icon_state = "hair_spikey"
+ species_allowed = list("Human", "Slime People", "Unathi")
- kagami
- name = "Pigtails"
- icon_state = "hair_kagami"
- gender = FEMALE
+/datum/sprite_accessory/hair/kusanagi
+ name = "Kusanagi Hair"
+ icon_state = "hair_kusanagi"
- himecut
- name = "Hime Cut"
- icon_state = "hair_himecut"
- gender = FEMALE
+/datum/sprite_accessory/hair/kagami
+ name = "Pigtails"
+ icon_state = "hair_kagami"
+ gender = FEMALE
- braid
- name = "Floorlength Braid"
- icon_state = "hair_braid"
- gender = FEMALE
+/datum/sprite_accessory/hair/himecut
+ name = "Hime Cut"
+ icon_state = "hair_himecut"
+ gender = FEMALE
- odango
- name = "Odango"
- icon_state = "hair_odango"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid
+ name = "Floorlength Braid"
+ icon_state = "hair_braid"
+ gender = FEMALE
- ombre
- name = "Ombre"
- icon_state = "hair_ombre"
- gender = FEMALE
+/datum/sprite_accessory/hair/odango
+ name = "Odango"
+ icon_state = "hair_odango"
+ gender = FEMALE
- updo
- name = "Updo"
- icon_state = "hair_updo"
- gender = FEMALE
+/datum/sprite_accessory/hair/ombre
+ name = "Ombre"
+ icon_state = "hair_ombre"
+ gender = FEMALE
- skinhead
- name = "Skinhead"
- icon_state = "hair_skinhead"
+/datum/sprite_accessory/hair/updo
+ name = "Updo"
+ icon_state = "hair_updo"
+ gender = FEMALE
- balding
- name = "Balding Hair"
- icon_state = "hair_e"
- gender = MALE // turnoff!
+/datum/sprite_accessory/hair/skinhead
+ name = "Skinhead"
+ icon_state = "hair_skinhead"
- longemo
- name = "Long Emo"
- icon_state = "hair_emolong"
- gender = FEMALE
+/datum/sprite_accessory/hair/balding
+ name = "Balding Hair"
+ icon_state = "hair_e"
+ gender = MALE // turnoff!
+
+/datum/sprite_accessory/hair/longemo
+ name = "Long Emo"
+ icon_state = "hair_emolong"
+ gender = FEMALE
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- birdnest
- name = "Bird Nest"
- icon_state = "hair_birdnest"
+/datum/sprite_accessory/hair/birdnest
+ name = "Bird Nest"
+ icon_state = "hair_birdnest"
- unkept
- name = "Unkempt"
- icon_state = "hair_unkept"
+/datum/sprite_accessory/hair/unkept
+ name = "Unkempt"
+ icon_state = "hair_unkept"
- duelist
- name = "Duelist"
- icon_state = "hair_duelist"
- gender = MALE
+/datum/sprite_accessory/hair/duelist
+ name = "Duelist"
+ icon_state = "hair_duelist"
+ gender = MALE
- modern
- name = "Modern"
- icon_state = "hair_modern"
- gender = FEMALE
+/datum/sprite_accessory/hair/modern
+ name = "Modern"
+ icon_state = "hair_modern"
+ gender = FEMALE
- unshavenmohawk
- name = "Unshaven Mohawk"
- icon_state = "hair_unshavenmohawk"
- gender = MALE
+/datum/sprite_accessory/hair/unshavenmohawk
+ name = "Unshaven Mohawk"
+ icon_state = "hair_unshavenmohawk"
+ gender = MALE
- drills
- name = "Twincurls"
- icon_state = "hair_twincurl"
- gender = FEMALE
+/datum/sprite_accessory/hair/drills
+ name = "Twincurls"
+ icon_state = "hair_twincurl"
+ gender = FEMALE
- minidrills
- name = "Twincurls 2"
- icon_state = "hair_twincurl2"
- gender = FEMALE
+/datum/sprite_accessory/hair/minidrills
+ name = "Twincurls 2"
+ icon_state = "hair_twincurl2"
+ gender = FEMALE
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
+/datum/sprite_accessory/hair/ipc
+ species_allowed = list("Machine")
- ipc_screen_pink
- name = "Pink IPC Screen"
- icon_state = "ipc_pink"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_pink
+ name = "Pink IPC Screen"
+ icon_state = "ipc_pink"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_red
- name = "Red IPC Screen"
- icon_state = "ipc_red"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_red
+ name = "Red IPC Screen"
+ icon_state = "ipc_red"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_green
- name = "Green IPC Screen"
- icon_state = "ipc_green"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_green
+ name = "Green IPC Screen"
+ icon_state = "ipc_green"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_blue
- name = "Blue IPC Screen"
- icon_state = "ipc_blue"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_blue
+ name = "Blue IPC Screen"
+ icon_state = "ipc_blue"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_breakout
- name = "Breakout IPC Screen"
- icon_state = "ipc_breakout"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_breakout
+ name = "Breakout IPC Screen"
+ icon_state = "ipc_breakout"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_eight
- name = "Eight IPC Screen"
- icon_state = "ipc_eight"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_eight
+ name = "Eight IPC Screen"
+ icon_state = "ipc_eight"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rainbow
- name = "Rainbow IPC Screen"
- icon_state = "ipc_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow
+ name = "Rainbow IPC Screen"
+ icon_state = "ipc_rainbow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_goggles
- name = "Goggles IPC Screen"
- icon_state = "ipc_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_goggles
+ name = "Goggles IPC Screen"
+ icon_state = "ipc_goggles"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_heart
- name = "Heart IPC Screen"
- icon_state = "ipc_heart"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_heart
+ name = "Heart IPC Screen"
+ icon_state = "ipc_heart"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_monoeye
- name = "Monoeye IPC Screen"
- icon_state = "ipc_monoeye"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye
+ name = "Monoeye IPC Screen"
+ icon_state = "ipc_monoeye"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_nature
- name = "Nature IPC Screen"
- icon_state = "ipc_nature"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_nature
+ name = "Nature IPC Screen"
+ icon_state = "ipc_nature"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_orange
- name = "Orange IPC Screen"
- icon_state = "ipc_orange"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_orange
+ name = "Orange IPC Screen"
+ icon_state = "ipc_orange"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_purple
- name = "Purple IPC Screen"
- icon_state = "ipc_purple"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_purple
+ name = "Purple IPC Screen"
+ icon_state = "ipc_purple"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_shower
- name = "Shower IPC Screen"
- icon_state = "ipc_shower"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_shower
+ name = "Shower IPC Screen"
+ icon_state = "ipc_shower"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_static
- name = "Static IPC Screen"
- icon_state = "ipc_static"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_static
+ name = "Static IPC Screen"
+ icon_state = "ipc_static"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_yellow
- name = "Yellow IPC Screen"
- icon_state = "ipc_yellow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_yellow
+ name = "Yellow IPC Screen"
+ icon_state = "ipc_yellow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_scrolling
- name = "Scanline IPC Screen"
- icon_state = "ipc_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling
+ name = "Scanline IPC Screen"
+ icon_state = "ipc_scroll"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_console
- name = "Console IPC Screen"
- icon_state = "ipc_console"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_console
+ name = "Console IPC Screen"
+ icon_state = "ipc_console"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rgb
- name = "RGB IPC Screen"
- icon_state = "ipc_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rgb
+ name = "RGB IPC Screen"
+ icon_state = "ipc_rgb"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_glider
- name = "Glider IPC Screen"
- icon_state = "ipc_gol_glider"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_glider
+ name = "Glider IPC Screen"
+ icon_state = "ipc_gol_glider"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- hesphiastos_alt_off
- name = "Dark Hesphiastos Screen"
- icon_state = "hesphiastos_alt_off"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off
+ name = "Dark Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_off"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_pink
- name = "Pink Hesphiastos Screen"
- icon_state = "hesphiastos_alt_pink"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_pink
+ name = "Pink Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_pink"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_orange
- name = "Orange Hesphiastos Screen"
- icon_state = "hesphiastos_alt_orange"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_orange
+ name = "Orange Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_orange"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_goggle
- name = "Goggles Hesphiastos Screen"
- icon_state = "hesphiastos_alt_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_goggle
+ name = "Goggles Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_goggles"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_scroll
- name = "Scrolling Hesphiastos Screen"
- icon_state = "hesphiastos_alt_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_scroll
+ name = "Scrolling Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_scroll"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rgb
- name = "RGB Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rgb
+ name = "RGB Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rgb"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rainbow
- name = "Rainbow Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rainbow
+ name = "Rainbow Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rainbow"
+ models_allowed = list("Hesphiastos Industries alt.")
+
+/*
+///////////////////////////////////
+/ =---------------------------= /
+/ == Alien Style Definitions == /
+/ =---------------------------= /
+///////////////////////////////////
+*/
+
+/datum/sprite_accessory/hair/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/hair/unathi/una_horns
+ name = "Unathi Horns"
+ icon_state = "soghun_horns"
+
+/datum/sprite_accessory/hair/skrell
+ species_allowed = list("Skrell")
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_m
+ name = "Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_f
+ name = "Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+
+/datum/sprite_accessory/hair/skrell/skr_gold_m
+ name = "Gold plated Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_gold_f
+ name = "Gold chained Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_m
+ name = "Cloth draped Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_f
+ name = "Cloth draped Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/hair/tajara/taj_hair_clean
+ name = "Tajara Clean"
+ icon_state = "hair_clean"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bangs
+ name = "Tajara Bangs"
+ icon_state = "hair_bangs"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_braid
+ name = "Tajara Braid"
+ icon_state = "hair_tbraid"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_shaggy
+ name = "Tajara Shaggy"
+ icon_state = "hair_shaggy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_mohawk
+ name = "Tajaran Mohawk"
+ icon_state = "hair_mohawk"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_plait
+ name = "Tajara Plait"
+ icon_state = "hair_plait"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_straight
+ name = "Tajara Straight"
+ icon_state = "hair_straight"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_long
+ name = "Tajara Long"
+ icon_state = "hair_long"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_rattail
+ name = "Tajara Rat Tail"
+ icon_state = "hair_rattail"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_spiky
+ name = "Tajara Spikey"
+ icon_state = "hair_tajspikey"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_messy
+ name = "Tajara Messy"
+ icon_state = "hair_messy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_curls
+ name = "Tajara Curly"
+ icon_state = "hair_curly"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_retro
+ name = "Tajaran Ladies' Retro"
+ icon_state = "hair_ladies_retro"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_victory
+ name = "Tajara Victory Curls"
+ icon_state = "hair_victory"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bob
+ name = "Tajara Bob"
+ icon_state = "hair_tbob"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_fingercurl
+ name = "Tajara Finger Curls"
+ icon_state = "hair_fingerwave"
+
+/datum/sprite_accessory/hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kajam
+ name = "Kajam"
+ icon_state = "kajam"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_keid
+ name = "Keid"
+ icon_state = "keid"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_adhara
+ name = "Adhara"
+ icon_state = "adhara"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kleeia
+ name = "Kleeia"
+ icon_state = "kleeia"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_mizar
+ name = "Mizar"
+ icon_state = "mizar"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_apollo
+ name = "Apollo"
+ icon_state = "apollo"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_belle
+ name = "Belle"
+ icon_state = "belle"
+ secondary_theme = "bands"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_bun
+ name = "Bun"
+ icon_state = "bun"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jagged
+ name = "Jagged"
+ icon_state = "jagged"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_curl
+ name = "Curl"
+ icon_state = "curl"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_hawk
+ name = "Hawk"
+ icon_state = "hawk"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_anita
+ name = "Anita"
+ icon_state = "anita"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_spike
+ name = "Spike"
+ icon_state = "spike"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_braided
+ name = "Braided"
+ icon_state = "braided"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/hair/vox/vox_quills_short
+ name = "Short Vox Quills"
+ icon_state = "vox_shortquills"
+
+/datum/sprite_accessory/hair/vox/vox_crestedquills
+ name = "Crested Vox Quills"
+ icon_state = "vox_crestedquills"
+
+/datum/sprite_accessory/hair/vox/vox_tielquills
+ name = "Vox Tiel Quills"
+ icon_state = "vox_tielquills"
+
+/datum/sprite_accessory/hair/vox/vox_emperorquills
+ name = "Vox Emperor Quills"
+ icon_state = "vox_emperorquills"
+
+/datum/sprite_accessory/hair/vox/vox_keelquills
+ name = "Vox Keel Quills"
+ icon_state = "vox_keelquills"
+
+/datum/sprite_accessory/hair/vox/vox_keetquills
+ name = "Vox Keet Quills"
+ icon_state = "vox_keetquills"
+
+/datum/sprite_accessory/hair/vox/vox_quills_kingly
+ name = "Kingly Vox Quills"
+ icon_state = "vox_kingly"
+
+/datum/sprite_accessory/hair/vox/vox_quills_fluff
+ name = "Fluffy Vox Quills"
+ icon_state = "vox_afro"
+
+/datum/sprite_accessory/hair/vox/vox_quills_mohawk
+ name = "Vox Quill Mohawk"
+ icon_state = "vox_mohawk"
+
+/datum/sprite_accessory/hair/vox/vox_quills_long
+ name = "Long Vox Quills"
+ icon_state = "vox_yasu"
+
+/datum/sprite_accessory/hair/vox/vox_horns
+ name = "Vox Spikes"
+ icon_state = "vox_horns"
+
+/datum/sprite_accessory/hair/vox/vox_nights
+ name = "Vox Pigtails"
+ icon_state = "vox_nights"
+
+/datum/sprite_accessory/hair/vox/vox_razor
+ name = "Vox Razorback"
+ icon_state = "vox_razor"
+
+/datum/sprite_accessory/hair/vox/vox_razor_clipped
+ name = "Clipped Vox Razorback"
+ icon_state = "vox_razor_clipped"
+
+// Apollo-specific
+
+/datum/sprite_accessory/hair/wryn
+ species_allowed = list("Wryn")
+
+/datum/sprite_accessory/hair/wryn/wry_antennae_default
+ name = "Antennae"
+ icon_state = "wryn_antennae"
+
+/datum/sprite_accessory/hair/nucleation
+ species_allowed = list("Nucleation")
+
+/datum/sprite_accessory/hair/nucleation/nuc_crystals
+ name = "Nucleation Crystals"
+ icon_state = "nuc_crystal"
+
+/datum/sprite_accessory/hair/nucleation/nuc_betaburns
+ name = "Nucleation Beta Burns"
+ icon_state = "nuc_betaburns"
+
+/datum/sprite_accessory/hair/nucleation/nuc_fallout
+ name = "Nucleation Fallout"
+ icon_state = "nuc_fallout"
+
+/datum/sprite_accessory/hair/nucleation/nuc_frission
+ name = "Nucleation Frission"
+ icon_state = "nuc_frission"
+
+/datum/sprite_accessory/hair/nucleation/nuc_radical
+ name = "Nucleation Free Radical"
+ icon_state = "nuc_radical"
+
+/datum/sprite_accessory/hair/nucleation/nuc_gammaray
+ name = "Nucleation Gamma Ray"
+ icon_state = "nuc_gammaray"
+
+/datum/sprite_accessory/hair/nucleation/nuc_neutron
+ name = "Nucleation Neutron Bomb"
+ icon_state = "nuc_neutron"
/*
@@ -558,559 +833,232 @@
*/
/datum/sprite_accessory/facial_hair
-
icon = 'icons/mob/human_face.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P)
- shaved
- name = "Shaved"
- icon_state = "bald"
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
+/datum/sprite_accessory/facial_hair/shaved
+ name = "Shaved"
+ icon_state = "bald"
+ gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
- watson
- name = "Watson Mustache"
- icon_state = "facial_watson"
+/datum/sprite_accessory/facial_hair/watson
+ name = "Watson Mustache"
+ icon_state = "facial_watson"
- hogan
- name = "Hulk Hogan Mustache"
- icon_state = "facial_hogan" //-Neek
+/datum/sprite_accessory/facial_hair/hogan
+ name = "Hulk Hogan Mustache"
+ icon_state = "facial_hogan" //-Neek
- vandyke
- name = "Van Dyke Mustache"
- icon_state = "facial_vandyke"
+/datum/sprite_accessory/facial_hair/vandyke
+ name = "Van Dyke Mustache"
+ icon_state = "facial_vandyke"
- chaplin
- name = "Square Mustache"
- icon_state = "facial_chaplin"
+/datum/sprite_accessory/facial_hair/chaplin
+ name = "Square Mustache"
+ icon_state = "facial_chaplin"
- selleck
- name = "Selleck Mustache"
- icon_state = "facial_selleck"
+/datum/sprite_accessory/facial_hair/selleck
+ name = "Selleck Mustache"
+ icon_state = "facial_selleck"
- neckbeard
- name = "Neckbeard"
- icon_state = "facial_neckbeard"
+/datum/sprite_accessory/facial_hair/neckbeard
+ name = "Neckbeard"
+ icon_state = "facial_neckbeard"
- fullbeard
- name = "Full Beard"
- icon_state = "facial_fullbeard"
+/datum/sprite_accessory/facial_hair/fullbeard
+ name = "Full Beard"
+ icon_state = "facial_fullbeard"
- longbeard
- name = "Long Beard"
- icon_state = "facial_longbeard"
+/datum/sprite_accessory/facial_hair/longbeard
+ name = "Long Beard"
+ icon_state = "facial_longbeard"
- vlongbeard
- name = "Very Long Beard"
- icon_state = "facial_wise"
+/datum/sprite_accessory/facial_hair/vlongbeard
+ name = "Very Long Beard"
+ icon_state = "facial_wise"
- elvis
- name = "Elvis Sideburns"
- icon_state = "facial_elvis"
- species_allowed = list("Human","Unathi")
+/datum/sprite_accessory/facial_hair/elvis
+ name = "Elvis Sideburns"
+ icon_state = "facial_elvis"
+ species_allowed = list("Human", "Slime People", "Unathi")
- abe
- name = "Abraham Lincoln Beard"
- icon_state = "facial_abe"
+/datum/sprite_accessory/facial_hair/abe
+ name = "Abraham Lincoln Beard"
+ icon_state = "facial_abe"
- chinstrap
- name = "Chinstrap"
- icon_state = "facial_chin"
+/datum/sprite_accessory/facial_hair/chinstrap
+ name = "Chinstrap"
+ icon_state = "facial_chin"
- hip
- name = "Hipster Beard"
- icon_state = "facial_hip"
+/datum/sprite_accessory/facial_hair/hip
+ name = "Hipster Beard"
+ icon_state = "facial_hip"
- gt
- name = "Goatee"
- icon_state = "facial_gt"
+/datum/sprite_accessory/facial_hair/gt
+ name = "Goatee"
+ icon_state = "facial_gt"
- jensen
- name = "Adam Jensen Beard"
- icon_state = "facial_jensen"
+/datum/sprite_accessory/facial_hair/jensen
+ name = "Adam Jensen Beard"
+ icon_state = "facial_jensen"
- dwarf
- name = "Dwarf Beard"
- icon_state = "facial_dwarf"
+/datum/sprite_accessory/facial_hair/dwarf
+ name = "Dwarf Beard"
+ icon_state = "facial_dwarf"
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- britstache
- name = "Brit Stache"
- icon_state = "facial_britstache"
+/datum/sprite_accessory/facial_hair/britstache
+ name = "Brit Stache"
+ icon_state = "facial_britstache"
- martialartist
- name = "Martial Artist"
- icon_state = "facial_martialartist"
+/datum/sprite_accessory/facial_hair/martialartist
+ name = "Martial Artist"
+ icon_state = "facial_martialartist"
- moonshiner
- name = "Moonshiner"
- icon_state = "facial_moonshiner"
+/datum/sprite_accessory/facial_hair/moonshiner
+ name = "Moonshiner"
+ icon_state = "facial_moonshiner"
- tribeard
- name = "Tri-beard"
- icon_state = "facial_tribeard"
+/datum/sprite_accessory/facial_hair/tribeard
+ name = "Tri-beard"
+ icon_state = "facial_tribeard"
- unshaven
- name = "Unshaven"
- icon_state = "facial_unshaven"
+/datum/sprite_accessory/facial_hair/unshaven
+ name = "Unshaven"
+ icon_state = "facial_unshaven"
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
-/*
-///////////////////////////////////
-/ =---------------------------= /
-/ == Alien Style Definitions == /
-/ =---------------------------= /
-///////////////////////////////////
-*/
+/datum/sprite_accessory/facial_hair/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/hair
+/datum/sprite_accessory/facial_hair/tajara/taj_sideburns
+ name = "Tajara Sideburns"
+ icon_state = "facial_sideburns"
- una_horns
- name = "Unathi Horns"
- icon_state = "soghun_horns"
- species_allowed = list("Unathi")
+/datum/sprite_accessory/facial_hair/tajara/taj_mutton
+ name = "Tajara Mutton"
+ icon_state = "facial_mutton"
- skr_tentacle_m
- name = "Skrell Male Tentacles"
- icon_state = "skrell_hair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_pencilstache
+ name = "Tajara Pencilstache"
+ icon_state = "facial_pencilstache"
- skr_tentacle_f
- name = "Skrell Female Tentacles"
- icon_state = "skrell_hair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_moustache
+ name = "Tajara Moustache"
+ icon_state = "facial_moustache"
- skr_gold_m
- name = "Gold plated Skrell Male Tentacles"
- icon_state = "skrell_goldhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_goatee
+ name = "Tajara Goatee"
+ icon_state = "facial_goatee"
- skr_gold_f
- name = "Gold chained Skrell Female Tentacles"
- icon_state = "skrell_goldhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_smallstache
+ name = "Tajara Smallstache"
+ icon_state = "facial_smallstache"
+
+/datum/sprite_accessory/facial_hair/vox
+ species_allowed = list("Vox")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vox/vox_colonel
+ name = "Vox Colonel Beard"
+ icon_state = "vox_colonel"
+
+/datum/sprite_accessory/facial_hair/vox/vox_long
+ name = "Long Mustache"
+ icon_state = "vox_fu"
+
+/datum/sprite_accessory/facial_hair/vox/vox_neck
+ name = "Neck Quills"
+ icon_state = "vox_neck"
+
+/datum/sprite_accessory/facial_hair/vox/vox_beard
+ name = "Vox Quill Beard"
+ icon_state = "vox_beard"
+
+/datum/sprite_accessory/facial_hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_blaze
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_brows
+ name = "Vulpine and Brows"
+ icon_state = "vulp_facial_vulpine_brows"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_fluff
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_mask
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_patch
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_ruff
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_kita
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_swift
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/facial_hair/unathi
+ species_allowed = list("Unathi")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_long
+ name = "Long Spines"
+ icon_state = "soghun_longspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_short
+ name = "Short Spines"
+ icon_state = "soghun_shortspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic
+ name = "Aquatic Frills"
+ icon_state = "soghun_aquaticfrills"
- skr_clothtentacle_m
- name = "Cloth draped Skrell Male Tentacles"
- icon_state = "skrell_clothhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/unathi/una_frills_long
+ name = "Long Frills"
+ icon_state = "soghun_longfrills"
- skr_clothtentacle_f
- name = "Cloth draped Skrell Female Tentacles"
- icon_state = "skrell_clothhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
-
- taj_ears
- name = "Tajaran Ears"
- icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-
- taj_ears_clean
- name = "Tajara Clean"
- icon_state = "hair_clean"
- species_allowed = list("Tajaran")
-
- taj_ears_bangs
- name = "Tajara Bangs"
- icon_state = "hair_bangs"
- species_allowed = list("Tajaran")
-
- taj_ears_braid
- name = "Tajara Braid"
- icon_state = "hair_tbraid"
- species_allowed = list("Tajaran")
-
- taj_ears_shaggy
- name = "Tajara Shaggy"
- icon_state = "hair_shaggy"
- species_allowed = list("Tajaran")
-
- taj_ears_mohawk
- name = "Tajaran Mohawk"
- icon_state = "hair_mohawk"
- species_allowed = list("Tajaran")
-
- taj_ears_plait
- name = "Tajara Plait"
- icon_state = "hair_plait"
- species_allowed = list("Tajaran")
-
- taj_ears_straight
- name = "Tajara Straight"
- icon_state = "hair_straight"
- species_allowed = list("Tajaran")
-
- taj_ears_long
- name = "Tajara Long"
- icon_state = "hair_long"
- species_allowed = list("Tajaran")
-
- taj_ears_rattail
- name = "Tajara Rat Tail"
- icon_state = "hair_rattail"
- species_allowed = list("Tajaran")
-
- taj_ears_spiky
- name = "Tajara Spiky"
- icon_state = "hair_tajspiky"
- species_allowed = list("Tajaran")
-
- taj_ears_messy
- name = "Tajara Messy"
- icon_state = "hair_messy"
- species_allowed = list("Tajaran")
-
-//Vulpkanin
-
- vulp_hair_none
- name = "None"
- icon_state = "bald"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kajam
- name = "Kajam"
- icon_state = "kajam"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_keid
- name = "Keid"
- icon_state = "keid"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_adhara
- name = "Adhara"
- icon_state = "adhara"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kleeia
- name = "Kleeia"
- icon_state = "kleeia"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_mizar
- name = "Mizar"
- icon_state = "mizar"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_apollo
- name = "Apollo"
- icon_state = "apollo"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_belle
- name = "Belle"
- icon_state = "belle"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_bun
- name = "Bun"
- icon_state = "bun"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_jagged
- name = "Jagged"
- icon_state = "jagged"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_curl
- name = "Curl"
- icon_state = "curl"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_hawk
- name = "Hawk"
- icon_state = "hawk"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_anita
- name = "Anita"
- icon_state = "anita"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_short
- name = "Short"
- icon_state = "short"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_spike
- name = "Spike"
- icon_state = "spike"
- species_allowed = list("Vulpkanin")
-
-//Vox
-
- vox_quills_short
- name = "Short Vox Quills"
- icon_state = "vox_shortquills"
- species_allowed = list("Vox")
-
- vox_crestedquills
- name = "Crested Vox Quills"
- icon_state = "vox_crestedquills"
- species_allowed = list("Vox")
-
- vox_tielquills
- name = "Vox Tiel Quills"
- icon_state = "vox_tielquills"
- species_allowed = list("Vox")
-
- vox_emperorquills
- name = "Vox Emperor Quills"
- icon_state = "vox_emperorquills"
- species_allowed = list("Vox")
-
- vox_keelquills
- name = "Vox Keel Quills"
- icon_state = "vox_keelquills"
- species_allowed = list("Vox")
-
- vox_keetquills
- name = "Vox Keet Quills"
- icon_state = "vox_keetquills"
- species_allowed = list("Vox")
-
- vox_quills_kingly
- name = "Kingly Vox Quills"
- icon_state = "vox_kingly"
- species_allowed = list("Vox")
-
- vox_quills_fluff
- name = "Fluffy Vox Quills"
- icon_state = "vox_afro"
- species_allowed = list("Vox")
-
- vox_quills_mohawk
- name = "Vox Quill Mohawk"
- icon_state = "vox_mohawk"
- species_allowed = list("Vox")
-
- vox_quills_long
- name = "Long Vox Quills"
- icon_state = "vox_yasu"
- species_allowed = list("Vox")
-
- vox_horns
- name = "Vox Spikes"
- icon_state = "vox_horns"
- species_allowed = list("Vox")
-
- vox_nights
- name = "Vox Pigtails"
- icon_state = "vox_nights"
- species_allowed = list("Vox")
-
- vox_razor
- name = "Vox Razorback"
- icon_state = "vox_razor"
- species_allowed = list("Vox")
-
-// Apollo-specific
-
- //Wryn antennae
-
- wry_antennae_default
- name = "Antennae"
- icon_state = "wryn_antennae"
- species_allowed = list("Wryn")
-
- //Nucleation "hairstyles"
-
- nuc_crystals
- name = "Nucleation Crystals"
- icon_state = "nuc_crystal"
- species_allowed = list("Nucleation")
-
- nuc_betaburns
- name = "Nucleation Beta Burns"
- icon_state = "nuc_betaburns"
- species_allowed = list("Nucleation")
-
- nuc_fallout
- name = "Nucleation Fallout"
- icon_state = "nuc_fallout"
- species_allowed = list("Nucleation")
-
- nuc_frission
- name = "Nucleation Frission"
- icon_state = "nuc_frission"
- species_allowed = list("Nucleation")
-
- nuc_radical
- name = "Nucleation Free Radical"
- icon_state = "nuc_radical"
- species_allowed = list("Nucleation")
-
- nuc_gammaray
- name = "Nucleation Gamma Ray"
- icon_state = "nuc_gammaray"
- species_allowed = list("Nucleation")
-
- nuc_neutron
- name = "Nucleation Neutron Bomb"
- icon_state = "nuc_neutron"
- species_allowed = list("Nucleation")
-
-/datum/sprite_accessory/facial_hair
-
-//Tajara
-
- taj_sideburns
- name = "Tajara Sideburns"
- icon_state = "facial_sideburns"
- species_allowed = list("Tajaran")
-
- taj_mutton
- name = "Tajara Mutton"
- icon_state = "facial_mutton"
- species_allowed = list("Tajaran")
-
- taj_pencilstache
- name = "Tajara Pencilstache"
- icon_state = "facial_pencilstache"
- species_allowed = list("Tajaran")
-
- taj_moustache
- name = "Tajara Moustache"
- icon_state = "facial_moustache"
- species_allowed = list("Tajaran")
-
- taj_goatee
- name = "Tajara Goatee"
- icon_state = "facial_goatee"
- species_allowed = list("Tajaran")
-
- taj_smallstache
- name = "Tajara Smallstache"
- icon_state = "facial_smallstache"
- species_allowed = list("Tajaran")
-
-//Vox
-
- vox_colonel
- name = "Vox Colonel Beard"
- icon_state = "vox_colonel"
- species_allowed = list("Vox")
-
- vox_long
- name = "Long Mustache"
- icon_state = "vox_fu"
- species_allowed = list("Vox")
-
- vox_neck
- name = "Neck Quills"
- icon_state = "vox_neck"
- species_allowed = list("Vox")
-
- vox_beard
- name = "Vox Quill Beard"
- icon_state = "vox_beard"
- species_allowed = list("Vox")
-
-//Vulpkanin
-
- vulp_blaze
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine_fluff
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_mask
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_patch
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_ruff
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_kita
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_swift
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
-//Unathi
-
- una_spines_long
- name = "Long Spines"
- icon_state = "soghun_longspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_spines_short
- name = "Short Spines"
- icon_state = "soghun_shortspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_long
- name = "Long Frills"
- icon_state = "soghun_longfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_short
- name = "Short Frills"
- icon_state = "soghun_shortfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_long
- name = "Long Webbed Frills"
- icon_state = "soghun_longfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_short
- name = "Short Webbed Frills"
- icon_state = "soghun_shortfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_aquatic
- name = "Aquatic Frills"
- icon_state = "soghun_aquaticfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
+/datum/sprite_accessory/facial_hair/unathi/una_frills_short
+ name = "Short Frills"
+ icon_state = "soghun_shortfrills"
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic
+ name = "Aquatic Webbed Frills"
+ icon_state = "soghun_aquaticfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long
+ name = "Long Webbed Frills"
+ icon_state = "soghun_longfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short
+ name = "Short Webbed Frills"
+ icon_state = "soghun_shortfrills"
+ secondary_theme = "webbing"
//skin styles - WIP
//going to have to re-integrate this with surgery
@@ -1118,420 +1066,355 @@
/datum/sprite_accessory/skin
icon = 'icons/mob/human_races/r_human.dmi'
- human
- name = "Default human skin"
- icon_state = "default"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human
+ name = "Default human skin"
+ icon_state = "default"
+ species_allowed = list("Human")
- human_tatt01
- name = "Tatt01 human skin"
- icon_state = "tatt1"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human/human_tatt01
+ name = "Tatt01 human skin"
+ icon_state = "tatt1"
- tajaran
- name = "Default tajaran skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_tajaran.dmi'
- species_allowed = list("Tajaran")
+/datum/sprite_accessory/skin/tajaran
+ name = "Default tajaran skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_tajaran.dmi'
+ species_allowed = list("Tajaran")
- vulpkanin
- name = "Default Vulpkanin skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_vulpkanin.dmi'
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/skin/vulpkanin
+ name = "Default Vulpkanin skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_vulpkanin.dmi'
+ species_allowed = list("Vulpkanin")
- unathi
- name = "Default Unathi skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_lizard.dmi'
- species_allowed = list("Unathi")
+/datum/sprite_accessory/skin/unathi
+ name = "Default Unathi skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_lizard.dmi'
+ species_allowed = list("Unathi")
- skrell
- name = "Default skrell skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_skrell.dmi'
- species_allowed = list("Skrell")
+/datum/sprite_accessory/skin/skrell
+ name = "Default skrell skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_skrell.dmi'
+ species_allowed = list("Skrell")
///////////////////////////
// Underwear Definitions //
///////////////////////////
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+/datum/sprite_accessory/underwear/nude
+ name = "Nude"
+ icon_state = null
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
- nude
- name = "Nude"
- icon_state = null
- gender = NEUTER
+/datum/sprite_accessory/underwear/male
+ gender = MALE
- male_white
- name = "Mens White"
- icon_state = "male_white"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_white
+ name = "Mens White"
+ icon_state = "male_white"
- male_grey
- name = "Mens Grey"
- icon_state = "male_grey"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey"
+ icon_state = "male_grey"
- male_grey
- name = "Mens Grey Alt"
- icon_state = "male_greyalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey Alt"
+ icon_state = "male_greyalt"
- male_green
- name = "Mens Green"
- icon_state = "male_green"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_green
+ name = "Mens Green"
+ icon_state = "male_green"
- male_blue
- name = "Mens Blue"
- icon_state = "male_blue"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_blue
+ name = "Mens Blue"
+ icon_state = "male_blue"
- male_red
- name = "Mens Red"
- icon_state = "male_red"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_red
+ name = "Mens Red"
+ icon_state = "male_red"
- male_black
- name = "Mens Black"
- icon_state = "male_black"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black
+ name = "Mens Black"
+ icon_state = "male_black"
- male_black_alt
- name = "Mens Black Alt"
- icon_state = "male_blackalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black_alt
+ name = "Mens Black Alt"
+ icon_state = "male_blackalt"
- male_striped
- name = "Mens Striped"
- icon_state = "male_stripe"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_striped
+ name = "Mens Striped"
+ icon_state = "male_stripe"
- male_heart
- name = "Mens Hearts"
- icon_state = "male_hearts"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_heart
+ name = "Mens Hearts"
+ icon_state = "male_hearts"
- male_kinky
- name = "Mens Kinky"
- icon_state = "male_kinky"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_kinky
+ name = "Mens Kinky"
+ icon_state = "male_kinky"
- male_mankini
- name = "Mankini"
- icon_state = "male_mankini"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_mankini
+ name = "Mankini"
+ icon_state = "male_mankini"
- female_red
- name = "Ladies Red"
- icon_state = "female_red"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female
+ gender = FEMALE
- female_green
- name = "Ladies Green"
- icon_state = "female_green"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_red
+ name = "Ladies Red"
+ icon_state = "female_red"
- female_white
- name = "Ladies White"
- icon_state = "female_white"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_green
+ name = "Ladies Green"
+ icon_state = "female_green"
- female_whiter
- name = "Ladies Whiter"
- icon_state = "female_whiter"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_white
+ name = "Ladies White"
+ icon_state = "female_white"
- female_whitealt
- name = "Ladies White Alt"
- icon_state = "female_whitealt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whiter
+ name = "Ladies Whiter"
+ icon_state = "female_whiter"
- female_yellow
- name = "Ladies Yellow"
- icon_state = "female_yellow"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whitealt
+ name = "Ladies White Alt"
+ icon_state = "female_whitealt"
- female_blue
- name = "Ladies Blue"
- icon_state = "female_blue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_yellow
+ name = "Ladies Yellow"
+ icon_state = "female_yellow"
- female_babyblue
- name = "Ladies Baby Blue"
- icon_state = "female_babyblue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blue
+ name = "Ladies Blue"
+ icon_state = "female_blue"
+/datum/sprite_accessory/underwear/female/female_babyblue
+ name = "Ladies Baby Blue"
+ icon_state = "female_babyblue"
- female_black
- name = "Ladies Black"
- icon_state = "female_black"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_black
+ name = "Ladies Black"
+ icon_state = "female_black"
- female_blacker
- name = "Ladies Blacker"
- icon_state = "female_blacker"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blacker
+ name = "Ladies Blacker"
+ icon_state = "female_blacker"
- female_blackalt
- name = "Ladies Black Alt"
- icon_state = "female_blackalt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blackalt
+ name = "Ladies Black Alt"
+ icon_state = "female_blackalt"
- female_kinky
- name = "Ladies Kinky"
- icon_state = "female_kinky"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_kinky
+ name = "Ladies Kinky"
+ icon_state = "female_kinky"
- female_babydoll
- name = "Ladies Full Grey"
- icon_state = "female_babydoll"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_babydoll
+ name = "Ladies Full Grey"
+ icon_state = "female_babydoll"
- female_pink
- name = "Ladies Pink"
- icon_state = "female_pink"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_pink
+ name = "Ladies Pink"
+ icon_state = "female_pink"
- female_thong
- name = "Ladies Thong"
- icon_state = "female_thong"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_thong
+ name = "Ladies Thong"
+ icon_state = "female_thong"
////////////////////////////
// Undershirt Definitions //
////////////////////////////
/datum/sprite_accessory/undershirt
icon = 'icons/mob/underwear.dmi'
-
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/undershirt/nude
name = "Nude"
icon_state = null
- gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
//plain color shirts
/datum/sprite_accessory/undershirt/shirt_white
name = "White Shirt"
icon_state = "shirt_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_black
name = "Black Shirt"
icon_state = "shirt_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blacker
name = "Blacker Shirt"
icon_state = "shirt_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_grey
name = "Grey Shirt"
icon_state = "shirt_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_red
name = "Red Shirt"
icon_state = "shirt_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blue
name = "Blue Shirt"
icon_state = "shirt_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_yellow
name = "Yellow Shirt"
icon_state = "shirt_yellow"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_green
name = "Green Shirt"
icon_state = "shirt_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkblue
name = "Dark Blue Shirt"
icon_state = "shirt_darkblue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkred
name = "Dark Red Shirt"
icon_state = "shirt_darkred"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkgreen
name = "Dark Green Shirt"
icon_state = "shirt_darkgreen"
- gender = NEUTER
//end plain color shirts
+//graphic shirts
/datum/sprite_accessory/undershirt/shirt_heart
name = "Heart Shirt"
icon_state = "shirt_heart"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_corgi
name = "Corgi Shirt"
icon_state = "shirt_corgi"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_clown
name = "Clown Shirt"
icon_state = "shirt_clown"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_alien
name = "Alien Shirt"
icon_state = "shirt_alien"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_jack
name = "Union Jack Shirt"
icon_state = "shirt_jack"
- gender = NEUTER
/datum/sprite_accessory/undershirt/love_nt
name = "I Love NT Shirt"
icon_state = "shirt_lovent"
- gender = NEUTER
/datum/sprite_accessory/undershirt/peace
name = "Peace Shirt"
icon_state = "shirt_peace"
- gender = NEUTER
/datum/sprite_accessory/undershirt/mondmondjaja
name = "Band Shirt"
icon_state = "shirt_band"
- gender = NEUTER
/datum/sprite_accessory/undershirt/pacman
name = "Pogoman Shirt"
icon_state = "shirt_pogoman"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_ss13
name = "SS13 Shirt"
icon_state = "shirt_ss13"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_question
name = "Question Mark Shirt"
icon_state = "shirt_question"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_skull
name = "Skull Shirt"
icon_state = "shirt_skull"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_commie
name = "Communist Shirt"
icon_state = "shirt_commie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_nano
name = "Nanotrasen Shirt"
icon_state = "shirt_nano"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_meat
name = "Meat Shirt"
icon_state = "shirt_meat"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_tiedie
name = "Tiedie Shirt"
icon_state = "shirt_tiedie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/blue_striped
name = "Striped Blue Shirt"
icon_state = "shirt_bluestripe"
- gender = NEUTER
/datum/sprite_accessory/undershirt/brightblue_striped
name = "Striped Bright Blue Shirt"
icon_state = "shirt_brightbluestripe"
- gender = NEUTER
-
+//end graphic shirts
//short sleeved
/datum/sprite_accessory/undershirt/short_white
name = "White Short-sleeved Shirt"
icon_state = "short_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_purple
name = "Purple Short-sleeved Shirt"
icon_state = "short_purple"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_blue
name = "Blue Short-sleeved Shirt"
icon_state = "short_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_green
name = "Green Short-sleeved Shirt"
icon_state = "short_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_black
name = "Black Short-sleeved Shirt"
icon_state = "short_black"
- gender = NEUTER
//end short sleeved
//polo shirts
/datum/sprite_accessory/undershirt/polo_blue
name = "Blue Polo Shirt"
icon_state = "polo_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_red
name = "Red Polo Shirt"
icon_state = "polo_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_greyelllow
name = "Grey-Yellow Polo Shirt"
icon_state = "polo_greyellow"
- gender = NEUTER
//end polo shirts
//sport shirts
/datum/sprite_accessory/undershirt/sport_green
name = "Green Sports Shirt"
icon_state = "sport_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_red
name = "Red Sports Shirt"
icon_state = "sport_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_blue
name = "Blue Sports Shirt"
icon_state = "sport_blue"
- gender = NEUTER
-//end sport shirts
/datum/sprite_accessory/undershirt/jersey_red
name = "Red Jersey"
icon_state = "jersey_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/jersey_blue
name = "Blue Jersey"
icon_state = "jersey_blue"
- gender = NEUTER
-
+//end sport shirts
//tanktops
/datum/sprite_accessory/undershirt/tank_redtop
@@ -1552,39 +1435,30 @@
/datum/sprite_accessory/undershirt/tank_white
name = "White Tank-Top"
icon_state = "tank_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_black
name = "Black Tank-Top"
icon_state = "tank_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_blacker
name = "Blacker Tank-Top"
icon_state = "tank_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_grey
name = "Grey Tank-Top"
icon_state = "tank_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_red
name = "Red Tank-Top"
icon_state = "tank_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_fire
name = "Fire Tank-Top"
icon_state = "tank_fire"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_stripes
name = "Striped Tank-Top"
icon_state = "tank_stripes"
- gender = NEUTER
-
-
//end tanktops
///////////////////////
@@ -1592,174 +1466,127 @@
///////////////////////
/datum/sprite_accessory/socks
icon = 'icons/mob/underwear.dmi'
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/socks/nude
name = "Nude"
icon_state = null
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
-
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
/datum/sprite_accessory/socks/white_norm
name = "Normal White"
icon_state = "white_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_norm
name = "Normal Black"
icon_state = "black_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_short
name = "Short White"
icon_state = "white_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_short
name = "Short Black"
icon_state = "black_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_knee
name = "Knee-high White"
icon_state = "white_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_knee
name = "Knee-high Black"
icon_state = "black_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_knee
name = "Knee-high Thin"
icon_state = "thin_knee"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_knee
name = "Knee-high Striped"
icon_state = "striped_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_knee
name = "Knee-high Rainbow"
icon_state = "rainbow_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_thigh
name = "Thigh-high White"
icon_state = "white_thigh"
- gender = NEUTER
/datum/sprite_accessory/socks/black_thigh
name = "Thigh-high Black"
icon_state = "black_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_thigh
name = "Thigh-high Thin"
icon_state = "thin_thigh"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_thigh
name = "Thigh-high Striped"
icon_state = "striped_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_thigh
name = "Thigh-high Rainbow"
icon_state = "rainbow_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/pantyhose
name = "Pantyhose"
icon_state = "pantyhose"
gender = FEMALE
-
/datum/sprite_accessory/socks/black_fishnet
name = "Black Fishnet"
icon_state = "black_fishnet"
- gender = NEUTER
-/datum/sprite_accessory/socks/vox_white
+/datum/sprite_accessory/socks/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox/vox_white
name = "Vox White"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black
+/datum/sprite_accessory/socks/vox/vox_black
name = "Vox Black"
icon_state = "vox_black"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin
+/datum/sprite_accessory/socks/vox/vox_thin
name = "Vox Black Thin"
icon_state = "vox_blackthin"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow
+/datum/sprite_accessory/socks/vox/vox_rainbow
name = "Vox Rainbow"
icon_state = "vox_rainbow"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_stripped
+/datum/sprite_accessory/socks/vox/vox_stripped
name = "Vox Striped"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_white_thigh
+/datum/sprite_accessory/socks/vox/vox_white_thigh
name = "Vox Thigh-high White"
icon_state = "vox_whiteTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black_thigh
+/datum/sprite_accessory/socks/vox/vox_black_thigh
name = "Vox Thigh-high Black"
icon_state = "vox_blackTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin_thigh
+/datum/sprite_accessory/socks/vox/vox_thin_thigh
name = "Vox Thigh-high Thin"
icon_state = "vox_blackthinTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow_thigh
+/datum/sprite_accessory/socks/vox/vox_rainbow_thigh
name = "Vox Thigh-high Rainbow"
icon_state = "vox_rainbowTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_striped_thigh
+/datum/sprite_accessory/socks/vox/vox_striped_thigh
name = "Vox Thigh-high Striped"
icon_state = "vox_stripedTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_fishnet
+/datum/sprite_accessory/socks/vox/vox_fishnet
name = "Vox Fishnets"
icon_state = "vox_fishnet"
- gender = NEUTER
- species_allowed = list("Vox")
/* HEAD ACCESSORY */
@@ -1773,185 +1600,494 @@
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/head_accessory/simple
- name = "Simple"
+/datum/sprite_accessory/head_accessory/unathi
species_allowed = list("Unathi")
+
+/datum/sprite_accessory/head_accessory/unathi/simple
+ name = "Simple"
icon_state = "horns_simple"
-/datum/sprite_accessory/head_accessory/short
+/datum/sprite_accessory/head_accessory/unathi/short
name = "Short"
- species_allowed = list("Unathi")
icon_state = "horns_short"
-/datum/sprite_accessory/head_accessory/curled
+/datum/sprite_accessory/head_accessory/unathi/curled
name = "Curled"
- species_allowed = list("Unathi")
icon_state = "horns_curled"
-/datum/sprite_accessory/head_accessory/ram
+/datum/sprite_accessory/head_accessory/unathi/ram
name = "Ram"
- species_allowed = list("Unathi")
icon_state = "horns_ram"
-/datum/sprite_accessory/head_accessory/vulp_earfluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpkanin Earfluff"
- icon_state = "vulp_facial_earfluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/vulp_blaze
- icon = 'icons/mob/human_face.dmi'
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine_fluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
-/datum/sprite_accessory/head_accessory/vulp_mask
- icon = 'icons/mob/human_face.dmi'
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_patch
- icon = 'icons/mob/human_face.dmi'
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_ruff
- icon = 'icons/mob/human_face.dmi'
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_kita
- icon = 'icons/mob/human_face.dmi'
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_swift
- icon = 'icons/mob/human_face.dmi'
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/taj_ears
+/datum/sprite_accessory/head_accessory/tajara/taj_ears
icon = 'icons/mob/human_face.dmi'
name = "Tajaran Ears"
icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/ipc_antennae
+/datum/sprite_accessory/head_accessory/tajara/taj_nose
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/head_accessory/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_earfluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpkanin Earfluff"
+ icon_state = "vulp_facial_earfluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_blaze
+ icon = 'icons/mob/human_face.dmi'
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine_fluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_mask
+ icon = 'icons/mob/human_face.dmi'
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_patch
+ icon = 'icons/mob/human_face.dmi'
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_ruff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_kita
+ icon = 'icons/mob/human_face.dmi'
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_swift
+ icon = 'icons/mob/human_face.dmi'
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/head_accessory/ipc
+ species_allowed = list("Machine")
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_antennae
name = "Antennae"
icon_state = "antennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tv_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tv_antennae
name = "T.V. Antennae"
icon_state = "tvantennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tesla_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tesla_antennae
name = "Tesla Antennae"
icon_state = "tesla"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_light
+/datum/sprite_accessory/head_accessory/ipc/ipc_light
name = "Head Light"
icon_state = "light"
- species_allowed = list("Machine")
/* BODY MARKINGS */
/datum/sprite_accessory/body_markings
icon = 'icons/mob/body_accessory.dmi'
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine")
+ species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox")
icon_state = "accessory_none"
+ marking_location = "body"
/datum/sprite_accessory/body_markings/none
name = "None"
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/body_markings/stripe
- name = "Stripe"
- species_allowed = list("Unathi")
- icon_state = "markings_stripe"
-
/datum/sprite_accessory/body_markings/tiger
name = "Tiger Body"
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "markings_tiger"
-/datum/sprite_accessory/body_markings/tigerhead
- name = "Tiger Body and Head"
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
- icon_state = "markings_tigerhead"
-
-/datum/sprite_accessory/body_markings/tigerheadface_taj
- name = "Tajaran Tiger Body, Head and Face"
- species_allowed = list("Tajaran")
- icon_state = "markings_tigerheadface_taj"
-
-/datum/sprite_accessory/body_markings/tigerheadface_vulp
- name = "Vulpkanin Tiger Body, Head and Face"
- species_allowed = list("Vulpkanin")
- icon_state = "markings_tigerheadface_vulp"
-
-/datum/sprite_accessory/body_markings/tigerheadface_una
- name = "Unathi Tiger Body, Head and Face"
+/datum/sprite_accessory/body_markings/unathi
species_allowed = list("Unathi")
- icon_state = "markings_tigerheadface_una"
-/datum/sprite_accessory/body_markings/optics
+/datum/sprite_accessory/body_markings/unathi/stripe_una
+ name = "Unathi Stripe"
+ icon_state = "markings_stripe_una"
+
+/datum/sprite_accessory/body_markings/unathi/belly_narrow_una
+ name = "Unathi Belly"
+ icon_state = "markings_belly_narrow_una"
+
+/datum/sprite_accessory/body_markings/unathi/banded_una
+ name = "Unathi Banded"
+ icon_state = "markings_banded_una"
+
+/datum/sprite_accessory/body_markings/unathi/points_una
+ name = "Unathi Points"
+ icon_state = "markings_points_una"
+
+/datum/sprite_accessory/body_markings/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/tajara/belly_flat_taj
+ name = "Tajaran Belly"
+ icon_state = "markings_belly_flat_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_crest_taj
+ name = "Tajaran Chest Crest"
+ icon_state = "markings_belly_crest_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_full_taj
+ name = "Tajaran Belly 2"
+ icon_state = "markings_belly_full_taj"
+
+/datum/sprite_accessory/body_markings/tajara/points_taj
+ name = "Tajaran Points"
+ icon_state = "markings_points_taj"
+
+/datum/sprite_accessory/body_markings/tajara/patchy_taj
+ name = "Tajaran Patches"
+ icon_state = "markings_patch_taj"
+
+/datum/sprite_accessory/body_markings/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_fox_vulp
+ name = "Vulpkanin Belly"
+ icon_state = "markings_belly_fox_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_full_vulp
+ name = "Vulpkanin Belly 2"
+ icon_state = "markings_belly_full_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_crest_vulp
+ name = "Vulpkanin Belly Crest"
+ icon_state = "markings_belly_crest_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_vulp
+ name = "Vulpkanin Points"
+ icon_state = "markings_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_vulp
+ name = "Vulpkanin Points and Belly"
+ icon_state = "markings_points_fade_belly_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_alt_vulp
+ name = "Vulpkanin Points and Belly Alt."
+ icon_state = "markings_points_fade_belly_alt_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_sharp_vulp
+ name = "Vulpkanin Points 2"
+ icon_state = "markings_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_crest_vulp
+ name = "Vulpkanin Points and Crest"
+ icon_state = "markings_points_crest_vulp"
+
+/datum/sprite_accessory/body_markings/drask
+ species_allowed = list("Drask")
+
+/datum/sprite_accessory/body_markings/drask/arm_spines_drask
+ name = "Drask Arm Spines"
+ icon_state = "markings_armspines_drask"
+
+/datum/sprite_accessory/body_markings/head
+ marking_location = "head"
+ species_allowed = list()
+
+/datum/sprite_accessory/body_markings/head/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_head_taj
+ name = "Tajaran Tiger Head"
+ icon_state = "markings_head_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_face_taj
+ name = "Tajaran Tiger Head and Face"
+ icon_state = "markings_face_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/nose_taj
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_alt_taj //Companion marking for Tajaran Belly 2.
+ name = "Tajaran Muzzle 2"
+ icon_state = "markings_face_full_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/points_taj //Companion marking for Tajaran Points.
+ name = "Tajaran Points Head"
+ icon_state = "markings_face_points_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/patchy_taj //Companion marking for Tajaran Patches.
+ name = "Tajaran Patches Head"
+ icon_state = "markings_face_patch_taj"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_head_vulp
+ name = "Vulpkanin Tiger Head"
+ icon_state = "markings_head_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_face_vulp
+ name = "Vulpkanin Tiger Head and Face"
+ icon_state = "markings_face_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/nose_default_vulp
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle"
+ icon_state = "markings_face_full_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle and Ears"
+ icon_state = "markings_face_full_ears_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_fade_vulp //Companion marking for Vulpkanin Points Fade.
+ name = "Vulpkanin Points Head"
+ icon_state = "markings_face_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp.
+ name = "Vulpkanin Points Head 2"
+ icon_state = "markings_face_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/head/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_head_una
+ name = "Unathi Tiger Head"
+ icon_state = "markings_head_tiger_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_face_una
+ name = "Unathi Tiger Head and Face"
+ icon_state = "markings_face_tiger_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_una_round
+ name = "Unathi Round Snout"
+ icon_state = "markings_face_snout_una_round"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round
+ name = "Unathi Lower Round Snout"
+ icon_state = "markings_face_snout_lower_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded.
+ name = "Unathi Banded Head"
+ icon_state = "markings_face_banded_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_narrow_una //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Snout 2"
+ icon_state = "markings_face_narrow_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/points_una //Companion marking for Unathi Points.
+ name = "Unathi Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp
+ heads_allowed = list("Unathi Sharp Snout")
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/tiger_face_una_sharp
+ name = "Unathi Sharp Tiger Head and Face"
+ icon_state = "markings_face_tiger_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_una_sharp
+ name = "Unathi Sharp Snout"
+ icon_state = "markings_face_snout_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Sharp Snout 2"
+ icon_state = "markings_face_narrow_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/points_una_sharp //Companion marking for Unathi Points.
+ name = "Unathi Sharp Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/optics
name = "Humanoid Optics"
species_allowed = list("Machine")
icon_state = "optics"
models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm
- marking_location = "head"
-/datum/sprite_accessory/body_markings/optics/bishop_alt
+/datum/sprite_accessory/body_markings/head/optics/bishop_alt
name = "Bishop Alt. Optics"
- species_allowed = list("Machine")
icon_state = "bishop_alt_optics"
models_allowed = list("Bishop Cybernetics alt.")
-/datum/sprite_accessory/body_markings/optics/morpheus_alt
+/datum/sprite_accessory/body_markings/head/optics/morpheus_alt
name = "Morpheus Alt. Optics"
- species_allowed = list("Machine")
icon_state = "morpheus_alt_optics"
models_allowed = list("Morpheus Cyberkinetics alt.")
-/datum/sprite_accessory/body_markings/optics/wardtakahashi_alt
+/datum/sprite_accessory/body_markings/head/optics/wardtakahashi_alt
name = "Ward-Takahashi Alt. Optics"
- species_allowed = list("Machine")
icon_state = "wardtakahashi_alt_optics"
models_allowed = list("Ward-Takahashi alt.")
-/datum/sprite_accessory/body_markings/optics/xion_alt
+/datum/sprite_accessory/body_markings/head/optics/xion_alt
name = "Xion Alt. Optics"
- species_allowed = list("Machine")
icon_state = "xion_alt_optics"
models_allowed = list("Xion Manufacturing Group alt.")
/datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm
- name = "base tattoo"
- species_allowed = list()
+ species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell")
icon_state = "accessory_none"
/datum/sprite_accessory/body_markings/tattoo/elliot
name = "Elliot Circuit Tattoo"
- icon_state = "campbell_tattoo"
\ No newline at end of file
+ icon_state = "campbell_tattoo"
+ species_allowed = null
+
+/datum/sprite_accessory/body_markings/tattoo/tiger_body
+ name = "Tiger-stripe Tattoo"
+ species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell")
+ icon_state = "markings_tiger"
+
+/datum/sprite_accessory/body_markings/tattoo/heart
+ name = "Heart Tattoo"
+ icon_state = "markings_tattoo_heart"
+
+/datum/sprite_accessory/body_markings/tattoo/hive
+ name = "Hive Tattoo"
+ icon_state = "markings_tattoo_hive"
+
+/datum/sprite_accessory/body_markings/tattoo/nightling
+ name = "Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling"
+
+/datum/sprite_accessory/body_markings/tattoo/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tattoo/vox/heart_vox
+ name = "Vox Heart Tattoo"
+ icon_state = "markings_tattoo_heart_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/hive_vox
+ name = "Vox Hive Tattoo"
+ icon_state = "markings_tattoo_hive_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/nightling_vox
+ name = "Vox Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling_vox"
+
+/datum/sprite_accessory/body_markings/tail
+ species_allowed = list()
+ icon_state = "accessory_none"
+ marking_location = "tail"
+ tails_allowed = null
+
+/datum/sprite_accessory/body_markings/tail/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_band
+ name = "Vox Tail Band"
+ icon_state = "markings_voxtail_band"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_tip
+ name = "Vox Tail Tip"
+ icon_state = "markings_voxtail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_stripe
+ name = "Vox Tail Stripe"
+ icon_state = "markings_voxtail_stripe"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_tip
+ name = "Vulpkanin Default Tail Tip"
+ icon_state = "markings_vulptail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_fade
+ name = "Vulpkanin Default Tail Fade"
+ icon_state = "markings_vulptail_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_bushy_fluff
+ name = "Vulpkanin Bushy Tail Fluff"
+ tails_allowed = list("Vulpkanin Alt 1 (Bushy)")
+ icon_state = "markings_vulptail2_fluff"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_short_tip
+ name = "Vulpkanin Short Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 4 (Short)")
+ icon_state = "markings_vulptail5_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_tip
+ name = "Vulpkanin Bushy Straight Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_fade
+ name = "Vulpkanin Bushy Straight Tail Fade"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_silverf
+ name = "Vulpkanin Bushy Straight Tail Black Fade White Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_silverf"
+
+/* ALT HEADS */
+
+/datum/sprite_accessory/alt_heads
+ icon = null
+ icon_state = null
+ species_allowed = null
+ var/suffix = null
+
+/datum/sprite_accessory/alt_heads/none
+ name = "None"
+
+/datum/sprite_accessory/alt_heads/una_sharp_snout
+ name = "Unathi Sharp Snout"
+ species_allowed = list("Unathi")
+ icon_state = "head_sharp"
+ suffix = "sharp"
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 8606dafbd31..21c14077886 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -7,8 +7,11 @@
var/list/valid_hairstyles = list()
var/list/valid_facial_hairstyles = list()
var/list/valid_head_accessories = list()
- var/list/valid_marking_styles = list()
+ var/list/valid_head_marking_styles = list()
+ var/list/valid_body_marking_styles = list()
+ var/list/valid_tail_marking_styles = list()
var/list/valid_body_accessories = list()
+ var/list/valid_alt_head_styles = list()
var/check_whitelist
var/list/whitelist
@@ -48,7 +51,7 @@
else if(owner.species.bodyflags & HAS_ICON_SKIN_TONE)
var/const/MAX_LINE_ENTRIES = 4
var/prompt = "Choose your character's skin tone: 1-[owner.species.icon_skin_tones.len]\n("
- for(var/i = 1; i <= owner.species.icon_skin_tones.len; i++)
+ for(var/i = 1 to owner.species.icon_skin_tones.len)
if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES))
prompt += "\n"
prompt += "[i] = [owner.species.icon_skin_tones[i]]"
@@ -66,9 +69,9 @@
if(can_change_skin_color())
var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null
if(new_skin && can_still_topic(state))
- var/r_skin = hex2num(copytext(new_skin, 2, 4))
- var/g_skin = hex2num(copytext(new_skin, 4, 6))
- var/b_skin = hex2num(copytext(new_skin, 6, 8))
+ var/r_skin = color2R(new_skin)
+ var/g_skin = color2G(new_skin)
+ var/b_skin = color2B(new_skin)
if(owner.change_skin_color(r_skin, g_skin, b_skin))
update_dna()
return 1
@@ -81,12 +84,22 @@
if(can_change(APPEARANCE_HAIR_COLOR))
var/new_hair = input("Please select hair color.", "Hair Color", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as color|null
if(new_hair && can_still_topic(state))
- var/r_hair = hex2num(copytext(new_hair, 2, 4))
- var/g_hair = hex2num(copytext(new_hair, 4, 6))
- var/b_hair = hex2num(copytext(new_hair, 6, 8))
+ var/r_hair = color2R(new_hair)
+ var/g_hair = color2G(new_hair)
+ var/b_hair = color2B(new_hair)
if(owner.change_hair_color(r_hair, g_hair, b_hair))
update_dna()
return 1
+ if(href_list["secondary_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_HAIR_COLOR))
+ var/new_hair = input("Please select secondary hair color.", "Secondary Hair Color", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as color|null
+ if(new_hair && can_still_topic(state))
+ var/r_hair_sec = color2R(new_hair)
+ var/g_hair_sec = color2G(new_hair)
+ var/b_hair_sec = color2B(new_hair)
+ if(owner.change_hair_color(r_hair_sec, g_hair_sec, b_hair_sec, 1))
+ update_dna()
+ return 1
if(href_list["facial_hair"])
if(can_change(APPEARANCE_FACIAL_HAIR) && (href_list["facial_hair"] in valid_facial_hairstyles))
if(owner.change_facial_hair(href_list["facial_hair"]))
@@ -96,12 +109,22 @@
if(can_change(APPEARANCE_FACIAL_HAIR_COLOR))
var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as color|null
if(new_facial && can_still_topic(state))
- var/r_facial = hex2num(copytext(new_facial, 2, 4))
- var/g_facial = hex2num(copytext(new_facial, 4, 6))
- var/b_facial = hex2num(copytext(new_facial, 6, 8))
+ var/r_facial = color2R(new_facial)
+ var/g_facial = color2G(new_facial)
+ var/b_facial = color2B(new_facial)
if(owner.change_facial_hair_color(r_facial, g_facial, b_facial))
update_dna()
return 1
+ if(href_list["secondary_facial_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR))
+ var/new_facial = input("Please select secondary facial hair color.", "Secondary Facial Hair Color", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as color|null
+ if(new_facial && can_still_topic(state))
+ var/r_facial_sec = color2R(new_facial)
+ var/g_facial_sec = color2G(new_facial)
+ var/b_facial_sec = color2B(new_facial)
+ if(owner.change_facial_hair_color(r_facial_sec, g_facial_sec, b_facial_sec, 1))
+ update_dna()
+ return 1
if(href_list["eye_color"])
if(can_change(APPEARANCE_EYE_COLOR))
var/obj/item/organ/internal/eyes/eyes_organ = owner.get_int_organ(/obj/item/organ/internal/eyes)
@@ -114,9 +137,9 @@
eyes_blue = eyes_organ.eye_colour[3]
var/new_eyes = input("Please select eye color.", "Eye Color", rgb(eyes_red, eyes_green, eyes_blue)) as color|null
if(new_eyes && can_still_topic(state))
- var/r_eyes = hex2num(copytext(new_eyes, 2, 4))
- var/g_eyes = hex2num(copytext(new_eyes, 4, 6))
- var/b_eyes = hex2num(copytext(new_eyes, 6, 8))
+ var/r_eyes = color2R(new_eyes)
+ var/g_eyes = color2G(new_eyes)
+ var/b_eyes = color2B(new_eyes)
if(owner.change_eye_color(r_eyes, g_eyes, b_eyes))
update_dna()
return 1
@@ -129,31 +152,60 @@
if(can_change_head_accessory())
var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as color|null
if(new_head_accessory && can_still_topic(state))
- var/r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- var/g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- var/b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+ var/r_headacc = color2R(new_head_accessory)
+ var/g_headacc = color2G(new_head_accessory)
+ var/b_headacc = color2B(new_head_accessory)
if(owner.change_head_accessory_color(r_headacc, g_headacc, b_headacc))
update_dna()
return 1
- if(href_list["marking"])
- if(can_change_markings() && (href_list["marking"] in valid_marking_styles))
- if(owner.change_markings(href_list["marking"]))
+ if(href_list["head_marking"])
+ if(can_change_markings("head") && (href_list["head_marking"] in valid_head_marking_styles))
+ if(owner.change_markings(href_list["head_marking"], "head"))
update_dna()
return 1
- if(href_list["marking_color"])
- if(can_change_markings())
- var/new_markings = input("Please select marking color.", "Marking Color", rgb(owner.r_markings, owner.g_markings, owner.b_markings)) as color|null
+ if(href_list["head_marking_color"])
+ if(can_change_markings("head"))
+ var/new_markings = input("Please select head marking color.", "Marking Color", owner.m_colours["head"]) as color|null
if(new_markings && can_still_topic(state))
- var/r_markings = hex2num(copytext(new_markings, 2, 4))
- var/g_markings = hex2num(copytext(new_markings, 4, 6))
- var/b_markings = hex2num(copytext(new_markings, 6, 8))
- if(owner.change_marking_color(r_markings, g_markings, b_markings))
+ if(owner.change_marking_color(new_markings, "head"))
+ update_dna()
+ return 1
+ if(href_list["body_marking"])
+ if(can_change_markings("body") && (href_list["body_marking"] in valid_body_marking_styles))
+ if(owner.change_markings(href_list["body_marking"], "body"))
+ update_dna()
+ return 1
+ if(href_list["body_marking_color"])
+ if(can_change_markings("body"))
+ var/new_markings = input("Please select body marking color.", "Marking Color", owner.m_colours["body"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "body"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking"])
+ if(can_change_markings("tail") && (href_list["tail_marking"] in valid_tail_marking_styles))
+ if(owner.change_markings(href_list["tail_marking"], "tail"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking_color"])
+ if(can_change_markings("tail"))
+ var/new_markings = input("Please select tail marking color.", "Marking Color", owner.m_colours["tail"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "tail"))
update_dna()
return 1
if(href_list["body_accessory"])
if(can_change_body_accessory() && (href_list["body_accessory"] in valid_body_accessories))
if(owner.change_body_accessory(href_list["body_accessory"]))
update_dna()
+ cut_and_generate_data()
+ return 1
+ if(href_list["alt_head"])
+ if(can_change_alt_head() && (href_list["alt_head"] in valid_alt_head_styles))
+ if(owner.change_alt_head(href_list["alt_head"]))
+ update_dna()
+ head_organ = owner.get_organ("head") //Update the head with the new information.
+ cut_and_generate_data()
return 1
return 0
@@ -199,13 +251,32 @@
data["facial_hair_styles"] = facial_hair_styles
data["facial_hair_style"] = (head_organ ? head_organ.f_style : "Shaved")
- data["change_markings"] = can_change_markings()
- if(data["change_markings"])
- var/marking_styles[0]
- for(var/marking_style in valid_marking_styles)
- marking_styles[++marking_styles.len] = list("markingstyle" = marking_style)
- data["marking_styles"] = marking_styles
- data["marking_style"] = owner.m_style
+ data["change_head_markings"] = can_change_markings("head")
+ if(data["change_head_markings"])
+ var/m_style = owner.m_styles["head"]
+ var/head_marking_styles[0]
+ for(var/head_marking_style in valid_head_marking_styles)
+ head_marking_styles[++head_marking_styles.len] = list("headmarkingstyle" = head_marking_style)
+ data["head_marking_styles"] = head_marking_styles
+ data["head_marking_style"] = m_style
+
+ data["change_body_markings"] = can_change_markings("body")
+ if(data["change_body_markings"])
+ var/m_style = owner.m_styles["body"]
+ var/body_marking_styles[0]
+ for(var/body_marking_style in valid_body_marking_styles)
+ body_marking_styles[++body_marking_styles.len] = list("bodymarkingstyle" = body_marking_style)
+ data["body_marking_styles"] = body_marking_styles
+ data["body_marking_style"] = m_style
+
+ data["change_tail_markings"] = can_change_markings("tail")
+ if(data["change_tail_markings"])
+ var/m_style = owner.m_styles["tail"]
+ var/tail_marking_styles[0]
+ for(var/tail_marking_style in valid_tail_marking_styles)
+ tail_marking_styles[++tail_marking_styles.len] = list("tailmarkingstyle" = tail_marking_style)
+ data["tail_marking_styles"] = tail_marking_styles
+ data["tail_marking_style"] = m_style
data["change_body_accessory"] = can_change_body_accessory()
if(data["change_body_accessory"])
@@ -213,15 +284,24 @@
for(var/body_accessory_style in valid_body_accessories)
body_accessory_styles[++body_accessory_styles.len] = list("bodyaccessorystyle" = body_accessory_style)
data["body_accessory_styles"] = body_accessory_styles
- var/datum/body_accessory/BA
- if(owner.body_accessory)
- BA = owner.body_accessory.name
- data["body_accessory_style"] = BA
+ data["body_accessory_style"] = (owner.body_accessory ? owner.body_accessory.name : "None")
+
+ data["change_alt_head"] = can_change_alt_head()
+ if(data["change_alt_head"])
+ var/alt_head_styles[0]
+ for(var/alt_head_style in valid_alt_head_styles)
+ alt_head_styles[++alt_head_styles.len] = list("altheadstyle" = alt_head_style)
+ data["alt_head_styles"] = alt_head_styles
+ data["alt_head_style"] = head_organ.alt_head
data["change_head_accessory_color"] = can_change_head_accessory()
data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR)
+ data["change_secondary_hair_color"] = can_change(APPEARANCE_SECONDARY_HAIR_COLOR)
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
- data["change_marking_color"] = can_change_markings()
+ data["change_secondary_facial_hair_color"] = can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR)
+ data["change_head_marking_color"] = can_change_markings("head")
+ data["change_body_marking_color"] = can_change_markings("body")
+ data["change_tail_marking_color"] = can_change_markings("tail")
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state)
@@ -248,19 +328,41 @@
return 0
return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
-/datum/nano_module/appearance_changer/proc/can_change_markings()
- return owner && (flags & APPEARANCE_MARKINGS) && (owner.species.bodyflags & HAS_MARKINGS)
+/datum/nano_module/appearance_changer/proc/can_change_markings(var/location = "body")
+ var/marking_flag = HAS_BODY_MARKINGS
+ var/body_flags = owner.species.bodyflags
+ if(location == "head")
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ body_flags = head_organ.species.bodyflags
+ marking_flag = HAS_HEAD_MARKINGS
+ if(location == "body")
+ marking_flag = HAS_BODY_MARKINGS
+ if(location == "tail")
+ marking_flag = HAS_TAIL_MARKINGS
+
+ return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag)
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
+/datum/nano_module/appearance_changer/proc/can_change_alt_head()
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.species.bodyflags & HAS_ALT_HEADS)
+
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
// Making the assumption that the available species remain constant
valid_hairstyles.Cut()
valid_facial_hairstyles.Cut()
valid_head_accessories.Cut()
- valid_marking_styles.Cut()
+ valid_head_marking_styles.Cut()
+ valid_body_marking_styles.Cut()
+ valid_tail_marking_styles.Cut()
valid_body_accessories.Cut()
+ valid_alt_head_styles.Cut()
generate_data()
/datum/nano_module/appearance_changer/proc/generate_data()
@@ -273,7 +375,13 @@
valid_facial_hairstyles = owner.generate_valid_facial_hairstyles()
if(!valid_head_accessories.len)
valid_head_accessories = owner.generate_valid_head_accessories()
- if(!valid_marking_styles.len)
- valid_marking_styles = owner.generate_valid_markings()
+ if(!valid_head_marking_styles.len)
+ valid_head_marking_styles = owner.generate_valid_markings("head")
+ if(!valid_body_marking_styles.len)
+ valid_body_marking_styles = owner.generate_valid_markings("body")
+ if(!valid_tail_marking_styles.len)
+ valid_tail_marking_styles = owner.generate_valid_markings("tail")
if(!valid_body_accessories.len)
valid_body_accessories = owner.generate_valid_body_accessories()
+ if(!valid_alt_head_styles.len)
+ valid_alt_head_styles = owner.generate_valid_alt_heads()
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 99a1660ba35..8d920a7e736 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -49,7 +49,7 @@
/obj/item/weapon/gun/energy/gun/hos
name = "\improper X-01 MultiPhase Energy Gun"
- desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
+ desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
icon_state = "hoslaser"
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 85657dd2b5b..232d2a9b3c5 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -255,20 +255,20 @@
/obj/machinery/disposal/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
- var/pressure = 100 * air_contents.return_pressure() / (SEND_PRESSURE)
+ var/pressure = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100)
var/pressure_round = round(pressure,1)
data["isAI"] = isAI(user)
data["flushing"] = flush
data["mode"] = mode
if(mode <= 0)
- data["pumpstatus"] = ""
+ data["pumpstatus"] = "N/A"
else if(mode == 1)
- data["pumpstatus"] = "(pressurizing)"
+ data["pumpstatus"] = "Pressurizing"
else if(mode == 2)
- data["pumpstatus"] = "(ready)"
+ data["pumpstatus"] = "Ready"
else
- data["pumpstatus"] = "(idle)"
+ data["pumpstatus"] = "Idle"
data["pressure"] = pressure_round
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm
index 188bf7597c2..8ff0ed6eb64 100644
--- a/code/modules/security_levels/keycard authentication.dm
+++ b/code/modules/security_levels/keycard authentication.dm
@@ -3,6 +3,7 @@
desc = "This device is used to trigger station functions, which require more than one ID card to authenticate."
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
+
var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made.
var/event = ""
var/screen = 1
@@ -14,25 +15,25 @@
var/mob/event_triggered_by
var/mob/event_confirmed_by
var/ert_reason = "Reason for ERT"
- //1 = select event
- //2 = authenticate
- anchored = 1.0
+
+ anchored = 1
use_power = 1
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
+
+ req_access = list(access_keycard_auth)
/obj/machinery/keycard_auth/attack_ai(mob/user as mob)
- to_chat(user, "The station AI is not to interact with these devices.")
+ to_chat(user, "The station AI is not to interact with these devices.")
return
/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(stat & (NOPOWER|BROKEN))
to_chat(user, "This device is not powered.")
return
- if(istype(W,/obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/ID = W
- if(access_keycard_auth in ID.access)
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(check_access(W))
if(active == 1)
//This is not the device that made the initial request. It is the device confirming the request.
if(event_source)
@@ -44,6 +45,8 @@
return
event_triggered_by = usr
broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices
+ else
+ to_chat(user, "Access denied.")
/obj/machinery/keycard_auth/power_change()
if(powered(ENVIRON))
@@ -51,16 +54,16 @@
icon_state = "auth_off"
else
stat |= NOPOWER
+
+/obj/machinery/keycard_auth/attack_ghost(mob/user)
+ ui_interact(user)
/obj/machinery/keycard_auth/attack_hand(mob/user as mob)
- if(!user.IsAdvancedToolUser())
- return 0
+ if(..())
+ return 1
ui_interact(user)
/obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(user.stat || stat & (NOPOWER|BROKEN))
- to_chat(user, "This device is not powered.")
- return
if(busy)
to_chat(user, "This device is busy.")
return
@@ -74,19 +77,18 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
- ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320)
+ ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 540, 320)
ui.set_initial_data(data)
ui.open()
/obj/machinery/keycard_auth/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(busy)
to_chat(usr, "This device is busy.")
return
- if(usr.stat || stat & (BROKEN|NOPOWER))
- to_chat(usr, "This device is without power.")
- return
+
if(href_list["triggerevent"])
event = href_list["triggerevent"]
screen = 2
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index b17eb9940ea..5a01cd5b09f 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -197,8 +197,7 @@
/obj/spacepod/bullet_act(var/obj/item/projectile/P)
if(P.damage_type == BRUTE || P.damage_type == BURN)
deal_damage(P.damage)
- else if(P.flag == "energy" && istype(P,/obj/item/projectile/ion)) //needed to make sure ions work properly
- empulse(src, 1, 1)
+ P.on_hit(src)
/obj/spacepod/blob_act()
deal_damage(30)
@@ -284,35 +283,27 @@
/obj/spacepod/emp_act(severity)
occupant_sanity_check()
cargo_hold.emp_act(severity)
+
+ if(battery && battery.charge > 0)
+ battery.use((battery.charge / 2) / severity)
+ deal_damage(80 / severity)
+ if(empcounter < (40 / severity))
+ empcounter = 40 / severity
+ processing_objects.Add(src)
+
switch(severity)
if(1)
if(pilot)
to_chat(pilot, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")
if(passengers)
for(var/mob/M in passengers)
- to_chat(M, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the passengers
-
-
- if(battery)
- battery.charge = max(0, battery.charge - 5000) //Cell EMP act is too weak, this pod needs to be sapped.
- src.deal_damage(100)
- if(src.empcounter < 40)
- src.empcounter = 40 //Disable movement for 40 ticks. Plenty long enough.
- processing_objects.Add(src)
-
+ to_chat(M, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")
if(2)
if(pilot)
to_chat(pilot, "The pod console flashes 'EMP WAVE DETECTED'.")
if(passengers)
for(var/mob/M in passengers)
- to_chat(M, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the passengers
-
- deal_damage(40)
- if(battery)
- battery.charge = max(0, battery.charge - 2500) //Cell EMP act is too weak, this pod needs to be sapped.
- if(empcounter < 20)
- empcounter = 20 //Disable movement for 20 ticks.
- processing_objects.Add(src)
+ to_chat(M, "The pod console flashes 'EMP WAVE DETECTED'.")
/obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params)
if(user.a_intent == I_HARM)
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index a0dcd29525f..794bf2a3e9f 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -162,9 +162,9 @@
var/obj/item/organ/external/head/H = target.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(robohead.is_monitor) //Ensures that if an IPC gets a head that's got a human hair wig attached to their body, the hair won't wipe.
- H.h_style = ""
- H.f_style = ""
- target.m_style = ""
+ H.h_style = "Bald"
+ H.f_style = "Shaved"
+ target.m_styles["head"] = "None"
E.status &= ~ORGAN_DESTROYED
if(E.children)
for(var/obj/item/organ/external/C in E.children)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index d10fea6b7aa..ce4b55efb11 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -860,11 +860,13 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/mutate()
src.status |= ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly render the deformed sprite.
/obj/item/organ/external/proc/unmutate()
src.status &= ~ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly return them to normal.
/obj/item/organ/external/proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index 31ef55f4919..272adcad52c 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -107,13 +107,14 @@ var/global/list/limb_icon_cache = list()
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
- if(owner.m_style)
- var/datum/sprite_accessory/marking_style = marking_styles_list[owner.m_style]
- if(marking_style && marking_style.species_allowed && (species.name in marking_style.species_allowed) && marking_style.marking_location == "head")
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(owner.r_markings, owner.g_markings, owner.b_markings), ICON_ADD)
- overlays |= markings_s
+ var/head_marking = owner.m_styles["head"]
+ if(head_marking && head_marking != "None")
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(owner.m_colours["head"], ICON_ADD)
+ overlays |= h_marking_s
if(ha_style)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
@@ -158,6 +159,10 @@ var/global/list/limb_icon_cache = list()
gender = "f"
else
gender = "m"
+ if(limb_name == "head")
+ var/obj/item/organ/external/head/head_organ = src
+ head_organ.handle_alt_icon()
+
new_icon_state = "[icon_name][gender ? "_[gender]" : ""]"
if(skeletal)
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 02351f523a8..faa6c403355 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -159,11 +159,15 @@
gendered_icon = 1
encased = "skull"
var/can_intake_reagents = 1
+ var/alt_head = "None"
//Hair colour and style
var/r_hair = 0
var/g_hair = 0
var/b_hair = 0
+ var/r_hair_sec = 0
+ var/g_hair_sec = 0
+ var/b_hair_sec = 0
var/h_style = "Bald"
//Head accessory colour and style
@@ -176,6 +180,9 @@
var/r_facial = 0
var/g_facial = 0
var/b_facial = 0
+ var/r_facial_sec = 0
+ var/g_facial_sec = 0
+ var/b_facial_sec = 0
var/f_style = "Shaved"
/obj/item/organ/external/head/remove()
@@ -197,6 +204,8 @@
if(owner)//runtimer no runtiming
owner.update_hair()
owner.update_fhair()
+ owner.update_head_accessory()
+ owner.update_markings()
. = ..()
/obj/item/organ/external/head/replaced()
@@ -213,6 +222,17 @@
if(burn_dam > 40)
disfigure("burn")
+/obj/item/organ/external/head/proc/handle_alt_icon()
+ if(alt_head && alt_heads_list[alt_head])
+ var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[alt_head]
+ if(alternate_head.icon_state)
+ icon_name = alternate_head.icon_state
+ else //If alternate_head.icon_state doesn't exist, that means alternate_head is "None", so default icon_name back to "head".
+ icon_name = initial(icon_name)
+ else //If alt_head is null, set it to "None" and default icon_name for sanity.
+ alt_head = initial(alt_head)
+ icon_name = initial(icon_name)
+
/obj/item/organ/external/head/set_dna(datum/dna/new_dna)
..()
new_dna.write_head_attributes(src)
diff --git a/html/changelog.html b/html/changelog.html
index 8279fa001b3..2d41f163168 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,86 @@
-->
+
23 October 2016
+
KasparoVy updated:
+
+ - Refactors markings. Now split into head, body and tail markings.
+ - Refactors morph again. Changes made while morphing are now reflected instantly on your sprite.
+ - Darkens Vulpkanin and Tajara for improved colour fidelity. Species base colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj to keep the same colour on your character.
+ - Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add 23 to the R, G and B values of your facial hair/head accessory to keep the same colour on your character.
+ - Darkens Unathi frills and horns. Add 27 to the R, G and B values of your frills and 21 for horns to keep the same colour on your character.
+ - Vulpkanin tails are now split-rendered. Tails overlap hair when facing north, but are overlapped by hair when facing all other directions. No other differences, only affects the fluffy husky tail.
+ - The heads of tiger markings have been isolated and can now be coloured independently.
+ - Hair can now cover facial hair, and glasses are no longer covered by facial hair and head accessories. Means that two-piece Vulpkanin facial fur patterns won't almost entirely cover whatever glasses they're wearing.
+ - Tajaran head and facial hair have been darkened. Add 28 to the R, G and B values of your Tajara head/facial hair to keep the same colour on your character.
+ - Vulpkanin head hair and one facial hair style has been darkened. Refer to PR notes for darkening factors.
+ - The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS flags are for specific locations (head, body, tail).
+ - Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - Naked Humans and Skrell will no longer have exposed flesh poking out their wrists when facing east or west. Male Humans now no longer lack a butt pixel when facing east or west.
+ - Mutated limbs now render correctly as soon as they're mutated.
+ - Mobs will now correctly appear as fat/skinny.
+ - Species with TAIL_OVERLAPPED will no longer wag tail at max speed when facing north.
+ - Species with TAIL_OVERLAPPED and body accessories won't crash the game when they wag.
+ - Tiger Head and Face markings adjusted so they don't look ugly on certain species' ears.
+ - Fixes issue where Unathi dorsal stripe didn't render.
+ - Tajaran ears are no longer in their hair sprites, but on their actual heads.
+ - The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and will now be rendered correctly on a body regardless of species bodyflags.
+ - Changing a person's species via CMA will no longer result in a mob with all the same cosmetic attributes as the old species.
+ - Dressers now have species fitting checks for undergarments. Drask are now able to wear undershirts and underwear like they were originally meant to.
+ - Adds some head markings for Tajara and Vulpkanin.
+ - Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - Adds tail markings for Vox and Vulpkanin.
+ - Adds 5 Tajaran hairstyles.
+ - Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with certain jackets as much.
+ - Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - Adds a facial hairstyle for Vulpkanin.
+ - Adds secondary hair (head and facial) themes. Skrell can now colour their tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles can be coloured and the same with the webbing in Unathi frills. Can be changed at nanomirrors, via morph and CMA.
+ - Adds alternate heads. Unathi can now choose a head with a sharp snout. Can be changed via morph and CMA.
+ - Helper procs to convert a hex colour into either R, G, or B.
+ - Markings, body accessories, head accessories, alt heads and their colours (if they have colours) can now be randomized at the character preferences screen.
+ - Adds a system that attempts to fit mobs with alternate heads with appropriate mask sprites. The sprites just need to be suffixed with the alt_head suffix in sprite_accessories.dm.
+ - Adds mask sprites tweaked to fit the new Unathi alternate head to go along with the new alt. head mask fitting system.
+
+
+
15 October 2016
+
Crazylemon64 updated:
+
+ - The R&D console should now no longer freeze on the "Syncing Database" message or whatever.
+ - Borg coolers and SMES boards can be made again
+ - Maroon now works
+
+
FlattestGuitar updated:
+
+ - pAIs no longer turn into debris when wiped
+ - SNPCs no longer get targeted by assasinate objectives
+ - fixes a hallucination runtime, actually making one more aspect of being high as f*** work for the first time in ages
+ - NODROP items will no longer attempt to be dropped if your hand is broken
+
+
Fox McCloud updated:
+
+ - Cloners will now put you inside the cloned body when it is fully grown as opposed to initially created
+ - Examining a cloner will tell you the clone progress
+ - Observers can now see a visual countdown of the cloning status progression
+ - Atmos grenades cost increased from 6 to 11
+ - Mice now have sprites when worn
+ - Fixes various ghost alerts having barely visible icons
+ - Fixes items being in two locations at once when loading things into the bio-generator or reagent grinder.
+
+
GeneralChaos81 updated:
+
+ - Ability to place and remove conveyor belts and levers.
+
+
KasparoVy updated:
+
+ - Botany, viro and xenobio bottles will no longer be invisible.
+
+
Krausus updated:
+
+ - Fixed full chat panes scrolling unpredictably when trying to view old messages.
+ - Fixed camera monitors immobilizing you if you reconnect while using one.
+ - Fixed selecting datum types through SDQL2 never returning any datums.
+
+
16 September 2016
Aurorablade updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 884eb062051..7f682f24250 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2947,3 +2947,104 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
had hit a wall. The leap still goes on a 3 second cooldown as normal.
Ty-Omaha:
- rscadd: Adds fluff item "Tacticool EyePro"
+2016-10-15:
+ Crazylemon64:
+ - bugfix: The R&D console should now no longer freeze on the "Syncing Database"
+ message or whatever.
+ - bugfix: Borg coolers and SMES boards can be made again
+ - bugfix: Maroon now works
+ FlattestGuitar:
+ - tweak: pAIs no longer turn into debris when wiped
+ - bugfix: SNPCs no longer get targeted by assasinate objectives
+ - bugfix: fixes a hallucination runtime, actually making one more aspect of being
+ high as f*** work for the first time in ages
+ - bugfix: NODROP items will no longer attempt to be dropped if your hand is broken
+ Fox McCloud:
+ - tweak: Cloners will now put you inside the cloned body when it is fully grown
+ as opposed to initially created
+ - tweak: Examining a cloner will tell you the clone progress
+ - rscadd: Observers can now see a visual countdown of the cloning status progression
+ - tweak: Atmos grenades cost increased from 6 to 11
+ - rscadd: Mice now have sprites when worn
+ - bugfix: Fixes various ghost alerts having barely visible icons
+ - bugfix: Fixes items being in two locations at once when loading things into the
+ bio-generator or reagent grinder.
+ GeneralChaos81:
+ - rscadd: Ability to place and remove conveyor belts and levers.
+ KasparoVy:
+ - bugfix: Botany, viro and xenobio bottles will no longer be invisible.
+ Krausus:
+ - bugfix: Fixed full chat panes scrolling unpredictably when trying to view old
+ messages.
+ - bugfix: Fixed camera monitors immobilizing you if you reconnect while using one.
+ - bugfix: Fixed selecting datum types through SDQL2 never returning any datums.
+2016-10-23:
+ KasparoVy:
+ - tweak: Refactors markings. Now split into head, body and tail markings.
+ - tweak: Refactors morph again. Changes made while morphing are now reflected instantly
+ on your sprite.
+ - tweak: Darkens Vulpkanin and Tajara for improved colour fidelity. Species base
+ colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj
+ to keep the same colour on your character.
+ - tweak: Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add
+ 23 to the R, G and B values of your facial hair/head accessory to keep the same
+ colour on your character.
+ - tweak: Darkens Unathi frills and horns. Add 27 to the R, G and B values of your
+ frills and 21 for horns to keep the same colour on your character.
+ - tweak: Vulpkanin tails are now split-rendered. Tails overlap hair when facing
+ north, but are overlapped by hair when facing all other directions. No other
+ differences, only affects the fluffy husky tail.
+ - tweak: The heads of tiger markings have been isolated and can now be coloured
+ independently.
+ - tweak: Hair can now cover facial hair, and glasses are no longer covered by facial
+ hair and head accessories. Means that two-piece Vulpkanin facial fur patterns
+ won't almost entirely cover whatever glasses they're wearing.
+ - tweak: Tajaran head and facial hair have been darkened. Add 28 to the R, G and
+ B values of your Tajara head/facial hair to keep the same colour on your character.
+ - tweak: Vulpkanin head hair and one facial hair style has been darkened. Refer
+ to PR notes for darkening factors.
+ - tweak: The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS
+ flags are for specific locations (head, body, tail).
+ - tweak: Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - bugfix: Naked Humans and Skrell will no longer have exposed flesh poking out their
+ wrists when facing east or west. Male Humans now no longer lack a butt pixel
+ when facing east or west.
+ - bugfix: Mutated limbs now render correctly as soon as they're mutated.
+ - bugfix: Mobs will now correctly appear as fat/skinny.
+ - bugfix: Species with TAIL_OVERLAPPED will no longer wag tail at max speed when
+ facing north.
+ - bugfix: Species with TAIL_OVERLAPPED and body accessories won't crash the game
+ when they wag.
+ - bugfix: Tiger Head and Face markings adjusted so they don't look ugly on certain
+ species' ears.
+ - bugfix: Fixes issue where Unathi dorsal stripe didn't render.
+ - bugfix: Tajaran ears are no longer in their hair sprites, but on their actual
+ heads.
+ - bugfix: The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and
+ will now be rendered correctly on a body regardless of species bodyflags.
+ - bugfix: Changing a person's species via CMA will no longer result in a mob with
+ all the same cosmetic attributes as the old species.
+ - bugfix: Dressers now have species fitting checks for undergarments. Drask are
+ now able to wear undershirts and underwear like they were originally meant to.
+ - rscadd: Adds some head markings for Tajara and Vulpkanin.
+ - rscadd: Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - rscadd: Adds tail markings for Vox and Vulpkanin.
+ - rscadd: Adds 5 Tajaran hairstyles.
+ - rscadd: Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with
+ certain jackets as much.
+ - rscadd: Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - rscadd: Adds a facial hairstyle for Vulpkanin.
+ - rscadd: Adds secondary hair (head and facial) themes. Skrell can now colour their
+ tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles
+ can be coloured and the same with the webbing in Unathi frills. Can be changed
+ at nanomirrors, via morph and CMA.
+ - rscadd: Adds alternate heads. Unathi can now choose a head with a sharp snout.
+ Can be changed via morph and CMA.
+ - rscadd: Helper procs to convert a hex colour into either R, G, or B.
+ - rscadd: Markings, body accessories, head accessories, alt heads and their colours
+ (if they have colours) can now be randomized at the character preferences screen.
+ - rscadd: Adds a system that attempts to fit mobs with alternate heads with appropriate
+ mask sprites. The sprites just need to be suffixed with the alt_head suffix
+ in sprite_accessories.dm.
+ - imageadd: Adds mask sprites tweaked to fit the new Unathi alternate head to go
+ along with the new alt. head mask fitting system.
diff --git a/html/changelogs/AutoChangeLog-pr-5581.yml b/html/changelogs/AutoChangeLog-pr-5581.yml
deleted file mode 100644
index f79c2493863..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5581.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - tweak: "Cloners will now put you inside the cloned body when it is fully grown as opposed to initially created"
- - tweak: "Examining a cloner will tell you the clone progress"
- - rscadd: "Observers can now see a visual countdown of the cloning status progression"
diff --git a/html/changelogs/AutoChangeLog-pr-5644.yml b/html/changelogs/AutoChangeLog-pr-5644.yml
deleted file mode 100644
index f336a56d07a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5644.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: GeneralChaos81
-delete-after: True
-changes:
- - rscadd: "Ability to place and remove conveyor belts and levers."
diff --git a/html/changelogs/AutoChangeLog-pr-5646.yml b/html/changelogs/AutoChangeLog-pr-5646.yml
deleted file mode 100644
index 022b08350f1..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5646.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - tweak: "Atmos grenades cost increased from 6 to 11"
diff --git a/html/changelogs/AutoChangeLog-pr-5649.yml b/html/changelogs/AutoChangeLog-pr-5649.yml
deleted file mode 100644
index 5dddb44c4c3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5649.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Mice now have sprites when worn"
diff --git a/html/changelogs/AutoChangeLog-pr-5679.yml b/html/changelogs/AutoChangeLog-pr-5679.yml
deleted file mode 100644
index 9292e91fee9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5679.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - bugfix: "The R&D console should now no longer freeze on the \"Syncing Database\" message or whatever."
diff --git a/html/changelogs/AutoChangeLog-pr-5685.yml b/html/changelogs/AutoChangeLog-pr-5685.yml
deleted file mode 100644
index 0fdc18d2454..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5685.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes various ghost alerts having barely visible icons"
diff --git a/html/changelogs/AutoChangeLog-pr-5691.yml b/html/changelogs/AutoChangeLog-pr-5691.yml
deleted file mode 100644
index d88812f1585..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5691.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: KasparoVy
-delete-after: True
-changes:
- - bugfix: "Botany, viro and xenobio bottles will no longer be invisible."
diff --git a/html/changelogs/AutoChangeLog-pr-5697.yml b/html/changelogs/AutoChangeLog-pr-5697.yml
deleted file mode 100644
index 9b853c7f031..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5697.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - bugfix: "Borg coolers and SMES boards can be made again"
diff --git a/html/changelogs/AutoChangeLog-pr-5703.yml b/html/changelogs/AutoChangeLog-pr-5703.yml
deleted file mode 100644
index a206365db26..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5703.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fixed full chat panes scrolling unpredictably when trying to view old messages."
diff --git a/html/changelogs/AutoChangeLog-pr-5708.yml b/html/changelogs/AutoChangeLog-pr-5708.yml
deleted file mode 100644
index db2fd949d15..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5708.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fixed camera monitors immobilizing you if you reconnect while using one."
diff --git a/html/changelogs/AutoChangeLog-pr-5713.yml b/html/changelogs/AutoChangeLog-pr-5713.yml
deleted file mode 100644
index 9ece18ba44e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5713.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fixed selecting datum types through SDQL2 never returning any datums."
diff --git a/html/changelogs/AutoChangeLog-pr-5715.yml b/html/changelogs/AutoChangeLog-pr-5715.yml
deleted file mode 100644
index b2f8901db43..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5715.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - tweak: "pAIs no longer turn into debris when wiped"
diff --git a/html/changelogs/AutoChangeLog-pr-5716.yml b/html/changelogs/AutoChangeLog-pr-5716.yml
deleted file mode 100644
index 29235ac7342..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5716.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - bugfix: "SNPCs no longer get targeted by assasinate objectives"
diff --git a/html/changelogs/AutoChangeLog-pr-5735.yml b/html/changelogs/AutoChangeLog-pr-5735.yml
deleted file mode 100644
index a390302ce8c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5735.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - bugfix: "fixes a hallucination runtime, actually making one more aspect of being high as f*** work for the first time in ages"
diff --git a/html/changelogs/AutoChangeLog-pr-5737.yml b/html/changelogs/AutoChangeLog-pr-5737.yml
deleted file mode 100644
index 533cba860c7..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5737.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - bugfix: "Maroon now works"
diff --git a/html/changelogs/AutoChangeLog-pr-5744.yml b/html/changelogs/AutoChangeLog-pr-5744.yml
deleted file mode 100644
index 982ede22fe8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5744.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - bugfix: "NODROP items will no longer attempt to be dropped if your hand is broken"
diff --git a/html/changelogs/AutoChangeLog-pr-5755.yml b/html/changelogs/AutoChangeLog-pr-5755.yml
deleted file mode 100644
index d1d10015a82..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5755.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes items being in two locations at once when loading things into the bio-generator or reagent grinder."
diff --git a/html/changelogs/AutoChangeLog-pr-5811.yml b/html/changelogs/AutoChangeLog-pr-5811.yml
new file mode 100644
index 00000000000..33d9eb32a8b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5811.yml
@@ -0,0 +1,7 @@
+author: KasparoVy
+delete-after: True
+changes:
+ - bugfix: "Fixes a bug where changing your alt head required two icon updates to show."
+ - bugfix: "Fixes a bug where you couldn't choose head marking styles that would ordinarily be available regardless of your alt head."
+ - bugfix: "Fixes a bug where Tajara couldn't choose undergarments."
+ - bugfix: "Resolves an issue with the Vulpkanin Jagged hairstyle missing a pixel."
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index ee3da07c3c5..87c047f397a 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index c45bd957a1a..6e94d89854d 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index ad4f2d137a6..02bbf79ad76 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 79df46605a2..bf6507c412c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_def_human.dmi b/icons/mob/human_races/r_def_human.dmi
index 9d6af67be61..92ee97b4aba 100644
Binary files a/icons/mob/human_races/r_def_human.dmi and b/icons/mob/human_races/r_def_human.dmi differ
diff --git a/icons/mob/human_races/r_def_lizard.dmi b/icons/mob/human_races/r_def_lizard.dmi
index 3926ca17092..e1c40712b23 100644
Binary files a/icons/mob/human_races/r_def_lizard.dmi and b/icons/mob/human_races/r_def_lizard.dmi differ
diff --git a/icons/mob/human_races/r_def_tajaran.dmi b/icons/mob/human_races/r_def_tajaran.dmi
index 1e7da69c495..e62f4228fc6 100644
Binary files a/icons/mob/human_races/r_def_tajaran.dmi and b/icons/mob/human_races/r_def_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_grey.dmi b/icons/mob/human_races/r_grey.dmi
index d270ab83934..4f603380545 100644
Binary files a/icons/mob/human_races/r_grey.dmi and b/icons/mob/human_races/r_grey.dmi differ
diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi
index 0aa7295b8d3..0cbbde7fb3a 100644
Binary files a/icons/mob/human_races/r_human.dmi and b/icons/mob/human_races/r_human.dmi differ
diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi
index 457e50b204e..d60ae4979df 100644
Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ
diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi
index f1c4966dc51..586714c7da8 100644
Binary files a/icons/mob/human_races/r_skrell.dmi and b/icons/mob/human_races/r_skrell.dmi differ
diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi
index c287ef822f3..3f45032951d 100644
Binary files a/icons/mob/human_races/r_tajaran.dmi and b/icons/mob/human_races/r_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi
index 0f1b6956c10..3bcdb3539b7 100644
Binary files a/icons/mob/human_races/r_vulpkanin.dmi and b/icons/mob/human_races/r_vulpkanin.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index ea17113a2fc..9217fb7730c 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 4ad3b228849..46b11152ba7 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index a211a035012..e0571e592db 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index b39ee5577a6..93dacb8f058 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi
index f0353c1766d..14a70e1bb4c 100644
Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index 886076f21d2..47a3ce113e2 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -23,7 +23,7 @@
{{/if}}
-{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_marking_color}}
+{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_head_marking_color || data.change_body_marking_color || data.change_tail_marking_color}}
Colors:
@@ -44,11 +44,23 @@
{{if data.change_hair_color}}
{{:helper.link('Change hair color', null, { 'hair_color' : 1})}}
{{/if}}
+ {{if data.change_secondary_hair_color}}
+ {{:helper.link('Change secondary hair color', null, { 'secondary_hair_color' : 1})}}
+ {{/if}}
{{if data.change_facial_hair_color}}
{{:helper.link('Change facial hair color', null, { 'facial_hair_color' : 1})}}
{{/if}}
- {{if data.change_marking_color}}
- {{:helper.link('Change marking color', null, { 'marking_color' : 1})}}
+ {{if data.change_secondary_facial_hair_color}}
+ {{:helper.link('Change secondary facial hair color', null, { 'secondary_facial_hair_color' : 1})}}
+ {{/if}}
+ {{if data.change_head_marking_color}}
+ {{:helper.link('Change head marking color', null, { 'head_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_body_marking_color}}
+ {{:helper.link('Change body marking color', null, { 'body_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_tail_marking_color}}
+ {{:helper.link('Change tail marking color', null, { 'tail_marking_color' : 1})}}
{{/if}}
@@ -93,14 +105,40 @@
{{/if}}
-{{if data.change_markings}}
+{{if data.change_head_markings}}
- Marking styles:
+ Head Marking styles:
- {{for data.marking_styles}}
- {{:helper.link(value.markingstyle, null, { 'marking' : value.markingstyle}, null, data.marking_style == value.markingstyle ? 'selected' : null)}}
+ {{for data.head_marking_styles}}
+ {{:helper.link(value.headmarkingstyle, null, { 'head_marking' : value.headmarkingstyle}, null, data.head_marking_style == value.headmarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_body_markings}}
+
+
+ Body Marking styles:
+
+
+ {{for data.body_marking_styles}}
+ {{:helper.link(value.bodymarkingstyle, null, { 'body_marking' : value.bodymarkingstyle}, null, data.body_marking_style == value.bodymarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_tail_markings}}
+
+
+ Tail Marking styles:
+
+
+ {{for data.tail_marking_styles}}
+ {{:helper.link(value.tailmarkingstyle, null, { 'tail_marking' : value.tailmarkingstyle}, null, data.tail_marking_style == value.tailmarkingstyle ? 'selected' : null)}}
{{/for}}
@@ -118,3 +156,16 @@
{{/if}}
+
+{{if data.change_alt_head}}
+
+
+ Alternate Heads:
+
+
+ {{for data.alt_head_styles}}
+ {{:helper.link(value.altheadstyle, null, { 'alt_head' : value.altheadstyle}, null, data.alt_head_style == value.altheadstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
diff --git a/nano/templates/chem_dispenser.tmpl b/nano/templates/chem_dispenser.tmpl
index cec3028652e..f8988e35e43 100644
--- a/nano/templates/chem_dispenser.tmpl
+++ b/nano/templates/chem_dispenser.tmpl
@@ -78,24 +78,12 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
{{empty}}
-
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- is empty
+ {{if data.glass}}Glass{{else}}Beaker{{/if}} is empty
{{/for}}
{{else}}
- No
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- loaded
+ No {{if data.glass}}Glass{{else}}Beaker{{/if}} loaded
{{/if}}
diff --git a/nano/templates/disposal_bin.tmpl b/nano/templates/disposal_bin.tmpl
index c68389a95cb..d211b3fbb17 100644
--- a/nano/templates/disposal_bin.tmpl
+++ b/nano/templates/disposal_bin.tmpl
@@ -31,6 +31,13 @@ Used In File(s): \code\modules\recycling\disposal.dm
{{:helper.link('On', 'gear', {'pump' : 1}, data.mode > 0 ? 'selected' : '')}}
{{:helper.link('Off', 'gear', {'pump' : 0}, data.mode <= 0 ? 'selected' : '')}}
+
+
+
+
+ Pump Status:
+
+
{{:data.pumpstatus}}
diff --git a/nano/templates/keycard_auth.tmpl b/nano/templates/keycard_auth.tmpl
index 7f8f24b80eb..af58b061a9f 100644
--- a/nano/templates/keycard_auth.tmpl
+++ b/nano/templates/keycard_auth.tmpl
@@ -29,7 +29,7 @@ Used In File(s): \code\modules\security_levels\keycard_authentication.dm
{{/if}}
-
+ Please swipe your card to authorize the following event:
{{:data.event}}
{{:helper.link('Back', 'close', { 'reset' : 1 })}}
{{/if}}
diff --git a/nano/templates/supply_console.tmpl b/nano/templates/supply_console.tmpl
index accafa99626..3402e8982b5 100644
--- a/nano/templates/supply_console.tmpl
+++ b/nano/templates/supply_console.tmpl
@@ -52,8 +52,8 @@ Used In File(s): \code\game\supplyshuttle.dm
Shuttle Control:
- {{:helper.link('Call Shuttle', 'circle-triangle-e', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}}
- {{:helper.link('Return Shuttle', 'circle-triangle-w', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}}
+ {{:helper.link('Call Shuttle', 'arrow-circle-down', data.send, data.moving || data.at_station || !data.can_launch ? 'disabled' : '')}}
+ {{:helper.link('Return Shuttle', 'arrow-circle-up', data.send, data.moving || !data.at_station || !data.can_launch ? 'disabled' : '')}}